diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 81ca677481..928c969583 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -62,4 +62,3 @@ body: id: additional-context attributes: label: Additional context - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9f0d42ea2d..1e2afba20c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ - [ ] Have you followed the [guidelines for contributing](https://github.com/canonical/snapcraft/blob/main/CONTRIBUTING.md)? - [ ] Have you signed the [CLA](http://www.ubuntu.com/legal/contributors/)? -- [ ] Have you successfully run `tox run -m lint`? -- [ ] Have you successfully run `tox run -e test-py310`? (supported versions: `py39`, `py310`, `py311`, `py312`) +- [ ] Have you successfully run `make lint`? +- [ ] Have you successfully run `make test`? ------ +--- diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 50f9d88e4c..e78bce4016 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -15,10 +15,10 @@ categories: - title: "Tooling" label: - "tooling" -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-template: "- $TITLE @$AUTHOR (#$NUMBER)" template: | Special thanks to the contributors that made this release happen: $CONTRIBUTORS - + ## Full list of changes $CHANGES diff --git a/.github/spread-problem-matcher.json b/.github/spread-problem-matcher.json index 87326ee58b..546d1d46a9 100644 --- a/.github/spread-problem-matcher.json +++ b/.github/spread-problem-matcher.json @@ -1,14 +1,14 @@ { - "problemMatcher": [ + "problemMatcher": [ + { + "owner": "spread-error", + "pattern": [ { - "owner": "spread-error", - "pattern": [ - { - "regexp": "^\\d+-\\d+-\\d+ \\d+:\\d+:\\d+ ((Error) (preparing|executing|restoring) .+) : .*$", - "message": 1, - "severity": 2 - } - ] + "regexp": "^\\d+-\\d+-\\d+ \\d+:\\d+:\\d+ ((Error) (preparing|executing|restoring) .+) : .*$", + "message": 1, + "severity": 2 } - ] + ] + } + ] } diff --git a/.github/workflows/check-renovate.yaml b/.github/workflows/check-renovate.yaml index 7d13cfbf21..ba9126fad8 100644 --- a/.github/workflows/check-renovate.yaml +++ b/.github/workflows/check-renovate.yaml @@ -10,7 +10,7 @@ on: inputs: enable_ssh_access: type: boolean - description: 'Enable ssh access' + description: "Enable ssh access" required: false default: false diff --git a/.github/workflows/cla-check.yaml b/.github/workflows/cla-check.yaml deleted file mode 100644 index cdb271af63..0000000000 --- a/.github/workflows/cla-check.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: cla-check -on: [pull_request] - -jobs: - cla-check: - runs-on: ubuntu-latest - steps: - - name: Check if CLA signed - uses: canonical/has-signed-canonical-cla@v1 diff --git a/.github/workflows/policy.yaml b/.github/workflows/policy.yaml new file mode 100644 index 0000000000..604e0d5375 --- /dev/null +++ b/.github/workflows/policy.yaml @@ -0,0 +1,22 @@ +name: Check policy +on: + pull_request: + push: + branches: + - main + - hotfix/* + - work/check-policy # For development + +jobs: + policy: + uses: canonical/starflow/.github/workflows/policy.yaml@main + python-scans: + name: Security scan + uses: canonical/starflow/.github/workflows/scan-python.yaml@main + with: + # 1. requirements-noble.txt can't build on jammy + # 2. Ignore requirements files in spread tests, as some of these intentionally + # contain vulnerable versions. + # 3. Docs contain requirements.txt files that don't specify versions. + requirements-find-args: '! -name requirements-noble.txt ! -path "./tests/spread*" ! -path "./docs/**"' + trivy-extra-args: "--severity HIGH,CRITICAL --ignore-unfixed --skip-dirs tests/spread/" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 0a11f13634..ec52e4e393 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -1,6 +1,6 @@ name: CI -on: +on: pull_request: push: branches: diff --git a/.github/workflows/qa.yaml b/.github/workflows/qa.yaml new file mode 100644 index 0000000000..8c5db516ce --- /dev/null +++ b/.github/workflows/qa.yaml @@ -0,0 +1,24 @@ +name: QA +on: + push: + branches: + - "main" + - "feature/*" + - "hotfix/*" + - "release/*" + - "renovate/*" + pull_request: + +jobs: + lint: + uses: canonical/starflow/.github/workflows/lint-python.yaml@main + test: + uses: canonical/starflow/.github/workflows/test-python.yaml@main + with: + # Snapcraft currently only tests on Python 3.12 on Ubuntu 24.04 + fast-test-platforms: '["ubuntu-24.04"]' + slow-test-platforms: '["ubuntu-24.04"]' + lowest-python-platform: "ubuntu-24.04" + fast-test-python-versions: '["3.12"]' + slow-test-python-versions: '["3.12"]' + lowest-python-version: "3.12" diff --git a/.github/workflows/security-scan.yaml b/.github/workflows/security-scan.yaml deleted file mode 100644 index 20770c8ad9..0000000000 --- a/.github/workflows/security-scan.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Security scan -on: - pull_request: - push: - branches: - - main - - hotfix/* - - work/secscan # For development - -jobs: - python-scans: - name: Scan Python project - uses: canonical/starflow/.github/workflows/scan-python.yaml@main - with: - packages: python-apt-dev - osv-extra-args: '--config=source/osv-scanner.toml' - trivy-extra-args: '--severity HIGH,CRITICAL --ignore-unfixed --skip-dirs "tests/spread/**"' diff --git a/.github/workflows/tics.yaml b/.github/workflows/tics.yaml index b3bd736492..d97fbb5ed8 100644 --- a/.github/workflows/tics.yaml +++ b/.github/workflows/tics.yaml @@ -3,13 +3,13 @@ name: TICS on: push: branches: - - main - # to easy test changes to the workflow - - tiobe + - main + # to easy test changes to the workflow + - tiobe jobs: CI: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 @@ -22,22 +22,32 @@ jobs: sudo apt-get update echo "::endgroup::" echo "::group::apt-get install..." - sudo apt-get install -y python3 python3-dev libapt-pkg-dev libyaml-dev xdelta3 patchelf + sudo apt-get install -y python3 python3-dev libapt-pkg-dev libyaml-dev umoci echo "::endgroup::" - echo "::group::pip install" - python -m pip install 'tox<5.0' tox-gh + echo "::group::snap install" + sudo snap install --classic astral-uv + echo "::endgroup::" + echo "::group::install requirements" + uv sync --frozen --group dev echo "::endgroup::" - - name: Setup Tox environment - run: tox --workdir /tmp/tox run-parallel --parallel auto --parallel-no-spinner --parallel-live --colored yes -e test-all-py310 --notest + - name: Install project + run: | + python -m pip install -e . - - name: Test with tox - run: tox --workdir /tmp/tox run --skip-pkg-install --result-json results/tox-py310.json --colored yes -e test-all-py310 + - name: Run coverage + run: | + make test-coverage + + - name: Upload test results + if: success() || failure() + uses: actions/upload-artifact@v4 + with: + name: test-results-ubuntu-24.04 + path: results/ - name: Run TICS analysis uses: tiobe/tics-github-action@v3 - env: - PATH: "/tmp/tox/test-all-py310/bin:/snap/bin:/home/runner/.local/bin:/home/runner/.cargo/bin:/bin:/usr/bin:/usr/local/bin:" with: mode: qserver project: snapcraft diff --git a/.github/workflows/tox.yaml b/.github/workflows/tox.yaml deleted file mode 100644 index fff2b8a938..0000000000 --- a/.github/workflows/tox.yaml +++ /dev/null @@ -1,78 +0,0 @@ -name: Tox -on: - push: - branches: - - "main" - - "snapcraft/7.0" - - "release/*" - - "hotfix/*" - pull_request: - -jobs: - linters: - runs-on: ubuntu-24.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install dependencies - run: | - echo "::group::Begin snap install" - echo "Installing snaps in the background while running apt and pip..." - sudo snap install --no-wait --classic pyright --revision 735 # version 1.1.344 - sudo snap install --no-wait shellcheck ruff - echo "::endgroup::" - echo "::group::apt-get update" - sudo apt-get update - echo "::endgroup::" - echo "::group::apt-get install..." - sudo apt-get install --yes python3 python3-dev libapt-pkg-dev libyaml-dev xdelta3 - echo "::endgroup::" - echo "::group::pip install" - python -m pip install 'tox<5.0' tox-gh - echo "::endgroup::" - echo "::group::Create virtual environments for linting processes." - tox run --colored yes -m lint build-docs --notest - echo "::endgroup::" - echo "::group::Build docs." - tox run --colored yes -e build-docs - echo "::endgroup::" - echo "::group::Wait for snap to complete" - snap watch --last=install - echo "::endgroup::" - - name: Run Linters - run: tox run --colored yes --skip-pkg-install -m lint - tests: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install dependencies - run: | - echo "::group::apt-get update" - sudo apt-get update - echo "::endgroup::" - echo "::group::apt-get install..." - sudo apt-get install -y python3 python3-dev libapt-pkg-dev libyaml-dev xdelta3 - echo "::endgroup::" - echo "::group::pip install" - python -m pip install 'tox<5.0' tox-gh - echo "::endgroup::" - mkdir -p results - - name: Setup Tox environments - run: tox run-parallel --parallel auto --parallel-no-spinner --parallel-live --colored yes -e test-py312,test-legacy-py312 --notest - - name: Test with tox - run: tox run --skip-pkg-install --result-json results/tox-ubuntu-24.04.json --colored yes -e test-py312,test-legacy-py312 - - name: Upload code coverage - uses: codecov/codecov-action@v5 - with: - directory: ./results/ - files: coverage*.xml - - name: Upload test results - if: success() || failure() - uses: actions/upload-artifact@v4 - with: - name: test-results-ubuntu-24.04 - path: results/ diff --git a/.gitignore b/.gitignore index bdfd02fc87..eccc827adf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,44 +1,116 @@ -build -Cargo.lock -.coverage** -coverage-* -demos/*/parts/ -demos/*/prime/ -demos/**/*.snap -demos/*/snap/.snapcraft/ -demos/*/stage/ -.direnv -dist -docs/**.html -docs/reference.md -docs/reference/commands -docs/.sphinx -docs/_build -docs/common -*.egg-info +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +develop-eggs/ +dist/ +downloads/ +eggs/ .eggs/ -.envrc -htmlcov -.idea -.mypy_cache -/parts +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ pip-wheel-metadata/ -/prime -*.pyc -__pycache__ -.pytest_cache -*.comp +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg *.snap +MANIFEST + +# Build outputs +*.comp +/snapcraft/_version.py snap/.snapcraft/ +*.snap + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Docs +docs/_build +# Auto-generated command reference +docs/common/craft-parts +docs/reference/commands + +# Unit test / coverage reports +htmlcov/ +.cache +.coverage +.coverage.* +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +.results.*.xml .spread_multipass .spread-reuse.* -/stage -*.swp -target -tests/unit/snap/ -tests/unit/stage/ -test-results* -.tox +results/ + +# Translations +*.mo +*.pot + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Environments +.env +.envrc +.direnv +.venv/ +.venv.bak/ +venv/ +venv.bak/ +env/ +ENV/ +env.bak/ + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Lifecycle +build/ +parts/ +prime/ +stage/ + +# Python virtual environment +venv/ +.venv/ + +# backups +*~ +.*.*swp + +# Editor configs +.idea .vscode -venv -.venv +.spyderproject +.spyproject diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..7fed7d6cb4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,28 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: "v5.0.0" + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: check-merge-conflict + - id: check-toml + - id: fix-byte-order-marker + - id: mixed-line-ending + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.9.3" + hooks: + # Run the linter + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + # Run the formatter + - id: ruff-format + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "" # Intentionally blank, despite the warning. + hooks: + - id: prettier + additional_dependencies: + - prettier@3.4.2 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..b831ceaf39 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +# Git submodules +docs/sphinx-resources +tests/spread/tools/snapd-testing-tools diff --git a/.readthedocs.yaml b/.readthedocs.yaml index d1d77d291a..d5ef338b0b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -15,18 +15,20 @@ build: apt_packages: - libapt-pkg-dev jobs: + create_environment: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + install: + - uv sync --frozen --group docs --group dev-noble + build: + html: + - uv run sphinx-build -T -b dirhtml docs $READTHEDOCS_OUTPUT/html post_checkout: - - git fetch --tags --unshallow # Also fetch tags - - git describe # Make sure we get a proper version + - git fetch --tags --unshallow # Also fetch tags + - git describe # Make sure we get a proper version # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py - builder: dirhtml fail_on_warning: true - -python: - install: - - requirements: requirements-docs.txt - - method: pip - path: . diff --git a/.shellcheckrc b/.shellcheckrc deleted file mode 100644 index 99235f886e..0000000000 --- a/.shellcheckrc +++ /dev/null @@ -1,5 +0,0 @@ -# NOTE: these disables are only necessary while the core24 spread tests are -# being fixed; they refer to unreachable code, unused variable, etc. -# This file must be removed once all tests in tests/spread/core24/ are fixed. -disable=SC2317,SC2034,SC2154 - diff --git a/.yamllint.yaml b/.yamllint.yaml index 752f322a53..09da41146a 100644 --- a/.yamllint.yaml +++ b/.yamllint.yaml @@ -18,7 +18,7 @@ rules: octal-values: enable truthy: check-keys: false - # Changes from starbase start here + # Changes from starbase start here level: warning indentation: disable trailing-spaces: disable diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index eae850e874..69f4b99747 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,22 +14,22 @@ appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities diff --git a/CODE_STYLE.md b/CODE_STYLE.md index 7d9a1b6105..d8d2eb7100 100644 --- a/CODE_STYLE.md +++ b/CODE_STYLE.md @@ -13,30 +13,30 @@ tests. Some other rules are only socially enforced during code reviews. ## Code Formatting -This code base adheres to black[2]. -You can `snap install black --beta --devmode` to install the linter and formatter onto your host. +This code base adheres to [Ruff][2]. +You can `snap install ruff` to install the linter and formatter onto your host. ## Conditionals -* Always check for expected value e.g.; `if foo is True` instead of `if foo` +- Always check for expected value e.g.; `if foo is True` instead of `if foo` or `if foo is not None`. - + ## Methods -* Return only once from a method unless it is through a guard. -* Method names should start with a =verb= unless it is a `@property`. -* Attribute names should be a `noun`. +- Return only once from a method unless it is through a guard. +- Method names should start with a =verb= unless it is a `@property`. +- Attribute names should be a `noun`. ## Classes -* `classmethods` should be defined before `__init__`. -* Serialization/marshalling/dumping shall use methods named `marshal` and +- `classmethods` should be defined before `__init__`. +- Serialization/marshalling/dumping shall use methods named `marshal` and `unmarshal` but if specific types are serialized we append the information type, e.g.; `unmarshal_dict`. ## Iterating -* Always use generators, list comprehensions, reduce and functional resolution +- Always use generators, list comprehensions, reduce and functional resolution when possible. ## Multiline strings @@ -59,14 +59,14 @@ fix it. ## Tests -* When asserting for equality, we prefer to use the `Equals` matcher from +- When asserting for equality, we prefer to use the `Equals` matcher from testtools: - ``` - self.assertThat(actual, Equals(expected)) - ``` + ``` + self.assertThat(actual, Equals(expected)) + ``` -* When writing unit tests that raise errors, the tests should only check the +- When writing unit tests that raise errors, the tests should only check the class of the exception raised and it's attributes, not the format of the error message. The formatting of the exception as a string should be tested only once, in the module tests/unit/test_errors.py @@ -76,4 +76,4 @@ fix it. Generally speaking, all comments should end with some punctuation. [1]: TESTING.md -[2]: https://github.com/ambv/black +[2]: https://docs.astral.sh/ruff/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d995ba1aea..9cdd20d317 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,55 +8,54 @@ here. **Prerequisite:** Sign the [contributor license agreement][1]. This is how you give us permission to use your contributions. -1. If there is a [Snapcraft bug][2] you are trying to fix, please refer to - it here. If it is a feature that has not been discussed, please raise - awareness on https://forum.snapcraft.io under the *snapcraft* topic. This - will ensure that we're all on the same page, and your work is not in vain - or duplicating what someone else is already doing. This actually saves time! +1. If there is a [Snapcraft bug][2] you are trying to fix, please refer to + it here. If it is a feature that has not been discussed, please raise + awareness on https://forum.snapcraft.io under the _snapcraft_ topic. This + will ensure that we're all on the same page, and your work is not in vain + or duplicating what someone else is already doing. This actually saves time! -2. We use a forking, feature-based workflow. +2. We use a forking, feature-based workflow. - Make a fork of Snapcraft, and create a branch named specifically for the - feature on which you'd like to work. Make your changes there, adding new - tests as needed, and make sure the existing tests continue to pass when your - changes are complete (for information see the [HACKING][3] and [TESTING][4] - documents). + Make a fork of Snapcraft, and create a branch named specifically for the + feature on which you'd like to work. Make your changes there, adding new + tests as needed, and make sure the existing tests continue to pass when your + changes are complete (for information see the [HACKING][3] and [TESTING][4] + documents). -3. We try to follow a consistent and readable code style. Read the - [CODE_STYLE][5] document and please make sure that your code complies. +3. We try to follow a consistent and readable code style. Read the + [CODE_STYLE][5] document and please make sure that your code complies. -4. Squash commits into one, well-formatted commit. If you really feel like there - should be more than one commit in your branch, then you're probably trying to - introduce more than one feature and you should make another branch for - it. +4. Squash commits into one, well-formatted commit. If you really feel like there + should be more than one commit in your branch, then you're probably trying to + introduce more than one feature and you should make another branch for + it. - This is important: your commit diff says what changed, but only the commit - message can say why the change was necessary. In an effort to take good care - of our `git log`, we try to follow this template for commit messages: + This is important: your commit diff says what changed, but only the commit + message can say why the change was necessary. In an effort to take good care + of our `git log`, we try to follow this template for commit messages: + ``` + : lower-case summary of changes - ``` - : lower-case summary of changes + More detailed explanatory text, if necessary. Wrap it to 72 characters. + Think of this like an email, where you have a subject line and a body. - More detailed explanatory text, if necessary. Wrap it to 72 characters. - Think of this like an email, where you have a subject line and a body. + ``` - ``` + Try to keep the summary to around 50 characters, and use the imperative mood. + A good rule of thumb is that, if you extract the `` from + the summary, it should be able to complete the following sentence: - Try to keep the summary to around 50 characters, and use the imperative mood. - A good rule of thumb is that, if you extract the `` from - the summary, it should be able to complete the following sentence: + ``` + If applied, this commit will . + ``` - ``` - If applied, this commit will . - ``` - -5. Submit a pull request to get changes from your branch into master. Mention - which bug is being resolved in the description of the pull request (bonus - points if it's a hyperlink to the bug itself). +5. Submit a pull request to get changes from your branch into master. Mention + which bug is being resolved in the description of the pull request (bonus + points if it's a hyperlink to the bug itself). [1]: http://www.ubuntu.com/legal/contributors/ [2]: https://bugs.launchpad.net/snapcraft [3]: HACKING.md [4]: TESTING.md -[5]: CODE_STYLE.md \ No newline at end of file +[5]: CODE_STYLE.md diff --git a/HACKING.md b/HACKING.md index 52ca1d715c..a7e3af3629 100644 --- a/HACKING.md +++ b/HACKING.md @@ -23,61 +23,82 @@ newgrp lxd Setup the environment by running: ```shell -./tools/environment-setup.sh +make setup ``` -To work inside this environment, run: +### Tooling + +We use a large number of tools for our project. Most of these are installed for +you with `make setup`, but you'll need to install Python 3.12 separately. + +### Testing + +For unit testing, you can use `make` recipes: ```shell -lxc exec snapcraft-dev -- sudo -iu ubuntu bash +make test # All unit tests +make test-fast # Only the fast tests +make test-slow # Only the slow tests ``` -Import your keys (`ssh-import-id`) and add a `Host` entry to your ssh config if you are interested in [Code's](https://snapcraft.io/code) [Remote-SSH](https://code.visualstudio.com/docs/remote/ssh) plugin. +For integration testing, Snapcraft uses [Spread](https://github.com/canonical/spread). Spread is a system for distributing tests and executing them in different backends, in parallel. In order to use spread, first build Snapcraft using: -### Tooling +```shell +snapcraft pack +``` -We use a large number of tools for our project. Most of these are installed for -you with tox, but you'll need to install: +Then, move the resulting snap into the tests directory: -- Python 3.12 (default on Ubuntu 24.04) with setuptools. -- [tox](https://tox.wiki) version 3.8 or later -- [pyright](https://github.com/microsoft/pyright) (also available via snap: `snap install pyright`) -- [ruff](https://github.com/astral/ruff) (also available via snap: `snap install ruff`) -- [ShellCheck](https://www.shellcheck.net/) (also available via snap: `snap install shellcheck`) +```shell +mv *.snap tests/ +``` -### Testing +Next, install Spread with Go: + +``` +go install github.com/snapcore/spread/cmd/spread@latest +``` + +Note: Ensure that the `$HOME/go/bin` directory is on your path after installation. + +Then, you can run the integration tests using a local LXD backend with: + +``` +spread -v lxd: +``` -See the [Testing guide](TESTING.md). +Or, you can run them in Google Cloud if you have a `SPREAD_GOOGLE_KEY`, with: + +```shell +SPREAD_GOOGLE_KEY={key} spread -v google: +``` ### Enabling debug output Given that the `--debug` option in snapcraft is reserved for project specific debugging, enabling for the `logger.debug` calls is achieved by setting the "SNAPCRAFT_ENABLE_DEVELOPER_DEBUG" environment variable to a truthful value. Snapcraft's internal tools, e.g.; `snapcraftctl` should pick up this environment variable as well. - ## Documentation - ### Build To render the documentation as HTML in `docs/_build`, run: ```shell -tox run -e build-docs +make docs ``` > **Important** -> +> > Interactive builds are currently defective and cause an infinite loop. [This GitHub issue](https://github.com/sphinx-doc/sphinx/issues/11556#issuecomment-1667451983) posits that this is caused by by pages referencing each other. If you prefer to compose pages interactively, you can host the documentation on a local server: ```shell -tox run -e autobuild-docs +make auto-docs ``` You can reach the interactive site at http://127.0.0.1:8080 in a web browser. - ### Test The documentation Makefile provided by the [Sphinx Starter Pack](https://github.com/canonical/sphinx-docs-starter-pack) provides a number of natural language checks such as style guide adherence, inclusive words, and product terminology, however they currently aren't configured correctly for Snapcraft. Instead, you can validate for basic language and syntax using two of the development tests. @@ -85,16 +106,15 @@ The documentation Makefile provided by the [Sphinx Starter Pack](https://github. To check for syntax errors in documentation, run: ```shell -tox run -e lint-docs +make lint-docs ``` For a rudimentary spell check, you can use codespell: ```shell -tox run -e lint-codespell +make lint-codespell ``` - ## Evaluating pull requests Oftentimes all you want to do is see if a given pull request solves the issue you were having. To make this easier, a snap is published for `amd64` on a channel named `latest/edge/pr-` where `PR number` is the number of the pull request. diff --git a/Makefile b/Makefile index 2f9f7f40b4..93b96c6d5c 100644 --- a/Makefile +++ b/Makefile @@ -1,55 +1,104 @@ -SOURCES=setup.py snapcraft tests/*.py tests/unit -SOURCES_LEGACY=snapcraft_legacy tests/legacy +PROJECT=snapcraft +UV_TEST_GROUPS := "--group=dev" +UV_DOCS_GROUPS := "--group=docs" +UV_LINT_GROUPS := "--group=lint" "--group=types" -.PHONY: autoformat-black -autoformat-black: - tox run -e format-black +ifneq ($(wildcard /etc/os-release),) +include /etc/os-release +endif +ifdef VERSION_CODENAME +UV_TEST_GROUPS += "--group=dev-$(VERSION_CODENAME)" +UV_DOCS_GROUPS += "--group=dev-$(VERSION_CODENAME)" +UV_LINT_GROUPS += "--group=dev-$(VERSION_CODENAME)" +endif -.PHONY: freeze-requirements -freeze-requirements: - tools/freeze-requirements.sh +include common.mk -.PHONY: test-black -test-black: - tox run -e lint-black +.PHONY: format +format: format-ruff format-codespell format-prettier ## Run all automatic formatters -.PHONY: test-codespell -test-codespell: - tox run -e lint-codespell +# Override the common.mk lint-docs target until https://github.com/canonical/snapcraft/issues/5229 is resolved +.PHONY: lint-docs +lint-docs: ##- Lint the documentation +ifneq ($(CI),) + @echo ::group::$@ +endif + uv run $(UV_DOCS_GROUPS) sphinx-lint --ignore docs/reference/commands --ignore docs/_build --enable all $(DOCS) -d missing-underscore-after-hyperlink,missing-space-in-hyperlink,line-too-long +ifneq ($(CI),) + @echo ::endgroup:: +endif -.PHONY: test-mypy -test-mypy: - tox run -e lint-mypy - -.PHONY: test-pydocstyle -test-pydocstyle: - tox run -e lint-docstyle - -.PHONY: test-pyright -test-pyright: - tox run -e lint-pyright +.PHONY: lint +lint: lint-ruff lint-codespell lint-mypy lint-prettier lint-pyright lint-shellcheck lint-docs lint-twine ## Run all linters -.PHONY: test-ruff -test-ruff: - ruff check +.PHONY: pack +pack: pack-pip ## Build all packages -.PHONY: test-shellcheck -test-shellcheck: - tox run -e lint-shellcheck +.PHONY: pack-snap +pack-snap: snap/snapcraft.yaml ##- Build snap package +ifeq ($(shell which snapcraft),) + sudo snap install --classic snapcraft +endif + snapcraft pack -.PHONY: test-legacy-units -test-legacy-units: - tox run -e test-legacy-py312 +.PHONY: publish +publish: publish-pypi ## Publish packages -.PHONY: test-units -test-units: test-legacy-units - tox run -e test-py312 +.PHONY: publish-pypi +publish-pypi: clean package-pip lint-twine ##- Publish Python packages to pypi + uv tool run twine upload dist/* -.PHONY: tests -tests: tests-static test-units +# Find dependencies that need installing +APT_PACKAGES := +ifeq ($(wildcard /usr/include/libxml2/libxml/xpath.h),) +APT_PACKAGES += libxml2-dev +endif +ifeq ($(wildcard /usr/include/libxslt/xslt.h),) +APT_PACKAGES += libxslt1-dev +endif +ifeq ($(wildcard /usr/share/doc/python3-venv/copyright),) +APT_PACKAGES += python3-venv +endif +ifeq ($(wildcard /usr/share/doc/libapt-pkg-dev/copyright),) +APT_PACKAGES += libapt-pkg-dev +endif +ifeq ($(wildcard /usr/share/doc/libgit2-dev/copyright),) +APT_PACKAGES += libgit2-dev +endif +ifeq ($(shell which cargo),) +APT_PACKAGES += cargo +endif +ifeq ($(wildcard /usr/share/doc/python3-dev),) +APT_PACKAGES += python3-dev +endif +ifeq ($(wildcard /usr/share/doc/libffi8),) +APT_PACKAGES += libffi-dev +endif +ifeq ($(wildcard /usr/share/doc/pkg-config/copyright),) +APT_PACKAGES += pkg-config +endif +ifeq ($(wildcard /usr/share/doc/libssl-dev/copyright),) +APT_PACKAGES += libssl-dev +endif +ifeq ($(wildcard /usr/share/doc/libyaml-dev/copyright),) +APT_PACKAGES += libyaml-dev +endif +# Needed for xdelta3 tests +ifeq ($(wildcard /usr/share/doc/xdelta3/copyright),) +APT_PACKAGES += xdelta3 +endif -.PHONY: tests-static -tests-static: test-black test-codespell test-ruff test-mypy test-pydocstyle test-pyright test-shellcheck +# Used for installing build dependencies in CI. +.PHONY: install-build-deps +install-build-deps: install-lint-build-deps +ifeq ($(APT_PACKAGES),) +else ifeq ($(shell which apt-get),) + $(warning Cannot install build dependencies without apt.) + $(warning Please ensure the equivalents to these packages are installed: $(APT_PACKAGES)) +else + sudo $(APT) install $(APT_PACKAGES) +endif -.PHONY: lint -lint: tests-static +# If additional build dependencies need installing in order to build the linting env. +.PHONY: install-lint-build-deps +install-lint-build-deps: diff --git a/README.md b/README.md deleted file mode 100644 index e8b6707df8..0000000000 --- a/README.md +++ /dev/null @@ -1,32 +0,0 @@ -[![snapcraft](https://snapcraft.io/snapcraft/badge.svg)](https://snapcraft.io/snapcraft) -[![Documentation Status](https://readthedocs.com/projects/canonical-snapcraft/badge/?version=latest)](https://canonical-snapcraft.readthedocs-hosted.com/en/latest/?badge=latest) -[![Scheduled spread tests](https://github.com/canonical/snapcraft/actions/workflows/spread-scheduled.yaml/badge.svg?branch=main)](https://github.com/canonical/snapcraft/actions/workflows/spread-scheduled.yaml) -[![Coverage Status][codecov-image]][codecov-url] -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) - - -# Snapcraft - -Package, distribute, and update any app for Linux and IoT. - -Snaps are containerised software packages that are simple to create and -install. They auto-update and are safe to run. And because they bundle their -dependencies, they work on all major Linux systems without modification. - -[Build your first snap](https://docs.snapcraft.io/build-snaps/languages) or learn more about how [Snapcraft can help you](https://snapcraft.io). - -## Get support - -We’re here to help. Ask your questions at the [Snapcraft Forum](https://forum.snapcraft.io). Report bugs on [Launchpad](https://bugs.launchpad.net/snapcraft/+filebug). - -Learn about the latest features by following Snapcraft on -[Twitter](https://twitter.com/snapcraftio) or -[Facebook](https://www.facebook.com/snapcraftio). - -## Contribute to Snapcraft - -We love contributors. Read the [hacking guide](HACKING.md) if you're interested in helping out. - - -[codecov-image]: https://codecov.io/github/canonical/snapcraft/coverage.svg?branch=master -[codecov-url]: https://codecov.io/github/canonical/snapcraft?branch=master diff --git a/README.rst b/README.rst new file mode 100644 index 0000000000..3cd608d0e8 --- /dev/null +++ b/README.rst @@ -0,0 +1,44 @@ +|snapcraft| |Documentation Status| |Scheduled spread tests| |Coverage +Status| |Code style: ruff| + +Snapcraft +========= + +Package, distribute, and update any app for Linux and IoT. + +Snaps are containerised software packages that are simple to create and +install. They auto-update and are safe to run. And because they bundle +their dependencies, they work on all major Linux systems without +modification. + +`Build your first +snap `__ or learn more +about how `Snapcraft can help you `__. + +Get support +----------- + +We're here to help. Ask your questions at the `Snapcraft +Forum `__. Report bugs on +`Launchpad `__. + +Learn about the latest features by following Snapcraft on +`Twitter `__ or +`Facebook `__. + +Contribute to Snapcraft +----------------------- + +We love contributors. Read the `hacking guide `__ if you're +interested in helping out. + +.. |snapcraft| image:: https://snapcraft.io/snapcraft/badge.svg + :target: https://snapcraft.io/snapcraft +.. |Documentation Status| image:: https://readthedocs.com/projects/canonical-snapcraft/badge/?version=latest + :target: https://canonical-snapcraft.readthedocs-hosted.com/en/latest/?badge=latest +.. |Scheduled spread tests| image:: https://github.com/canonical/snapcraft/actions/workflows/spread-scheduled.yaml/badge.svg?branch=main + :target: https://github.com/canonical/snapcraft/actions/workflows/spread-scheduled.yaml +.. |Coverage Status| image:: https://codecov.io/github/canonical/snapcraft/coverage.svg?branch=master + :target: https://codecov.io/github/canonical/snapcraft?branch=master +.. |Code style: ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json + :target: https://docs.astral.sh/ruff/formatter/ diff --git a/TESTING.md b/TESTING.md deleted file mode 100644 index 2d4671d6ce..0000000000 --- a/TESTING.md +++ /dev/null @@ -1,195 +0,0 @@ -# Snapcraft tests - -## Manual tests - -Snapcraft has a few manual tests documented in [manual-tests.md](manual-tests.md). -These are tests for features that are not possible to automate, or that the complexity of automating them is too high while the time it takes to run them by hand is not too much. - -We try very hard to automate as much as possible and to keep the manual test suite as small as possible. Please do not add a manual test before discussing it with the team, and make sure that there are very good reasons not to automate it. - -When running manual tests against the production store, make sure to use the test user email account and the well-known test prefixes, since these snaps will pollute the store. To register a user, use an email address like snapcraft-test+-@canonical.com (e.g., snapcraft-test+elopio-123@canonical.com). This will send the confirmation email and any notifications to the inbox of snapcraft-test@canonical.com, and the snapcraft team has the password to access that inbox. To register a snap or anything else that has a name, like tracks, keys, etc., prefix the name with test-snapcraft and your name (e.g., test-snapcraft-snap-elopio-123, test-snapcraft-track-elopio-111). - -### Staging server - -Snapcraft has the ability to upload snaps for publication in the Snappy Store. If you're working on a feature that requires you to interact with the store, you might want to use the staging server instead of the production store. To do that, make sure you have an account on the [staging server](https://login.staging.ubuntu.com), then run: - - source tools/staging_env.sh - -You will see a prompt indicating that you are going to be talking to the staging server. Once you are done working with the staging servers you can run `deactivate`. - -## Automated tests in the snapcraft repository - -The snapcraft repository has multiple suites of automated tests which run the code at different levels, following different principles of what to execute, how to force different code paths, and how to verify the results. - -### Static tests - -The static tests suite performs a static analysis on the source code without executing it. It will catch syntax and code style errors. - -### Unit tests - -The unit tests is a suite of low-level white box tests. They exercise units of code to verify that the different parts work as expected in a fully isolated way. Ideally, these tests should call only public functions, objects and methods, leaving the internals of snapcraft as implementation details that can change without having to modifying any tests. To isolate the units from their environment and dependencies we can replace those with test doubles. In order to set up test doubles, we prefer dependency injection through arguments than excessive mocking. These tests can verify the results checking the output printed to the command line, checking the files created during the execution, inspecting the calls made to the test doubles and verifying that the expected exceptions were thrown. - -These tests are in the `tests/unit` directory. - -### Integration tests - -The integration tests are a group of suites that exercise snapcraft as a black box. They are only allowed to set up the environment where snapcraft runs and create files; but for the execution phase of the test they can only run the snapcraft command or one of its subcommands. To verify the results they can check the output printed to the command line, the return value of the snapcraft command, and any files created during the execution. - -These tests are in the `tests/integration` directory, with the `snapcraft.yamls` and other source files for the tests snaps in `tests/integration/snaps`. - -At any time, an integration test may fail and given the use of temporary directories it can be hard to inspect what went on. When working on a specific test case you can set the environment variable `SNAPCRAFT_TEST_KEEP_DATA_PATH` to a directory path for the sepecic test. -This mechanism will only work when working with individual tests and will fail to run with a batch of them. - -### Snaps tests - -The snaps tests is a suite of high-level tests that try to simulate real-world scenarios of a user interacting with snapcraft. They cover the call to snapcraft to generate a snap file from the source files of a fully functional project, the installation of the resulting snap, and the execution of the binaries and services of this snap. - -These tests are in the `snaps_tests` directory, with the sources for the test snaps in the `demos` directory. - -### Setting up the environment - -In order to run these tests suites, first you will need to set up your development environment. Follow the steps in the [Hacking guide](HACKING.md) to install for development. - -### Running the tests - -To run the static tests, execute: - - make tests-static - -To run the unit tests, execute: - - make test-units - -...or use pytest directly: - - pytest tests/unit - -You can also run a subsuite of the unit suites specifying the path to the directory. -For example: - - * To run only the unit tests for the plugins: - - ``` - pytest tests/unit/parts/plugins - ``` - - * To run only the integration tests for the store: - - ``` - pytest tests/unit/store - ``` - -The snaps tests script has more complex arguments. For an explanation of them, run: - - python3 -m snaps_tests -h - -The integration and snaps suites can be run using the snapcraft source from the repository, or using the snapacraft command installed in the system. By default, they will use the source code, so you can modify your clone of the repository and verify that your changes are correct. If instead you want to verify that the snapcraft version installed in your system is correct, run them with the environment variable `SNAPCRAFT_PACKAGE_TYPE` set to either "snap" or "deb", like this: - - SNAPCRAFT_PACKAGE_TYPE=snap ./runtests.sh tests/integration - -or - - SNAPCRAFT_PACKAGE_TYPE=type ./runtests.sh tests/integration - -## Setting up the store test user - -The store tests by default will start fake servers that are configured to reply like the real store does. But you can run them also against the staging and production store servers. To do that, you will need to set the `TEST_STORE` environment variable to either `staging` or `production`, and you also have to pass credentials for a valid user in that store with the environment variable `TEST_USER_EMAIL` and `TEST_USER_PASSWORD`, like this: - - TEST_STORE=staging TEST_USER_EMAIL=test@example.com TEST_USER_PASSWORD=Hola123* ./runtests.sh tests/integration/store - -To prepare a user for testing, go to https://login.staging.ubuntu.com/ (or -https://login.ubuntu.com/ for the production store) and create a new user. Then -go to https://dashboard.staging.snapcraft.io/ (or -https://dashboard.staging.snapcraft.io/ for the production store) to sign the -developer agreement. - -Note that most testing should be done on the staging server. If multiple tests -have to be executed on production, notify the store team before. - -## Testing on macOS - -We can currently run a minimal subset of snapcraft integration tests on macOS. They are run by travis, using a brew formula that builds the installer from the branch. Once the virtualization tool for Ubuntu on mac is finalized, the full suite can be executed. - -For manual exploratory testing, the team has one mac machine available. - -## Spread tests for the snapcraft snap - -[Spread](https://github.com/canonical/spread) is a system to distribute tests and execute them in different backends, in parallel. We are currently using spread only to run the integration suite using the installed snapcraft snap from the edge channel. - -To run them, first, download the spread binary: - - curl -s -O https://storage.googleapis.com/snapd-spread-tests/spread/spread-amd64.tar.gz && tar xzvf spread-amd64.tar.gz - -Then, you can run them using a local LXD as the backend with: - - ./spread -v lxd: - -Or, you can run them in google if you have a `SPREAD_GOOGLE_KEY`, with: - - SPREAD_GOOGLE_KEY={key} ./spread -v google: - -## Testing arm - -It is possible to emulate an arm64 machine on an amd64 host, which is very useful for running manual exploratory tests for snapcraft. To set it up: - -1. Download the latest ubuntu arm64 uefi image from https://cloud-images.ubuntu.com/releases/16.04/release/ -2. Keep a pristine copy of the image, in case you want to reset the machine, replacing with the name of the file you downloaded on step 1: - - ``` - $ cp .pristine - ``` - -3. Download the latest UEFI firmware image QEMU_EFI.fd from https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/ -4. Create a cloud init file, replacing with your values: - - ``` - $ cat > cloud-data.yaml << EOF - #cloud-config - users: - - name: $USER - ssh-import-id: - sudo: ['ALL=(ALL) NOPASSWD:ALL'] - groups: sudo - shell: /bin/bash - EOF - ``` - -5. Create a cloud config disk image on the file `cloud-config.img`: - - ``` - $ sudo apt install --yes cloud-image-utils - $ cloud-localds --disk-format qcow2 cloud-config.img cloud-data.yaml - ``` - -6. Run the image in qemu, replacing with the path of the file you downloaded on step 1. - - ``` - $ sudo apt install qemu-system-arm - $ qemu-system-aarch64 \ - -smp 2 \ - -m 1024 \ - -M virt \ - -cpu cortex-a57 \ - -bios QEMU_EFI.fd \ - -nographic \ - -device virtio-blk-device,drive=image \ - -drive if=none,id=image,file= \ - -device virtio-blk-device,drive=cloud \ - -drive if=none,id=cloud,file=cloud-config.img \ - -device virtio-net-device,netdev=user0 \ - -netdev user,id=user0 \ - -redir tcp:2222::22 - ``` - -This will show a few errors, and a weird screen while the machine boots. -TODO: research how to make it nicer, but for now, just be patient until the login prompt appears. - -7. ssh into the emulated machine: - - ``` - $ ssh -p 2222 localhost - ``` - -(Source: https://gist.github.com/george-hawkins/16ee37063213f348a17717a7007d2c79) - -To test snapcraft on an armhf machine, currently the only simple option is to install ubuntu classic on BeagleBoard (https://elinux.org/BeagleBoardUbuntu) or on Raspberry Pi 2 (https://wiki.ubuntu.com/ARM/RaspberryPi). diff --git a/appveyor.yml b/appveyor.yml index 7f4a447663..a8f1b9a7b5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,68 +7,67 @@ environment: TIMESTAMP_SERVICE: http://timestamp.digicert.com matrix: - - PYTHON: C:\Python310-x64 + - PYTHON: C:\Python310-x64 cache: -- '%LOCALAPPDATA%\pip\Cache\http' -- '%LOCALAPPDATA%\pip\Cache\wheels' + - '%LOCALAPPDATA%\pip\Cache\http' + - '%LOCALAPPDATA%\pip\Cache\wheels' build: off install: -- cmd: | - %PYTHON%\python.exe -m venv venv - venv\Scripts\activate.bat - python -c "import sys; print(sys.executable)" - python -m pip install -r requirements-devel.txt - python -m pip install --prefix %VIRTUAL_ENV% -e . - venv\Scripts\deactivate.bat + - cmd: | + %PYTHON%\python.exe -m venv venv + venv\Scripts\activate.bat + python -c "import sys; print(sys.executable)" + python -m pip install --prefix %VIRTUAL_ENV% -e . + venv\Scripts\deactivate.bat build_script: -- cmd: | - echo "Building snapcraft.exe..." - venv\Scripts\activate.bat - pyinstaller.exe snapcraft.spec - venv\Scripts\deactivate.bat + - cmd: | + echo "Building snapcraft.exe..." + venv\Scripts\activate.bat + pyinstaller.exe snapcraft.spec + venv\Scripts\deactivate.bat - echo "Test signing snapcraft.exe..." - powershell.exe windows\generate-self-signed-cert.ps1 - "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft.exe + echo "Test signing snapcraft.exe..." + powershell.exe windows\generate-self-signed-cert.ps1 + "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft.exe - echo "Setting Snapcraft version..." - venv\Scripts\activate.bat - python -m tools.version set-snapcraft-iss - venv\Scripts\deactivate.bat - echo "Building snapcraft inno installer..." - "%INNOCC%" windows\snapcraft.iss + echo "Setting Snapcraft version..." + venv\Scripts\activate.bat + python -m tools.version set-snapcraft-iss + venv\Scripts\deactivate.bat + echo "Building snapcraft inno installer..." + "%INNOCC%" windows\snapcraft.iss - copy dist\snapcraft-installer.exe dist\snapcraft-installer-self-signed.exe - echo "Test signing snapcraft inno installer..." - "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft-installer-self-signed.exe + copy dist\snapcraft-installer.exe dist\snapcraft-installer-self-signed.exe + echo "Test signing snapcraft inno installer..." + "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft-installer-self-signed.exe - echo "Building snapcraft msix installer..." - mkdir dist\msix - copy dist\snapcraft.exe dist\msix\ - copy windows\snapcraft.png dist\msix\ - copy windows\AppxManifest.xml dist\msix\ - "%MAKEAPPX%" pack /h SHA256 /d dist\msix /p dist\snapcraft-installer.msix + echo "Building snapcraft msix installer..." + mkdir dist\msix + copy dist\snapcraft.exe dist\msix\ + copy windows\snapcraft.png dist\msix\ + copy windows\AppxManifest.xml dist\msix\ + "%MAKEAPPX%" pack /h SHA256 /d dist\msix /p dist\snapcraft-installer.msix - echo "Test signing snapcraft msix installer..." - "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft-installer.msix + echo "Test signing snapcraft msix installer..." + "%SIGNTOOL%" sign /fd SHA256 /td SHA256 /tr "%TIMESTAMP_SERVICE%" /f test-signing.pfx /p Password1234 dist\snapcraft-installer.msix test_script: -- cmd: | - echo "Smoke testing snapcraft.exe..." - dist\snapcraft.exe version - mkdir test - cd test - ..\dist\snapcraft.exe init - cd .. + - cmd: | + echo "Smoke testing snapcraft.exe..." + dist\snapcraft.exe version + mkdir test + cd test + ..\dist\snapcraft.exe init + cd .. - echo "Smoke testing snapcraft-installer-self-signed.exe..." - start /wait "SNAPCRAFT INSTALLER" dist\snapcraft-installer-self-signed.exe /VERYSILENT /ALLUSERS - "%SNAPCRAFT_INSTALLED_EXE%" version + echo "Smoke testing snapcraft-installer-self-signed.exe..." + start /wait "SNAPCRAFT INSTALLER" dist\snapcraft-installer-self-signed.exe /VERYSILENT /ALLUSERS + "%SNAPCRAFT_INSTALLED_EXE%" version artifacts: -#- path: dist\snapcraft.exe -- path: dist\snapcraft-installer.exe + #- path: dist\snapcraft.exe + - path: dist\snapcraft-installer.exe #- path: dist\snapcraft-installer.msix diff --git a/common.mk b/common.mk new file mode 100644 index 0000000000..329e5fd9c3 --- /dev/null +++ b/common.mk @@ -0,0 +1,287 @@ +# Common items for all Starcraft Makefiles. Should only be edited in the `starbase` repository: +# https://github.com/canonical/starbase + +SOURCES=$(wildcard *.py) $(PROJECT) tests +DOCS=docs + +ifneq ($(OS),Windows_NT) + OS := $(shell uname) +endif +ifdef CI + APT := apt-get --yes +else + APT := apt-get +endif + +PRETTIER=npm exec --package=prettier -- prettier +PRETTIER_FILES="**/*.{yaml,yml,json,json5,css,md}" + +# By default we should not update the uv lock file here. +export UV_FROZEN := true + +.DEFAULT_GOAL := help + +.ONESHELL: + +.SHELLFLAGS = -ec + +.PHONY: help +help: ## Show this help. + @printf "\e[1m%-30s\e[0m | \e[1m%s\e[0m\n" "Target" "Description" + printf "\e[2m%-30s + %-41s\e[0m\n" "------------------------------" "------------------------------------------------" + egrep '^[^:]+\: [^#]*##' $$(echo $(MAKEFILE_LIST) | tac --separator=' ') | sed -e 's/^[^:]*://' -e 's/:[^#]*/ /' | sort -V| awk -F '[: ]*' \ + '{ + if ($$2 == "##") + { + $$1=sprintf(" %-28s", $$1); + $$2=" | "; + print $$0; + } + else + { + $$1=sprintf(" └ %-25s", $$1); + $$2=" | "; + $$3=sprintf(" └ %s", $$3); + print $$0; + } + }' + +.PHONY: setup +setup: install-uv setup-precommit install-build-deps ## Set up a development environment + uv sync $(UV_TEST_GROUPS) $(UV_LINT_GROUPS) $(UV_DOCS_GROUPS) + +.PHONY: setup-tests +setup-tests: install-uv install-build-deps ##- Set up a testing environment without linters + uv sync $(UV_TEST_GROUPS) + +.PHONY: setup-lint +setup-lint: install-uv install-shellcheck install-pyright install-lint-build-deps ##- Set up a linting-only environment + uv sync $(UV_LINT_GROUPS) + +.PHONY: setup-docs +setup-docs: install-uv ##- Set up a documentation-only environment + uv sync --no-dev $(UV_DOCS_GROUPS) + +.PHONY: setup-precommit +setup-precommit: install-uv ##- Set up pre-commit hooks in this repository. +ifeq ($(shell which pre-commit),) + uv tool run pre-commit install +else + pre-commit install +endif + +.PHONY: clean +clean: ## Clean up the development environment + uv tool run pyclean . + rm -rf dist/ build/ docs/_build/ *.snap .coverage* + +.PHONY: autoformat +autoformat: format # Hidden alias for 'format' + +.PHONY: format-ruff +format-ruff: install-ruff ##- Automatically format with ruff + success=true + ruff check --fix $(SOURCES) || success=false + ruff format $(SOURCES) + $$success || exit 1 + +.PHONY: format-codespell +format-codespell: ##- Fix spelling issues with codespell + uv run codespell --toml pyproject.toml --write-changes $(SOURCES) + +.PHONY: format-prettier +format-prettier: install-npm ##- Format files with prettier + $(PRETTIER) --write $(PRETTIER_FILES) + +.PHONY: lint-ruff +lint-ruff: install-ruff ##- Lint with ruff +ifneq ($(CI),) + @echo ::group::$@ +endif + ruff check $(SOURCES) + ruff format --diff $(SOURCES) +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-codespell +lint-codespell: install-codespell ##- Check spelling with codespell +ifneq ($(CI),) + @echo ::group::$@ +endif + uv run codespell --toml pyproject.toml $(SOURCES) +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-mypy +lint-mypy: ##- Check types with mypy +ifneq ($(CI),) + @echo ::group::$@ +endif + uv run mypy --show-traceback --show-error-codes $(PROJECT) +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-pyright +lint-pyright: ##- Check types with pyright +ifneq ($(CI),) + @echo ::group::$@ +endif +ifneq ($(shell which pyright),) # Prefer the system pyright + pyright --pythonpath .venv/bin/python +else + uv tool run pyright --pythonpath .venv/bin/python +endif +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-shellcheck +lint-shellcheck: ##- Lint shell scripts +ifneq ($(CI),) + @echo ::group::$@ +endif + git ls-files | file --mime-type -Nnf- | grep shellscript | cut -f1 -d: | xargs -r shellcheck +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-prettier +lint-prettier: install-npm ##- Lint files with prettier +ifneq ($(CI),) + @echo ::group::$@ +endif + $(PRETTIER) --check $(PRETTIER_FILES) +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-docs +lint-docs: ##- Lint the documentation +ifneq ($(CI),) + @echo ::group::$@ +endif + uv run $(UV_DOCS_GROUPS) sphinx-lint --max-line-length 88 --ignore docs/reference/commands --ignore docs/_build --enable all $(DOCS) -d missing-underscore-after-hyperlink,missing-space-in-hyperlink +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: lint-twine +lint-twine: pack-pip ##- Lint Python packages with twine +ifneq ($(CI),) + @echo ::group::$@ +endif + uv tool run twine check dist/* +ifneq ($(CI),) + @echo ::endgroup:: +endif + +.PHONY: test +test: ## Run all tests + uv run pytest + +.PHONY: test-fast +test-fast: ##- Run fast tests + uv run pytest -m 'not slow' + +.PHONY: test-slow +test-slow: ##- Run slow tests + uv run pytest -m 'slow' + +.PHONY: test-coverage +test-coverage: ## Generate coverage report + uv run coverage run --source $(PROJECT) -m pytest + uv run coverage xml -o coverage.xml + uv run coverage report -m + uv run coverage html + +.PHONY: docs +docs: ## Build documentation + uv run --group docs sphinx-build -b html -W $(DOCS) $(DOCS)/_build + +.PHONY: docs-auto +docs-auto: ## Build and host docs with sphinx-autobuild + uv run --group docs sphinx-autobuild -b html --open-browser --port=8080 --watch $(PROJECT) -W $(DOCS) $(DOCS)/_build + +.PHONY: pack-pip +pack-pip: ##- Build packages for pip (sdist, wheel) +ifneq ($(CI),) + @echo ::group::$@ +endif + uv build . +ifneq ($(CI),) + @echo ::endgroup:: +endif + +# Below are intermediate targets for setup. They are not included in help as they should +# not be used independently. + +.PHONY: install-uv +install-uv: +ifneq ($(shell which uv),) +else ifneq ($(shell which snap),) + sudo snap install --classic astral-uv +else ifneq ($(shell which brew),) + brew install uv +else ifeq ($(OS),Windows_NT) + pwsh -c "irm https://astral.sh/uv/install.ps1 | iex" +else + curl -LsSf https://astral.sh/uv/install.sh | sh +endif + +.PHONY: install-codespell +install-codespell: +ifneq ($(shell which codespell),) +else ifneq ($(shell which snap),) + sudo snap install codespell +else ifneq ($(shell which brew),) + make install-uv + uv tool install codespell +else + $(warning Codespell not installed. Please install it yourself.) +endif + +.PHONY: install-pyright +install-pyright: install-uv +ifneq ($(shell which pyright),) +else ifneq ($(shell which snap),) + sudo snap install --classic pyright +else + # Workaround for a bug in npm + [ -d "$(HOME)/.npm/_cacache" ] && chown -R `id -u`:`id -g` "$(HOME)/.npm" || true + uv tool install pyright +endif + +.PHONY: install-ruff +install-ruff: +ifneq ($(shell which ruff),) +else ifneq ($(shell which snap),) + sudo snap install ruff +else + make install-uv + uv tool install ruff +endif + +.PHONY: install-shellcheck +install-shellcheck: +ifneq ($(shell which shellcheck),) +else ifneq ($(shell which snap),) + sudo snap install shellcheck +else ifneq ($(shell which brew),) + brew install shellcheck +else + $(warning Shellcheck not installed. Please install it yourself.) +endif + +.PHONY: install-npm +install-npm: +ifneq ($(shell which npm),) +else ifneq ($(shell which snap),) + sudo snap install --classic node +else ifneq ($(shell which brew),) + brew install node +else + $(error npm not installed. Please install it yourself.) +endif diff --git a/docker/README.md b/docker/README.md index 4615244cbb..9972cff446 100644 --- a/docker/README.md +++ b/docker/README.md @@ -8,8 +8,8 @@ matches snap `base`. For example, to build `base: core24` snap: docker run -it -v `pwd`:/project ghcr.io/canonical/snapcraft:8_core24 - * `8` in `8_core24` is the version of snapcraft. - * `\; -v` construction at the end is required to see `snapcraft` output. +- `8` in `8_core24` is the version of snapcraft. +- `\; -v` construction at the end is required to see `snapcraft` output. For more details, see official `snapcraft-rocks` repo from Canonical. @@ -18,7 +18,7 @@ For more details, see official `snapcraft-rocks` repo from Canonical. `podman` was born as a rootless alternative to Docker. It is default on Fedora to have `podman` instead of Docker, but SELinux there doesn't allow containers to write to volumes, so we just turn this "feature" off with - `--security-opt label=disable`. +`--security-opt label=disable`. ```sh podman run -it --rm --security-opt label=disable \ diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index ef7e97f641..0f09c64e73 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -1,28 +1,28 @@ -@import url('https://fonts.googleapis.com/css2?family=Ubuntu:ital@0;1&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Ubuntu:ital@0;1&display=swap"); body { - font-family: Ubuntu, "times new roman", times, roman, serif; + font-family: Ubuntu, "times new roman", times, roman, serif; } div .toctree-wrapper { - column-count: 2; + column-count: 2; } -div .toctree-wrapper>ul { - margin: 0; +div .toctree-wrapper > ul { + margin: 0; } ul .toctree-l1 { - margin: 0; - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid-column; + margin: 0; + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid-column; } .wy-nav-content { - max-width: none; + max-width: none; } .log-snippets { - color: rgb(141, 141, 141); + color: rgb(141, 141, 141); } diff --git a/docs/howto/code/basic/task.yaml b/docs/howto/code/basic/task.yaml index dc65706e68..e8f939ff91 100644 --- a/docs/howto/code/basic/task.yaml +++ b/docs/howto/code/basic/task.yaml @@ -1,7 +1,6 @@ summary: test the "How to package and upload a snap with components" -restore: - rm -r *.snap +restore: rm -r *.snap execute: | unset SNAPCRAFT_BUILD_ENVIRONMENT diff --git a/docs/howto/code/components-organize/task.yaml b/docs/howto/code/components-organize/task.yaml index 87a416fcc0..71970ea009 100644 --- a/docs/howto/code/components-organize/task.yaml +++ b/docs/howto/code/components-organize/task.yaml @@ -1,7 +1,6 @@ summary: test the "How to package and upload a snap with components" -restore: - rm -r *.snap *.comp +restore: rm -r *.snap *.comp execute: | unset SNAPCRAFT_BUILD_ENVIRONMENT diff --git a/docs/howto/code/components/task.yaml b/docs/howto/code/components/task.yaml index 87a416fcc0..71970ea009 100644 --- a/docs/howto/code/components/task.yaml +++ b/docs/howto/code/components/task.yaml @@ -1,7 +1,6 @@ summary: test the "How to package and upload a snap with components" -restore: - rm -r *.snap *.comp +restore: rm -r *.snap *.comp execute: | unset SNAPCRAFT_BUILD_ENVIRONMENT diff --git a/docs/howto/code/craft-a-snap/example-python-recipe.yaml b/docs/howto/code/craft-a-snap/example-python-recipe.yaml index 5c5b12253d..6cb5d91c8e 100644 --- a/docs/howto/code/craft-a-snap/example-python-recipe.yaml +++ b/docs/howto/code/craft-a-snap/example-python-recipe.yaml @@ -2,7 +2,7 @@ name: liquidctl summary: a status and control utility to for power, cooling and LED components -version: '1.0' +version: "1.0" description: | liquidctl is a command-line tool to monitor and control the fan speed, LED colour and pump volumes of specific power supplies, motherboards, diff --git a/docs/reference/code/yt-dlp-recipe.yaml b/docs/reference/code/yt-dlp-recipe.yaml index f5a1c0312f..9c793f587c 100644 --- a/docs/reference/code/yt-dlp-recipe.yaml +++ b/docs/reference/code/yt-dlp-recipe.yaml @@ -3,9 +3,9 @@ name: yt-dlp summary: A fork of youtube-dl with additional features and patches description: | - Download and play videos on your local system. Runs from the command - line and with all the features and patches of youtube-dlc in addition - to the latest youtube-dl. + Download and play videos on your local system. Runs from the command + line and with all the features and patches of youtube-dlc in addition + to the latest youtube-dl. version: test grade: stable confinement: strict diff --git a/extensions/desktop/kde-neon-6/launcher-specific b/extensions/desktop/kde-neon-6/launcher-specific index 047878330b..ef35cca30a 100644 --- a/extensions/desktop/kde-neon-6/launcher-specific +++ b/extensions/desktop/kde-neon-6/launcher-specific @@ -35,7 +35,7 @@ append_dir QML2_IMPORT_PATH "$SNAP_DESKTOP_RUNTIME/lib/$ARCH" # Fix locating the QtWebEngineProcess executable export QTWEBENGINEPROCESS_PATH="$SNAP_DESKTOP_RUNTIME/usr/lib/qt6/libexec/QtWebEngineProcess" # And QtWebEngine's path to resources -QTWEBENGINE_RESOURCES_PATH="$SNAP_DESKTOP_RUNTIME/usr/share/qt6/resources" +export QTWEBENGINE_RESOURCES_PATH="$SNAP_DESKTOP_RUNTIME/usr/share/qt6/resources" # Removes Qt warning: Could not find a location # of the system Compose files diff --git a/manual-tests.md b/manual-tests.md deleted file mode 100644 index f5d2d185a9..0000000000 --- a/manual-tests.md +++ /dev/null @@ -1,224 +0,0 @@ -# Test log in with one-time password - -1. Set up an SSO account with two-factor authentication. -2. Run snapcraft logout -3. Run snapcraft login -4. Enter the email address. -5. Enter the password. -6. Enter the one-time password. - - * Check that the log in was successful. - - -# Test file ownership is retained - -1. 'snapcraft build' a simple snap -2. sudo touch install/test-owner-file -3. sudo chown nobody:nogroup install/test-owner-file -4. sudo snapcraft prime -5. ensure that prime/test-owner-file is owned by nobody and nogroup - - -# Test stage package caching - -1. `snapcraft pull` a snap that has `parts` with `stage-packages`. -2. Run `snapcraft clean`. -3. Verify there is cached apt data in `~/.cache/snapcraft//` -4. Run `snapcraft pull` again and notice the download is minimal. -5. Wipe the cached apt data. -6. Run `snapcraft pull` again and notice the download is as in `1.`. -7. Run this test again, but run snapcraft on a partition separated - from $HOME. - - -# Test cross-compilation with Go - -1. Go to integration_tests/snaps/go-hello. -2. Run `snapcraft snap --target-arch=armhf`. -3. Copy the snap to a Raspberry Pi. -4. Install the snap. -5. Run `go-hello`. - - -# Test cross-compilation with Rust - -1. Go to integration_tests/snaps/rust-hello. -2. Run `snapcraft snap --target-arch=armhf`. -3. Copy the snap to a Raspberry Pi. -4. Install the snap. -5. Run `rust-hello`. - - -# Test cross-compilation with Autotools - -1. Go to integration_tests/snaps/autotools-hello. -2. Run `snapcraft snap --target-arch=armhf`. -3. Copy the snap to a Raspberry Pi. -4. Install the snap. -5. Run `autotools-hello`. - - -# Test cross-compilation with Waf - -1. Go to integration_tests/snaps/waf-with-configflags. -2. Run `snapcraft snap --target-arch=armhf`. -3. Copy the snap to a Raspberry Pi. -4. Install the snap. -5. Run `waf-with-configflags`. - - -# Test the PC kernel. - -1. Get the PC kernel source: - - $ git clone -b pc https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux-snap/+git/xenial - $ cd xenial - -2. Run `sudo snapcraft`. -3. Create a file called `pc-model.json` with the following contents: - - { - "type": "model", - "authority-id": "$account_id", - "brand-id": "$account_id", - "series": "16", - "model": "pc", - "architecture": "amd64", - "gadget": "pc", - "kernel": "$kernel_snap_path", - "timestamp": "$date" - } - -4. Replace `$account_id` with the value from https://myapps.developer.ubuntu.com/dev/account/ -5. Replace `$kernel_snap_path` with the path to the snap you just created. -6. Replace `$date` with the output of the command `date -Iseconds --utc`. -7. If you haven't created a key, run the following command, replacing - `$key_name` with a name for your key: - - $ snap create-key $key_name - $ snapcraft register-key - -8. Sign the model: - - $ cat pc-model.json | snap sign -k $key_name > pc.model - -10. Install ubuntu-image: - - $ sudo apt install ubuntu-image - -11. Create the image: - - $ sudo ubuntu-image --image-size 3G -O ubuntu-core-16 pc.model --extra-snaps $kernel_snap_path - -12. Start the image in kvm: - - $ kvm -smp 2 -m 1500 -netdev user,id=mynet0,hostfwd=tcp::8022-:22,hostfwd=tcp::8090-:80 -device virtio-net-pci,netdev=mynet0 -drive file=ubuntu-core-16/pc.img,format=raw - - * Check that the user can be created. - * Check that it's possible to ssh into the vm. - * Check that it's possible to install a snap. - - -# Test the dragonboard 410c kernel. - -1. Download https://developer.qualcomm.com/download/db410c/linux-board-support-package-v1.2.zip -2. Extract it and copy the file `firmware.tar` to the directory `demos/96boards-kernel`. -3. Run `snapcraft snap --target-arch arm64` in the `demos/96boards-kernel` directory. -4. Create a file called `dragonboard-model.json` with the following contents: - - { - "type": "model", - "authority-id": "$account_id", - "brand-id": "$account_id", - "series": "16", - "model": "dragonboard", - "architecture": "arm64", - "gadget": "dragonboard", - "kernel": "$kernel_snap_path", - "timestamp": "$date" - } - -5. Replace `$account_id` with the value from https://myapps.developer.ubuntu.com/dev/account/ -6. Replace `$kernel_snap_path` with the path to the snap you just created. -7. Replace `$date` with the output of the command `date -Iseconds --utc`. -8. If you haven't created a key, run the following command, replacing - `$key_name` with a name for your key: - - $ snap create-key $key_name - $ snapcraft register-key - -9. Sign the model: - - $ cat dragonboard-model.json | snap sign -k $key_name > dragonboard.model - -10. Install ubuntu-image: - - $ sudo apt install ubuntu-image - -11. Create the image: - - $ sudo ubuntu-image -O ubuntu-core-16 dragonboard.model --extra-snaps $kernel_snap_path - -12. Insert an sdcard into the host PC. -13. Umount the sdcard partitions. -14. Flash the image, replacing sdX with the path to the sdcard: - - $ sudo dd if=ubuntu-core-16/dragonboard.img of=/dev/sdX bs=32M - $ sync - -15. Insert the sdcard into the dragonboard, and turn it on. - - * Check that the user can be created. - * Check that it's possible to ssh into the board. - * Check that it's possible to install a snap. - - -# Test installing with `pip` - -1. Follow HACKING.md to install using `pip` without using --editable. -2. Make sure Snapcraft works by running `snapcraft init` followed by `snapcraft`. -3. Follow HACKING.md to install using `pip` while using --editable. -4. Repeat step 2. - - -# Test push metadata with conflicts - -1. 'snapcraft snap' a simple snap -2. Do a simple 'snapcraft push SNAP' -3. Go to the Web and change snap's description -4. Change the snap's description in the YAML file to something different than you put in the Web -5. Try to update snap's metadata doing `snapcraft push-metadata SNAP` - - * Check that it should error with "conflict" on the description field - -6. Force the update doing `snapcraft push-metadata SNAP --force` - - * Check that it should end ok - * Check in the Web that the description is now what the YAML says - - -# Test push binary metadata with conflicts - -1. 'snapcraft snap' a simple snap -2. Do a simple 'snapcraft push SNAP' -3. Go to the Web and change snap's icon -4. Change the snap's icon in the YAML file to something different than you put in the Web -5. Try to update snap's metadata using `snapcraft push-metadata SNAP` - - * Check that it should error with "conflict" on the icon field - -6. Force the update doing `snapcraft push-metadata SNAP --force` - - * Check that it should end ok - * Check in the Web that the icon is now what the YAML says - - -# Test creating a macaroon with a specific expiration - -1. Take note of the current date. Pick a date two days later, and convert it - into ISO 8601. For example, midnight on February 5th, 2019 is - '2019-02-05T00:00:00'. -2. Run 'snapcraft export-login --expires="2019-02-05T00:00:00" exported', using - the expiration date you calculated. -3. Snapcraft will print the capabilities of the exported login. Verify that the - expiration date you requested is the one that it prints. diff --git a/pyproject.toml b/pyproject.toml index 62b20ec258..30862547d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,197 @@ -[tool.black] -extend-exclude = ''' -/( - | snapcraft_legacy - | tools - | docs/sphinx-resources -)/ -''' -# Targeting future versions as well so we don't have black reformatting code -# en masse later. -target-version = ["py312"] +[project] +name = "snapcraft" +description = "Create snaps" +dynamic = ["version", "readme"] +dependencies = [ + "attrs", + "catkin-pkg==1.0.0 ; sys_platform == 'linux'", + "click==8.1.7", + "craft-application==4.4.0", # Pinned due to https://github.com/canonical/snapcraft/issues/5231 + "craft-archives~=2.0", + "craft-cli~=2.15.0", + "craft-grammar>=2.0.1,<3.0.0", + "craft-parts==2.4.1", + "craft-platforms~=0.4", + "craft-store>=3.0.2,<4.0.0", + "cryptography==43.0.3", # Pinned due to https://github.com/canonical/snapcraft/issues/5217 + "gnupg", + "jsonschema==2.5.1", + "launchpadlib", + "lazr.restfulclient", + "lxml", + "macaroonbakery", + "mypy-extensions", + "overrides", + "packaging", + "progressbar", + "pydantic~=2.8", + "pyelftools", + # Pygit2 and libgit2 need to match versions. + # Further info: https://www.pygit2.org/install.html#version-numbers + "pygit2~=1.13.0", + "pylxd ; sys_platform == 'linux'", + "pymacaroons", + "python-debian ; sys_platform == 'linux'", + "pyxdg", + "pyyaml", + "raven", + "requests-toolbelt", + "requests-unixsocket2", + "requests", + "simplejson", + "snap-helpers", + "tabulate", + "toml", + "tinydb", + "typing-extensions", + "validators>=0.28.3", +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Operating System :: POSIX :: Linux", + "Intended Audience :: Developers", + "Intended Audience :: System Administrators", + "Natural Language :: English", + "Topic :: Software Development :: Build Tools", + "Topic :: System :: Software Distribution", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", +] +requires-python = ">=3.12" + +[dependency-groups] +dev = [ + "coverage[toml]", + "pyflakes", + "fixtures", + # For Tiobe TiCS + "flake8", + "mccabe", + "testscenarios", + "pexpect", + "pip", + "pycodestyle", + "pyftpdlib", + "pyinstaller ; sys_platform == 'win32'", + # For Tiobe TiCS + "pylint", + "pyramid", + "pytest", + "pytest-cov", + "pytest-check", + "pytest-mock", + "pytest-subprocess", +] +docs = [ + "canonical-sphinx[full]>=0.2.0", + "docutils<0.20", # Frozen until we can update sphinx dependencies. + "sphinx-autobuild", + "sphinx-autodoc-typehints", + "sphinxcontrib-details-directive", + "sphinx-lint", + "sphinx-toolbox", + "pyspelling", +] +lint = [ + "yamllint~=1.34", + "codespell[toml]", + { include-group = "types" }, +] +types = [ + "mypy", + "types-PyYAML", + # Pinned because any higher requires urllib3>=2 + "types-requests==2.31.0.6", + "types-setuptools", + "types-simplejson", + "types-tabulate", + "types-toml", +] +dev-jammy = [ + # Stay on 2.4 for Jammy + "python-apt~=2.4.0;sys_platform=='linux'", +] +dev-noble = [ + # 2.7 for Noble + "python-apt~=2.7.0;sys_platform=='linux'", +] +dev-oracular = [ + # 2.9 for Oracular+ + "python-apt>=2.9.0;sys_platform=='linux'", +] +dev-plucky = [ + # 2.9 for Oracular+ + "python-apt>=2.9.0;sys_platform=='linux'", +] + +[tool.uv] +conflicts = [ + [ + { group = "dev-jammy" }, + { group = "dev-noble" }, + { group = "dev-oracular" }, + { group = "dev-plucky" }, + ] +] + +[[tool.uv.index]] +name = "python-apt-wheels" +url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" # workaround to get python-apt to install across multiple platforms + +[project.scripts] +snapcraft = "snapcraft.application:main" +snapcraft_legacy = "snapcraft_legacy.cli.__main__:run" + +[build-system] +requires = [ + "setuptools>=69.0", + "setuptools_scm[toml]>=7.1", +] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +script-files = ["bin/snapcraftctl", "bin/snapcraftctl-compat"] + +[tool.setuptools.dynamic] +readme = { file = "README.rst" } + +[tool.setuptools_scm] +write_to = "snapcraft/_version.py" +# the version comes from the latest annotated git tag formatted as 'X.Y.Z' +# version scheme: +# - X.Y.Z.post+g.d<%Y%m%d> +# parts of scheme: +# - X.Y.Z - most recent git tag +# - post+g - present when current commit is not tagged +# - +dirty - present when working dir is dirty +# version scheme when no tags exist: +# - 0.0.post+g +version_scheme = "post-release" +# deviations from the default 'git describe' command: +# - only match annotated tags +# - only match tags formatted as 'X.Y.Z' +git_describe_command = [ + "git", + "describe", + "--dirty", + "--long", + "--match", + "[0-9]*.[0-9]*.[0-9]*", + "--exclude", + "*[^0-9.]*", +] +# Appends "+dirty" to the version when working dir is dirty +# Necessary to avoid version numbers being too long +local_scheme = "dirty-tag" + +[tool.setuptools.packages.find] +include = ["snapcraft", "extensions", "keyrings", "schema", "snapcraft_legacy"] +namespaces = true + +[tool.setuptools.package-data] +snapcraft = ["templates/*"] [tool.mypy] python_version = "3.12" @@ -31,11 +214,6 @@ include = ["snapcraft", "tests"] exclude = ["build", "tests/legacy", "tests/spread"] pythonVersion = "3.12" -[tool.pytest.ini_options] -minversion = "7.0" -required_plugins = ["pytest-cov>=4.0", "pytest-mock>=3.12", "pytest-subprocess>=1.4"] -addopts = ["--cov=snapcraft"] - # Most of this ruff configuration comes from craft-parts [tool.ruff] target-version = "py312" @@ -45,6 +223,7 @@ extend-exclude = [ "__pycache__", "legacy", "tests/legacy", + "snapcraft/_version.py", # setuptools_scm generates old-style type annotations and single quotes ] lint.select = [ "E", "F", # The rules built into Flake8 @@ -129,5 +308,47 @@ max-branches = 16 ] "__init__.py" = ["I001"] # Imports in __init__ filesare allowed to be out of order -[tool.ruff.lint.flake8-annotations] -suppress-none-returning = true # We don't need to explicitly point out that a function doesn't return anything +[tool.ruff.lint.pydocstyle] +ignore-decorators = [ # Functions with these decorators don't have to have docstrings. + "typing.overload", # Default configuration + # The next four are all variations on override, so child classes don't have to repeat parent classes' docstrings. + "overrides.override", + "overrides.overrides", + "typing.override", + "typing_extensions.override", +] + +[tool.ruff.lint.pep8-naming] +# Allow Pydantic's `@validator` decorator to trigger class method treatment. +classmethod-decorators = ["pydantic.validator", "pydantic.root_validator"] + +[tool.pytest.ini_options] +minversion = "7.0" +testpaths = "tests" +xfail_strict = true +markers = ["slow: slow tests"] + +[tool.coverage.run] +branch = true +omit = ["test/**"] + +[tool.coverage.report] +skip_empty = true +exclude_also = [ + "if (typing\\.)?TYPE_CHECKING:", +] + +[tool.codespell] +ignore-words-list = [ + "buildd", + "crate", + "assertIn", + "socio-economic", +] +skip = [ + # Keyrings aren't code + "*.asc", + # These tests include some non-English text + "*/test_appstream.py", + "*/test_update_metadata.py", +] diff --git a/requirements-devel.txt b/requirements-devel.txt deleted file mode 100644 index 7880a30c26..0000000000 --- a/requirements-devel.txt +++ /dev/null @@ -1,431 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --extra=dev --output-file=requirements-devel.txt -# -annotated-types==0.7.0 - # via - # craft-platforms - # pydantic -astroid==3.3.5 - # via pylint -attrs==24.2.0 - # via snapcraft (setup.py) -black==24.10.0 - # via snapcraft (setup.py) -boolean-py==4.0 - # via license-expression -cachetools==5.5.0 - # via tox -catkin-pkg==1.0.0 ; sys_platform == "linux" - # via snapcraft (setup.py) -certifi==2024.8.30 - # via requests -cffi==1.17.1 - # via - # cryptography - # pygit2 - # pynacl -chardet==5.2.0 - # via - # python-debian - # tox -charset-normalizer==3.4.0 - # via requests -click==8.1.7 - # via - # black - # snapcraft (setup.py) -codespell[toml]==2.3.0 - # via snapcraft (setup.py) -colorama==0.4.6 - # via tox -coverage[toml]==7.6.4 - # via - # pytest-cov - # snapcraft (setup.py) -craft-application==4.4.0 - # via snapcraft (setup.py) -craft-archives==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-cli==2.15.0 - # via - # craft-application - # snapcraft (setup.py) -craft-grammar==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-parts==2.4.1 - # via - # craft-application - # snapcraft (setup.py) -craft-platforms==0.4.0 - # via - # craft-application - # snapcraft (setup.py) -craft-providers==2.0.4 - # via - # craft-application - # snapcraft (setup.py) -craft-store==3.0.2 - # via snapcraft (setup.py) -cryptography==43.0.3 - # via - # pylxd - # secretstorage -dill==0.3.9 - # via pylint -distlib==0.3.9 - # via virtualenv -distro==1.9.0 - # via - # craft-archives - # craft-platforms - # lazr-restfulclient -docutils==0.19 - # via - # catkin-pkg - # snapcraft (setup.py) -filelock==3.16.1 - # via - # tox - # virtualenv -fixtures==4.1.0 - # via snapcraft (setup.py) -flake8==7.1.1 - # via snapcraft (setup.py) -gnupg==2.3.1 - # via snapcraft (setup.py) -httplib2==0.22.0 - # via - # launchpadlib - # lazr-restfulclient -hupper==1.12.1 - # via pyramid -idna==3.10 - # via requests -iniconfig==2.0.0 - # via pytest -isort==5.13.2 - # via pylint -jaraco-classes==3.4.0 - # via - # craft-store - # keyring -jaraco-context==6.0.1 - # via keyring -jaraco-functools==4.1.0 - # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage -jinja2==3.1.5 - # via craft-application -jsonschema==2.5.1 - # via snapcraft (setup.py) -keyring==25.5.0 - # via craft-store -launchpadlib==2.0.0 - # via - # craft-archives - # snapcraft (setup.py) -lazr-restfulclient==0.14.6 - # via - # craft-archives - # launchpadlib - # snapcraft (setup.py) -lazr-uri==1.0.6 - # via - # craft-archives - # launchpadlib - # wadllib -license-expression==30.4.0 - # via craft-application -lxml==5.3.0 - # via snapcraft (setup.py) -macaroonbakery==1.3.4 - # via - # craft-store - # snapcraft (setup.py) -markupsafe==3.0.2 - # via jinja2 -mccabe==0.7.0 - # via - # flake8 - # pylint - # snapcraft (setup.py) -more-itertools==10.5.0 - # via - # jaraco-classes - # jaraco-functools -mypy==1.13.0 - # via snapcraft (setup.py) -mypy-extensions==1.0.0 - # via - # black - # mypy - # snapcraft (setup.py) -oauthlib==3.2.2 - # via lazr-restfulclient -overrides==7.7.0 - # via - # craft-archives - # craft-grammar - # craft-parts - # craft-store - # snapcraft (setup.py) -packaging==24.2 - # via - # black - # craft-providers - # pyproject-api - # pytest - # snapcraft (setup.py) - # tox -pastedeploy==3.1.0 - # via plaster-pastedeploy -pathspec==0.12.1 - # via - # black - # yamllint -pbr==6.1.0 - # via - # fixtures - # testscenarios -pexpect==4.9.0 - # via snapcraft (setup.py) -plaster==1.1.2 - # via - # plaster-pastedeploy - # pyramid -plaster-pastedeploy==1.0.1 - # via pyramid -platformdirs==4.3.6 - # via - # black - # craft-application - # craft-cli - # pylint - # tox - # virtualenv -pluggy==1.5.0 - # via - # pytest - # tox -progressbar==2.5 - # via snapcraft (setup.py) -protobuf==5.28.3 - # via macaroonbakery -psutil==6.1.0 - # via gnupg -ptyprocess==0.7.0 - # via pexpect -pyasynchat==1.0.4 - # via pyftpdlib -pyasyncore==1.0.4 - # via - # pyasynchat - # pyftpdlib -pycodestyle==2.12.1 - # via - # flake8 - # snapcraft (setup.py) -pycparser==2.22 - # via cffi -pydantic==2.10.3 - # via - # craft-application - # craft-archives - # craft-grammar - # craft-parts - # craft-providers - # craft-store - # snapcraft (setup.py) -pydantic-core==2.27.1 - # via pydantic -pydocstyle==6.3.0 - # via snapcraft (setup.py) -pyelftools==0.31 - # via snapcraft (setup.py) -pyflakes==3.2.0 - # via - # flake8 - # snapcraft (setup.py) -pyftpdlib==2.0.1 - # via snapcraft (setup.py) -pygit2==1.13.3 - # via - # craft-application - # snapcraft (setup.py) -pylint==3.3.1 - # via snapcraft (setup.py) -pylxd==2.3.5 ; sys_platform == "linux" - # via snapcraft (setup.py) -pymacaroons==0.13.0 - # via - # macaroonbakery - # snapcraft (setup.py) -pynacl==1.5.0 - # via - # macaroonbakery - # pymacaroons -pyparsing==3.2.0 - # via - # catkin-pkg - # httplib2 -pyproject-api==1.8.0 - # via tox -pyramid==2.0.2 - # via snapcraft (setup.py) -pyrfc3339==1.1 - # via macaroonbakery -pytest==8.3.3 - # via - # pytest-check - # pytest-cov - # pytest-mock - # pytest-subprocess - # snapcraft (setup.py) -pytest-check==2.4.1 - # via snapcraft (setup.py) -pytest-cov==6.0.0 - # via snapcraft (setup.py) -pytest-mock==3.14.0 - # via snapcraft (setup.py) -pytest-subprocess==1.5.2 - # via snapcraft (setup.py) - # via snapcraft (setup.py) -python-dateutil==2.9.0.post0 - # via - # catkin-pkg - # pylxd -python-debian==0.1.49 ; sys_platform == "linux" - # via - # craft-archives - # snapcraft (setup.py) -pytz==2024.2 - # via pyrfc3339 -pyxdg==0.28 - # via - # craft-parts - # craft-store - # snapcraft (setup.py) -pyyaml==6.0.2 - # via - # craft-application - # craft-cli - # craft-parts - # craft-providers - # snap-helpers - # snapcraft (setup.py) - # yamllint -raven==6.10.0 - # via snapcraft (setup.py) -requests==2.32.3 - # via - # craft-application - # craft-parts - # craft-providers - # craft-store - # macaroonbakery - # pylxd - # requests-toolbelt - # requests-unixsocket2 - # snapcraft (setup.py) -requests-toolbelt==1.0.0 - # via - # craft-store - # pylxd - # snapcraft (setup.py) -requests-unixsocket2==0.4.2 - # via - # craft-parts - # craft-providers - # snapcraft (setup.py) -secretstorage==3.3.3 - # via keyring -simplejson==3.19.3 - # via snapcraft (setup.py) -six==1.16.0 - # via - # lazr-restfulclient - # macaroonbakery - # pymacaroons - # python-dateutil -snap-helpers==0.4.2 - # via - # craft-application - # snapcraft (setup.py) -snowballstemmer==2.2.0 - # via pydocstyle -tabulate==0.9.0 - # via snapcraft (setup.py) -testscenarios==0.5.0 - # via snapcraft (setup.py) -testtools==2.7.2 - # via testscenarios -tinydb==4.8.2 - # via snapcraft (setup.py) -toml==0.10.2 - # via snapcraft (setup.py) -tomlkit==0.13.2 - # via pylint -tox==4.23.2 - # via snapcraft (setup.py) -translationstring==1.4 - # via pyramid -types-pyyaml==6.0.12.20240917 - # via snapcraft (setup.py) -types-requests==2.31.0.6 - # via snapcraft (setup.py) -types-setuptools==75.3.0.20241112 - # via snapcraft (setup.py) -types-simplejson==3.19.0.20240801 - # via snapcraft (setup.py) -types-tabulate==0.9.0.20240106 - # via snapcraft (setup.py) -types-toml==0.10.8.20240310 - # via snapcraft (setup.py) -types-urllib3==1.26.25.14 - # via types-requests -typing-extensions==4.12.2 - # via - # craft-application - # craft-platforms - # mypy - # pydantic - # pydantic-core - # snapcraft (setup.py) -urllib3==2.2.3 - # via - # requests - # requests-unixsocket2 -validators==0.34.0 - # via snapcraft (setup.py) -venusian==3.1.0 - # via pyramid -virtualenv==20.27.1 - # via tox -wadllib==2.0.0 - # via lazr-restfulclient -webob==1.8.9 - # via pyramid -ws4py==0.5.1 - # via pylxd -yamllint==1.35.1 - # via snapcraft (setup.py) -zope-deprecation==5.0 - # via pyramid -zope-interface==7.1.1 - # via pyramid - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools -python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz ; sys.platform == "linux" -pyinstaller==5.13.1 ; sys.platform == "win32" diff --git a/requirements-docs.txt b/requirements-docs.txt deleted file mode 100644 index 9f311008c2..0000000000 --- a/requirements-docs.txt +++ /dev/null @@ -1,489 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --extra=docs --output-file=requirements-docs.txt -# -alabaster==0.7.16 - # via sphinx -annotated-types==0.7.0 - # via - # craft-platforms - # pydantic -anyio==4.6.2.post1 - # via - # starlette - # watchfiles -apeye==1.4.1 - # via sphinx-toolbox -apeye-core==1.1.5 - # via apeye -attrs==24.2.0 - # via snapcraft (setup.py) -autodocsumm==0.2.14 - # via sphinx-toolbox -babel==2.16.0 - # via sphinx -beautifulsoup4==4.12.3 - # via - # canonical-sphinx-extensions - # furo - # pyspelling - # sphinx-toolbox -boolean-py==4.0 - # via license-expression -bracex==2.5.post1 - # via wcmatch -cachecontrol[filecache]==0.14.1 - # via sphinx-toolbox -canonical-sphinx[full]==0.2.0 - # via snapcraft (setup.py) -canonical-sphinx-extensions==0.0.23 - # via canonical-sphinx -catkin-pkg==1.0.0 ; sys_platform == "linux" - # via snapcraft (setup.py) -certifi==2024.8.30 - # via requests -cffi==1.17.1 - # via - # cryptography - # pygit2 - # pynacl -chardet==5.2.0 - # via python-debian -charset-normalizer==3.4.0 - # via requests -click==8.1.7 - # via - # snapcraft (setup.py) - # uvicorn -colorama==0.4.6 - # via sphinx-autobuild -craft-application==4.4.0 - # via snapcraft (setup.py) -craft-archives==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-cli==2.15.0 - # via - # craft-application - # snapcraft (setup.py) -craft-grammar==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-parts==2.4.1 - # via - # craft-application - # snapcraft (setup.py) -craft-platforms==0.4.0 - # via - # craft-application - # snapcraft (setup.py) -craft-providers==2.0.4 - # via - # craft-application - # snapcraft (setup.py) -craft-store==3.0.2 - # via snapcraft (setup.py) -cryptography==43.0.3 - # via - # pylxd - # secretstorage -cssutils==2.11.1 - # via dict2css -dict2css==0.3.0.post1 - # via sphinx-toolbox -distro==1.9.0 - # via - # craft-archives - # craft-platforms - # lazr-restfulclient -docutils==0.19 - # via - # canonical-sphinx-extensions - # catkin-pkg - # myst-parser - # snapcraft (setup.py) - # sphinx - # sphinx-prompt - # sphinx-tabs - # sphinx-toolbox -domdf-python-tools==3.9.0 - # via - # apeye - # apeye-core - # dict2css - # sphinx-toolbox -filelock==3.16.1 - # via - # cachecontrol - # sphinx-toolbox -furo==2024.8.6 - # via canonical-sphinx -gitdb==4.0.11 - # via gitpython -gitpython==3.1.43 - # via canonical-sphinx-extensions -gnupg==2.3.1 - # via snapcraft (setup.py) -h11==0.14.0 - # via uvicorn -html5lib==1.1 - # via - # pyspelling - # sphinx-toolbox -httplib2==0.22.0 - # via - # launchpadlib - # lazr-restfulclient -idna==3.10 - # via - # anyio - # apeye-core - # requests -imagesize==1.4.1 - # via sphinx -jaraco-classes==3.4.0 - # via - # craft-store - # keyring -jaraco-context==6.0.1 - # via keyring -jaraco-functools==4.1.0 - # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage -jinja2==3.1.5 - # via - # craft-application - # myst-parser - # sphinx - # sphinx-jinja2-compat -jsonschema==2.5.1 - # via snapcraft (setup.py) -keyring==25.5.0 - # via craft-store -launchpadlib==2.0.0 - # via - # craft-archives - # snapcraft (setup.py) -lazr-restfulclient==0.14.6 - # via - # craft-archives - # launchpadlib - # snapcraft (setup.py) -lazr-uri==1.0.6 - # via - # craft-archives - # launchpadlib - # wadllib -license-expression==30.4.0 - # via craft-application -linkify-it-py==2.0.3 - # via canonical-sphinx -lxml==5.3.0 - # via - # pyspelling - # snapcraft (setup.py) -macaroonbakery==1.3.4 - # via - # craft-store - # snapcraft (setup.py) -markdown==3.7 - # via pyspelling -markdown-it-py==3.0.0 - # via - # mdit-py-plugins - # myst-parser -markupsafe==3.0.2 - # via - # jinja2 - # sphinx-jinja2-compat -mdit-py-plugins==0.4.2 - # via myst-parser -mdurl==0.1.2 - # via markdown-it-py -more-itertools==10.5.0 - # via - # cssutils - # jaraco-classes - # jaraco-functools -msgpack==1.1.0 - # via cachecontrol -mypy-extensions==1.0.0 - # via snapcraft (setup.py) -myst-parser==4.0.0 - # via canonical-sphinx -natsort==8.4.0 - # via domdf-python-tools -oauthlib==3.2.2 - # via lazr-restfulclient -overrides==7.7.0 - # via - # craft-archives - # craft-grammar - # craft-parts - # craft-store - # snapcraft (setup.py) -packaging==24.2 - # via - # craft-providers - # snapcraft (setup.py) - # sphinx -platformdirs==4.3.6 - # via - # apeye - # craft-application - # craft-cli -polib==1.2.0 - # via sphinx-lint -progressbar==2.5 - # via snapcraft (setup.py) -protobuf==5.28.3 - # via macaroonbakery -psutil==6.1.0 - # via gnupg -pycparser==2.22 - # via cffi -pydantic==2.10.3 - # via - # craft-application - # craft-archives - # craft-grammar - # craft-parts - # craft-providers - # craft-store - # snapcraft (setup.py) -pydantic-core==2.27.1 - # via pydantic -pyelftools==0.31 - # via snapcraft (setup.py) -pygit2==1.13.3 - # via - # craft-application - # snapcraft (setup.py) -pygments==2.18.0 - # via - # furo - # sphinx - # sphinx-prompt - # sphinx-tabs -pylxd==2.3.5 ; sys_platform == "linux" - # via snapcraft (setup.py) -pymacaroons==0.13.0 - # via - # macaroonbakery - # snapcraft (setup.py) -pynacl==1.5.0 - # via - # macaroonbakery - # pymacaroons -pyparsing==3.2.0 - # via - # catkin-pkg - # httplib2 -pyrfc3339==1.1 - # via macaroonbakery -pyspelling==2.10 - # via - # canonical-sphinx - # snapcraft (setup.py) - # via snapcraft (setup.py) -python-dateutil==2.9.0.post0 - # via - # catkin-pkg - # pylxd -python-debian==0.1.49 ; sys_platform == "linux" - # via - # craft-archives - # snapcraft (setup.py) -pytz==2024.2 - # via pyrfc3339 -pyxdg==0.28 - # via - # craft-parts - # craft-store - # snapcraft (setup.py) -pyyaml==6.0.2 - # via - # craft-application - # craft-cli - # craft-parts - # craft-providers - # myst-parser - # pyspelling - # snap-helpers - # snapcraft (setup.py) -raven==6.10.0 - # via snapcraft (setup.py) -regex==2024.11.6 - # via sphinx-lint -requests==2.32.3 - # via - # apeye - # cachecontrol - # canonical-sphinx-extensions - # craft-application - # craft-parts - # craft-providers - # craft-store - # macaroonbakery - # pylxd - # requests-toolbelt - # requests-unixsocket2 - # snapcraft (setup.py) - # sphinx -requests-toolbelt==1.0.0 - # via - # craft-store - # pylxd - # snapcraft (setup.py) -requests-unixsocket2==0.4.2 - # via - # craft-parts - # craft-providers - # snapcraft (setup.py) -ruamel-yaml==0.18.6 - # via sphinx-toolbox -ruamel-yaml-clib==0.2.12 - # via ruamel-yaml -secretstorage==3.3.3 - # via keyring -simplejson==3.19.3 - # via snapcraft (setup.py) -six==1.16.0 - # via - # html5lib - # lazr-restfulclient - # macaroonbakery - # pymacaroons - # python-dateutil -smmap==5.0.1 - # via gitdb -snap-helpers==0.4.2 - # via - # craft-application - # snapcraft (setup.py) -sniffio==1.3.1 - # via anyio -snowballstemmer==2.2.0 - # via sphinx -soupsieve==2.6 - # via - # beautifulsoup4 - # pyspelling -sphinx==7.3.7 - # via - # autodocsumm - # canonical-sphinx - # canonical-sphinx-extensions - # furo - # myst-parser - # sphinx-autobuild - # sphinx-autodoc-typehints - # sphinx-basic-ng - # sphinx-copybutton - # sphinx-design - # sphinx-notfound-page - # sphinx-prompt - # sphinx-reredirects - # sphinx-tabs - # sphinx-toolbox - # sphinxcontrib-details-directive - # sphinxcontrib-jquery - # sphinxext-opengraph -sphinx-autobuild==2024.10.3 - # via snapcraft (setup.py) -sphinx-autodoc-typehints==2.3.0 - # via - # snapcraft (setup.py) - # sphinx-toolbox -sphinx-basic-ng==1.0.0b2 - # via furo -sphinx-copybutton==0.5.2 - # via canonical-sphinx -sphinx-design==0.6.1 - # via canonical-sphinx -sphinx-jinja2-compat==0.3.0 - # via sphinx-toolbox -sphinx-lint==1.0.0 - # via snapcraft (setup.py) -sphinx-notfound-page==1.0.4 - # via canonical-sphinx -sphinx-prompt==1.8.0 - # via sphinx-toolbox -sphinx-reredirects==0.1.5 - # via canonical-sphinx -sphinx-tabs==3.4.5 - # via - # canonical-sphinx - # sphinx-toolbox -sphinx-toolbox==3.8.1 - # via snapcraft (setup.py) -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-details-directive==0.1.0 - # via snapcraft (setup.py) -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jquery==4.1 - # via canonical-sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -sphinxext-opengraph==0.9.1 - # via canonical-sphinx -starlette==0.41.2 - # via sphinx-autobuild -tabulate==0.9.0 - # via - # snapcraft (setup.py) - # sphinx-toolbox -tinydb==4.8.2 - # via snapcraft (setup.py) -toml==0.10.2 - # via snapcraft (setup.py) -typing-extensions==4.12.2 - # via - # craft-application - # craft-platforms - # domdf-python-tools - # pydantic - # pydantic-core - # snapcraft (setup.py) - # sphinx-toolbox -uc-micro-py==1.0.3 - # via linkify-it-py -urllib3==2.2.3 - # via - # requests - # requests-unixsocket2 -uvicorn==0.32.0 - # via sphinx-autobuild -validators==0.34.0 - # via snapcraft (setup.py) -wadllib==2.0.0 - # via lazr-restfulclient -watchfiles==0.24.0 - # via sphinx-autobuild -wcmatch==10.0 - # via pyspelling -webencodings==0.5.1 - # via html5lib -websockets==14.1 - # via sphinx-autobuild -ws4py==0.5.1 - # via pylxd - -# The following packages are considered to be unsafe in a requirements file: -# setuptools -python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz ; sys.platform == "linux" diff --git a/requirements-noble.txt b/requirements-noble.txt new file mode 100644 index 0000000000..865b447c73 --- /dev/null +++ b/requirements-noble.txt @@ -0,0 +1,3 @@ +# Update this by finding the latest version of the tarball at https://launchpad.net/ubuntu/noble/+source/python-apt +python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.7.7ubuntu4/python-apt_2.7.7ubuntu4.tar.xz \ + --hash=sha256:9833fcccf33e0fbf00d62df93c0b6165dc00edd9f635251be4cde1a9dc708e88 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 932ff5a8e5..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,272 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile --output-file=requirements.txt -# -annotated-types==0.7.0 - # via - # craft-platforms - # pydantic -attrs==24.2.0 - # via snapcraft (setup.py) -boolean-py==4.0 - # via license-expression -catkin-pkg==1.0.0 ; sys_platform == "linux" - # via snapcraft (setup.py) -certifi==2024.8.30 - # via requests -cffi==1.17.1 - # via - # cryptography - # pygit2 - # pynacl -chardet==5.2.0 - # via python-debian -charset-normalizer==3.4.0 - # via requests -click==8.1.7 - # via snapcraft (setup.py) -craft-application==4.4.0 - # via snapcraft (setup.py) -craft-archives==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-cli==2.15.0 - # via - # craft-application - # snapcraft (setup.py) -craft-grammar==2.0.1 - # via - # craft-application - # snapcraft (setup.py) -craft-parts==2.4.1 - # via - # craft-application - # snapcraft (setup.py) -craft-platforms==0.4.0 - # via - # craft-application - # snapcraft (setup.py) -craft-providers==2.0.4 - # via - # craft-application - # snapcraft (setup.py) -craft-store==3.0.2 - # via snapcraft (setup.py) -cryptography==43.0.3 - # via - # pylxd - # secretstorage -distro==1.9.0 - # via - # craft-archives - # craft-platforms - # lazr-restfulclient -docutils==0.19 - # via - # catkin-pkg - # snapcraft (setup.py) -gnupg==2.3.1 - # via snapcraft (setup.py) -httplib2==0.22.0 - # via - # launchpadlib - # lazr-restfulclient -idna==3.10 - # via requests -jaraco-classes==3.4.0 - # via - # craft-store - # keyring -jaraco-context==6.0.1 - # via keyring -jaraco-functools==4.1.0 - # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage -jinja2==3.1.5 - # via craft-application -jsonschema==2.5.1 - # via snapcraft (setup.py) -keyring==25.5.0 - # via craft-store -launchpadlib==2.0.0 - # via - # craft-archives - # snapcraft (setup.py) -lazr-restfulclient==0.14.6 - # via - # craft-archives - # launchpadlib - # snapcraft (setup.py) -lazr-uri==1.0.6 - # via - # craft-archives - # launchpadlib - # wadllib -license-expression==30.4.0 - # via craft-application -lxml==5.3.0 - # via snapcraft (setup.py) -macaroonbakery==1.3.4 - # via - # craft-store - # snapcraft (setup.py) -markupsafe==3.0.2 - # via jinja2 -more-itertools==10.5.0 - # via - # jaraco-classes - # jaraco-functools -mypy-extensions==1.0.0 - # via snapcraft (setup.py) -oauthlib==3.2.2 - # via lazr-restfulclient -overrides==7.7.0 - # via - # craft-archives - # craft-grammar - # craft-parts - # craft-store - # snapcraft (setup.py) -packaging==24.2 - # via - # craft-providers - # snapcraft (setup.py) -platformdirs==4.3.6 - # via - # craft-application - # craft-cli -progressbar==2.5 - # via snapcraft (setup.py) -protobuf==5.28.3 - # via macaroonbakery -psutil==6.1.0 - # via gnupg -pycparser==2.22 - # via cffi -pydantic==2.10.3 - # via - # craft-application - # craft-archives - # craft-grammar - # craft-parts - # craft-providers - # craft-store - # snapcraft (setup.py) -pydantic-core==2.27.1 - # via pydantic -pyelftools==0.31 - # via snapcraft (setup.py) -pygit2==1.13.3 - # via - # craft-application - # snapcraft (setup.py) -pylxd==2.3.5 ; sys_platform == "linux" - # via snapcraft (setup.py) -pymacaroons==0.13.0 - # via - # macaroonbakery - # snapcraft (setup.py) -pynacl==1.5.0 - # via - # macaroonbakery - # pymacaroons -pyparsing==3.2.0 - # via - # catkin-pkg - # httplib2 -pyrfc3339==1.1 - # via macaroonbakery - # via snapcraft (setup.py) -python-dateutil==2.9.0.post0 - # via - # catkin-pkg - # pylxd -python-debian==0.1.49 ; sys_platform == "linux" - # via - # craft-archives - # snapcraft (setup.py) -pytz==2024.2 - # via pyrfc3339 -pyxdg==0.28 - # via - # craft-parts - # craft-store - # snapcraft (setup.py) -pyyaml==6.0.2 - # via - # craft-application - # craft-cli - # craft-parts - # craft-providers - # snap-helpers - # snapcraft (setup.py) -raven==6.10.0 - # via snapcraft (setup.py) -requests==2.32.3 - # via - # craft-application - # craft-parts - # craft-providers - # craft-store - # macaroonbakery - # pylxd - # requests-toolbelt - # requests-unixsocket2 - # snapcraft (setup.py) -requests-toolbelt==1.0.0 - # via - # craft-store - # pylxd - # snapcraft (setup.py) -requests-unixsocket2==0.4.2 - # via - # craft-parts - # craft-providers - # snapcraft (setup.py) -secretstorage==3.3.3 - # via keyring -simplejson==3.19.3 - # via snapcraft (setup.py) -six==1.16.0 - # via - # lazr-restfulclient - # macaroonbakery - # pymacaroons - # python-dateutil -snap-helpers==0.4.2 - # via - # craft-application - # snapcraft (setup.py) -tabulate==0.9.0 - # via snapcraft (setup.py) -tinydb==4.8.2 - # via snapcraft (setup.py) -toml==0.10.2 - # via snapcraft (setup.py) -typing-extensions==4.12.2 - # via - # craft-application - # craft-platforms - # pydantic - # pydantic-core - # snapcraft (setup.py) -urllib3==2.2.3 - # via - # requests - # requests-unixsocket2 -validators==0.34.0 - # via snapcraft (setup.py) -wadllib==2.0.0 - # via lazr-restfulclient -ws4py==0.5.1 - # via pylxd - -# The following packages are considered to be unsafe in a requirements file: -# setuptools -python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz ; sys.platform == "linux" diff --git a/runtests.sh b/runtests.sh deleted file mode 100755 index b17489f685..0000000000 --- a/runtests.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash -# -*- Mode:sh; indent-tabs-mode:nil; tab-width:4 -*- -# -# Copyright (C) 2015-2018 Canonical Ltd -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 3 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details.f-1 -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -set -e - -usage() { - echo "Usage: " - echo " ./runtests.sh static" - echo " ./runtests.sh tests/integration[/]" - echo " ./runtests.sh spread" - echo "" - echo " can be one of: $(find tests/integration/ -mindepth 1 -maxdepth 1 -type d ! -name __pycache__ | tr '\n' ' ')" - echo " makes use of run instead of discover to run the tests" -} - -run_static_tests() { - make tests-static -} - -run_snapcraft_tests(){ - test_suite="$1" - - python3 -m unittest discover -b -v -s "$test_suite" -t . -} - -run_spread(){ - TMP_SPREAD="$(mktemp -d)" - curl -s https://storage.googleapis.com/snapd-spread-tests/spread/spread-amd64.tar.gz | tar xzv -C "$TMP_SPREAD" - - if [[ "$#" -eq 0 ]]; then - "$TMP_SPREAD/spread" -v lxd: - else - "$TMP_SPREAD/spread" -v "$@" - fi -} - -if [[ "$#" -eq 0 ]]; then - usage - exit 1 -fi - -test_suite=$1 -shift - -if [[ "$test_suite" == "static" ]]; then - run_static_tests -elif [[ "$test_suite" == "spread" ]]; then - run_spread "$@" -elif [[ "$test_suite" == "-h" ]] || [[ "$test_suite" == "help" ]]; then - usage - exit 0 -else - run_snapcraft_tests "$test_suite" "$@" -fi - -echo -e '\e[1;32mEverything passed\e[0m' diff --git a/schema/snapcraft.json b/schema/snapcraft.json index c4c0a5b3ec..059199a797 100644 --- a/schema/snapcraft.json +++ b/schema/snapcraft.json @@ -1,1284 +1,1156 @@ { - "$schema": "http://json-schema.org/draft-04/schema#", - "definitions": { - "grammar-string": { - "oneOf": [ - { - "type": "string", - "usage": "" - }, - { - "type": "array", - "items": { - "minitems": 1, - "uniqueItems": true, - "oneOf": [ - { - "type": "object", - "usage": "on [,...]:", - "additionalProperties": false, - "patternProperties": { - "^on\\s+.+$": { - "$ref": "#/definitions/grammar-string" - } - } - }, - { - "type": "object", - "usage": "to [,...]:", - "additionalProperties": false, - "patternProperties": { - "^to\\s+.+$": { - "$ref": "#/definitions/grammar-string" - } - } - }, - { - "type": "object", - "usage": "try:", - "additionalProperties": false, - "patternProperties": { - "^try$": { - "$ref": "#/definitions/grammar-string" - } - } - }, - { - "type": "object", - "usage": "else:", - "additionalProperties": false, - "patternProperties": { - "^else$": { - "$ref": "#/definitions/grammar-string" - } - } - }, - { - "type": "string", - "pattern": "else fail" - } - ] - } - } - ] + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": { + "grammar-string": { + "oneOf": [ + { + "type": "string", + "usage": "" }, - "grammar-array": { - "type": "array", + { + "type": "array", + "items": { "minitems": 1, "uniqueItems": true, - "items": { - "oneOf": [ - { - "type": "string", - "usage": "" - }, - { - "type": "object", - "usage": "on [,...]:", - "additionalProperties": false, - "patternProperties": { - "^on\\s+.+$": { - "$ref": "#/definitions/grammar-array" - } - } - }, - { - "type": "object", - "usage": "to [,...]:", - "additionalProperties": false, - "patternProperties": { - "^to\\s+.+$": { - "$ref": "#/definitions/grammar-array" - } - } - }, - { - "type": "object", - "usage": "try:", - "additionalProperties": false, - "patternProperties": { - "^try$": { - "$ref": "#/definitions/grammar-array" - } - } - }, - { - "type": "object", - "usage": "else:", - "additionalProperties": false, - "patternProperties": { - "^else$": { - "$ref": "#/definitions/grammar-array" - } - } - } - ] + "oneOf": [ + { + "type": "object", + "usage": "on [,...]:", + "additionalProperties": false, + "patternProperties": { + "^on\\s+.+$": { + "$ref": "#/definitions/grammar-string" + } + } + }, + { + "type": "object", + "usage": "to [,...]:", + "additionalProperties": false, + "patternProperties": { + "^to\\s+.+$": { + "$ref": "#/definitions/grammar-string" + } + } + }, + { + "type": "object", + "usage": "try:", + "additionalProperties": false, + "patternProperties": { + "^try$": { + "$ref": "#/definitions/grammar-string" + } + } + }, + { + "type": "object", + "usage": "else:", + "additionalProperties": false, + "patternProperties": { + "^else$": { + "$ref": "#/definitions/grammar-string" + } + } + }, + { + "type": "string", + "pattern": "else fail" + } + ] + } + } + ] + }, + "grammar-array": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "oneOf": [ + { + "type": "string", + "usage": "" + }, + { + "type": "object", + "usage": "on [,...]:", + "additionalProperties": false, + "patternProperties": { + "^on\\s+.+$": { + "$ref": "#/definitions/grammar-array" + } } - }, - "build-environment-grammar": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "oneOf": [ - { - "type": "object", - "minProperties": 1, - "maxProperties": 1, - "additionalProperties": { - "type": "string" - } - }, - { - "type": "object", - "usage": "on [,...]:", - "additionalProperties": false, - "patternProperties": { - "^on\\s+.+$": { - "$ref": "#/definitions/build-environment-grammar" - } - } - }, - { - "type": "object", - "usage": "to [,...]:", - "additionalProperties": false, - "patternProperties": { - "^to\\s+.+$": { - "$ref": "#/definitions/build-environment-grammar" - } - } - }, - { - "type": "object", - "usage": "else:", - "additionalProperties": false, - "patternProperties": { - "^else$": { - "$ref": "#/definitions/build-environment-grammar" - } - } - } - ] + }, + { + "type": "object", + "usage": "to [,...]:", + "additionalProperties": false, + "patternProperties": { + "^to\\s+.+$": { + "$ref": "#/definitions/grammar-array" + } } - }, - "apt-deb": { + }, + { "type": "object", - "description": "deb repositories", + "usage": "try:", "additionalProperties": false, - "properties": { - "type": { - "type": "string", - "enum": [ - "apt" - ] - }, - "architectures": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string", - "description": "Architectures to enable, or restrict to, for this repository. Defaults to host architecture." - } - }, - "formats": { - "type": "array", - "description": "deb types to enable. Defaults to [deb, deb-src].", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string", - "enum": [ - "deb", - "deb-src" - ] - } - }, - "components": { - "type": "array", - "minItems": 0, - "uniqueItems": true, - "items": { - "type": "string", - "description": "Deb repository components to enable, e.g. 'main, multiverse, unstable'" - } - }, - "key-id": { - "type": "string", - "description": "GPG key identifier / fingerprint. May be used to identify key file in /snap/keys/.asc", - "pattern": "^[A-Z0-9]{40}$" - }, - "key-server": { - "type": "string", - "description": "GPG keyserver to use to fetch GPG , e.g. 'keyserver.ubuntu.com'. Defaults to keyserver.ubuntu.com if key is not found in project." - }, - "path": { - "type": "string", - "description": "Exact path to repository (relative to URL). Cannot be used with suites or components." - }, - "suites": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": "string", - "description": "Deb repository suites to enable, e.g. 'xenial-updates, xenial-security')." - } - }, - "url": { - "type": "string", - "description": "Deb repository URL, e.g. 'http://archive.canonical.com/ubuntu'." - } - }, - "required": [ - "type", - "key-id", - "url" - ], - "validation-failure": "{!r} is not properly configured deb repository" - }, - "apt-ppa": { + "patternProperties": { + "^try$": { + "$ref": "#/definitions/grammar-array" + } + } + }, + { "type": "object", - "description": "PPA repository", + "usage": "else:", "additionalProperties": false, - "properties": { - "type": { - "type": "string", - "enum": [ - "apt" - ] - }, - "ppa": { - "type": "string", - "description": "ppa path: e.g. 'canonical-kernel-team/unstable'" - } - }, - "required": [ - "type", - "ppa" - ], - "validation-failure": "{!r} is not properly configured PPA repository" - }, - "system-username-scope": { - "type": "string", - "description": "short-form user configuration (: )", - "enum": [ - "shared" - ], - "validation-failure": "{!r} is not a valid user scope. Valid scopes include: 'shared'" - }, - "environment": { + "patternProperties": { + "^else$": { + "$ref": "#/definitions/grammar-array" + } + } + } + ] + } + }, + "build-environment-grammar": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "oneOf": [ + { "type": "object", - "description": "environment entries", - "minItems": 1, + "minProperties": 1, + "maxProperties": 1, "additionalProperties": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "number" - } - ] + "type": "string" } - } + }, + { + "type": "object", + "usage": "on [,...]:", + "additionalProperties": false, + "patternProperties": { + "^on\\s+.+$": { + "$ref": "#/definitions/build-environment-grammar" + } + } + }, + { + "type": "object", + "usage": "to [,...]:", + "additionalProperties": false, + "patternProperties": { + "^to\\s+.+$": { + "$ref": "#/definitions/build-environment-grammar" + } + } + }, + { + "type": "object", + "usage": "else:", + "additionalProperties": false, + "patternProperties": { + "^else$": { + "$ref": "#/definitions/build-environment-grammar" + } + } + } + ] + } }, - "title": "snapcraft schema", - "type": "object", - "properties": { - "build-packages": { - "$ref": "#/definitions/grammar-array", - "description": "top level build packages." - }, - "adopt-info": { - "type": "string", - "description": "name of the part that provides source files that will be parsed to extract snap metadata information" - }, - "name": { - "description": "name of the snap package", - "allOf": [ - { - "$comment": "string, but not too long. the failure message avoids printing repr of the thing, as it could be huge", - "type": "string", - "validation-failure": "snap names need to be strings.", - "maxLength": 40 - }, - { - "pattern": "^[a-z0-9-]*[a-z][a-z0-9-]*$", - "validation-failure": "{.instance!r} is not a valid snap name. Snap names can only use ASCII lowercase letters, numbers, and hyphens, and must have at least one letter." - }, - { - "pattern": "^[^-]", - "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot start with a hyphen." - }, - { - "pattern": "[^-]$", - "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot end with a hyphen." - }, - { - "not": { - "pattern": "--" - }, - "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot have two hyphens in a row." - } - ] - }, - "title": { - "$comment": "https://forum.snapcraft.io/t/title-length-in-snapcraft-yaml-snap-yaml/8625/10", - "description": "title for the snap", - "type": "string", - "maxLength": 40 + "apt-deb": { + "type": "object", + "description": "deb repositories", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["apt"] }, "architectures": { - "description": "architectures on which to build, and on which the resulting snap runs", - "type": "array", - "minItems": 1, - "uniqueItems": true, - "format": "architectures", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "additionalProperties": false, - "required": [ - "build-on" - ], - "properties": { - "build-on": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true - } - ] - }, - "run-on": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "uniqueItems": true - } - ] - } - } - } - ] - } - }, - "version": { - "description": "package version", - "allOf": [ - { - "type": "string", - "validation-failure": "snap versions need to be strings. They must also be wrapped in quotes when the value will be interpreted by the YAML parser as a non-string. Examples: '1', '1.2', '1.2.3', git (will be replaced by a git describe based version string)." - }, - { - "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9:.+~-]*[a-zA-Z0-9+~])?$", - "maxLength": 32, - "validation-failure": "{.instance!r} is not a valid snap version string. Snap versions consist of upper- and lower-case alphanumeric characters, as well as periods, colons, plus signs, tildes, and hyphens. They cannot begin with a period, colon, plus sign, tilde, or hyphen. They cannot end with a period, colon, or hyphen." - } - ] - }, - "version-script": { - "type": "string", - "description": "a script that echoes the version to set." - }, - "license": { - "type": "string", - "description": "the license the package holds" - }, - "icon": { - "type": "string", - "description": "path to a 512x512 icon representing the package.", - "format": "icon-path" - }, - "summary": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { "type": "string", - "description": "one line summary for the package", - "maxLength": 78 + "description": "Architectures to enable, or restrict to, for this repository. Defaults to host architecture." + } }, - "description": { + "formats": { + "type": "array", + "description": "deb types to enable. Defaults to [deb, deb-src].", + "minItems": 1, + "uniqueItems": true, + "items": { "type": "string", - "description": "long description of the package", - "pattern": ".+", - "validation-failure": "{.instance!r} is not a valid description string." + "enum": ["deb", "deb-src"] + } }, - "assumes": { - "type": "array", - "description": "featureset the snap requires in order to work.", - "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] - }, - "type": { + "components": { + "type": "array", + "minItems": 0, + "uniqueItems": true, + "items": { "type": "string", - "description": "the snap type, the implicit type is 'app'", - "enum": [ - "app", - "base", - "gadget", - "kernel", - "snapd" - ] + "description": "Deb repository components to enable, e.g. 'main, multiverse, unstable'" + } }, - "frameworks": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] - }, - "confinement": { - "type": "string", - "description": "the type of confinement supported by the snap", - "default": "strict", - "enum": [ - "classic", - "devmode", - "strict" - ] + "key-id": { + "type": "string", + "description": "GPG key identifier / fingerprint. May be used to identify key file in /snap/keys/.asc", + "pattern": "^[A-Z0-9]{40}$" }, - "grade": { - "type": "string", - "description": "the quality grade of the snap", - "default": "stable", - "enum": [ - "stable", - "devel" - ] + "key-server": { + "type": "string", + "description": "GPG keyserver to use to fetch GPG , e.g. 'keyserver.ubuntu.com'. Defaults to keyserver.ubuntu.com if key is not found in project." }, - "base": { - "type": "string", - "description": "the base snap to use" + "path": { + "type": "string", + "description": "Exact path to repository (relative to URL). Cannot be used with suites or components." }, - "build-base": { + "suites": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { "type": "string", - "description": "force a build environment based on base to create a snap" + "description": "Deb repository suites to enable, e.g. 'xenial-updates, xenial-security')." + } }, - "epoch": { - "description": "the snap epoch, used to specify upgrade paths", - "format": "epoch" + "url": { + "type": "string", + "description": "Deb repository URL, e.g. 'http://archive.canonical.com/ubuntu'." + } + }, + "required": ["type", "key-id", "url"], + "validation-failure": "{!r} is not properly configured deb repository" + }, + "apt-ppa": { + "type": "object", + "description": "PPA repository", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": ["apt"] }, - "compression": { - "description": "compression to use for snap archive - default is otherwise determined by 'snap pack'", + "ppa": { + "type": "string", + "description": "ppa path: e.g. 'canonical-kernel-team/unstable'" + } + }, + "required": ["type", "ppa"], + "validation-failure": "{!r} is not properly configured PPA repository" + }, + "system-username-scope": { + "type": "string", + "description": "short-form user configuration (: )", + "enum": ["shared"], + "validation-failure": "{!r} is not a valid user scope. Valid scopes include: 'shared'" + }, + "environment": { + "type": "object", + "description": "environment entries", + "minItems": 1, + "additionalProperties": { + "anyOf": [ + { "type": "string", - "enum": [ - "lzo", - "xz" - ] - }, - "environment": { - "description": "environment entries for the snap as a whole", - "$ref": "#/definitions/environment" + "minLength": 1 + }, + { + "type": "number" + } + ] + } + } + }, + "title": "snapcraft schema", + "type": "object", + "properties": { + "build-packages": { + "$ref": "#/definitions/grammar-array", + "description": "top level build packages." + }, + "adopt-info": { + "type": "string", + "description": "name of the part that provides source files that will be parsed to extract snap metadata information" + }, + "name": { + "description": "name of the snap package", + "allOf": [ + { + "$comment": "string, but not too long. the failure message avoids printing repr of the thing, as it could be huge", + "type": "string", + "validation-failure": "snap names need to be strings.", + "maxLength": 40 }, - "passthrough": { - "type": "object", - "description": "properties to be passed into snap.yaml as-is" + { + "pattern": "^[a-z0-9-]*[a-z][a-z0-9-]*$", + "validation-failure": "{.instance!r} is not a valid snap name. Snap names can only use ASCII lowercase letters, numbers, and hyphens, and must have at least one letter." }, - "layout": { - "type": "object", - "description": "layout property to be passed into the snap.yaml as-is" + { + "pattern": "^[^-]", + "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot start with a hyphen." }, - "package-repositories": { - "type": "array", - "description": "additional repository configuration.", - "minItems": 0, - "uniqueItems": true, - "items": [ - { - "oneOf": [ - { - "$ref": "#/definitions/apt-deb" - }, - { - "$ref": "#/definitions/apt-ppa" - } - ] - } - ] + { + "pattern": "[^-]$", + "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot end with a hyphen." }, - "system-usernames": { + { + "not": { + "pattern": "--" + }, + "validation-failure": "{.instance!r} is not a valid snap name. Snap names cannot have two hyphens in a row." + } + ] + }, + "title": { + "$comment": "https://forum.snapcraft.io/t/title-length-in-snapcraft-yaml-snap-yaml/8625/10", + "description": "title for the snap", + "type": "string", + "maxLength": 40 + }, + "architectures": { + "description": "architectures on which to build, and on which the resulting snap runs", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "format": "architectures", + "items": { + "anyOf": [ + { + "type": "string" + }, + { "type": "object", - "description": "system username", "additionalProperties": false, - "validation-failure": "{!r} is not a valid system-username.", - "patternProperties": { - "^snap_(daemon|microk8s|aziotedge|aziotdu)$": { - "oneOf": [ - { - "$ref": "#/definitions/system-username-scope" - }, - { - "type": "object", - "description": "long-form user configuration", - "additionalProperties": false, - "properties": { - "scope": { - "$ref": "#/definitions/system-username-scope" - } - }, - "required": [ - "scope" - ] - } - ] - } - } - }, - "donation": { - "oneOf": [ - { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] - }, - { + "required": ["build-on"], + "properties": { + "build-on": { + "anyOf": [ + { "type": "string" - } - ] - }, - "issues": { - "oneOf": [ - { + }, + { "type": "array", "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] - }, - { + "uniqueItems": true + } + ] + }, + "run-on": { + "anyOf": [ + { "type": "string" - } - ] - }, - "contact": { - "oneOf": [ - { + }, + { "type": "array", "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] - }, - { - "type": "string" - } - ] - }, - "source-code": { - "type": "string" - }, - "website": { - "type": "string" - }, - "apps": { - "type": "object", - "additionalProperties": false, - "validation-failure": "{!r} is not a valid app name. App names consist of upper- and lower-case alphanumeric characters and hyphens. They cannot start or end with a hyphen.", - "patternProperties": { - "^[a-zA-Z0-9](?:-?[a-zA-Z0-9])*$": { - "type": "object", - "required": [ - "command" - ], - "dependencies": { - "bus-name": [ - "daemon" - ], - "activates-on": [ - "daemon" - ], - "refresh-mode": [ - "daemon" - ], - "stop-mode": [ - "daemon" - ], - "stop-command": [ - "daemon" - ], - "start-timeout": [ - "daemon" - ], - "stop-timeout": [ - "daemon" - ], - "watchdog-timeout": [ - "daemon" - ], - "restart-delay": [ - "daemon" - ], - "post-stop-command": [ - "daemon" - ], - "reload-command": [ - "daemon" - ], - "restart-condition": [ - "daemon" - ], - "before": [ - "daemon" - ], - "after": [ - "daemon" - ], - "timer": [ - "daemon" - ], - "install-mode": [ - "daemon" - ] - }, - "additionalProperties": false, - "properties": { - "autostart": { - "type": "string", - "description": "Name of the desktop file placed by the application in $SNAP_USER_DATA/.config/autostart to indicate that application should be started with the user's desktop session.", - "pattern": "^[A-Za-z0-9. _#:$-]+\\.desktop$", - "validation-failure": "{.instance!r} is not a valid desktop file name (e.g. myapp.desktop)" - }, - "common-id": { - "type": "string", - "description": "common identifier across multiple packaging formats" - }, - "bus-name": { - "type": "string", - "description": "D-Bus name this service is reachable as", - "pattern": "^[A-Za-z0-9/. _#:$-]*$", - "validation-failure": "{.instance!r} is not a valid bus name." - }, - "activates-on": { - "type": "array", - "description": "dbus interface slots this service activates on", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "desktop": { - "type": "string", - "description": "path to a desktop file representing the app, relative to the prime directory" - }, - "command": { - "type": "string", - "description": "command executed to run the binary" - }, - "completer": { - "type": "string", - "description": "bash completion script relative to the prime directory" - }, - "stop-command": { - "type": "string", - "description": "command executed to stop a service" - }, - "post-stop-command": { - "type": "string", - "description": "command executed after stopping a service" - }, - "start-timeout": { - "type": "string", - "pattern": "^[0-9]+(ns|us|ms|s|m)*$", - "validation-failure": "{.instance!r} is not a valid timeout value.", - "description": "Optional time to wait for daemon to start - ns | us | ms | s | m" - }, - "stop-timeout": { - "type": "string", - "pattern": "^[0-9]+(ns|us|ms|s|m)*$", - "validation-failure": "{.instance!r} is not a valid timeout value.", - "description": "Optional time to wait for daemon to stop - ns | us | ms | s | m" - }, - "watchdog-timeout": { - "type": "string", - "pattern": "^[0-9]+(ns|us|ms|s|m)*$", - "validation-failure": "{.instance!r} is not a valid timeout value.", - "description": "Service watchdog timeout - ns | us | ms | s | m" - }, - "reload-command": { - "type": "string", - "description": "Command to use to ask the service to reload its configuration." - }, - "restart-delay": { - "type": "string", - "pattern": "^[0-9]+(ns|us|ms|s|m)*$", - "validation-failure": "{.instance!r} is not a valid delay value.", - "description": "Delay between service restarts - ns | us | ms | s | m. Defaults to unset. See the systemd.service manual on RestartSec for details." - }, - "timer": { - "type": "string", - "description": "The service is activated by a timer, app must be a daemon. (systemd.time calendar event string)" - }, - "daemon": { - "type": "string", - "description": "signals that the app is a service.", - "enum": [ - "simple", - "forking", - "oneshot", - "notify", - "dbus" - ] - }, - "after": { - "type": "array", - "description": "List of applications that are ordered to be started after the current one", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "before": { - "type": "array", - "description": "List of applications that are ordered to be started before the current one", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "refresh-mode": { - "type": "string", - "description": "controls if the app should be restarted at all", - "enum": [ - "endure", - "restart", - "ignore-running" - ] - }, - "stop-mode": { - "type": "string", - "description": "controls how the daemon should be stopped", - "enum": [ - "sigterm", - "sigterm-all", - "sighup", - "sighup-all", - "sigusr1", - "sigusr1-all", - "sigusr2", - "sigusr2-all", - "sigint", - "sigint-all" - ] - }, - "restart-condition": { - "type": "string", - "enum": [ - "on-success", - "on-failure", - "on-abnormal", - "on-abort", - "on-watchdog", - "always", - "never" - ] - }, - "install-mode": { - "type": "string", - "enum": [ - "enable", - "disable" - ] - }, - "slots": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "plugs": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "aliases": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "pattern": "^[a-zA-Z0-9][-_.a-zA-Z0-9]*$", - "validation-failure": "{.instance!r} is not a valid alias. Aliases must be strings, begin with an ASCII alphanumeric character, and can only use ASCII alphanumeric characters and the following special characters: . _ -" - } - }, - "environment": { - "description": "environment entries for the specific app.", - "$ref": "#/definitions/environment" - }, - "adapter": { - "$comment": "Full should be the default, but it requires command-chain which isn't available in snapd until 2.36, which isn't yet stable. Until 2.36 is generally available, continue with legacy as the default.", - "type": "string", - "description": "What kind of wrapper to generate for the given command", - "enum": [ - "none", - "legacy", - "full" - ], - "default": "legacy" - }, - "command-chain": { - "type": "array", - "items": { - "type": "string", - "pattern": "^[A-Za-z0-9/._#:$-]*$", - "validation-failure": "{.instance!r} is not a valid command-chain entry. Command chain entries must be strings, and can only use ASCII alphanumeric characters and the following special characters: / . _ # : $ -" - } - }, - "sockets": { - "type": "object", - "additionalProperties": false, - "validation-failure": "{!r} is not a valid socket name. Socket names consist of lower-case alphanumeric characters and hyphens.", - "patternProperties": { - "^[a-z][a-z0-9_-]*$": { - "type": "object", - "required": [ - "listen-stream" - ], - "description": "Sockets for automatic service activation", - "additionalProperties": false, - "properties": { - "listen-stream": { - "anyOf": [ - { - "type": "integer", - "usage": "port number, an integer between 1 and 65535", - "minimum": 1, - "maximum": 65535 - }, - { - "type": "string", - "usage": "socket path, a string" - } - ] - }, - "socket-mode": { - "type": "integer" - } - } - } - } - }, - "passthrough": { - "type": "object", - "description": "properties to be passed into snap.yaml as-is" - }, - "extensions": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "env-injector", - "flutter-stable", - "flutter-beta", - "flutter-dev", - "flutter-master", - "gnome", - "gnome-3-28", - "gnome-3-34", - "gnome-3-38", - "kde-neon", - "kde-neon-6", - "ros1-noetic", - "ros1-noetic-desktop", - "ros1-noetic-perception", - "ros1-noetic-robot", - "ros1-noetic-ros-base", - "ros1-noetic-ros-core", - "ros2-foxy", - "ros2-foxy-ros-base", - "ros2-foxy-ros-core", - "ros2-foxy-desktop", - "ros2-humble", - "ros2-humble-ros-base", - "ros2-humble-ros-core", - "ros2-humble-desktop" - ] - } - } - } - } + "uniqueItems": true + } + ] + } } + } + ] + } + }, + "version": { + "description": "package version", + "allOf": [ + { + "type": "string", + "validation-failure": "snap versions need to be strings. They must also be wrapped in quotes when the value will be interpreted by the YAML parser as a non-string. Examples: '1', '1.2', '1.2.3', git (will be replaced by a git describe based version string)." }, - "hooks": { - "type": "object", - "additionalProperties": false, - "validation-failure": "{!r} is not a valid hook name. Hook names consist of lower-case alphanumeric characters and hyphens. They cannot start or end with a hyphen.", - "patternProperties": { - "^[a-z](?:-?[a-z0-9])*$": { - "type": "object", - "additionalProperties": false, - "properties": { - "command-chain": { - "type": "array", - "items": { - "type": "string", - "pattern": "^[A-Za-z0-9/._#:$-]*$", - "validation-failure": "{.instance!r} is not a valid command-chain entry. Command chain entries must be strings, and can only use ASCII alphanumeric characters and the following special characters: / . _ # : $ -" - } - }, - "environment": { - "description": "environment entries for this hook", - "$ref": "#/definitions/environment" - }, - "plugs": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "passthrough": { - "type": "object", - "description": "properties to be passed into snap.yaml as-is" - } - } - } + { + "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9:.+~-]*[a-zA-Z0-9+~])?$", + "maxLength": 32, + "validation-failure": "{.instance!r} is not a valid snap version string. Snap versions consist of upper- and lower-case alphanumeric characters, as well as periods, colons, plus signs, tildes, and hyphens. They cannot begin with a period, colon, plus sign, tilde, or hyphen. They cannot end with a period, colon, or hyphen." + } + ] + }, + "version-script": { + "type": "string", + "description": "a script that echoes the version to set." + }, + "license": { + "type": "string", + "description": "the license the package holds" + }, + "icon": { + "type": "string", + "description": "path to a 512x512 icon representing the package.", + "format": "icon-path" + }, + "summary": { + "type": "string", + "description": "one line summary for the package", + "maxLength": 78 + }, + "description": { + "type": "string", + "description": "long description of the package", + "pattern": ".+", + "validation-failure": "{.instance!r} is not a valid description string." + }, + "assumes": { + "type": "array", + "description": "featureset the snap requires in order to work.", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] + }, + "type": { + "type": "string", + "description": "the snap type, the implicit type is 'app'", + "enum": ["app", "base", "gadget", "kernel", "snapd"] + }, + "frameworks": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] + }, + "confinement": { + "type": "string", + "description": "the type of confinement supported by the snap", + "default": "strict", + "enum": ["classic", "devmode", "strict"] + }, + "grade": { + "type": "string", + "description": "the quality grade of the snap", + "default": "stable", + "enum": ["stable", "devel"] + }, + "base": { + "type": "string", + "description": "the base snap to use" + }, + "build-base": { + "type": "string", + "description": "force a build environment based on base to create a snap" + }, + "epoch": { + "description": "the snap epoch, used to specify upgrade paths", + "format": "epoch" + }, + "compression": { + "description": "compression to use for snap archive - default is otherwise determined by 'snap pack'", + "type": "string", + "enum": ["lzo", "xz"] + }, + "environment": { + "description": "environment entries for the snap as a whole", + "$ref": "#/definitions/environment" + }, + "passthrough": { + "type": "object", + "description": "properties to be passed into snap.yaml as-is" + }, + "layout": { + "type": "object", + "description": "layout property to be passed into the snap.yaml as-is" + }, + "package-repositories": { + "type": "array", + "description": "additional repository configuration.", + "minItems": 0, + "uniqueItems": true, + "items": [ + { + "oneOf": [ + { + "$ref": "#/definitions/apt-deb" + }, + { + "$ref": "#/definitions/apt-ppa" } - }, - "parts": { - "type": "object", - "minProperties": 1, - "additionalProperties": false, - "validation-failure": "{!r} is not a valid part name. Part names consist of lower-case alphanumeric characters, hyphens and plus signs. As a special case, 'plugins' is also not a valid part name.", - "patternProperties": { - "^(?!plugins$)[a-z0-9][a-z0-9+-]*$": { - "type": [ - "object", - "null" - ], - "minProperties": 1, - "required": [ - "plugin" - ], - "properties": { - "plugin": { - "type": "string", - "description": "plugin name" - }, - "source": { - "$ref": "#/definitions/grammar-string" - }, - "source-checksum": { - "type": "string", - "default": "" - }, - "source-branch": { - "type": "string", - "default": "" - }, - "source-commit": { - "type": "string", - "default": "" - }, - "source-depth": { - "type": "integer", - "default": 0 - }, - "source-submodules": { - "type": "array", - "minItems": 0, - "uniqueItems": true, - "items": { - "type": "string", - "description": "submodules to fetch, by pathname in source tree" - } - }, - "source-subdir": { - "type": "string", - "default": "" - }, - "source-tag": { - "type": "string", - "default": "" - }, - "source-type": { - "type": "string", - "default": "", - "enum": [ - "bzr", - "git", - "hg", - "mercurial", - "subversion", - "svn", - "tar", - "zip", - "deb", - "rpm", - "7z", - "local" - ] - }, - "disable-parallel": { - "type": "boolean", - "default": false - }, - "after": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - }, - "default": [] - }, - "stage-snaps": { - "$comment": "For some reason 'default' doesn't work if in the ref", - "$ref": "#/definitions/grammar-array", - "default": [] - }, - "stage-packages": { - "$comment": "For some reason 'default' doesn't work if in the ref", - "$ref": "#/definitions/grammar-array", - "default": [] - }, - "build-snaps": { - "$comment": "For some reason 'default' doesn't work if in the ref", - "$ref": "#/definitions/grammar-array", - "default": [] - }, - "build-packages": { - "$comment": "For some reason 'default' doesn't work if in the ref", - "$ref": "#/definitions/grammar-array", - "default": [] - }, - "build-environment": { - "$ref": "#/definitions/build-environment-grammar", - "default": [] - }, - "build-attributes": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string", - "enum": [ - "core22-step-dependencies", - "enable-patchelf", - "no-patchelf", - "no-install", - "debug", - "keep-execstack" - ] - }, - "default": [] - }, - "organize": { - "type": "object", - "default": {}, - "additionalProperties": { - "type": "string", - "minLength": 1 - } - }, - "filesets": { - "type": "object", - "default": {}, - "additionalProperties": { - "type": "array", - "minitems": 1 - } - }, - "stage": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "prime": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - }, - "default": [ - "*" - ] - }, - "override-pull": { - "type": "string", - "default": "snapcraftctl pull" - }, - "override-build": { - "type": "string", - "default": "snapcraftctl build" - }, - "override-stage": { - "type": "string", - "default": "snapcraftctl stage" - }, - "override-prime": { - "type": "string", - "default": "snapcraftctl prime" - }, - "parse-info": { - "type": "array", - "minitems": 1, - "uniqueItems": true, - "items": { - "type": "string" - }, - "default": [] - } - } + ] + } + ] + }, + "system-usernames": { + "type": "object", + "description": "system username", + "additionalProperties": false, + "validation-failure": "{!r} is not a valid system-username.", + "patternProperties": { + "^snap_(daemon|microk8s|aziotedge|aziotdu)$": { + "oneOf": [ + { + "$ref": "#/definitions/system-username-scope" + }, + { + "type": "object", + "description": "long-form user configuration", + "additionalProperties": false, + "properties": { + "scope": { + "$ref": "#/definitions/system-username-scope" } + }, + "required": ["scope"] } + ] + } + } + }, + "donation": { + "oneOf": [ + { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] }, - "plugs": { - "type": "object" - }, - "slots": { - "type": "object" + { + "type": "string" + } + ] + }, + "issues": { + "oneOf": [ + { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] }, - "ua-services": { - "type": "array", - "description": "UA services to enable.", - "minItems": 1, - "uniqueItems": true, - "items": [ - { - "type": "string" - } - ] + { + "type": "string" } + ] }, - "allOf": [ + "contact": { + "oneOf": [ { - "anyOf": [ - { - "usage": "type: (without a base)", - "properties": { - "type": { - "enum": [ - "base", - "kernel", - "snapd" - ] - } - }, - "allOf": [ + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] + }, + { + "type": "string" + } + ] + }, + "source-code": { + "type": "string" + }, + "website": { + "type": "string" + }, + "apps": { + "type": "object", + "additionalProperties": false, + "validation-failure": "{!r} is not a valid app name. App names consist of upper- and lower-case alphanumeric characters and hyphens. They cannot start or end with a hyphen.", + "patternProperties": { + "^[a-zA-Z0-9](?:-?[a-zA-Z0-9])*$": { + "type": "object", + "required": ["command"], + "dependencies": { + "bus-name": ["daemon"], + "activates-on": ["daemon"], + "refresh-mode": ["daemon"], + "stop-mode": ["daemon"], + "stop-command": ["daemon"], + "start-timeout": ["daemon"], + "stop-timeout": ["daemon"], + "watchdog-timeout": ["daemon"], + "restart-delay": ["daemon"], + "post-stop-command": ["daemon"], + "reload-command": ["daemon"], + "restart-condition": ["daemon"], + "before": ["daemon"], + "after": ["daemon"], + "timer": ["daemon"], + "install-mode": ["daemon"] + }, + "additionalProperties": false, + "properties": { + "autostart": { + "type": "string", + "description": "Name of the desktop file placed by the application in $SNAP_USER_DATA/.config/autostart to indicate that application should be started with the user's desktop session.", + "pattern": "^[A-Za-z0-9. _#:$-]+\\.desktop$", + "validation-failure": "{.instance!r} is not a valid desktop file name (e.g. myapp.desktop)" + }, + "common-id": { + "type": "string", + "description": "common identifier across multiple packaging formats" + }, + "bus-name": { + "type": "string", + "description": "D-Bus name this service is reachable as", + "pattern": "^[A-Za-z0-9/. _#:$-]*$", + "validation-failure": "{.instance!r} is not a valid bus name." + }, + "activates-on": { + "type": "array", + "description": "dbus interface slots this service activates on", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "desktop": { + "type": "string", + "description": "path to a desktop file representing the app, relative to the prime directory" + }, + "command": { + "type": "string", + "description": "command executed to run the binary" + }, + "completer": { + "type": "string", + "description": "bash completion script relative to the prime directory" + }, + "stop-command": { + "type": "string", + "description": "command executed to stop a service" + }, + "post-stop-command": { + "type": "string", + "description": "command executed after stopping a service" + }, + "start-timeout": { + "type": "string", + "pattern": "^[0-9]+(ns|us|ms|s|m)*$", + "validation-failure": "{.instance!r} is not a valid timeout value.", + "description": "Optional time to wait for daemon to start - ns | us | ms | s | m" + }, + "stop-timeout": { + "type": "string", + "pattern": "^[0-9]+(ns|us|ms|s|m)*$", + "validation-failure": "{.instance!r} is not a valid timeout value.", + "description": "Optional time to wait for daemon to stop - ns | us | ms | s | m" + }, + "watchdog-timeout": { + "type": "string", + "pattern": "^[0-9]+(ns|us|ms|s|m)*$", + "validation-failure": "{.instance!r} is not a valid timeout value.", + "description": "Service watchdog timeout - ns | us | ms | s | m" + }, + "reload-command": { + "type": "string", + "description": "Command to use to ask the service to reload its configuration." + }, + "restart-delay": { + "type": "string", + "pattern": "^[0-9]+(ns|us|ms|s|m)*$", + "validation-failure": "{.instance!r} is not a valid delay value.", + "description": "Delay between service restarts - ns | us | ms | s | m. Defaults to unset. See the systemd.service manual on RestartSec for details." + }, + "timer": { + "type": "string", + "description": "The service is activated by a timer, app must be a daemon. (systemd.time calendar event string)" + }, + "daemon": { + "type": "string", + "description": "signals that the app is a service.", + "enum": ["simple", "forking", "oneshot", "notify", "dbus"] + }, + "after": { + "type": "array", + "description": "List of applications that are ordered to be started after the current one", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "before": { + "type": "array", + "description": "List of applications that are ordered to be started before the current one", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "refresh-mode": { + "type": "string", + "description": "controls if the app should be restarted at all", + "enum": ["endure", "restart", "ignore-running"] + }, + "stop-mode": { + "type": "string", + "description": "controls how the daemon should be stopped", + "enum": [ + "sigterm", + "sigterm-all", + "sighup", + "sighup-all", + "sigusr1", + "sigusr1-all", + "sigusr2", + "sigusr2-all", + "sigint", + "sigint-all" + ] + }, + "restart-condition": { + "type": "string", + "enum": [ + "on-success", + "on-failure", + "on-abnormal", + "on-abort", + "on-watchdog", + "always", + "never" + ] + }, + "install-mode": { + "type": "string", + "enum": ["enable", "disable"] + }, + "slots": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "plugs": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "aliases": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^[a-zA-Z0-9][-_.a-zA-Z0-9]*$", + "validation-failure": "{.instance!r} is not a valid alias. Aliases must be strings, begin with an ASCII alphanumeric character, and can only use ASCII alphanumeric characters and the following special characters: . _ -" + } + }, + "environment": { + "description": "environment entries for the specific app.", + "$ref": "#/definitions/environment" + }, + "adapter": { + "$comment": "Full should be the default, but it requires command-chain which isn't available in snapd until 2.36, which isn't yet stable. Until 2.36 is generally available, continue with legacy as the default.", + "type": "string", + "description": "What kind of wrapper to generate for the given command", + "enum": ["none", "legacy", "full"], + "default": "legacy" + }, + "command-chain": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Za-z0-9/._#:$-]*$", + "validation-failure": "{.instance!r} is not a valid command-chain entry. Command chain entries must be strings, and can only use ASCII alphanumeric characters and the following special characters: / . _ # : $ -" + } + }, + "sockets": { + "type": "object", + "additionalProperties": false, + "validation-failure": "{!r} is not a valid socket name. Socket names consist of lower-case alphanumeric characters and hyphens.", + "patternProperties": { + "^[a-z][a-z0-9_-]*$": { + "type": "object", + "required": ["listen-stream"], + "description": "Sockets for automatic service activation", + "additionalProperties": false, + "properties": { + "listen-stream": { + "anyOf": [ { - "required": [ - "type" - ] + "type": "integer", + "usage": "port number, an integer between 1 and 65535", + "minimum": 1, + "maximum": 65535 }, { - "not": { - "required": [ - "base" - ] - } - } - ] - }, - { - "usage": "base: and type: ", - "properties": { - "type": { - "enum": [ - "app", - "gadget" - ] + "type": "string", + "usage": "socket path, a string" } + ] }, - "allOf": [ - { - "required": [ - "base" - ] - } - ] - }, - { - "usage": "base: bare (with a build-base)", - "properties": { - "base": { - "enum": [ - "bare" - ] - } - }, - "required": [ - "build-base" - ] + "socket-mode": { + "type": "integer" + } + } } - ] + } + }, + "passthrough": { + "type": "object", + "description": "properties to be passed into snap.yaml as-is" + }, + "extensions": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "env-injector", + "flutter-stable", + "flutter-beta", + "flutter-dev", + "flutter-master", + "gnome", + "gnome-3-28", + "gnome-3-34", + "gnome-3-38", + "kde-neon", + "kde-neon-6", + "ros1-noetic", + "ros1-noetic-desktop", + "ros1-noetic-perception", + "ros1-noetic-robot", + "ros1-noetic-ros-base", + "ros1-noetic-ros-core", + "ros2-foxy", + "ros2-foxy-ros-base", + "ros2-foxy-ros-core", + "ros2-foxy-desktop", + "ros2-humble", + "ros2-humble-ros-base", + "ros2-humble-ros-core", + "ros2-humble-desktop" + ] + } + } + } + } + } + }, + "hooks": { + "type": "object", + "additionalProperties": false, + "validation-failure": "{!r} is not a valid hook name. Hook names consist of lower-case alphanumeric characters and hyphens. They cannot start or end with a hyphen.", + "patternProperties": { + "^[a-z](?:-?[a-z0-9])*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "command-chain": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Za-z0-9/._#:$-]*$", + "validation-failure": "{.instance!r} is not a valid command-chain entry. Command chain entries must be strings, and can only use ASCII alphanumeric characters and the following special characters: / . _ # : $ -" + } + }, + "environment": { + "description": "environment entries for this hook", + "$ref": "#/definitions/environment" + }, + "plugs": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + } + }, + "passthrough": { + "type": "object", + "description": "properties to be passed into snap.yaml as-is" + } + } + } + } + }, + "parts": { + "type": "object", + "minProperties": 1, + "additionalProperties": false, + "validation-failure": "{!r} is not a valid part name. Part names consist of lower-case alphanumeric characters, hyphens and plus signs. As a special case, 'plugins' is also not a valid part name.", + "patternProperties": { + "^(?!plugins$)[a-z0-9][a-z0-9+-]*$": { + "type": ["object", "null"], + "minProperties": 1, + "required": ["plugin"], + "properties": { + "plugin": { + "type": "string", + "description": "plugin name" + }, + "source": { + "$ref": "#/definitions/grammar-string" + }, + "source-checksum": { + "type": "string", + "default": "" + }, + "source-branch": { + "type": "string", + "default": "" + }, + "source-commit": { + "type": "string", + "default": "" + }, + "source-depth": { + "type": "integer", + "default": 0 + }, + "source-submodules": { + "type": "array", + "minItems": 0, + "uniqueItems": true, + "items": { + "type": "string", + "description": "submodules to fetch, by pathname in source tree" + } + }, + "source-subdir": { + "type": "string", + "default": "" + }, + "source-tag": { + "type": "string", + "default": "" + }, + "source-type": { + "type": "string", + "default": "", + "enum": [ + "bzr", + "git", + "hg", + "mercurial", + "subversion", + "svn", + "tar", + "zip", + "deb", + "rpm", + "7z", + "local" + ] + }, + "disable-parallel": { + "type": "boolean", + "default": false + }, + "after": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + }, + "default": [] + }, + "stage-snaps": { + "$comment": "For some reason 'default' doesn't work if in the ref", + "$ref": "#/definitions/grammar-array", + "default": [] + }, + "stage-packages": { + "$comment": "For some reason 'default' doesn't work if in the ref", + "$ref": "#/definitions/grammar-array", + "default": [] + }, + "build-snaps": { + "$comment": "For some reason 'default' doesn't work if in the ref", + "$ref": "#/definitions/grammar-array", + "default": [] + }, + "build-packages": { + "$comment": "For some reason 'default' doesn't work if in the ref", + "$ref": "#/definitions/grammar-array", + "default": [] + }, + "build-environment": { + "$ref": "#/definitions/build-environment-grammar", + "default": [] + }, + "build-attributes": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "core22-step-dependencies", + "enable-patchelf", + "no-patchelf", + "no-install", + "debug", + "keep-execstack" + ] + }, + "default": [] + }, + "organize": { + "type": "object", + "default": {}, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "filesets": { + "type": "object", + "default": {}, + "additionalProperties": { + "type": "array", + "minitems": 1 + } + }, + "stage": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + }, + "default": ["*"] + }, + "prime": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + }, + "default": ["*"] + }, + "override-pull": { + "type": "string", + "default": "snapcraftctl pull" + }, + "override-build": { + "type": "string", + "default": "snapcraftctl build" + }, + "override-stage": { + "type": "string", + "default": "snapcraftctl stage" + }, + "override-prime": { + "type": "string", + "default": "snapcraftctl prime" + }, + "parse-info": { + "type": "array", + "minitems": 1, + "uniqueItems": true, + "items": { + "type": "string" + }, + "default": [] + } + } + } + } + }, + "plugs": { + "type": "object" + }, + "slots": { + "type": "object" + }, + "ua-services": { + "type": "array", + "description": "UA services to enable.", + "minItems": 1, + "uniqueItems": true, + "items": [ + { + "type": "string" + } + ] + } + }, + "allOf": [ + { + "anyOf": [ + { + "usage": "type: (without a base)", + "properties": { + "type": { + "enum": ["base", "kernel", "snapd"] + } + }, + "allOf": [ + { + "required": ["type"] + }, + { + "not": { + "required": ["base"] + } + } + ] }, { - "anyOf": [ - { - "required": [ - "summary", - "description", - "version" - ] - }, - { - "required": [ - "adopt-info" - ] - } - ] + "usage": "base: and type: ", + "properties": { + "type": { + "enum": ["app", "gadget"] + } + }, + "allOf": [ + { + "required": ["base"] + } + ] + }, + { + "usage": "base: bare (with a build-base)", + "properties": { + "base": { + "enum": ["bare"] + } + }, + "required": ["build-base"] } - ], - "required": [ - "name", - "parts" - ], - - "dependencies": { - "license-agreement": [ - "license" - ], - "license-version": [ - "license" - ] + ] }, - "additionalProperties": false + { + "anyOf": [ + { + "required": ["summary", "description", "version"] + }, + { + "required": ["adopt-info"] + } + ] + } + ], + "required": ["name", "parts"], + + "dependencies": { + "license-agreement": ["license"], + "license-version": ["license"] + }, + "additionalProperties": false } diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index e5487c3071..0000000000 --- a/setup.cfg +++ /dev/null @@ -1,42 +0,0 @@ -[codespell] -ignore-words-list = buildd,crate,keyserver,comandos,ro,astroid,assertIn,socio-economic,wethr -skip = waf,*.tar,*.xz,*.zip,*.bz2,*.7z,*.gz,*.deb,*.rpm,*.snap,*.comp,*.gpg,*.pyc,*.png,*.ico,*.jar,*.so,changelog,.git,.hg,.mypy_cache,.tox,.venv,venv,_build,buck-out,__pycache__,build,dist,.vscode,parts,stage,prime,test_appstream.py,./snapcraft.spec,./.direnv,./.pytest_cache,.ruff_cache,*.asc -quiet-level = 4 - -[flake8] -# E501 line too long -# E203 whitespace before ':' -extend-ignore = E203, E501 -max-complexity = 10 -max-line-length = 88 -exclude = - # No need to traverse our git directory - .direnv, - .git, - .hg, - .mypy_cache, - .tox, - .venv, - .vscode, - _build, - buck-out, - # There's no value in checking cache directories - __pycache__, - # This contains builds of flake8 that we don't want to check - build, - dist, - # snapcraft generated - parts, - stage, - prime - -[pycodestyle] -max-line-length = 88 -ignore = E203,E501 - -[pydocstyle] -# D107 Missing docstring in __init__ (reason: documented in class docstring) -# D203 1 blank line required before class docstring (reason: pep257 default) -# D213 Multi-line docstring summary should start at the second line (reason: pep257 default) -ignore = D107, D203, D213 -ignore_decorators = override diff --git a/setup.py b/setup.py deleted file mode 100755 index 87cec33c05..0000000000 --- a/setup.py +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env python3 -# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- -# -# Copyright 2015-2022,2024 Canonical Ltd. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 3 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import os -import sys - -from setuptools import find_namespace_packages, setup - -from tools.version import determine_version - - -def recursive_data_files(directory, install_directory): - data_files = [] - for root, _directories, file_names in os.walk(directory): - file_paths = [os.path.join(root, file_name) for file_name in file_names] - data_files.append((os.path.join(install_directory, root), file_paths)) - return data_files - - -# Common distribution data -name = "snapcraft" -description = "Publish your app for Linux users for desktop, cloud, and IoT." -author_email = "snapcraft@lists.snapcraft.io" -url = "https://github.com/canonical/snapcraft" -license_ = "GPL v3" -classifiers = [ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Developers", - "Intended Audience :: System Administrators", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Natural Language :: English", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.12", - "Topic :: Software Development :: Build Tools", - "Topic :: System :: Software Distribution", -] - -# snapcraftctl is not in console_scripts because we need a clean environment. -# Only include it for Linux. -if sys.platform == "linux": - scripts = ["bin/snapcraftctl", "bin/snapcraftctl-compat"] -else: - scripts = [] - -dev_requires = [ - "black", - "codespell[toml]", - "coverage[toml]", - "pyflakes", - "fixtures", - # For Tiobe TiCS - "flake8", - "mccabe", - "mypy", - "testscenarios", - "pexpect", - "pip", - "pycodestyle", - "pydocstyle", - "pyftpdlib", - "pyinstaller; sys_platform == 'win32'", - # For Tiobe TiCS - "pylint", - "pyramid", - "pytest", - "pytest-cov", - "pytest-check", - "pytest-mock", - "pytest-subprocess", - "tox>=4.5", - "types-PyYAML", - # types-requests>=2.31.0.7 requires urllib3>=2 - "types-requests==2.31.0.6", - "types-setuptools", - "types-simplejson", - "types-tabulate", - "types-toml", - "yamllint", -] - -install_requires = [ - "attrs", - "catkin-pkg; sys_platform == 'linux'", - "click", - "craft-application~=4.4", - "craft-archives~=2.0", - "craft-cli>=2.15.0", - "craft-grammar>=2.0.1,<3.0.0", - "craft-parts==2.4.1", - "craft-platforms~=0.4", - "craft-providers>=2.0.4,<3.0.0", - "craft-store>=3.0.2,<4.0.0", - "docutils<0.20", # Frozen until we can update sphinx dependencies. - "gnupg", - "jsonschema==2.5.1", - "launchpadlib", - "lazr.restfulclient", - "lxml", - "macaroonbakery", - "mypy-extensions", - "overrides", - "packaging", - "progressbar", - "pydantic~=2.8", - "pyelftools", - # Pygit2 and libgit2 need to match versions. - # Further info: https://www.pygit2.org/install.html#version-numbers - "pygit2~=1.13.0", - "pylxd; sys_platform == 'linux'", - "pymacaroons", - "python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz ; sys_platform == 'linux'", - "python-debian; sys_platform == 'linux'", - "pyxdg", - "pyyaml", - "raven", - "requests-toolbelt", - "requests-unixsocket2", - "requests", - "simplejson", - "snap-helpers", - "tabulate", - "toml", - "tinydb", - "typing-extensions", - "validators>=0.28.3", -] - -docs_requires = { - "canonical-sphinx[full]>=0.2.0", - "sphinx-autobuild", - "sphinx-autodoc-typehints", - "sphinxcontrib-details-directive", - "sphinx-lint", - "sphinx-toolbox", - "pyspelling", -} - -extras_requires = {"dev": dev_requires, "docs": docs_requires} - -setup( - name=name, - version=determine_version(), - description=description, - author_email=author_email, - url=url, - packages=find_namespace_packages(), - license=license_, - classifiers=classifiers, - scripts=scripts, - entry_points=dict( - console_scripts=[ - "snapcraft_legacy = snapcraft_legacy.cli.__main__:run", - "snapcraft = snapcraft.application:main", - ] - ), - data_files=( - recursive_data_files("schema", "share/snapcraft") - + recursive_data_files("keyrings", "share/snapcraft") - + recursive_data_files("extensions", "share/snapcraft") - ), - include_package_data=True, - package_data={ - "snapcraft": ["templates/*"], - }, - python_requires=">=3.10", - install_requires=install_requires, - extras_require=extras_requires, - test_suite="tests.unit", -) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 347655002a..5c8fd50f9b 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -2,10 +2,10 @@ name: snapcraft base: core24 summary: easily create snaps description: | - Snapcraft aims to make upstream developers' lives easier and as such is not - a single toolset, but instead is a collection of tools that enable the - natural workflow of an upstream to be extended with a simple release step - into Snappy. + Snapcraft aims to make upstream developers' lives easier and as such is not + a single toolset, but instead is a collection of tools that enable the + natural workflow of an upstream to be extended with a simple release step + into Snappy. adopt-info: snapcraft confinement: classic license: GPL-3.0 @@ -19,7 +19,6 @@ environment: # Ubuntu 20.04 for armhf, ppc64el, riscv64, and s390x CRYPTOGRAPHY_OPENSSL_NO_LEGACY: "1" - apps: snapcraft: environment: @@ -70,12 +69,11 @@ parts: - "-usr/lib/x86_64-linux-gnu/libperl*" - "-usr/lib/x86_64-linux-gnu/libgdbm*" - patchelf: plugin: autotools source: https://github.com/canonical/patchelf source-type: git - source-branch: '0.9+snapcraft' + source-branch: "0.9+snapcraft" autotools-configure-parameters: - --prefix=/ build-attributes: @@ -100,28 +98,28 @@ parts: snapcraft-libs: plugin: nil stage-packages: - - apt - - apt-transport-https - - apt-utils - - binutils - - execstack - - gpg - - gpgv - - libsodium23 - - libxml2 - - libxslt1.1 - - libpython3-stdlib - - libpython3.12-stdlib - - libpython3.12-minimal - - python3-pip - - python3-setuptools - - python3-wheel - - python3-venv - - python3-minimal - - python3-pkg-resources - - python3.12-minimal - - squashfs-tools - - xdelta3 + - apt + - apt-transport-https + - apt-utils + - binutils + - execstack + - gpg + - gpgv + - libsodium23 + - libxml2 + - libxslt1.1 + - libpython3-stdlib + - libpython3.12-stdlib + - libpython3.12-minimal + - python3-pip + - python3-setuptools + - python3-wheel + - python3-venv + - python3-minimal + - python3-pkg-resources + - python3.12-minimal + - squashfs-tools + - xdelta3 build-attributes: - enable-patchelf override-build: | @@ -165,44 +163,53 @@ parts: - enable-patchelf prime: - -usr/include + snapcraft: source: . plugin: python python-packages: - - wheel - - pip + - wheel + - pip python-constraints: - - constraints.txt + - constraints.txt python-requirements: - - requirements.txt + - uv-requirements.txt + - requirements-noble.txt organize: - # Put snapcraftctl and craftctl into its own directory that can be included in the PATH - # without including other binaries. - bin/craftctl: libexec/snapcraft/craftctl - bin/snapcraftctl: bin/scriptlet-bin/snapcraftctl - # Also install the compatibility wrapper for core22+. - bin/snapcraftctl-compat: libexec/snapcraft/snapcraftctl + # Put snapcraftctl and craftctl into its own directory that can be included in the PATH + # without including other binaries. + bin/craftctl: libexec/snapcraft/craftctl + bin/snapcraftctl: bin/scriptlet-bin/snapcraftctl + # Also install the compatibility wrapper for core22+. + bin/snapcraftctl-compat: libexec/snapcraft/snapcraftctl + # Include general data in the share directory + "**/site-packages/extensions": share/snapcraft/extensions + "**/site-packages/keyrings": share/snapcraft/keyrings + "**/site-packages/schema": share/snapcraft/schema build-attributes: - enable-patchelf build-environment: - # Build PyNaCl from source since the wheel files interact - # strangely with classic snaps. Well, build it all from source. - - "PIP_NO_BINARY": ":all:" - # Use base image's libsodium for PyNaCl. - - "SODIUM_INSTALL": "system" - - "CFLAGS": "$(pkg-config python-3.12 yaml-0.1 --cflags)" + # Build PyNaCl from source since the wheel files interact + # strangely with classic snaps. Well, build it all from source. + - "PIP_NO_BINARY": ":all:" + # Use base image's libsodium for PyNaCl. + - "SODIUM_INSTALL": "system" + - "CFLAGS": "$(pkg-config python-3.12 yaml-0.1 --cflags)" + build-snaps: + - astral-uv override-build: | - ${SNAP}/libexec/snapcraft/craftctl default + uv export --no-dev --no-emit-workspace --output-file uv-requirements.txt + ${SNAP}/libexec/snapcraft/craftctl default - version="$(python3 setup.py --version)" - ${SNAP}/libexec/snapcraft/craftctl set version="$version" + version=$(PYTHONPATH=/root/parts/snapcraft/install/lib/python3.12/site-packages python3 -c "import snapcraft;print(snapcraft.__version__)") + ${SNAP}/libexec/snapcraft/craftctl set version="$version" - [ -n "$(echo $version | grep "+git")" ] && grade=devel || grade=stable - sed -i -e '1 s|^#!/.*|#!/snap/snapcraft/current/bin/python -E|' $SNAPCRAFT_PART_INSTALL/bin/craftctl - ${SNAP}/libexec/snapcraft/craftctl set grade="$grade" + [ -n "$(echo $version | grep "+git")" ] && grade=devel || grade=stable + sed -i -e '1 s|^#!/.*|#!/snap/snapcraft/current/bin/python -E|' $SNAPCRAFT_PART_INSTALL/bin/craftctl + ${SNAP}/libexec/snapcraft/craftctl set grade="$grade" - # The new implementation still requires this. - ln -sf ../usr/bin/python3.12 $SNAPCRAFT_PART_INSTALL/bin/python3 + # The new implementation still requires this. + ln -sf ../usr/bin/python3.12 $SNAPCRAFT_PART_INSTALL/bin/python3 after: [snapcraft-libs, libgit2] chisel: diff --git a/snapcraft/__init__.py b/snapcraft/__init__.py index 569d755bc7..2f5c327469 100644 --- a/snapcraft/__init__.py +++ b/snapcraft/__init__.py @@ -16,20 +16,15 @@ """Publish your app for Linux users for desktop, cloud, and IoT.""" -import os -from importlib import metadata - # For legacy compatibility import snapcraft.sources # noqa: F401 +try: + from ._version import __version__ +except ImportError: + from importlib.metadata import PackageNotFoundError, version -def _get_version(): - if os.environ.get("SNAP_NAME") == "snapcraft": - return os.environ["SNAP_VERSION"] try: - return metadata.version("snapcraft") - except metadata.PackageNotFoundError: - return "0.0.0+devel" - - -__version__ = _get_version() + __version__ = version("snapcraft") + except PackageNotFoundError: + __version__ = "dev" diff --git a/snapcraft/commands/account.py b/snapcraft/commands/account.py index 7593fa3999..6e9f9f7e8f 100644 --- a/snapcraft/commands/account.py +++ b/snapcraft/commands/account.py @@ -186,7 +186,7 @@ def fill_parser(self, parser: "argparse.ArgumentParser") -> None: ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: if parsed_args.experimental_login: raise ArgumentParsingError( "--experimental-login no longer supported. " diff --git a/snapcraft/commands/extensions.py b/snapcraft/commands/extensions.py index d4afe5c256..2de4575b91 100644 --- a/snapcraft/commands/extensions.py +++ b/snapcraft/commands/extensions.py @@ -65,7 +65,7 @@ class ListExtensionsCommand(AppCommand): ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: extension_presentation: Dict[str, ExtensionModel] = {} # New extensions. @@ -78,7 +78,9 @@ def run(self, parsed_args): # Extensions from snapcraft_legacy. for _extension_name in supported_extension_names(): - extension_class = find_extension(_extension_name) + # Ignore assignment type error as the conversion from legacy to modern Snapcraft `Extension` + # should be trivial + extension_class = find_extension(_extension_name) # type: ignore[assignment] extension_name = _extension_name.replace("_", "-") extension_bases = list(extension_class.get_supported_bases()) if extension_name in extension_presentation: diff --git a/snapcraft/commands/plugins.py b/snapcraft/commands/plugins.py index c1427db4df..38a495d571 100644 --- a/snapcraft/commands/plugins.py +++ b/snapcraft/commands/plugins.py @@ -59,7 +59,7 @@ def fill_parser(self, parser: "argparse.ArgumentParser") -> None: ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: if parsed_args.base == "core20": raise errors.LegacyFallback() diff --git a/snapcraft/commands/status.py b/snapcraft/commands/status.py index bdb55059f3..904e236e10 100644 --- a/snapcraft/commands/status.py +++ b/snapcraft/commands/status.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Snapcraft Store Account management commands.""" + import itertools import operator import textwrap @@ -71,7 +72,7 @@ def fill_parser(self, parser: "argparse.ArgumentParser") -> None: ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: snap_channel_map = store.StoreClientCLI().get_channel_map( snap_name=parsed_args.name ) @@ -391,7 +392,7 @@ def fill_parser(self, parser: "argparse.ArgumentParser") -> None: ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: snap_channel_map = store.StoreClientCLI().get_channel_map( snap_name=parsed_args.name ) diff --git a/snapcraft/commands/upload.py b/snapcraft/commands/upload.py index e589878679..e6855ee2d2 100644 --- a/snapcraft/commands/upload.py +++ b/snapcraft/commands/upload.py @@ -102,7 +102,7 @@ def fill_parser(self, parser: "argparse.ArgumentParser") -> None: ) @overrides - def run(self, parsed_args): + def run(self, parsed_args) -> None: snap_file = pathlib.Path(parsed_args.snap_file) if not snap_file.exists() or not snap_file.is_file(): raise ArgumentParsingError(f"{str(snap_file)!r} is not a valid file") diff --git a/snapcraft/commands/validation_sets.py b/snapcraft/commands/validation_sets.py index d310d3aeeb..0791166303 100644 --- a/snapcraft/commands/validation_sets.py +++ b/snapcraft/commands/validation_sets.py @@ -210,11 +210,13 @@ def edit_validation_sets( try: with validation_sets_path.open() as file: data = craft_application.util.safe_yaml_load(file) - edited_validation_sets = validation_sets.EditableBuildAssertion.from_yaml_data( - data=data, - # filepath is only shown for pydantic errors and snapcraft should - # not expose the temp file name - filepath=Path("validation-sets"), + edited_validation_sets = ( + validation_sets.EditableBuildAssertion.from_yaml_data( + data=data, + # filepath is only shown for pydantic errors and snapcraft should + # not expose the temp file name + filepath=Path("validation-sets"), + ) ) return edited_validation_sets except (yaml.YAMLError, CraftValidationError) as err: diff --git a/snapcraft/elf/_elf_file.py b/snapcraft/elf/_elf_file.py index 55fc44a3c3..91418b1425 100644 --- a/snapcraft/elf/_elf_file.py +++ b/snapcraft/elf/_elf_file.py @@ -57,7 +57,7 @@ def add_version(self, version: str) -> None: class SonameCache: """A cache for sonames.""" - def __init__(self): + def __init__(self) -> None: self._soname_paths: _SonameCacheDict = {} def __getitem__(self, key): diff --git a/snapcraft/extensions/_ros2_humble_meta.py b/snapcraft/extensions/_ros2_humble_meta.py index 3d23330d71..c84bcd9d32 100644 --- a/snapcraft/extensions/_ros2_humble_meta.py +++ b/snapcraft/extensions/_ros2_humble_meta.py @@ -72,9 +72,9 @@ def get_app_snippet(self, *, app_name: str) -> Dict[str, Any]: "$SNAP/opt/ros/underlay_ws/usr/lib/python3/dist-packages", ] - app_snippet["environment"][ - "PYTHONPATH" - ] = f'{python_paths}:{":".join(new_python_paths)}' + app_snippet["environment"]["PYTHONPATH"] = ( + f"{python_paths}:{':'.join(new_python_paths)}" + ) return app_snippet diff --git a/snapcraft/extensions/_ros2_jazzy_meta.py b/snapcraft/extensions/_ros2_jazzy_meta.py index b230119661..f0c0f0f4aa 100644 --- a/snapcraft/extensions/_ros2_jazzy_meta.py +++ b/snapcraft/extensions/_ros2_jazzy_meta.py @@ -72,9 +72,9 @@ def get_app_snippet(self, *, app_name: str) -> Dict[str, Any]: "$SNAP/opt/ros/underlay_ws/usr/lib/python3/dist-packages", ] - app_snippet["environment"][ - "PYTHONPATH" - ] = f'{python_paths}:{":".join(new_python_paths)}' + app_snippet["environment"]["PYTHONPATH"] = ( + f"{python_paths}:{':'.join(new_python_paths)}" + ) return app_snippet diff --git a/snapcraft/extensions/gnome.py b/snapcraft/extensions/gnome.py index 0f0c3be7ab..22e44115cc 100644 --- a/snapcraft/extensions/gnome.py +++ b/snapcraft/extensions/gnome.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Generic GNOME extension to support core22 and onwards.""" + import dataclasses import functools import re diff --git a/snapcraft/extensions/kde_neon.py b/snapcraft/extensions/kde_neon.py index 17eaf8e322..550846f0fe 100644 --- a/snapcraft/extensions/kde_neon.py +++ b/snapcraft/extensions/kde_neon.py @@ -16,6 +16,7 @@ # along with this program. If not, see . """Generic KDE NEON extension to support core22 and onwards.""" + import dataclasses import functools import re diff --git a/snapcraft/linters/library_linter.py b/snapcraft/linters/library_linter.py index e3c2c9d82b..4d65a5cca1 100644 --- a/snapcraft/linters/library_linter.py +++ b/snapcraft/linters/library_linter.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Library linter implementation.""" + import re import subprocess from pathlib import Path diff --git a/snapcraft/meta/snap_yaml.py b/snapcraft/meta/snap_yaml.py index dcd8a3a814..09e188dac0 100644 --- a/snapcraft/meta/snap_yaml.py +++ b/snapcraft/meta/snap_yaml.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Create snap.yaml metadata file.""" + from __future__ import annotations import re @@ -560,7 +561,7 @@ def _populate_environment( def _process_components( - components: dict[str, models.Component] | None + components: dict[str, models.Component] | None, ) -> dict[str, ComponentMetadata] | None: """Convert Components from a project to ComponentMetadata for a snap.yaml. diff --git a/snapcraft/models/project.py b/snapcraft/models/project.py index 7c95a789c3..e6bdc149b1 100644 --- a/snapcraft/models/project.py +++ b/snapcraft/models/project.py @@ -1013,7 +1013,7 @@ def _providers_base(cls, base: str) -> bases.BaseAlias | None: @pydantic.field_validator("plugs") @classmethod - def _validate_plugs(cls, plugs): + def _validate_plugs(cls, plugs) -> dict[str, ContentPlug | Any]: empty_plugs = [] if plugs is not None: for plug_name, plug in plugs.items(): diff --git a/snapcraft/parts/grammar.py b/snapcraft/parts/grammar.py index b7390f9748..9425a57a38 100644 --- a/snapcraft/parts/grammar.py +++ b/snapcraft/parts/grammar.py @@ -71,9 +71,9 @@ def self_check(value: Any) -> bool: # TODO: make checker optional in craft-grammar. processor = GrammarProcessor(arch=arch, target_arch=target_arch, checker=self_check) - for part_name in parts_yaml_data: - parts_yaml_data[part_name] = process_part( - part_yaml_data=parts_yaml_data[part_name], processor=processor + for part in parts_yaml_data.values(): + part = process_part( + part_yaml_data=part, processor=processor ) return parts_yaml_data diff --git a/snapcraft/parts/lifecycle.py b/snapcraft/parts/lifecycle.py index 83fff103d6..b24cb9ba27 100644 --- a/snapcraft/parts/lifecycle.py +++ b/snapcraft/parts/lifecycle.py @@ -22,7 +22,7 @@ import subprocess from datetime import datetime from pathlib import Path -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, cast import craft_parts from craft_cli import emit @@ -212,7 +212,8 @@ def _run_command( # noqa PLR0913 (too-many-arguments) if parsed_args.debug: emit.progress(str(err), permanent=True) launch_shell() - raise errors.FilePermissionError(err.filename, reason=err.strerror) + # Casting as a str as OSError should always contain an error message + raise errors.FilePermissionError(err.filename, reason=cast(str, err.strerror)) except OSError as err: msg = err.strerror if err.filename: @@ -220,7 +221,8 @@ def _run_command( # noqa PLR0913 (too-many-arguments) if parsed_args.debug: emit.progress(msg, permanent=True) launch_shell() - raise errors.SnapcraftError(msg) from err + # Casting as a str as OSError should always contain an error message + raise errors.SnapcraftError(cast(str, msg)) from err except errors.SnapcraftError as err: if parsed_args.debug: emit.progress(str(err), permanent=True) diff --git a/snapcraft/parts/parts.py b/snapcraft/parts/parts.py index dcccf4b52d..6417fa12e5 100644 --- a/snapcraft/parts/parts.py +++ b/snapcraft/parts/parts.py @@ -19,7 +19,7 @@ import pathlib import subprocess import types -from typing import Any, Dict, List, Optional, Set +from typing import Any, Dict, List, Optional, Set, cast import craft_parts from craft_archives import repo @@ -227,7 +227,8 @@ def run( msg = err.strerror if err.filename: msg = f"{err.filename}: {msg}" - raise errors.PartsLifecycleError(msg) from err + # Casting as a str as OSError should always contain an error message + raise errors.PartsLifecycleError(cast(str, msg)) from err except Exception as err: raise errors.PartsLifecycleError(str(err)) from err diff --git a/snapcraft/parts/yaml_utils.py b/snapcraft/parts/yaml_utils.py index f91bb76d81..e14d8fb465 100644 --- a/snapcraft/parts/yaml_utils.py +++ b/snapcraft/parts/yaml_utils.py @@ -18,7 +18,7 @@ from dataclasses import dataclass from pathlib import Path -from typing import Any, Dict, List, Optional, TextIO +from typing import Any, Dict, List, Optional, TextIO, cast import yaml import yaml.error @@ -271,6 +271,7 @@ def process_yaml(project_file: Path) -> Dict[str, Any]: msg = err.strerror if err.filename: msg = f"{msg}: {err.filename!r}." - raise errors.SnapcraftError(msg) from err + # Casting as a str as OSError should always contain an error message + raise errors.SnapcraftError(cast(str, msg)) from err return yaml_data diff --git a/snapcraft/plugins/v2/__init__.py b/snapcraft/plugins/v2/__init__.py index b10899a060..5960f3e239 100644 --- a/snapcraft/plugins/v2/__init__.py +++ b/snapcraft/plugins/v2/__init__.py @@ -16,7 +16,6 @@ """Legacy support for v2 plugins.""" - from snapcraft_legacy.plugins.v2 import ( AutotoolsPlugin, CatkinPlugin, diff --git a/snapcraft/providers.py b/snapcraft/providers.py index ae050a3bf3..a521e5a3af 100644 --- a/snapcraft/providers.py +++ b/snapcraft/providers.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Snapcraft-specific code to interface with craft-providers.""" + import io import os import sys diff --git a/snapcraft/snap_config.py b/snapcraft/snap_config.py index 9f5d1620ea..e68815d7ab 100644 --- a/snapcraft/snap_config.py +++ b/snapcraft/snap_config.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Snap config file definitions and helpers.""" + from typing import Annotated, Literal, Optional import craft_application.models diff --git a/snapcraft/store/__init__.py b/snapcraft/store/__init__.py index 6c6c5d77af..1088aba640 100644 --- a/snapcraft/store/__init__.py +++ b/snapcraft/store/__init__.py @@ -16,7 +16,6 @@ """Snapcraft CLI interface for the Snap Store.""" - from . import constants from ._legacy_account import LegacyUbuntuOne from .channel_map import ChannelMap diff --git a/snapcraft/store/client.py b/snapcraft/store/client.py index f7777000b8..6a0e2188ad 100644 --- a/snapcraft/store/client.py +++ b/snapcraft/store/client.py @@ -99,9 +99,7 @@ def _prompt_login() -> Tuple[str, str]: def _get_hostname( - hostname: Optional[ - str - ] = platform.node(), # noqa: B008 Function call in arg defaults + hostname: Optional[str] = platform.node(), # noqa: B008 Function call in arg defaults ) -> str: """Return the computer's network name or UNNKOWN if it cannot be determined.""" if not hostname: @@ -643,8 +641,7 @@ def notify_upload( # noqa: PLR0913[too-many-arguments] "Components are currently unsupported for on-prem stores" ) emit.debug( - f"Ignoring snap_file_size of {snap_file_size!r} and " - f"built_at {built_at!r}" + f"Ignoring snap_file_size of {snap_file_size!r} and built_at {built_at!r}" ) revision_request = cast( diff --git a/snapcraft/utils.py b/snapcraft/utils.py index 9d9acc7646..b6c3ae7ed6 100644 --- a/snapcraft/utils.py +++ b/snapcraft/utils.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Utilities for snapcraft.""" + from __future__ import annotations import multiprocessing diff --git a/snapcraft_legacy/_store.py b/snapcraft_legacy/_store.py index 7bce81fe48..6f2289fba6 100644 --- a/snapcraft_legacy/_store.py +++ b/snapcraft_legacy/_store.py @@ -430,9 +430,7 @@ def list_keys(): headers=["", "Name", "SHA3-384 fingerprint", ""], tablefmt="plain", ) - print( - "The following keys are available on this system:" - ) + print("The following keys are available on this system:") print(tabulated_keys) else: print( @@ -502,9 +500,9 @@ def wrapped_env(*args, **kwargs): return func(*args, **kwargs) finally: if credentials: - os.environ[ - storeapi.constants.ENVIRONMENT_STORE_CREDENTIALS - ] = credentials + os.environ[storeapi.constants.ENVIRONMENT_STORE_CREDENTIALS] = ( + credentials + ) return wrapped_env diff --git a/snapcraft_legacy/cli/_channel_map.py b/snapcraft_legacy/cli/_channel_map.py index 6f01bb3974..035f177697 100644 --- a/snapcraft_legacy/cli/_channel_map.py +++ b/snapcraft_legacy/cli/_channel_map.py @@ -111,10 +111,10 @@ def _get_channel_lines_for_channel( # noqa: C901 channel_info = snap_channel_map.get_channel_info(channel_name) try: - progressive_mapped_channel: Optional[ - MappedChannel - ] = snap_channel_map.get_mapped_channel( - channel_name=channel_name, architecture=architecture, progressive=True + progressive_mapped_channel: Optional[MappedChannel] = ( + snap_channel_map.get_mapped_channel( + channel_name=channel_name, architecture=architecture, progressive=True + ) ) except ValueError: progressive_mapped_channel = None diff --git a/snapcraft_legacy/cli/_errors.py b/snapcraft_legacy/cli/_errors.py index 3ced16ad13..c35519e227 100644 --- a/snapcraft_legacy/cli/_errors.py +++ b/snapcraft_legacy/cli/_errors.py @@ -283,10 +283,7 @@ def _print_trace_output(exc_info, file=sys.stdout) -> None: def _is_send_to_sentry(exc_info) -> bool: # noqa: C901 # Check to see if error reporting has been disabled - if ( - strtobool(os.getenv("SNAPCRAFT_ENABLE_ERROR_REPORTING", "y")) - == 0 - ): + if strtobool(os.getenv("SNAPCRAFT_ENABLE_ERROR_REPORTING", "y")) == 0: return False # Check the environment to see if we should allow for silent reporting @@ -384,6 +381,6 @@ def _submit_trace(exc_info): "raven.processors.RemoveStackLocalsProcessor", "raven.processors.SanitizePasswordsProcessor", ), - **kwargs + **kwargs, ) client.captureException(exc_info=exc_info) diff --git a/snapcraft_legacy/cli/_review.py b/snapcraft_legacy/cli/_review.py index e7690dfa93..c16ad89a07 100644 --- a/snapcraft_legacy/cli/_review.py +++ b/snapcraft_legacy/cli/_review.py @@ -27,7 +27,7 @@ def review_snap(*, snap_file: str) -> None: # Review the snap. if review_tools.is_available(): echo.info( - "Running the review tools before pushing this snap to the Snap " "Store." + "Running the review tools before pushing this snap to the Snap Store." ) # TODO just raise when we can override. try: diff --git a/snapcraft_legacy/cli/_runner.py b/snapcraft_legacy/cli/_runner.py index d01c4bb5cf..0154d67b95 100644 --- a/snapcraft_legacy/cli/_runner.py +++ b/snapcraft_legacy/cli/_runner.py @@ -86,7 +86,8 @@ def configure_requests_ca() -> None: context_settings=dict(help_option_names=["-h", "--help"]), ) @click.version_option( - message=SNAPCRAFT_VERSION_TEMPLATE, version=snapcraft_legacy.__version__ # type: ignore + message=SNAPCRAFT_VERSION_TEMPLATE, + version=snapcraft_legacy.__version__, # type: ignore ) @click.pass_context @add_provider_options(hidden=True) diff --git a/snapcraft_legacy/cli/echo.py b/snapcraft_legacy/cli/echo.py index ade1831393..495dfb6859 100644 --- a/snapcraft_legacy/cli/echo.py +++ b/snapcraft_legacy/cli/echo.py @@ -18,6 +18,7 @@ These methods, which are named after common logging levels, wrap around click.echo adding the corresponding color codes for each level. """ + import os import shutil import sys @@ -92,7 +93,7 @@ def exit_error( resolution: Optional[str] = None, details: Optional[str] = None, docs_url: Optional[str] = None, - exit_code: int = 2 + exit_code: int = 2, ): """Display an error and gracefully exit.""" message_parts = [brief] diff --git a/snapcraft_legacy/cli/lifecycle.py b/snapcraft_legacy/cli/lifecycle.py index 4bac289da8..6adf09a51f 100644 --- a/snapcraft_legacy/cli/lifecycle.py +++ b/snapcraft_legacy/cli/lifecycle.py @@ -107,7 +107,9 @@ def _execute( # noqa: C901 # validate experimental plugins plugins = [part.plugin for part in project_config.parts.all_parts] - if not kwargs.get("enable_experimental_plugins") and any(isinstance(plugin, KernelPlugin) for plugin in plugins): + if not kwargs.get("enable_experimental_plugins") and any( + isinstance(plugin, KernelPlugin) for plugin in plugins + ): raise SnapcraftEnvironmentError( "*EXPERIMENTAL* 'kernel' plugin used, but not enabled. " "Enable with '--enable-experimental-plugins' flag." diff --git a/snapcraft_legacy/cli/store.py b/snapcraft_legacy/cli/store.py index 75ca04c09e..f6fc3cb125 100644 --- a/snapcraft_legacy/cli/store.py +++ b/snapcraft_legacy/cli/store.py @@ -68,9 +68,7 @@ def _human_readable_acls(store_client: storeapi.StoreClient) -> str: channels: {channels} permissions: {permissions} expires: {expires} - """.format( - **human_readable_acl - ) + """.format(**human_readable_acl) ) diff --git a/snapcraft_legacy/extractors/_errors.py b/snapcraft_legacy/extractors/_errors.py index 9d3ee346bb..ffc6e155e3 100644 --- a/snapcraft_legacy/extractors/_errors.py +++ b/snapcraft_legacy/extractors/_errors.py @@ -18,7 +18,6 @@ class UnhandledFileError(MetadataExtractionError): - fmt = ( "Failed to extract metadata from {path!r}: " "This file is not handled by {extractor_name!r}." @@ -29,7 +28,6 @@ def __init__(self, path: str, extractor_name: str) -> None: class AppstreamFileParseError(MetadataExtractionError): - fmt = "Failed to extract metadata from {path!r}: it's not a valid XML file." def __init__(self, path: str) -> None: @@ -37,7 +35,6 @@ def __init__(self, path: str) -> None: class SetupPyFileParseError(MetadataExtractionError): - fmt = ( "Failed to extract metadata from {path!r}: " "the logic in setup.py is currently not handled." @@ -48,7 +45,6 @@ def __init__(self, path: str) -> None: class SetupPyImportError(MetadataExtractionError): - fmt = ( "Failed to extract metadata from {path!r}: " "some packages or modules used could not be imported: " diff --git a/snapcraft_legacy/extractors/_metadata.py b/snapcraft_legacy/extractors/_metadata.py index 5678ea8112..3a1fc967c3 100644 --- a/snapcraft_legacy/extractors/_metadata.py +++ b/snapcraft_legacy/extractors/_metadata.py @@ -34,7 +34,7 @@ def __init__( version: Optional[str] = None, grade: Optional[str] = None, icon: Optional[str] = None, - desktop_file_paths: Optional[List[str]] = None + desktop_file_paths: Optional[List[str]] = None, ) -> None: """Create a new ExtractedMetadata instance. diff --git a/snapcraft_legacy/file_utils.py b/snapcraft_legacy/file_utils.py index 2689c6e9d6..54e61853a9 100644 --- a/snapcraft_legacy/file_utils.py +++ b/snapcraft_legacy/file_utils.py @@ -197,8 +197,9 @@ def link_or_copy_tree( os.path.exists(destination_tree) or os.path.islink(destination_tree) ): raise errors.SnapcraftEnvironmentError( - "Cannot overwrite non-directory {!r} with directory " - "{!r}".format(destination_tree, source_tree) + "Cannot overwrite non-directory {!r} with directory {!r}".format( + destination_tree, source_tree + ) ) create_similar_directory(source_tree, destination_tree) diff --git a/snapcraft_legacy/internal/build_providers/_base_provider.py b/snapcraft_legacy/internal/build_providers/_base_provider.py index d401878e53..f624afca18 100644 --- a/snapcraft_legacy/internal/build_providers/_base_provider.py +++ b/snapcraft_legacy/internal/build_providers/_base_provider.py @@ -45,7 +45,6 @@ def _get_platform() -> str: class Provider(abc.ABC): - _INSTANCE_PROJECT_DIR = "~/project" def __init__( diff --git a/snapcraft_legacy/internal/build_providers/_multipass/_windows.py b/snapcraft_legacy/internal/build_providers/_multipass/_windows.py index f6a93fb8a0..6ecfd29ef5 100644 --- a/snapcraft_legacy/internal/build_providers/_multipass/_windows.py +++ b/snapcraft_legacy/internal/build_providers/_multipass/_windows.py @@ -92,9 +92,7 @@ def _run_installer(installer_path: str, echoer): [Environment]::Exit(1) }} }} - """.format( - path=installer_path - ) + """.format(path=installer_path) try: subprocess.check_call(["powershell.exe", "-Command", cmd]) diff --git a/snapcraft_legacy/internal/build_providers/_snap.py b/snapcraft_legacy/internal/build_providers/_snap.py index 28a9d757f1..36f8e42db6 100644 --- a/snapcraft_legacy/internal/build_providers/_snap.py +++ b/snapcraft_legacy/internal/build_providers/_snap.py @@ -56,7 +56,7 @@ def __init__( snap_name: str, remote_snap_dir: str, latest_revision: Optional[str], - inject_from_host: bool = True + inject_from_host: bool = True, ) -> None: # name of the snap instance, which may have an alias self.snap_instance_name = snap_name @@ -137,7 +137,9 @@ def push_host_snap(self, *, file_pusher: Callable[..., None]) -> None: # TODO not being able to lock down on a snap revision can lead to races. host_snap_repo = self._get_snap_repo() with tempfile.TemporaryDirectory() as temp_dir: - snap_file_path = os.path.join(temp_dir, "{}.snap".format(self.snap_instance_name)) + snap_file_path = os.path.join( + temp_dir, "{}.snap".format(self.snap_instance_name) + ) assertion_file_path = os.path.join( temp_dir, "{}.assert".format(self.snap_instance_name) ) @@ -170,7 +172,11 @@ def _set_data(self) -> None: if not snap_revision.startswith("x") and snap_channel: switch_cmd = [ - "snap", "switch", self.snap_name, "--channel", snap_channel + "snap", + "switch", + self.snap_name, + "--channel", + snap_channel, ] if snap_revision.startswith("x"): @@ -304,7 +310,7 @@ def __init__( registry_filepath: str, runner: Callable[..., Optional[bytes]], file_pusher: Callable[..., None], - inject_from_host: bool = True + inject_from_host: bool = True, ) -> None: """ Initialize a SnapInjector instance. diff --git a/snapcraft_legacy/internal/build_providers/errors.py b/snapcraft_legacy/internal/build_providers/errors.py index 18e62d45b4..372d183819 100644 --- a/snapcraft_legacy/internal/build_providers/errors.py +++ b/snapcraft_legacy/internal/build_providers/errors.py @@ -27,7 +27,6 @@ class ProviderBaseError(_SnapcraftError): class ProviderNotSupportedError(ProviderBaseError): - fmt = ( "The {provider!r} provider is not supported, please choose a " "different one and try again." @@ -38,7 +37,6 @@ def __init__(self, *, provider: str) -> None: class ProviderNotFound(ProviderBaseError): - fmt = "You need {provider!r} set-up to build snaps: {error_message}." def __init__( @@ -54,7 +52,6 @@ def __init__( class _GenericProviderError(ProviderBaseError): - _FMT_ERROR_MESSAGE_AND_EXIT_CODE = ( "An error occurred with the instance when trying to {action} with " "{provider_name!r}: returned exit code {exit_code!r}: {error_message}.\n" @@ -101,7 +98,6 @@ def __init__( class ProviderCommunicationError(ProviderBaseError): - fmt = ( "An error occurred when trying to communicate with the " "{provider_name!r} provider: {message}." @@ -191,7 +187,6 @@ def __init__( class ProviderExecError(ProviderBaseError): - fmt = ( "An error occurred when trying to execute {command_string!r} with " "{provider_name!r}: returned exit code {exit_code!r}." @@ -280,7 +275,6 @@ def __init__( class ProviderInfoError(ProviderBaseError): - fmt = ( "An error occurred when using {provider_name!r} to " "query the status of the instance: returned exit code {exit_code!r}: {stderr!s}." @@ -293,7 +287,6 @@ def __init__(self, *, provider_name: str, exit_code: int, stderr: bytes) -> None class ProviderInstanceNotFoundError(ProviderBaseError): - fmt = "Cannot find an instance named {instance_name!r}." def __init__(self, *, instance_name: str) -> None: @@ -301,7 +294,6 @@ def __init__(self, *, instance_name: str) -> None: class ProviderInfoDataKeyError(ProviderBaseError): - fmt = ( "The data returned by {provider_name!r} was not expected. " "It is missing a required key {missing_key!r} in {data!r}." @@ -316,7 +308,6 @@ def __init__( class ProviderBadDataError(ProviderBaseError): - fmt = ( "The data returned by {provider_name!r} was not expected " "or in the wrong format: {data!r}." diff --git a/snapcraft_legacy/internal/common.py b/snapcraft_legacy/internal/common.py index 6017b40505..b3d40c2656 100644 --- a/snapcraft_legacy/internal/common.py +++ b/snapcraft_legacy/internal/common.py @@ -35,13 +35,16 @@ from snapcraft_legacy.internal import errors SNAPCRAFT_FILES = ["parts", "stage", "prime"] + _DEFAULT_PLUGINDIR = os.path.join(sys.prefix, "share", "snapcraft", "plugins") _plugindir = _DEFAULT_PLUGINDIR -_DEFAULT_SCHEMADIR = os.path.join(sys.prefix, "share", "snapcraft", "schema") + +_BASE_DIR = Path(__file__).parents[2] +_DEFAULT_SCHEMADIR = _BASE_DIR / "schema" _schemadir = _DEFAULT_SCHEMADIR -_DEFAULT_EXTENSIONSDIR = os.path.join(sys.prefix, "share", "snapcraft", "extensions") +_DEFAULT_EXTENSIONSDIR = _BASE_DIR / "extensions" _extensionsdir = _DEFAULT_EXTENSIONSDIR -_DEFAULT_KEYRINGSDIR = os.path.join(sys.prefix, "share", "snapcraft", "keyrings") +_DEFAULT_KEYRINGSDIR = _BASE_DIR / "keyrings" _keyringsdir = _DEFAULT_KEYRINGSDIR _DOCKERENV_FILE = "/.dockerenv" @@ -177,8 +180,9 @@ def is_snap() -> bool: snap_name = os.environ.get("SNAP_NAME", "") is_snap = snap_name == "snapcraft" logger.debug( - "snapcraft is running as a snap {!r}, " - "SNAP_NAME set to {!r}".format(is_snap, snap_name) + "snapcraft is running as a snap {!r}, SNAP_NAME set to {!r}".format( + is_snap, snap_name + ) ) return is_snap diff --git a/snapcraft_legacy/internal/deltas/_deltas.py b/snapcraft_legacy/internal/deltas/_deltas.py index ee67f57a43..ef0293f0c5 100644 --- a/snapcraft_legacy/internal/deltas/_deltas.py +++ b/snapcraft_legacy/internal/deltas/_deltas.py @@ -49,7 +49,7 @@ def __init__( target_path: str, delta_tool: str, delta_format: str, - delta_file_extname: str = "delta" + delta_file_extname: str = "delta", ) -> None: self.source_path = source_path self.target_path = target_path diff --git a/snapcraft_legacy/internal/elf.py b/snapcraft_legacy/internal/elf.py index dc6c07b28d..dbda03dc85 100644 --- a/snapcraft_legacy/internal/elf.py +++ b/snapcraft_legacy/internal/elf.py @@ -240,7 +240,6 @@ def __init__( arch: ElfArchitectureTuple, soname_cache: SonameCache, ) -> None: - self.soname = soname self.soname_path = soname_path self.search_paths = search_paths diff --git a/snapcraft_legacy/internal/errors.py b/snapcraft_legacy/internal/errors.py index c787ea8cdf..adaec1cb23 100644 --- a/snapcraft_legacy/internal/errors.py +++ b/snapcraft_legacy/internal/errors.py @@ -253,7 +253,6 @@ def __init__( class PrimeFileConflictError(SnapcraftError): - fmt = ( "Failed to filter files: " "The following files have been excluded by the `stage` keyword, " @@ -264,10 +263,8 @@ class PrimeFileConflictError(SnapcraftError): class PluginError(SnapcraftError): - fmt = ( - "Failed to load plugin: " - "{message}" + "Failed to load plugin: {message}" # FIXME include how to fix each of the possible plugin errors. # https://bugs.launchpad.net/snapcraft/+bug/1727484 # --elopio - 2017-10-25 @@ -295,7 +292,6 @@ def __init__( class SnapcraftPartConflictError(SnapcraftError): - fmt = ( "Failed to stage: " "Parts {other_part_name!r} and {part_name!r} have the following " @@ -321,7 +317,6 @@ def __init__(self, *, part_name, other_part_name, conflict_files): class SnapcraftOrganizeError(SnapcraftError): - fmt = "Failed to organize part {part_name!r}: {message}" def __init__(self, part_name, message): @@ -329,10 +324,8 @@ def __init__(self, part_name, message): class InvalidWikiEntryError(SnapcraftError): - fmt = ( - "Invalid wiki entry: " - "{error!r}" + "Invalid wiki entry: {error!r}" # FIXME include how to fix each of the possible wiki errors. # https://bugs.launchpad.net/snapcraft/+bug/1727490 # --elopio - 2017-10-25 @@ -343,7 +336,6 @@ def __init__(self, error=None): class MissingGadgetError(SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "Missing gadget.yaml file.\n" @@ -356,7 +348,6 @@ class MissingGadgetError(SnapcraftError): class PluginOutdatedError(SnapcraftError): - fmt = "This plugin is outdated: {message}" def __init__(self, message): @@ -364,7 +355,6 @@ def __init__(self, message): class ToolMissingError(SnapcraftReportableError): - fmt = ( "A tool snapcraft depends on could not be found: {command_name!r}.\n" "Ensure the tool is installed and available, and try again." @@ -375,22 +365,18 @@ def __init__(self, *, command_name: str) -> None: class RequiredCommandFailure(SnapcraftError): - fmt = "{command!r} failed." class RequiredCommandNotFound(SnapcraftError): - fmt = "{cmd_list[0]!r} not found." class RequiredPathDoesNotExist(SnapcraftError): - fmt = "Required path does not exist: {path!r}" class SnapcraftPathEntryError(SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The path {value!r} set for {key!r} in {app!r} does not exist. " @@ -399,7 +385,6 @@ class SnapcraftPathEntryError(SnapcraftError): class InvalidPullPropertiesError(SnapcraftError): - fmt = ( "Failed to load plugin: " "Invalid pull properties specified by {plugin_name!r} plugin: " @@ -413,7 +398,6 @@ def __init__(self, plugin_name, properties): class InvalidBuildPropertiesError(SnapcraftError): - fmt = ( "Failed to load plugin: " "Invalid build properties specified by {plugin_name!r} plugin: " @@ -427,7 +411,6 @@ def __init__(self, plugin_name, properties): class StagePackageDownloadError(SnapcraftError): - fmt = ( "Failed to fetch stage packages: " "Error downloading packages for part {part_name!r}: {message}." @@ -438,27 +421,22 @@ def __init__(self, part_name, message): class OsReleaseIdError(SnapcraftError): - fmt = "Unable to determine host OS ID" class OsReleaseNameError(SnapcraftError): - fmt = "Unable to determine host OS name" class OsReleaseVersionIdError(SnapcraftError): - fmt = "Unable to determine host OS version ID" class OsReleaseCodenameError(SnapcraftError): - fmt = "Unable to determine host OS version codename" class InvalidContainerImageInfoError(SnapcraftError): - fmt = ( "Failed to parse container image info: " "SNAPCRAFT_IMAGE_INFO is not a valid JSON string: {image_info}" @@ -473,7 +451,6 @@ class PatcherError(SnapcraftError): class PatcherGenericError(PatcherError): - fmt = ( "{elf_file!r} cannot be patched to function properly in a classic " "confined snap: {message}" @@ -487,7 +464,6 @@ def __init__(self, *, elf_file, process_exception): class PatcherNewerPatchelfError(PatcherError): - fmt = ( "{elf_file!r} cannot be patched to function properly in a classic " "confined snap: {message}.\n" @@ -509,7 +485,6 @@ def __init__(self, *, elf_file, process_exception, patchelf_version): class StagePackageMissingError(SnapcraftError): - fmt = ( "{package!r} is required inside the snap for this part to work " "properly.\n" @@ -525,7 +500,6 @@ class MetadataExtractionError(SnapcraftError): class MissingMetadataFileError(MetadataExtractionError): - fmt = ( "Failed to generate snap metadata: " "Part {part_name!r} has a 'parse-info' referring to metadata file " @@ -537,7 +511,6 @@ def __init__(self, part_name: str, path: str) -> None: class UnhandledMetadataFileTypeError(MetadataExtractionError): - fmt = ( "Failed to extract metadata from {path!r}: " "This type of file is not supported for supplying metadata." @@ -548,7 +521,6 @@ def __init__(self, path: str) -> None: class InvalidExtractorValueError(MetadataExtractionError): - fmt = ( "Failed to extract metadata from {path!r}: " "Extractor {extractor_name!r} didn't return ExtractedMetadata as " @@ -645,7 +617,6 @@ def __init__(self, message: str) -> None: class SnapcraftInvalidCLIConfigError(SnapcraftError): - fmt = "The cli configuration file {config_file!r} has invalid data: {error!r}." def __init__(self, *, config_file: str, error: str) -> None: diff --git a/snapcraft_legacy/internal/lifecycle/_clean.py b/snapcraft_legacy/internal/lifecycle/_clean.py index a6cb4fba93..9a68a7bd8f 100644 --- a/snapcraft_legacy/internal/lifecycle/_clean.py +++ b/snapcraft_legacy/internal/lifecycle/_clean.py @@ -69,8 +69,7 @@ def _clean_parts(part_names, step, config, staged_state, primed_state): parts_not_being_cleaned = dirty_part_names.difference(part_names) if parts_not_being_cleaned: logger.warning( - "Cleaned {!r}, which makes the following {} out of date: " - "{}".format( + "Cleaned {!r}, which makes the following {} out of date: {}".format( part_name, formatting_utils.pluralize( parts_not_being_cleaned, "part", "parts" diff --git a/snapcraft_legacy/internal/meta/application.py b/snapcraft_legacy/internal/meta/application.py index 2915828c51..9cf598dacf 100644 --- a/snapcraft_legacy/internal/meta/application.py +++ b/snapcraft_legacy/internal/meta/application.py @@ -50,7 +50,7 @@ def __init__( install_mode: str = None, command_chain: List[str] = None, passthrough: Dict[str, Any] = None, - commands: Dict[str, Command] = None + commands: Dict[str, Command] = None, ) -> None: """Initialize an application entry. diff --git a/snapcraft_legacy/internal/meta/errors.py b/snapcraft_legacy/internal/meta/errors.py index a98565ee58..ff54d1a247 100644 --- a/snapcraft_legacy/internal/meta/errors.py +++ b/snapcraft_legacy/internal/meta/errors.py @@ -30,7 +30,6 @@ class SnapMetaGenerationError(errors.SnapcraftError): class MissingSnapcraftYamlKeysError(SnapMetaGenerationError): - fmt = ( "Failed to generate snap metadata: " "Missing required key(s) in snapcraft.yaml: {keys}. " @@ -43,7 +42,6 @@ def __init__(self, keys: List[str]) -> None: class AdoptedPartMissingError(SnapMetaGenerationError): - fmt = ( "Failed to generate snap metadata: " "'adopt-info' refers to a part named {part!r}, but it is not defined " @@ -55,7 +53,6 @@ def __init__(self, part: str) -> None: class AdoptedPartNotParsingInfo(SnapMetaGenerationError): - fmt = ( "Failed to generate snap metadata: " "'adopt-info' refers to part {part!r}, but that part is lacking the " @@ -67,7 +64,6 @@ def __init__(self, part: str) -> None: class AmbiguousPassthroughKeyError(SnapMetaGenerationError): - fmt = ( "Failed to generate snap metadata: " "The following keys are specified in their regular location " @@ -80,7 +76,6 @@ def __init__(self, keys: List[str]) -> None: class InvalidAppCommandError(errors.SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The specified command {command!r} defined in the app {app_name!r} does " @@ -93,7 +88,6 @@ def __init__(self, command, app_name): class InvalidAppCommandNotFound(errors.SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The specified command {command!r} defined in the app {app_name!r} does " @@ -106,7 +100,6 @@ def __init__(self, command, app_name): class InvalidAppCommandNotExecutable(errors.SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The specified command {command!r} defined in the app {app_name!r} " @@ -118,7 +111,6 @@ def __init__(self, command: str, app_name: str) -> None: class InvalidAppCommandFormatError(errors.SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The specified command {command!r} defined in the app {app_name!r} does " @@ -132,7 +124,6 @@ def __init__(self, command: str, app_name: str) -> None: class InvalidCommandChainError(errors.SnapcraftError): - fmt = ( "Failed to generate snap metadata: " "The command-chain item {item!r} defined in the app {app_name!r} does " @@ -145,10 +136,8 @@ def __init__(self, item: str, app_name: str) -> None: class InvalidDesktopFileError(errors.SnapcraftError): - fmt = ( - "Failed to generate desktop file: " - "Invalid desktop file {filename!r}: {message}." + "Failed to generate desktop file: Invalid desktop file {filename!r}: {message}." # FIXME include how to fix each of the possible desktop file errors. # https://bugs.launchpad.net/snapcraft/+bug/1727435 # --elopio - 2017-10-25 diff --git a/snapcraft_legacy/internal/meta/package_repository.py b/snapcraft_legacy/internal/meta/package_repository.py index b5cbe3126f..5079e28e17 100644 --- a/snapcraft_legacy/internal/meta/package_repository.py +++ b/snapcraft_legacy/internal/meta/package_repository.py @@ -27,8 +27,7 @@ class PackageRepository(abc.ABC): @abc.abstractmethod - def marshal(self) -> Dict[str, Any]: - ... + def marshal(self) -> Dict[str, Any]: ... @classmethod def unmarshal(cls, data: Dict[str, str]) -> "PackageRepository": diff --git a/snapcraft_legacy/internal/meta/plugs.py b/snapcraft_legacy/internal/meta/plugs.py index 7a7845283f..37893ab1cf 100644 --- a/snapcraft_legacy/internal/meta/plugs.py +++ b/snapcraft_legacy/internal/meta/plugs.py @@ -155,7 +155,7 @@ def validate(self) -> None: message=( "Specifying a snap channel in 'default_provider' is not supported: " f"{self._default_provider}" - ) + ), ) @classmethod diff --git a/snapcraft_legacy/internal/mountinfo.py b/snapcraft_legacy/internal/mountinfo.py index 5aea923ef7..616570b66f 100644 --- a/snapcraft_legacy/internal/mountinfo.py +++ b/snapcraft_legacy/internal/mountinfo.py @@ -58,9 +58,7 @@ def __init__(self, *, mountinfo_file: str = "/proc/self/mountinfo") -> None: # Maintain two dicts pointing to the same underlying objects: # a dict of mount points to Mounts, and a dict of roots to Mounts. self._mount_point_mounts = {} # type: Dict[str, Mount] - root_mounts = collections.defaultdict( - list - ) # type: Dict[str, List[Mount]] # noqa + root_mounts = collections.defaultdict(list) # type: Dict[str, List[Mount]] # noqa with contextlib.suppress(FileNotFoundError): with open(mountinfo_file) as f: diff --git a/snapcraft_legacy/internal/pluginhandler/__init__.py b/snapcraft_legacy/internal/pluginhandler/__init__.py index e388f6a847..14c766a3dd 100644 --- a/snapcraft_legacy/internal/pluginhandler/__init__.py +++ b/snapcraft_legacy/internal/pluginhandler/__init__.py @@ -771,8 +771,9 @@ def _get_machine_manifest(self): ) except subprocess.CalledProcessError as e: logger.warning( - "'uname' exited with code {}: unable to record machine " - "manifest".format(e.returncode) + "'uname' exited with code {}: unable to record machine manifest".format( + e.returncode + ) ) return {} diff --git a/snapcraft_legacy/internal/pluginhandler/_dirty_report.py b/snapcraft_legacy/internal/pluginhandler/_dirty_report.py index a708d2b249..6620cb81ad 100644 --- a/snapcraft_legacy/internal/pluginhandler/_dirty_report.py +++ b/snapcraft_legacy/internal/pluginhandler/_dirty_report.py @@ -50,7 +50,7 @@ def __init__( *, dirty_properties: StrCollection = None, dirty_project_options: StrCollection = None, - changed_dependencies: DependencyCollection = None + changed_dependencies: DependencyCollection = None, ) -> None: """Create a new DirtyReport. diff --git a/snapcraft_legacy/internal/pluginhandler/_runner.py b/snapcraft_legacy/internal/pluginhandler/_runner.py index 54e7423031..d6878dbe5a 100644 --- a/snapcraft_legacy/internal/pluginhandler/_runner.py +++ b/snapcraft_legacy/internal/pluginhandler/_runner.py @@ -203,8 +203,9 @@ def _handle_builtin_function(self, scriptlet_name, function_call) -> None: # This means a snapcraft developer messed up adding a new # snapcraftctl function. Should never be encountered in real life. raise ValueError( - "{!r} scriptlet called a function with invalid json: " - "{}".format(scriptlet_name, function_call) + "{!r} scriptlet called a function with invalid json: {}".format( + scriptlet_name, function_call + ) ) from e try: @@ -226,8 +227,9 @@ def _handle_builtin_function(self, scriptlet_name, function_call) -> None: # This means a snapcraft developer messed up adding a new # snapcraftctl function. Should never be encountered in real life. raise ValueError( - "{!r} scriptlet called an undefined builtin function: " - "{}".format(scriptlet_name, function_name) + "{!r} scriptlet called an undefined builtin function: {}".format( + scriptlet_name, function_name + ) ) from e function(**function_args) diff --git a/snapcraft_legacy/internal/project_loader/__init__.py b/snapcraft_legacy/internal/project_loader/__init__.py index 9c15fe124c..5cbac6f08c 100644 --- a/snapcraft_legacy/internal/project_loader/__init__.py +++ b/snapcraft_legacy/internal/project_loader/__init__.py @@ -88,7 +88,7 @@ def _validate_replacement(attr: str, variable: str, value: Optional[str]) -> Non # expand to shell syntax for variables (`$item` and `${item}`) expanded_variables_to_validate = ( - *(f"${item}" for item in variables_to_validate ), + *(f"${item}" for item in variables_to_validate), *(f"${{{item}}}" for item in variables_to_validate), ) diff --git a/snapcraft_legacy/internal/project_loader/_extensions/_ros1_noetic_meta.py b/snapcraft_legacy/internal/project_loader/_extensions/_ros1_noetic_meta.py index 21bc40638f..f979dc6107 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/_ros1_noetic_meta.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/_ros1_noetic_meta.py @@ -53,20 +53,21 @@ def __init__(self, *, extension_name: str, yaml_data: Dict[str, Any]) -> None: self.part_snippet_extra = dict() self.root_snippet["plugs"] = { - self.ros_noetic_snaps.content: - { - "interface": "content", - "content": self.ros_noetic_snaps.content, - "target": "$SNAP/opt/ros/underlay_ws", - "default-provider": self.ros_noetic_snaps.content, - } + self.ros_noetic_snaps.content: { + "interface": "content", + "content": self.ros_noetic_snaps.content, + "target": "$SNAP/opt/ros/underlay_ws", + "default-provider": self.ros_noetic_snaps.content, + } } self.part_snippet_extra["ros-content-sharing-extension-cmake-args"] = [ f'-DCMAKE_SYSTEM_PREFIX_PATH="/snap/{self.ros_noetic_snaps.sdk}/current/usr"' ] - self.part_snippet_extra["stage-packages"] = [f"ros-{self.ROS_DISTRO}-ros-environment"] + self.part_snippet_extra["stage-packages"] = [ + f"ros-{self.ROS_DISTRO}-ros-environment" + ] self.part_snippet_extra["ros-build-snaps"] = [self.ros_noetic_snaps.sdk] @@ -76,12 +77,14 @@ def __init__(self, *, extension_name: str, yaml_data: Dict[str, Any]) -> None: "$SNAP/opt/ros/underlay_ws/usr/lib/python3/dist-packages", ] - self.app_snippet["environment"]["PYTHONPATH"] = f'{python_paths}:{":".join(new_python_paths)}' + self.app_snippet["environment"]["PYTHONPATH"] = ( + f"{python_paths}:{':'.join(new_python_paths)}" + ) @overrides def get_part_snippet(self, *, plugin_name: str) -> Dict[str, Any]: # If the part uses a ROS plugin, return the extra bits containing ROS plugin specifics entries # If not, still return the base ROS plugin entries. if plugin_name in ["catkin", "catkin-tools", "colcon"]: - return {**self.part_snippet,**self.part_snippet_extra} + return {**self.part_snippet, **self.part_snippet_extra} return self.part_snippet diff --git a/snapcraft_legacy/internal/project_loader/_extensions/_ros2_foxy_meta.py b/snapcraft_legacy/internal/project_loader/_extensions/_ros2_foxy_meta.py index 0d9086e83b..c57b964842 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/_ros2_foxy_meta.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/_ros2_foxy_meta.py @@ -61,13 +61,12 @@ def __init__(self, *, extension_name: str, yaml_data: Dict[str, Any]) -> None: ] self.root_snippet["plugs"] = { - self.ros2_foxy_snaps.content: - { - "interface": "content", - "content": self.ros2_foxy_snaps.content, - "target": "$SNAP/opt/ros/underlay_ws", - "default-provider": self.ros2_foxy_snaps.content, - } + self.ros2_foxy_snaps.content: { + "interface": "content", + "content": self.ros2_foxy_snaps.content, + "target": "$SNAP/opt/ros/underlay_ws", + "default-provider": self.ros2_foxy_snaps.content, + } } self.part_snippet["colcon-cmake-args"] = [ @@ -82,4 +81,6 @@ def __init__(self, *, extension_name: str, yaml_data: Dict[str, Any]) -> None: "$SNAP/opt/ros/underlay_ws/usr/lib/python3/dist-packages", ] - self.app_snippet["environment"]["PYTHONPATH"] = f'{python_paths}:{":".join(new_python_paths)}' + self.app_snippet["environment"]["PYTHONPATH"] = ( + f"{python_paths}:{':'.join(new_python_paths)}" + ) diff --git a/snapcraft_legacy/internal/project_loader/_extensions/ros1_noetic_robot.py b/snapcraft_legacy/internal/project_loader/_extensions/ros1_noetic_robot.py index 5d4c763ea8..38454038d9 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/ros1_noetic_robot.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/ros1_noetic_robot.py @@ -29,6 +29,4 @@ class ExtensionImpl(RosNoeticMetaBase): @functools.cached_property @overrides def ros_noetic_snaps(self) -> ROS2NoeticSnaps: - return ROS2NoeticSnaps( - content="ros-noetic-robot", sdk="ros-noetic-robot-dev" - ) + return ROS2NoeticSnaps(content="ros-noetic-robot", sdk="ros-noetic-robot-dev") diff --git a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_desktop.py b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_desktop.py index 5c1f6327a7..4cb8126df2 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_desktop.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_desktop.py @@ -29,6 +29,4 @@ class ExtensionImpl(RosFoxyMetaBase): @functools.cached_property @overrides def ros2_foxy_snaps(self) -> ROS2FoxySnaps: - return ROS2FoxySnaps( - content="ros-foxy-desktop", sdk="ros-foxy-desktop-dev" - ) + return ROS2FoxySnaps(content="ros-foxy-desktop", sdk="ros-foxy-desktop-dev") diff --git a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_base.py b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_base.py index 806a7c81ce..ee980d933c 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_base.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_base.py @@ -29,6 +29,4 @@ class ExtensionImpl(RosFoxyMetaBase): @functools.cached_property @overrides def ros2_foxy_snaps(self) -> ROS2FoxySnaps: - return ROS2FoxySnaps( - content="ros-foxy-ros-base", sdk="ros-foxy-ros-base-dev" - ) + return ROS2FoxySnaps(content="ros-foxy-ros-base", sdk="ros-foxy-ros-base-dev") diff --git a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_core.py b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_core.py index b6671149c0..f3a8d99b65 100644 --- a/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_core.py +++ b/snapcraft_legacy/internal/project_loader/_extensions/ros2_foxy_ros_core.py @@ -29,6 +29,4 @@ class ExtensionImpl(RosFoxyMetaBase): @functools.cached_property @overrides def ros2_foxy_snaps(self) -> ROS2FoxySnaps: - return ROS2FoxySnaps( - content="ros-foxy-ros-core", sdk="ros-foxy-ros-core-dev" - ) + return ROS2FoxySnaps(content="ros-foxy-ros-core", sdk="ros-foxy-ros-core-dev") diff --git a/snapcraft_legacy/internal/project_loader/_parts_config.py b/snapcraft_legacy/internal/project_loader/_parts_config.py index 26835dbe80..6329914d48 100644 --- a/snapcraft_legacy/internal/project_loader/_parts_config.py +++ b/snapcraft_legacy/internal/project_loader/_parts_config.py @@ -161,8 +161,7 @@ def validate(self, part_names): for part_name in part_names: if part_name not in self._part_names: raise snapcraft_legacy.internal.errors.SnapcraftEnvironmentError( - "The part named {!r} is not defined in " - "{!r}".format( + "The part named {!r} is not defined in {!r}".format( part_name, self._project.info.snapcraft_yaml_file_path ) ) @@ -178,8 +177,9 @@ def load_part(self, part_name, plugin_name, part_properties): ) logger.debug( - "Setting up part {!r} with plugin {!r} and " - "properties {!r}.".format(part_name, plugin_name, part_properties) + "Setting up part {!r} with plugin {!r} and properties {!r}.".format( + part_name, plugin_name, part_properties + ) ) stage_packages_repo = repo.Repo diff --git a/snapcraft_legacy/internal/project_loader/errors.py b/snapcraft_legacy/internal/project_loader/errors.py index 09b187ffab..88974cfbd3 100644 --- a/snapcraft_legacy/internal/project_loader/errors.py +++ b/snapcraft_legacy/internal/project_loader/errors.py @@ -20,12 +20,10 @@ class ProjectLoaderError(snapcraft_legacy.internal.errors.SnapcraftError): - fmt = "" class VariableEvaluationError(ProjectLoaderError): - fmt = ( "Cannot evaluate project variable {variable!r}: {reason}\n" "For more information, check out: {docs_url}" @@ -36,12 +34,10 @@ def __init__(self, variable: str, reason: str, docs_url: str) -> None: class InvalidEpochError(ProjectLoaderError): - fmt = "epochs are positive integers followed by an optional asterisk" class DuplicateAliasError(ProjectLoaderError): - fmt = "Multiple parts have the same alias defined: {aliases!r}" def __str__(self): @@ -52,7 +48,6 @@ def __str__(self): class SnapcraftLogicError(ProjectLoaderError): - fmt = "Issue detected while analyzing snapcraft.yaml: {message}" def __init__(self, message): @@ -121,7 +116,6 @@ def __init__(self, extension_name: str) -> None: class SnapcraftAfterPartMissingError(ProjectLoaderError): - fmt = ( "Failed to get part information: " "Cannot find the definition for part {after_part_name!r}, required by part " diff --git a/snapcraft_legacy/internal/project_loader/inspection/errors.py b/snapcraft_legacy/internal/project_loader/inspection/errors.py index 7358972f45..57c1f5f9e1 100644 --- a/snapcraft_legacy/internal/project_loader/inspection/errors.py +++ b/snapcraft_legacy/internal/project_loader/inspection/errors.py @@ -18,7 +18,6 @@ class NoSuchFileError(snapcraft_legacy.internal.errors.SnapcraftError): - fmt = ( "Failed to find part that provided path: {path!r} does not " "exist.\n" @@ -37,7 +36,6 @@ def get_exit_code(self): class ProvidesInvalidFilePathError(SnapcraftInspectError): - fmt = ( "Failed to find part that provides path: {path!r} is not in the " "staging or priming area.\n" @@ -49,7 +47,6 @@ def __init__(self, path): class UntrackedFileError(SnapcraftInspectError): - fmt = "No known parts provided {path!r}. It may have been provided by a scriptlet." def __init__(self, path): diff --git a/snapcraft_legacy/internal/remote_build/_launchpad.py b/snapcraft_legacy/internal/remote_build/_launchpad.py index 853c35ed5e..c5feb51364 100644 --- a/snapcraft_legacy/internal/remote_build/_launchpad.py +++ b/snapcraft_legacy/internal/remote_build/_launchpad.py @@ -130,8 +130,12 @@ def _credentials_filepath(self) -> pathlib.Path: If the credentials file does not exist in the default location but exists in the legacy location, emit a deprecation warning and return the legacy location. """ - credentials_filepath = platformdirs.user_data_path("snapcraft") / "launchpad-credentials" - legacy_credentials_filepath = platformdirs.user_data_path("snapcraft") / "provider/launchpad/credentials" + credentials_filepath = ( + platformdirs.user_data_path("snapcraft") / "launchpad-credentials" + ) + legacy_credentials_filepath = ( + platformdirs.user_data_path("snapcraft") / "provider/launchpad/credentials" + ) if not credentials_filepath.exists() and legacy_credentials_filepath.exists(): logger.warning( diff --git a/snapcraft_legacy/internal/remote_build/_worktree.py b/snapcraft_legacy/internal/remote_build/_worktree.py index 465e381a28..76e6d41d63 100644 --- a/snapcraft_legacy/internal/remote_build/_worktree.py +++ b/snapcraft_legacy/internal/remote_build/_worktree.py @@ -50,14 +50,10 @@ def __init__( self._package_all_sources = package_all_sources # Get snapcraft yaml (as OrderedDict). - self._snapcraft_config = ( - self._project.info.get_raw_snapcraft() - ) # type: OrderedDict + self._snapcraft_config = self._project.info.get_raw_snapcraft() # type: OrderedDict # Working copy. - self._prepared_snapcraft_config = ( - self._project.info.get_raw_snapcraft() - ) # type: OrderedDict + self._prepared_snapcraft_config = self._project.info.get_raw_snapcraft() # type: OrderedDict # Working tree base directory. self._base_dir = worktree_dir diff --git a/snapcraft_legacy/internal/remote_build/errors.py b/snapcraft_legacy/internal/remote_build/errors.py index c7c2d9f6a2..2d2e04e8aa 100644 --- a/snapcraft_legacy/internal/remote_build/errors.py +++ b/snapcraft_legacy/internal/remote_build/errors.py @@ -25,7 +25,6 @@ class RemoteBuildBaseError(_SnapcraftError): class RemoteBuildNotFoundError(RemoteBuildBaseError): - fmt = ( "Remote build not found, please make sure project {name!r} and build " "number {req_number} are correct. If this is an old build, it may " @@ -37,17 +36,14 @@ def __init__(self, *, name: str, req_number: int) -> None: class NoLaunchpadUsernameError(RemoteBuildBaseError): - fmt = "Please set your Launchpad username using the '--user' option." class NotGitRepositoryError(RemoteBuildBaseError): - fmt = "Current directory is not a git repository." class GitNotFoundVersionError(RemoteBuildBaseError): - fmt = ( "This remote-build project requires `git` to be installed " "because of it use of `version: git`. Either install `git`, " @@ -57,7 +53,6 @@ class GitNotFoundVersionError(RemoteBuildBaseError): class GitNotFoundProviderError(RemoteBuildBaseError): - fmt = ( "The remote build provider ({provider!r}) requires " "the use of the `git` utility, and `git` is not installed. " @@ -69,7 +64,6 @@ def __init__(self, *, provider: str) -> None: class BaseRequiredError(RemoteBuildBaseError): - fmt = ( "Remote build currently requires that the project uses bases.\n" "Please specify an appropriate `base` keyword and try again." @@ -77,7 +71,6 @@ class BaseRequiredError(RemoteBuildBaseError): class RemoteBuilderNotSupportedError(RemoteBuildBaseError): - fmt = ( "Remote builder {provider!r} is not supported, please choose " "a different one and try again." @@ -88,12 +81,10 @@ def __init__(self, *, provider: str) -> None: class RemoteBuildTimeoutError(RemoteBuildBaseError): - fmt = "Remote build exceeded configured timeout." class RemoteBuilderError(RemoteBuildBaseError): - fmt = "Remote builder failed with error: {builder_error!r}" def __init__(self, *, builder_error: str) -> None: @@ -101,7 +92,6 @@ def __init__(self, *, builder_error: str) -> None: class UnsupportedArchitectureError(RemoteBuildBaseError): - fmt = ( "The following architectures are not supported by the remote builder: " "{archs}.\nPlease remove them from the architecture list " @@ -113,7 +103,6 @@ def __init__(self, *, archs: List[str]) -> None: class UnsupportedVersionScriptError(RemoteBuildBaseError): - fmt = ( "Remote-build does not support the use of `version-script`.\n" "Please use `snapcraftctl set-version` part scriptlet with " @@ -122,7 +111,6 @@ class UnsupportedVersionScriptError(RemoteBuildBaseError): class AcceptPublicUploadError(RemoteBuildBaseError): - fmt = ( "Remote build needs explicit acknowledgement that data sent to build servers " "is public.\n" @@ -152,6 +140,7 @@ def get_brief(self) -> str: def get_resolution(self) -> str: return "Verify connectivity to https://api.launchpad.net and retry build." + class RemoteBuildFailedError(RemoteBuildBaseError): """Remote build failed.""" diff --git a/snapcraft_legacy/internal/repo/_base.py b/snapcraft_legacy/internal/repo/_base.py index e5ebbafc15..370c21df2d 100644 --- a/snapcraft_legacy/internal/repo/_base.py +++ b/snapcraft_legacy/internal/repo/_base.py @@ -211,7 +211,7 @@ def _mark_origin_stage_package( ) -> Set[str]: """Mark all files in sources_dir as coming from stage_package.""" file_list = set() - for (root, dirs, files) in os.walk(sources_dir): + for root, dirs, files in os.walk(sources_dir): for file_name in files: file_path = os.path.join(root, file_name) diff --git a/snapcraft_legacy/internal/repo/apt_sources_manager.py b/snapcraft_legacy/internal/repo/apt_sources_manager.py index ba7ba04c33..d867d07e47 100644 --- a/snapcraft_legacy/internal/repo/apt_sources_manager.py +++ b/snapcraft_legacy/internal/repo/apt_sources_manager.py @@ -107,7 +107,6 @@ class AptSourcesManager: :param sources_list_d: Path to sources.list.d directory. """ - def __init__( self, *, diff --git a/snapcraft_legacy/internal/repo/errors.py b/snapcraft_legacy/internal/repo/errors.py index 19985097d0..5df006f9ef 100644 --- a/snapcraft_legacy/internal/repo/errors.py +++ b/snapcraft_legacy/internal/repo/errors.py @@ -30,7 +30,6 @@ class RepoError(errors.SnapcraftError): class NoNativeBackendError(RepoError): - fmt = "Native builds aren't supported on {distro}." def __init__(self): @@ -42,7 +41,6 @@ def __init__(self): class CacheUpdateFailedError(RepoError): - fmt = ( "Failed to update the package cache: " "Some files could not be downloaded:{errors}" @@ -79,7 +77,6 @@ def get_resolution(self) -> str: class FileProviderNotFound(RepoError): - fmt = "{file_path} is not provided by any package." def __init__(self, *, file_path: Path) -> None: @@ -87,7 +84,6 @@ def __init__(self, *, file_path: Path) -> None: class BuildPackageNotFoundError(RepoError): - fmt = "Could not find a required package in 'build-packages': {package}" def __init__(self, package): @@ -95,7 +91,6 @@ def __init__(self, package): class BuildPackagesNotInstalledError(RepoError): - fmt = "Could not install all requested build packages: {packages}" def __init__(self, *, packages: List[str]) -> None: @@ -103,7 +98,6 @@ def __init__(self, *, packages: List[str]) -> None: class PackageFetchError(RepoError): - fmt = "Package fetch error: {message}" def __init__(self, message: str) -> None: @@ -111,7 +105,6 @@ def __init__(self, message: str) -> None: class PackageBrokenError(RepoError): - fmt = "The package {package} has unmet dependencies: {deps}" def __init__(self, package: str, deps: List[str]) -> None: @@ -153,7 +146,6 @@ def get_resolution(self) -> str: class UnpackError(RepoError): - fmt = "Error while provisioning {package!r}" def __init__(self, package): @@ -161,7 +153,6 @@ def __init__(self, package): class SnapUnavailableError(RepoError): - fmt = ( "Failed to install or refresh a snap: {snap_name!r} does not exist " "or is not available on the desired channel {snap_channel!r}. " @@ -174,7 +165,6 @@ def __init__(self, *, snap_name: str, snap_channel: str) -> None: class SnapFindError(RepoError): - fmt = ( "Could not find the snap {snap_name!r} installed on this host.\n" "Install the snap and try again." @@ -185,7 +175,6 @@ def __init__(self, *, snap_name): class SnapInstallError(RepoError): - fmt = "Error while installing snap {snap_name!r} from channel {snap_channel!r}" def __init__(self, *, snap_name, snap_channel): @@ -193,7 +182,6 @@ def __init__(self, *, snap_name, snap_channel): class SnapDownloadError(RepoError): - fmt = "Error while downloading snap {snap_name!r} from channel {snap_channel!r}" def __init__(self, *, snap_name, snap_channel): @@ -201,7 +189,6 @@ def __init__(self, *, snap_name, snap_channel): class SnapGetAssertionError(RepoError): - fmt = ( "Error while retrieving assertion with parameters " "{assertion_params!r}\n" @@ -213,7 +200,6 @@ def __init__(self, *, assertion_params: Sequence[str]) -> None: class SnapRefreshError(RepoError): - fmt = "Error while refreshing snap {snap_name!r} to channel {snap_channel!r}" def __init__(self, *, snap_name, snap_channel): @@ -221,7 +207,6 @@ def __init__(self, *, snap_name, snap_channel): class SnapdConnectionError(RepoError): - fmt = ( "Failed to get information for snap {snap_name!r}: " "could not connect to {url!r}." diff --git a/snapcraft_legacy/internal/repo/snaps.py b/snapcraft_legacy/internal/repo/snaps.py index 0a779b0550..6d2fa7cb8e 100644 --- a/snapcraft_legacy/internal/repo/snaps.py +++ b/snapcraft_legacy/internal/repo/snaps.py @@ -160,8 +160,9 @@ def is_classic(self) -> bool: # hard to debug as they only occur there, logging in debug mode # will help uncover the root cause if it happens again. logger.debug( - "Current store channels are {!r} and the store" - "payload is {!r}".format(store_channels, self._store_snap_info) + "Current store channels are {!r} and the storepayload is {!r}".format( + store_channels, self._store_snap_info + ) ) raise @@ -183,7 +184,7 @@ def local_download(self, *, snap_path: str, assertion_path: str) -> None: [ "snap-declaration", # use the snap name without any alias - f"snap-name={self.name.partition('_')[0]}" + f"snap-name={self.name.partition('_')[0]}", ] ) assertions.append( diff --git a/snapcraft_legacy/internal/sources/__init__.py b/snapcraft_legacy/internal/sources/__init__.py index 6c7c64a88a..13f952c82e 100644 --- a/snapcraft_legacy/internal/sources/__init__.py +++ b/snapcraft_legacy/internal/sources/__init__.py @@ -80,6 +80,7 @@ snapcraft help """ + import logging import os import os.path diff --git a/snapcraft_legacy/internal/sources/_git.py b/snapcraft_legacy/internal/sources/_git.py index 13ef300713..54766ebd80 100644 --- a/snapcraft_legacy/internal/sources/_git.py +++ b/snapcraft_legacy/internal/sources/_git.py @@ -162,7 +162,7 @@ def _fetch_origin_commit(self): "origin", self.source_commit, ], - **self._call_kwargs + **self._call_kwargs, ) def _pull_existing(self): @@ -191,7 +191,7 @@ def _pull_existing(self): self._run( [self.command, "-C", self.source_dir, "reset", "--hard", reset_spec], - **self._call_kwargs + **self._call_kwargs, ) if self.source_submodules is None or len(self.source_submodules) > 0: @@ -229,7 +229,7 @@ def _clone_new(self): self._run( [self.command, "-C", self.source_dir, "checkout", self.source_commit], - **self._call_kwargs + **self._call_kwargs, ) def is_local(self): diff --git a/snapcraft_legacy/internal/sources/_local.py b/snapcraft_legacy/internal/sources/_local.py index a658d388c0..bda2150025 100644 --- a/snapcraft_legacy/internal/sources/_local.py +++ b/snapcraft_legacy/internal/sources/_local.py @@ -50,7 +50,7 @@ def _check(self, target): self._updated_files = set() self._updated_directories = set() - for (root, directories, files) in os.walk(self.source_abspath, topdown=True): + for root, directories, files in os.walk(self.source_abspath, topdown=True): ignored = set(self._ignore(root, directories + files, check=True)) if ignored: # Prune our search appropriately given an ignore list, i.e. diff --git a/snapcraft_legacy/internal/sources/_subversion.py b/snapcraft_legacy/internal/sources/_subversion.py index 0835a4a60e..e11becf0aa 100644 --- a/snapcraft_legacy/internal/sources/_subversion.py +++ b/snapcraft_legacy/internal/sources/_subversion.py @@ -69,7 +69,7 @@ def pull(self): self._run( [self.command, "update"] + opts, cwd=self.source_dir, - **self._call_kwargs + **self._call_kwargs, ) else: if os.path.isdir(self.source): @@ -81,12 +81,12 @@ def pull(self): self.source_dir, ] + opts, - **self._call_kwargs + **self._call_kwargs, ) else: self._run( [self.command, "checkout", self.source, self.source_dir] + opts, - **self._call_kwargs + **self._call_kwargs, ) self.source_details = self._get_source_details() diff --git a/snapcraft_legacy/internal/sources/errors.py b/snapcraft_legacy/internal/sources/errors.py index aba3d79630..31afa05dc1 100644 --- a/snapcraft_legacy/internal/sources/errors.py +++ b/snapcraft_legacy/internal/sources/errors.py @@ -30,7 +30,6 @@ class VCSError(SnapcraftSourceError): class SnapcraftSourceNotFoundError(SnapcraftSourceError): - fmt = ( "Failed to pull source: {source!r}.\n" "Please ensure the source path is correct and that it is accessible.\n" @@ -42,7 +41,6 @@ def __init__(self, source): class SnapcraftSourceUnhandledError(SnapcraftSourceError): - fmt = ( "Failed to pull source: " "unable to determine source type of {source!r}.\n" @@ -56,7 +54,6 @@ def __init__(self, source): class SnapcraftSourceInvalidOptionError(SnapcraftSourceError): - fmt = ( "Failed to pull source: " "{option!r} cannot be used with a {source_type} source.\n" @@ -68,7 +65,6 @@ def __init__(self, source_type: str, option: str) -> None: class SnapcraftSourceIncompatibleOptionsError(SnapcraftSourceError): - fmt = ( "Failed to pull source: " "cannot specify both {humanized_options} for a {source_type} source.\n" @@ -84,7 +80,6 @@ def __init__(self, source_type: str, options: List[str]) -> None: class DigestDoesNotMatchError(SnapcraftSourceError): - fmt = "Expected the digest for source to be {expected}, but it was {calculated}" def __init__(self, expected, calculated): @@ -92,7 +87,6 @@ def __init__(self, expected, calculated): class InvalidDebError(SnapcraftSourceError): - fmt = ( "The {deb_file} used does not contain valid data. " "Ensure a proper deb file is passed for .deb files " @@ -101,7 +95,6 @@ class InvalidDebError(SnapcraftSourceError): class InvalidSnapError(SnapcraftSourceError): - fmt = ( "The snap file does not contain valid data. " "Ensure the source lists a proper snap file" @@ -109,7 +102,6 @@ class InvalidSnapError(SnapcraftSourceError): class SourceUpdateUnsupportedError(SnapcraftSourceError): - fmt = "Failed to update source: {source!s} sources don't support updating." def __init__(self, source): @@ -117,7 +109,6 @@ def __init__(self, source): class SnapcraftPullError(SnapcraftSourceError): - fmt = "Failed to pull source, command {command!r} exited with code {exit_code}." def __init__(self, command, exit_code): @@ -129,7 +120,6 @@ def __init__(self, command, exit_code): class SnapcraftRequestError(SnapcraftSourceError): - fmt = "Network request error: {message}" diff --git a/snapcraft_legacy/internal/states/_global_state.py b/snapcraft_legacy/internal/states/_global_state.py index 4d3468579f..260ca575c6 100644 --- a/snapcraft_legacy/internal/states/_global_state.py +++ b/snapcraft_legacy/internal/states/_global_state.py @@ -33,7 +33,6 @@ class GlobalState(State): - yaml_tag = "!GlobalState" @classmethod diff --git a/snapcraft_legacy/plugins/v2/_kernel_build.py b/snapcraft_legacy/plugins/v2/_kernel_build.py index 48ec7243b2..08f5d85f98 100644 --- a/snapcraft_legacy/plugins/v2/_kernel_build.py +++ b/snapcraft_legacy/plugins/v2/_kernel_build.py @@ -181,9 +181,7 @@ def _download_generic_initrd_cmd(target_arch: str) -> List[str]: if [ ! -e ${{UC_INITRD_DEB}} ]; then download_core_initrd {arch} ${{UC_INITRD_DEB}} fi - """.format( - arch=target_arch - ) + """.format(arch=target_arch) ) return [cmd] @@ -214,9 +212,7 @@ def _download_snap_bootstrap_cmd(target_arch: str) -> List[str]: if [ ! -e ${{UC_INITRD_DEB}}/usr/lib/snapd ]; then download_snap_bootstrap {arch} ${{UC_INITRD_DEB}} fi - """.format( - arch=target_arch - ) + """.format(arch=target_arch) ) return [cmd] @@ -231,9 +227,7 @@ def _clone_zfs_cmd(enable_zfs: bool, dest_dir: str) -> List[str]: echo "cloning zfs..." git clone --depth=1 {zfs_url} {dest_dir}/zfs -b master fi - """.format( - dest_dir=dest_dir, zfs_url=_ZFS_URL - ) + """.format(dest_dir=dest_dir, zfs_url=_ZFS_URL) ) ] return [ @@ -249,9 +243,7 @@ def _clean_old_build_cmd(dest_dir: str) -> List[str]: echo "Cleaning previous build first..." [ -e {dest_dir}/modules ] && rm -rf {dest_dir}/modules [ -L {dest_dir}/lib/modules ] && rm -rf {dest_dir}/lib/modules - """.format( - dest_dir=dest_dir - ) + """.format(dest_dir=dest_dir) ) ] @@ -293,15 +285,13 @@ def _do_base_config_cmd( fakeroot debian/rules clean rm -rf CONFIGS/ popd - fi""".format( - config_flavour=config_flavour, dest_dir=dest_dir - ) + fi""".format(config_flavour=config_flavour, dest_dir=dest_dir) ) cmd.extend([conf_cmd]) else: make_cmd = make_cmd.copy() make_cmd[1] = "-j1" # FIXME: make this more robust - cmd.append(f'\t{" ".join(make_cmd + defconfig)}') + cmd.append(f"\t{' '.join(make_cmd + defconfig)}") cmd.append("fi") @@ -524,7 +514,6 @@ def _get_perf_build_commands( ] - def _make_initrd_cmd( initrd_compression: Optional[str], initrd_compression_options: Optional[List[str]], @@ -917,7 +906,6 @@ def _make_initrd_cmd( ] - def get_build_commands( make_cmd: List[str], make_targets: List[str], @@ -1118,9 +1106,7 @@ def _arrange_install_dir_cmd(install_dir: str) -> List[str]: # create symlinks for modules and firmware for convenience ln -sf ../modules {install_dir}/lib/modules ln -sf ../firmware {install_dir}/lib/firmware - """.format( - install_dir=install_dir - ) + """.format(install_dir=install_dir) ) ] @@ -1142,7 +1128,6 @@ def _compression_cmd( return cmd - def _get_post_install_cmd( device_trees: Optional[List[str]], initrd_compression: Optional[str], @@ -1192,7 +1177,6 @@ def _get_post_install_cmd( ] - def _get_install_command( device_trees: Optional[List[str]], make_cmd: List[str], diff --git a/snapcraft_legacy/plugins/v2/_ros.py b/snapcraft_legacy/plugins/v2/_ros.py index a97a7aaa70..364147d630 100644 --- a/snapcraft_legacy/plugins/v2/_ros.py +++ b/snapcraft_legacy/plugins/v2/_ros.py @@ -77,7 +77,9 @@ class RosPlugin(PluginV2): """Base class for ROS-related plugins. Not intended for use by end users.""" def get_build_snaps(self) -> Set[str]: - return set(self.options.ros_build_snaps) if self.options.ros_build_snaps else set() + return ( + set(self.options.ros_build_snaps) if self.options.ros_build_snaps else set() + ) def get_build_packages(self) -> Set[str]: return { @@ -122,7 +124,6 @@ def _get_build_commands(self) -> List[str]: """ def _get_list_packages_commands(self) -> List[str]: - cmd = list() # Clean up previously established list of packages in build snaps @@ -133,25 +134,25 @@ def _get_list_packages_commands(self) -> List[str]: for ros_build_snap in self.options.ros_build_snaps: snap_name = _get_parsed_snap(ros_build_snap)[0] path = f"/snap/{snap_name}/current/opt/ros" - cmd.extend([ - # Retrieve the list of all ROS packages available in the build snap - f"if [ -d {path} ]; then", - f"ROS_PACKAGE_PATH={path} " - 'rospack list-names | (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | ' - 'awk "/#apt/{getline;print;}" >> "${SNAPCRAFT_PART_INSTALL}/.installed_packages.txt"', - "fi", - - # Retrieve the list of all non-ROS packages available in the build snap - f'if [ -d "{path}/${{ROS_DISTRO}}/" ]; then', - f'rosdep keys --rosdistro "${{ROS_DISTRO}}" --from-paths "{path}/${{ROS_DISTRO}}" --ignore-packages-from-source ' - '| (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | grep -v "#" >> "${SNAPCRAFT_PART_INSTALL}"/.installed_packages.txt', - "fi", - - f'if [ -d "{path}/snap/" ]; then', - f'rosdep keys --rosdistro "${{ROS_DISTRO}}" --from-paths "{path}/snap" --ignore-packages-from-source ' - '| (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | grep -v "#" >> "${SNAPCRAFT_PART_INSTALL}"/.installed_packages.txt', - "fi", - ]) + cmd.extend( + [ + # Retrieve the list of all ROS packages available in the build snap + f"if [ -d {path} ]; then", + f"ROS_PACKAGE_PATH={path} " + 'rospack list-names | (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | ' + 'awk "/#apt/{getline;print;}" >> "${SNAPCRAFT_PART_INSTALL}/.installed_packages.txt"', + "fi", + # Retrieve the list of all non-ROS packages available in the build snap + f'if [ -d "{path}/${{ROS_DISTRO}}/" ]; then', + f'rosdep keys --rosdistro "${{ROS_DISTRO}}" --from-paths "{path}/${{ROS_DISTRO}}" --ignore-packages-from-source ' + '| (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | grep -v "#" >> "${SNAPCRAFT_PART_INSTALL}"/.installed_packages.txt', + "fi", + f'if [ -d "{path}/snap/" ]; then', + f'rosdep keys --rosdistro "${{ROS_DISTRO}}" --from-paths "{path}/snap" --ignore-packages-from-source ' + '| (xargs rosdep resolve --rosdistro "${ROS_DISTRO}" || echo "") | grep -v "#" >> "${SNAPCRAFT_PART_INSTALL}"/.installed_packages.txt', + "fi", + ] + ) cmd.append("") return cmd diff --git a/snapcraft_legacy/plugins/v2/catkin.py b/snapcraft_legacy/plugins/v2/catkin.py index 52c21bdac2..d73be0c30e 100644 --- a/snapcraft_legacy/plugins/v2/catkin.py +++ b/snapcraft_legacy/plugins/v2/catkin.py @@ -16,24 +16,24 @@ """The catkin plugin for ROS 1 parts. - - catkin-packages: - (list of strings) - List of catkin packages to build. If not specified, all packages in the - workspace will be built. If set to an empty list ([]), no packages will - be built, which could be useful if you only want ROS debs in the snap. - - - catkin-packages-ignore: - (list of strings) - List of catkin packages to ignore (i.e. not build or install). If not - specified or set to an empty list ([]), no packages will be ignored. - - - catkin-cmake-args: - (list of strings) - Arguments to pass to cmake projects. - - This plugin requires certain variables that are specified by the `ros1-noetic` - extension. If you're not using the extension, set these in your `build-environment`: - - ROS_DISTRO: "noetic" +- catkin-packages: + (list of strings) + List of catkin packages to build. If not specified, all packages in the + workspace will be built. If set to an empty list ([]), no packages will + be built, which could be useful if you only want ROS debs in the snap. + +- catkin-packages-ignore: + (list of strings) + List of catkin packages to ignore (i.e. not build or install). If not + specified or set to an empty list ([]), no packages will be ignored. + +- catkin-cmake-args: + (list of strings) + Arguments to pass to cmake projects. + +This plugin requires certain variables that are specified by the `ros1-noetic` +extension. If you're not using the extension, set these in your `build-environment`: + - ROS_DISTRO: "noetic" """ from typing import Any, Dict, List, Set @@ -118,12 +118,16 @@ def _get_workspace_activation_commands(self) -> List[str]: if self.options.ros_build_snaps: for ros_build_snap in self.options.ros_build_snaps: snap_name = _get_parsed_snap(ros_build_snap)[0] - activation_commands.extend(self._get_source_command(f"/snap/{snap_name}/current")) + activation_commands.extend( + self._get_source_command(f"/snap/{snap_name}/current") + ) activation_commands.append("") # Source ROS ws in stage-snaps next activation_commands.append("## Sourcing ROS ws in stage snaps") - activation_commands.extend(self._get_source_command("${SNAPCRAFT_PART_INSTALL}")) + activation_commands.extend( + self._get_source_command("${SNAPCRAFT_PART_INSTALL}") + ) activation_commands.append("") # Finally source system's ROS ws @@ -134,7 +138,6 @@ def _get_workspace_activation_commands(self) -> List[str]: return activation_commands def _get_build_commands(self) -> List[str]: - build_command = [ "catkin_make_isolated", "--install", @@ -155,9 +158,12 @@ def _get_build_commands(self) -> List[str]: if self.options.catkin_packages_ignore: build_command.extend(["--ignore-pkg", *self.options.catkin_packages_ignore]) - if self.options.catkin_cmake_args or self.options.ros_content_sharing_extension_cmake_args: + if ( + self.options.catkin_cmake_args + or self.options.ros_content_sharing_extension_cmake_args + ): build_command.append("--cmake-args") build_command.extend(self.options.catkin_cmake_args) build_command.extend(self.options.ros_content_sharing_extension_cmake_args) - return (["## Build command", " ".join(build_command)]) + return ["## Build command", " ".join(build_command)] diff --git a/snapcraft_legacy/plugins/v2/catkin_tools.py b/snapcraft_legacy/plugins/v2/catkin_tools.py index 5c466525af..c103e2a48d 100644 --- a/snapcraft_legacy/plugins/v2/catkin_tools.py +++ b/snapcraft_legacy/plugins/v2/catkin_tools.py @@ -16,19 +16,19 @@ """The catkin tools plugin for ROS 1 parts. - - catkin-tools-packages: - (list of strings) - List of catkin packages to build. If not specified, all packages in the - workspace will be built. If set to an empty list ([]), no packages will - be built, which could be useful if you only want ROS debs in the snap. - - - catkin-tools-cmake-args: - (list of strings) - Arguments to pass to cmake projects. - - This plugin requires certain variables that are specified by the `ros1-noetic` - extension. If you're not using the extension, set these in your `build-environment`: - - ROS_DISTRO: "noetic" +- catkin-tools-packages: + (list of strings) + List of catkin packages to build. If not specified, all packages in the + workspace will be built. If set to an empty list ([]), no packages will + be built, which could be useful if you only want ROS debs in the snap. + +- catkin-tools-cmake-args: + (list of strings) + Arguments to pass to cmake projects. + +This plugin requires certain variables that are specified by the `ros1-noetic` +extension. If you're not using the extension, set these in your `build-environment`: + - ROS_DISTRO: "noetic" """ from typing import Any, Dict, List, Set @@ -108,12 +108,16 @@ def _get_workspace_activation_commands(self) -> List[str]: if self.options.ros_build_snaps: for ros_build_snap in self.options.ros_build_snaps: snap_name = _get_parsed_snap(ros_build_snap)[0] - activation_commands.extend(self._get_source_command(f"/snap/{snap_name}/current")) + activation_commands.extend( + self._get_source_command(f"/snap/{snap_name}/current") + ) activation_commands.append("") # Source ROS ws in stage-snaps next activation_commands.append("## Sourcing ROS ws in stage snaps") - activation_commands.extend(self._get_source_command("${SNAPCRAFT_PART_INSTALL}")) + activation_commands.extend( + self._get_source_command("${SNAPCRAFT_PART_INSTALL}") + ) activation_commands.append("") # Finally source system's ROS ws @@ -166,15 +170,16 @@ def _get_build_commands(self) -> List[str]: '"${SNAPCRAFT_PART_INSTALL}/opt/ros/${ROS_DISTRO}"', ] - if self.options.catkin_tools_cmake_args or self.options.ros_content_sharing_extension_cmake_args: + if ( + self.options.catkin_tools_cmake_args + or self.options.ros_content_sharing_extension_cmake_args + ): cmake_args = [] if self.options.catkin_tools_cmake_args: cmake_args.extend(self.options.catkin_tools_cmake_args) if self.options.ros_content_sharing_extension_cmake_args: cmake_args.extend(self.options.ros_content_sharing_extension_cmake_args) - catkin_config_command.extend( - ["--cmake-args", *cmake_args] - ) + catkin_config_command.extend(["--cmake-args", *cmake_args]) commands.append(" ".join(catkin_config_command)) diff --git a/snapcraft_legacy/plugins/v2/colcon.py b/snapcraft_legacy/plugins/v2/colcon.py index b4e9d57882..3d07aeeafd 100644 --- a/snapcraft_legacy/plugins/v2/colcon.py +++ b/snapcraft_legacy/plugins/v2/colcon.py @@ -16,42 +16,42 @@ """The colcon plugin for ROS 2 parts. - - colcon-packages: - (list of strings) - List of colcon packages to build. If not specified, all packages in the - workspace will be built. If set to an empty list ([]), no packages will - be built, which could be useful if you only want ROS debs in the snap. - - - colcon-packages-ignore: - (list of strings) - List of colcon packages to ignore. If not specified or set to an empty - list ([]), no packages will be ignored. - - - colcon-cmake-args: - (list of strings) - Arguments to pass to cmake projects. Note that any arguments here which match - colcon arguments need to be prefixed with a space. This can be done by quoting - each argument with a leading space. - - - colcon-catkin-cmake-args: - (list of strings) - Arguments to pass to catkin packages. Note that any arguments here which match - colcon arguments need to be prefixed with a space. This can be done by quoting - each argument with a leading space. - - - colcon-ament-cmake-args: - (list of strings) - Arguments to pass to ament_cmake packages. Note that any arguments here which - match colcon arguments need to be prefixed with a space. This can be done by - quoting each argument with a leading space. - - This plugin expects the build-environment `ROS_DISTRO` and `ROS_BUILD_BASE` - to be populated by the `ros2-` extension. - - This plugin also expects certain variables that are specified by the extension, - specific to the ROS distro. If not using the extension, set these in your - `build-environment`: - - ROS_DISTRO: "foxy" +- colcon-packages: + (list of strings) + List of colcon packages to build. If not specified, all packages in the + workspace will be built. If set to an empty list ([]), no packages will + be built, which could be useful if you only want ROS debs in the snap. + +- colcon-packages-ignore: + (list of strings) + List of colcon packages to ignore. If not specified or set to an empty + list ([]), no packages will be ignored. + +- colcon-cmake-args: + (list of strings) + Arguments to pass to cmake projects. Note that any arguments here which match + colcon arguments need to be prefixed with a space. This can be done by quoting + each argument with a leading space. + +- colcon-catkin-cmake-args: + (list of strings) + Arguments to pass to catkin packages. Note that any arguments here which match + colcon arguments need to be prefixed with a space. This can be done by quoting + each argument with a leading space. + +- colcon-ament-cmake-args: + (list of strings) + Arguments to pass to ament_cmake packages. Note that any arguments here which + match colcon arguments need to be prefixed with a space. This can be done by + quoting each argument with a leading space. + +This plugin expects the build-environment `ROS_DISTRO` and `ROS_BUILD_BASE` +to be populated by the `ros2-` extension. + +This plugin also expects certain variables that are specified by the extension, +specific to the ROS distro. If not using the extension, set these in your +`build-environment`: + - ROS_DISTRO: "foxy" """ from typing import Any, Dict, List, Set @@ -180,7 +180,6 @@ def _get_workspace_activation_commands(self) -> List[str]: return activation_commands def _get_build_commands(self) -> List[str]: - build_command = [ "colcon", "build", @@ -194,36 +193,45 @@ def _get_build_commands(self) -> List[str]: ] if self.options.colcon_packages_ignore: - build_command.extend(["--packages-ignore", *self.options.colcon_packages_ignore]) + build_command.extend( + ["--packages-ignore", *self.options.colcon_packages_ignore] + ) if self.options.colcon_packages: build_command.extend(["--packages-select", *self.options.colcon_packages]) # compile in release only if user did not set the build type in cmake-args if not any("-DCMAKE_BUILD_TYPE=" in s for s in self.options.colcon_cmake_args): - build_command.extend(["--cmake-args", "-DCMAKE_BUILD_TYPE=Release", - *self.options.colcon_cmake_args - ]) - elif len(self.options.colcon_cmake_args)>0: + build_command.extend( + [ + "--cmake-args", + "-DCMAKE_BUILD_TYPE=Release", + *self.options.colcon_cmake_args, + ] + ) + elif len(self.options.colcon_cmake_args) > 0: build_command.extend(["--cmake-args", *self.options.colcon_cmake_args]) if self.options.colcon_ament_cmake_args: - build_command.extend(["--ament-cmake-args", *self.options.colcon_ament_cmake_args]) + build_command.extend( + ["--ament-cmake-args", *self.options.colcon_ament_cmake_args] + ) if self.options.colcon_catkin_cmake_args: - build_command.extend(["--catkin-cmake-args", *self.options.colcon_catkin_cmake_args]) + build_command.extend( + ["--catkin-cmake-args", *self.options.colcon_catkin_cmake_args] + ) # Specify the number of workers - build_command.extend(["--parallel-workers", '"${SNAPCRAFT_PARALLEL_BUILD_COUNT}"']) - - return ( - ["## Build command", " ".join(build_command)] - + [ - "## Post build command", - # Remove the COLCON_IGNORE marker so that, at staging, - # catkin can crawl the entire folder to look up for packages. - 'if [ -f "${SNAPCRAFT_PART_INSTALL}"/opt/ros/snap/COLCON_IGNORE ]; then', - 'rm "${SNAPCRAFT_PART_INSTALL}"/opt/ros/snap/COLCON_IGNORE', - "fi", - ] + build_command.extend( + ["--parallel-workers", '"${SNAPCRAFT_PARALLEL_BUILD_COUNT}"'] ) + + return ["## Build command", " ".join(build_command)] + [ + "## Post build command", + # Remove the COLCON_IGNORE marker so that, at staging, + # catkin can crawl the entire folder to look up for packages. + 'if [ -f "${SNAPCRAFT_PART_INSTALL}"/opt/ros/snap/COLCON_IGNORE ]; then', + 'rm "${SNAPCRAFT_PART_INSTALL}"/opt/ros/snap/COLCON_IGNORE', + "fi", + ] diff --git a/snapcraft_legacy/plugins/v2/crystal.py b/snapcraft_legacy/plugins/v2/crystal.py index 61b854f38c..18e11cf033 100644 --- a/snapcraft_legacy/plugins/v2/crystal.py +++ b/snapcraft_legacy/plugins/v2/crystal.py @@ -31,6 +31,7 @@ (list of strings, default: '[]') These options are passed to `shards build`. """ + import os import shlex import shutil diff --git a/snapcraft_legacy/project/_project.py b/snapcraft_legacy/project/_project.py index 7acbb327b6..0176df85e8 100644 --- a/snapcraft_legacy/project/_project.py +++ b/snapcraft_legacy/project/_project.py @@ -38,9 +38,8 @@ def __init__( debug=False, snapcraft_yaml_file_path=None, work_dir: str = None, - is_managed_host: bool = False + is_managed_host: bool = False, ) -> None: - project_dir = os.getcwd() if is_managed_host: work_dir = os.path.expanduser("~") @@ -59,7 +58,7 @@ def __init__( target_deb_arch, debug, work_dir=work_dir, - architectures=self.info.architectures if self.info else None + architectures=self.info.architectures if self.info else None, ) self._is_managed_host = is_managed_host diff --git a/snapcraft_legacy/project/_project_options.py b/snapcraft_legacy/project/_project_options.py index a00f9bb92d..a83aac0491 100644 --- a/snapcraft_legacy/project/_project_options.py +++ b/snapcraft_legacy/project/_project_options.py @@ -364,9 +364,8 @@ def __init__( debug=False, *, work_dir: str = None, - architectures = None, + architectures=None, ) -> None: - # Here for backwards compatibility. project_dir = os.getcwd() if work_dir is None: diff --git a/snapcraft_legacy/project/errors.py b/snapcraft_legacy/project/errors.py index 0e98f73ba9..8cba9a2863 100644 --- a/snapcraft_legacy/project/errors.py +++ b/snapcraft_legacy/project/errors.py @@ -23,7 +23,6 @@ class MissingSnapcraftYamlError(SnapcraftError): - fmt = ( "Could not find {snapcraft_yaml_file_path}. Are you sure you are " "in the right directory?\n" @@ -35,7 +34,6 @@ def __init__(self, *, snapcraft_yaml_file_path): class DuplicateSnapcraftYamlError(SnapcraftError): - fmt = ( "Found a {snapcraft_yaml_file_path!r} and a " "{other_snapcraft_yaml_file_path!r}.\n" diff --git a/snapcraft_legacy/scripts/generate_reference.py b/snapcraft_legacy/scripts/generate_reference.py index 7cb4f055c1..73c7d95d26 100755 --- a/snapcraft_legacy/scripts/generate_reference.py +++ b/snapcraft_legacy/scripts/generate_reference.py @@ -47,9 +47,9 @@ def __init__(self, output_file): self.topics = [] self.plugins = [] self.output_file = output_file - assert os.path.isdir( - os.path.dirname(self.output_file) - ), "Directory {} does not exist.".format(os.path.dirname(self.output_file)) + assert os.path.isdir(os.path.dirname(self.output_file)), ( + "Directory {} does not exist.".format(os.path.dirname(self.output_file)) + ) self._read() self._write() @@ -81,9 +81,7 @@ def _write(self): reference_text += """ ### Topic: {} -{}""".format( - entry[0].title(), entry[1].replace("# ", "#### ") - ) +{}""".format(entry[0].title(), entry[1].replace("# ", "#### ")) reference_text += """ ## snapcraft's Plugins @@ -95,9 +93,7 @@ def _write(self): reference_text += """ ### The {} plugin -{}""".format( - entry[0], entry[1] - ) +{}""".format(entry[0], entry[1]) with open(os.path.join(self.output_file), "w") as f: f.write(str(reference_text)) diff --git a/snapcraft_legacy/shell_utils.py b/snapcraft_legacy/shell_utils.py index 3fc7ea0016..78194caf57 100644 --- a/snapcraft_legacy/shell_utils.py +++ b/snapcraft_legacy/shell_utils.py @@ -16,7 +16,6 @@ """Utilities to run inside a correct snapcrafting environment.""" - import tempfile from snapcraft_legacy.internal import common diff --git a/snapcraft_legacy/storeapi/_snap_api.py b/snapcraft_legacy/storeapi/_snap_api.py index 0e24458efc..23613603ab 100644 --- a/snapcraft_legacy/storeapi/_snap_api.py +++ b/snapcraft_legacy/storeapi/_snap_api.py @@ -85,9 +85,9 @@ def get_info(self, snap_name: str, *, arch: str = None) -> SnapInfo: ) params = dict() - params[ - "fields" - ] = "channel-map,snap-id,name,publisher,confinement,revision,download" + params["fields"] = ( + "channel-map,snap-id,name,publisher,confinement,revision,download" + ) if arch is not None: params["architecture"] = arch logger.debug("Getting information for {}".format(snap_name)) diff --git a/snapcraft_legacy/storeapi/_status_tracker.py b/snapcraft_legacy/storeapi/_status_tracker.py index f3384d19d4..886c360091 100644 --- a/snapcraft_legacy/storeapi/_status_tracker.py +++ b/snapcraft_legacy/storeapi/_status_tracker.py @@ -10,7 +10,6 @@ class StatusTracker: - __messages = { "being_processed": "Processing...", "ready_to_release": "Ready to release!", diff --git a/snapcraft_legacy/storeapi/errors.py b/snapcraft_legacy/storeapi/errors.py index 93b341ac7a..afb450ff1a 100644 --- a/snapcraft_legacy/storeapi/errors.py +++ b/snapcraft_legacy/storeapi/errors.py @@ -48,7 +48,6 @@ def __init__(self, **kwargs): class GeneralStoreError(StoreError): - fmt = "Store Error: {message}" def __init__(self, message, response=None): @@ -156,7 +155,6 @@ def get_resolution(self) -> str: class NoSnapIdError(StoreError): - fmt = ( "Failed to get snap ID for snap {snap_name!r}. This is an error in " "the store, please open a new topic in the 'store' category in the " @@ -172,7 +170,6 @@ class StoreDownloadError(StoreError): class DownloadNotFoundError(StoreDownloadError): - fmt = "Downloaded file not found {path!r}." def __init__(self, *, path: str) -> None: @@ -180,7 +177,6 @@ def __init__(self, *, path: str) -> None: class SHAMismatchError(StoreDownloadError): - fmt = ( "The SHA3-384 checksum for {path!r} was {calculated!r}: expected {expected!r}." ) @@ -190,7 +186,6 @@ def __init__(self, *, path: str, expected: str, calculated: str) -> None: class DeveloperAgreementSignError(StoreError): - fmt = ( "There was an error while signing developer agreement.\n" "Reason: {reason!r}\n" @@ -202,7 +197,6 @@ def __init__(self, response): class NeedTermsSignedError(StoreError): - fmt = ( "Developer Terms of Service agreement must be signed " "before continuing: {message}" @@ -213,7 +207,6 @@ def __init__(self, message): class StoreAccountInformationError(StoreError): - fmt = "Error fetching account information from store: {error}" def __init__(self, response): @@ -236,7 +229,6 @@ def __init__(self, response): class StoreKeyRegistrationError(StoreError): - fmt = "Key registration failed: {error}" def __init__(self, response): @@ -278,8 +270,7 @@ class StoreRegistrationError(StoreError): ) __FMT_RETRY_WAIT = ( - "You must wait {retry_after} seconds before trying to register " - "your next snap." + "You must wait {retry_after} seconds before trying to register your next snap." ) __FMT_INVALID = "{message}" @@ -338,11 +329,8 @@ def __str__(self): class StoreUpDownError(StoreError): - fmt = ( - "There was an error uploading the package.\n" - "Reason: {reason!r}\n" - "Text: {text!r}" + "There was an error uploading the package.\nReason: {reason!r}\nText: {text!r}" ) def __init__(self, response): @@ -350,7 +338,6 @@ def __init__(self, response): class StoreUploadError(StoreError): - __FMT_NOT_REGISTERED = ( "This snap is not registered. Register the snap and try again." ) @@ -385,7 +372,6 @@ def __init__(self, snap_name, response): class StoreReviewError(StoreError): - __FMT_NEED_MANUAL_REVIEW = ( "The Store automatic review failed.\n" "A human will soon review your snap, but if you can't wait please " @@ -426,7 +412,6 @@ def __init__(self, result): class StoreReleaseError(StoreError): - fmt = "{message}" __FMT_NOT_REGISTERED = ( @@ -508,7 +493,6 @@ def __fmt_error_unknown(self, response): class StoreMetadataError(StoreError): - __FMT_NOT_FOUND = ( "Sorry, updating the information in the store has failed, first run " "`snapcraft register {snap_name}` and then " @@ -559,7 +543,6 @@ def __init__(self, snap_name, response, metadata): class StoreValidationError(StoreError): - fmt = "Received error {status_code!r}: {text!r}" def __init__(self, snap_id, response, message=None): @@ -577,7 +560,6 @@ def __init__(self, snap_id, response, message=None): class StoreValidationSetsError(StoreError): - fmt = "Issues encountered with validation set: {error}" def __init__(self, response): @@ -596,7 +578,6 @@ def __init__(self, response): class StoreSnapBuildError(StoreError): - fmt = "Could not assert build: {error}" def __init__(self, response): @@ -614,7 +595,6 @@ def __init__(self, response): class StoreSnapRevisionsError(StoreError): - fmt = ( "Error fetching revisions of snap id {snap_id!r} for {arch!r} " "in {series!r} series: {error}." @@ -641,7 +621,6 @@ def __init__(self, response, snap_id, series, arch): class StoreDeltaApplicationError(StoreError): - fmt = "{message}" def __init__(self, message): @@ -742,7 +721,6 @@ def get_resolution(self) -> str: class StoreSnapStatusError(StoreSnapRevisionsError): - fmt = ( "Error fetching status of snap id {snap_id!r} for {arch!r} " "in {series!r} series: {error}." @@ -750,7 +728,6 @@ class StoreSnapStatusError(StoreSnapRevisionsError): class StoreChannelClosingError(StoreError): - fmt = "Could not close channel: {error}" def __init__(self, response): @@ -764,7 +741,6 @@ def __init__(self, response): class StoreChannelClosingPermissionError(StoreError): - fmt = ( "Your account lacks permission to close channels for this snap. Make " "sure the logged in account has upload permissions on {snap_name!r} " @@ -776,7 +752,6 @@ def __init__(self, snap_name, snap_series): class StoreBuildAssertionPermissionError(StoreError): - fmt = ( "Your account lacks permission to assert builds for this snap. Make " "sure you are logged in as the publisher of {snap_name!r} " @@ -788,12 +763,10 @@ def __init__(self, snap_name, snap_series): class StoreAssertionError(StoreError): - fmt = "Error signing {endpoint} assertion for {snap_name}: {error!s}" class KeyAlreadyExistsError(StoreError): - fmt = "The key {key_name!r} already exists" def __init__(self, key_name): @@ -801,7 +774,6 @@ def __init__(self, key_name): class KeyAlreadyRegisteredError(StoreError): - fmt = "You have already registered a key named {key_name!r}" def __init__(self, key_name): @@ -809,7 +781,6 @@ def __init__(self, key_name): class NoKeysError(StoreError): - fmt = ( "You have no usable keys.\nPlease create at least one key with " "`snapcraft create-key` for use with snap." @@ -817,7 +788,6 @@ class NoKeysError(StoreError): class NoSuchKeyError(StoreError): - fmt = ( "You have no usable key named {key_name!r}.\nSee the keys available " "in your system with `snapcraft keys`." @@ -828,7 +798,6 @@ def __init__(self, key_name): class KeyNotRegisteredError(StoreError): - fmt = ( "The key {key_name!r} is not registered in the Store.\nPlease " "register it with `snapcraft register-key {key_name!r}` before " @@ -840,7 +809,6 @@ def __init__(self, key_name): class InvalidValidationRequestsError(StoreError): - fmt = "Invalid validation requests (format must be name=revision): {requests}" def __init__(self, requests): @@ -849,7 +817,6 @@ def __init__(self, requests): class SignBuildAssertionError(StoreError): - fmt = "Failed to sign build assertion for {snap_name!r}" def __init__(self, snap_name): diff --git a/snapcraft_legacy/storeapi/v2/validation_sets.py b/snapcraft_legacy/storeapi/v2/validation_sets.py index 90f0545c79..bd85fb78ec 100644 --- a/snapcraft_legacy/storeapi/v2/validation_sets.py +++ b/snapcraft_legacy/storeapi/v2/validation_sets.py @@ -35,7 +35,7 @@ def cast_dict_scalars_to_strings(data: dict) -> dict[str, Any]: def _to_string( - data: dict | list | str | int | float | str | bool | None + data: dict | list | str | int | float | str | bool | None, ) -> dict[str, Any] | list | str | None: """Recurse through nested dicts and lists and cast scalar values to strings. @@ -56,8 +56,10 @@ def _to_string( return data + Presence = Literal["required", "optional", "invalid"] + class Component(models.CraftBaseModel): """Represent a Component in a Validation Set.""" @@ -67,6 +69,7 @@ class Component(models.CraftBaseModel): revision: int | None = None """Component revision""" + class Snap(models.CraftBaseModel): """Represent a Snap in a Validation Set.""" @@ -85,11 +88,13 @@ class Snap(models.CraftBaseModel): components: dict[str, Presence | Component] | None = None """Snap components""" + class EditableBuildAssertion(models.CraftBaseModel): """Subset of a build assertion that can be edited by the user. https://dashboard.snapcraft.io/docs/reference/v2/en/validation-sets.html#request-json-schema """ + account_id: str """The "account-id" assertion header""" @@ -116,6 +121,7 @@ class BuildAssertion(EditableBuildAssertion): https://dashboard.snapcraft.io/docs/reference/v2/en/validation-sets.html#response-json-schema """ + authority_id: str """The "authority-id" assertion header""" @@ -145,6 +151,7 @@ def remove_sign_key(cls, values): class Headers(models.CraftBaseModel): """Assertion headers for a validation set.""" + headers: BuildAssertion """Assertion headers""" @@ -154,5 +161,6 @@ class ValidationSets(models.CraftBaseModel): https://dashboard.snapcraft.io/docs/reference/v2/en/validation-sets.html#id4 """ + assertions: list[Headers] """List of validation-set assertions""" diff --git a/snapcraft_legacy/yaml_utils/__init__.py b/snapcraft_legacy/yaml_utils/__init__.py index 42e49f4a35..6e8ac15535 100644 --- a/snapcraft_legacy/yaml_utils/__init__.py +++ b/snapcraft_legacy/yaml_utils/__init__.py @@ -89,7 +89,7 @@ def dump( data: Union[Dict[str, Any], yaml.YAMLObject], *, stream: Optional[TextIO] = None, - sort_keys=True + sort_keys=True, ) -> Optional[str]: """Safely dump YAML in ordered manner.""" return yaml.dump( diff --git a/snapcraft_legacy/yaml_utils/errors.py b/snapcraft_legacy/yaml_utils/errors.py index c3adb14954..683b48c4dc 100644 --- a/snapcraft_legacy/yaml_utils/errors.py +++ b/snapcraft_legacy/yaml_utils/errors.py @@ -28,7 +28,6 @@ class YamlValidationError(SnapcraftError): - fmt = "Issues while validating {source}: {message}" @classmethod diff --git a/spread.yaml b/spread.yaml index b7ac155b78..8d9a6b8027 100644 --- a/spread.yaml +++ b/spread.yaml @@ -94,7 +94,7 @@ backends: "if [ -d /etc/ssh/sshd_config.d/ ] then echo 'PasswordAuthentication yes' > /etc/ssh/sshd_config.d/10-custom.conf - echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config.d/10-custom.conf + echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config.d/10-custom.conf else sed -i /etc/ssh/sshd_config -E -e 's/^#?PasswordAuthentication.*/PasswordAuthentication yes/' -e 's/^#?PermitRootLogin.*/PermitRootLogin yes/' fi" @@ -183,172 +183,168 @@ restore-each: | "$TOOLS_DIR"/restore.sh suites: - tests/spread/core20/: - summary: core20 specific tests - systems: - - ubuntu-20.04* - - tests/spread/core22/: - summary: core22 specific tests - systems: - - ubuntu-22.04 - - ubuntu-22.04-64 - - ubuntu-22.04-amd64 - - ubuntu-22.04-arm64 - - ubuntu-22.04-armhf - - ubuntu-22.04-s390x - - ubuntu-22.04-ppc64el - environment: - SNAPCRAFT_BUILD_ENVIRONMENT: "" - - tests/spread/core22/environment/: - summary: core22 environment tests - systems: - - ubuntu-22.04* - - tests/spread/core22/scriptlets/: - summary: core22 scriptlet tests - systems: - - ubuntu-22.04* - - tests/spread/core22/manifest/: - summary: core22 manifest tests - systems: - - ubuntu-22.04* - - tests/spread/core22/architectures/: - summary: core22 architecture tests - systems: - - ubuntu-22.04 - - ubuntu-22.04-64 - - ubuntu-22.04-amd64 - - tests/spread/core22/linters/: - summary: core22 linter tests - environment: - SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: "n" - - systems: - - ubuntu-22.04* - - tests/spread/core22/patchelf/: - summary: core22 patchelf tests - systems: - - ubuntu-22.04* - - tests/spread/core24/: - summary: core24 specific tests - systems: - - ubuntu-24.04* - environment: - SNAPCRAFT_BUILD_ENVIRONMENT: "" - - tests/spread/core24-suites/environment/: - summary: core24 environment tests - systems: - - ubuntu-24.04* - - tests/spread/core24-suites/scriptlets/: - summary: core24 scriptlet tests - systems: - - ubuntu-24.04* - - tests/spread/core24-suites/manifest/: - summary: core24 manifest tests - systems: - - ubuntu-24.04* - - tests/spread/core24-suites/patchelf/: - summary: core24 patchelf tests - systems: - - ubuntu-24.04* - - # General, core suite - tests/spread/general/: - summary: tests of snapcraft core functionality - systems: - - ubuntu-20.04* - - ubuntu-22.04* - - tests/spread/general/hooks/: - summary: tests of snapcraft hook functionality - systems: - - ubuntu-20.04* - - ubuntu-22.04* - -# 'build-base: devel' fails due to an issue with the 24.10 buildd image (#4921) -# tests/spread/core-devel/: -# summary: tests of devel base snaps -# environment: -# SNAPCRAFT_BUILD_ENVIRONMENT: "" - - # General, core suite - tests/spread/cross-compile/: - summary: tests of supported cross-compile functionality - systems: - - ubuntu-20.04 - - ubuntu-20.04-64 - - ubuntu-20.04-amd64 - - # Use of multipass and lxd build providers - tests/spread/providers/: - summary: tests of snapcraft using build providers - systems: - - ubuntu-20.04-64 - - ubuntu-22.04-64 - kill-timeout: 180m - priority: 90 # Run this test relatively early since fetching images can take time - tests/spread/providers/legacy/: - summary: tests of snapcraft using build providers - systems: - - ubuntu-20.04-64 - kill-timeout: 180m - priority: 90 # Run this test relatively early since fetching images can take time - - # Plugin-specific suites - tests/spread/plugins/v2/: - summary: tests of snapcraft's v2 plugins - systems: - - ubuntu-20.04* - tests/spread/plugins/craft-parts/: - summary: tests of snapcraft's craft-part's based plugins - systems: - - ubuntu-22.04* - -# Extensions tests - tests/spread/extensions/: - summary: tests of snapcraft's extensions - kill-timeout: 20m - -# External snap tests - tests/spread/snaps/: - environment: - SNAPCRAFT_BUILD_ENVIRONMENT: "" - manual: true - summary: external snaps - prepare: | - sudo apt-get install git - sudo apt-mark auto git - - tests/spread/store/: - summary: tests of store-related snapcraft commands - manual: true - environment: - STORE_DASHBOARD_URL: https://dashboard.staging.snapcraft.io - STORE_API_URL: https://api.staging.snapcraft.io - STORE_UPLOAD_URL: https://storage.staging.snapcraftcontent.com - UBUNTU_ONE_SSO_URL: https://login.staging.ubuntu.com - - docs/howto/code/: - summary: tests how-to guides from the docs - systems: - - ubuntu-24.04-64 + tests/spread/core20/: + summary: core20 specific tests + systems: + - ubuntu-20.04* + + tests/spread/core22/: + summary: core22 specific tests + systems: + - ubuntu-22.04 + - ubuntu-22.04-64 + - ubuntu-22.04-amd64 + - ubuntu-22.04-arm64 + - ubuntu-22.04-armhf + - ubuntu-22.04-s390x + - ubuntu-22.04-ppc64el + environment: + SNAPCRAFT_BUILD_ENVIRONMENT: "" + + tests/spread/core22/environment/: + summary: core22 environment tests + systems: + - ubuntu-22.04* + + tests/spread/core22/scriptlets/: + summary: core22 scriptlet tests + systems: + - ubuntu-22.04* + + tests/spread/core22/manifest/: + summary: core22 manifest tests + systems: + - ubuntu-22.04* + + tests/spread/core22/architectures/: + summary: core22 architecture tests + systems: + - ubuntu-22.04 + - ubuntu-22.04-64 + - ubuntu-22.04-amd64 + + tests/spread/core22/linters/: + summary: core22 linter tests + environment: + SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: "n" + + systems: + - ubuntu-22.04* + tests/spread/core22/patchelf/: + summary: core22 patchelf tests + systems: + - ubuntu-22.04* + + tests/spread/core24/: + summary: core24 specific tests + systems: + - ubuntu-24.04* + environment: + SNAPCRAFT_BUILD_ENVIRONMENT: "" + + tests/spread/core24-suites/environment/: + summary: core24 environment tests + systems: + - ubuntu-24.04* + + tests/spread/core24-suites/scriptlets/: + summary: core24 scriptlet tests + systems: + - ubuntu-24.04* + + tests/spread/core24-suites/manifest/: + summary: core24 manifest tests + systems: + - ubuntu-24.04* + + tests/spread/core24-suites/patchelf/: + summary: core24 patchelf tests + systems: + - ubuntu-24.04* + + # General, core suite + tests/spread/general/: + summary: tests of snapcraft core functionality + systems: + - ubuntu-20.04* + - ubuntu-22.04* + + tests/spread/general/hooks/: + summary: tests of snapcraft hook functionality + systems: + - ubuntu-20.04* + - ubuntu-22.04* + + # 'build-base: devel' fails due to an issue with the 24.10 buildd image (#4921) + # tests/spread/core-devel/: + # summary: tests of devel base snaps + # environment: + # SNAPCRAFT_BUILD_ENVIRONMENT: "" + + # General, core suite + tests/spread/cross-compile/: + summary: tests of supported cross-compile functionality + systems: + - ubuntu-20.04 + - ubuntu-20.04-64 + - ubuntu-20.04-amd64 + + # Use of multipass and lxd build providers + tests/spread/providers/: + summary: tests of snapcraft using build providers + systems: + - ubuntu-20.04-64 + - ubuntu-22.04-64 + kill-timeout: 180m + priority: 90 # Run this test relatively early since fetching images can take time + tests/spread/providers/legacy/: + summary: tests of snapcraft using build providers + systems: + - ubuntu-20.04-64 + kill-timeout: 180m + priority: 90 # Run this test relatively early since fetching images can take time + + # Plugin-specific suites + tests/spread/plugins/v2/: + summary: tests of snapcraft's v2 plugins + systems: + - ubuntu-20.04* + tests/spread/plugins/craft-parts/: + summary: tests of snapcraft's craft-part's based plugins + systems: + - ubuntu-22.04* + + # Extensions tests + tests/spread/extensions/: + summary: tests of snapcraft's extensions + kill-timeout: 20m + + # External snap tests + tests/spread/snaps/: + environment: + SNAPCRAFT_BUILD_ENVIRONMENT: "" + manual: true + summary: external snaps + prepare: | + sudo apt-get install git + sudo apt-mark auto git + + tests/spread/store/: + summary: tests of store-related snapcraft commands + manual: true + environment: + STORE_DASHBOARD_URL: https://dashboard.staging.snapcraft.io + STORE_API_URL: https://api.staging.snapcraft.io + STORE_UPLOAD_URL: https://storage.staging.snapcraftcontent.com + UBUNTU_ONE_SSO_URL: https://login.staging.ubuntu.com + + docs/howto/code/: + summary: tests how-to guides from the docs + systems: + - ubuntu-24.04-64 path: /snapcraft/ include: - docs/ - tests/ - - requirements.txt - - requirements-devel.txt - - runtests.sh diff --git a/tests/legacy/unit/build_providers/test_snap.py b/tests/legacy/unit/build_providers/test_snap.py index 762ad15c88..91b563fbf6 100644 --- a/tests/legacy/unit/build_providers/test_snap.py +++ b/tests/legacy/unit/build_providers/test_snap.py @@ -20,6 +20,7 @@ from unittest.mock import ANY, call, patch import fixtures +import pytest from testtools.matchers import Contains, Equals, FileContains, Not from snapcraft_legacy.internal.build_providers._snap import ( @@ -280,6 +281,7 @@ def test_snapcraft_installed_on_host_aliased_from_store(self): ), ) + @pytest.mark.slow def test_snapcraft_installed_on_host_from_store_but_injection_disabled(self): self.useFixture(fixture_setup.FakeStore()) @@ -319,6 +321,7 @@ def test_snapcraft_installed_on_host_from_store_but_injection_disabled(self): ), ) + @pytest.mark.slow def test_snapcraft_installed_on_host_in_parallel_install_from_store(self): """Handle a parallel-installed snapcraft and install from the store.""" self.useFixture(fixture_setup.FakeStore()) @@ -479,6 +482,7 @@ def test_snapcraft_installed_on_host_in_parallel_inject_from_host(self): ), ) + @pytest.mark.slow def test_snapcraft_not_installed_on_host(self): self.useFixture(fixture_setup.FakeStore()) @@ -517,6 +521,7 @@ def test_snapcraft_not_installed_on_host(self): ), ) + @pytest.mark.slow def test_snapcraft_not_installed_on_host_with_channel_from_environment(self): self.useFixture(fixture_setup.FakeStore()) self.useFixture( @@ -560,6 +565,7 @@ def test_snapcraft_not_installed_on_host_with_channel_from_environment(self): ), ) + @pytest.mark.slow def test_no_registry(self): self.useFixture(fixture_setup.FakeStore()) @@ -651,6 +657,7 @@ def test_snapcraft_installed_on_host_from_store_rerun_is_nop(self): self.provider.run_mock.assert_not_called() + @pytest.mark.slow def test_snapcraft_installed_on_host_from_store_rerun_refreshes(self): self.useFixture(fixture_setup.FakeStore()) @@ -684,6 +691,7 @@ def test_snapcraft_installed_on_host_from_store_rerun_refreshes(self): ] ) + @pytest.mark.slow def test_snapd_not_on_host_installs_from_store(self): self.useFixture(fixture_setup.FakeStore()) diff --git a/tests/legacy/unit/commands/test_gated.py b/tests/legacy/unit/commands/test_gated.py index a7a355cfce..615f4e3801 100644 --- a/tests/legacy/unit/commands/test_gated.py +++ b/tests/legacy/unit/commands/test_gated.py @@ -16,6 +16,7 @@ import textwrap +import pytest from testtools.matchers import Contains, Equals import snapcraft_legacy.storeapi.errors @@ -25,6 +26,7 @@ account_info_data = {"snaps": {"16": {"core": {"snap-id": "good"}}}} +@pytest.mark.slow class GatedCommandTestCase(StoreCommandsBaseTestCase): def test_gated_unknown_snap(self): raised = self.assertRaises( diff --git a/tests/legacy/unit/commands/test_validate.py b/tests/legacy/unit/commands/test_validate.py index a968cad1ed..daa77f3021 100644 --- a/tests/legacy/unit/commands/test_validate.py +++ b/tests/legacy/unit/commands/test_validate.py @@ -16,6 +16,7 @@ from unittest import mock import fixtures +import pytest from testtools.matchers import Contains, Equals, FileExists import snapcraft_legacy.storeapi.errors @@ -23,6 +24,7 @@ from . import StoreCommandsBaseTestCase +@pytest.mark.slow class ValidateCommandTestCase(StoreCommandsBaseTestCase): def setUp(self): super().setUp() diff --git a/tests/legacy/unit/lifecycle/test_lifecycle.py b/tests/legacy/unit/lifecycle/test_lifecycle.py index 814c6a23a9..db58760503 100644 --- a/tests/legacy/unit/lifecycle/test_lifecycle.py +++ b/tests/legacy/unit/lifecycle/test_lifecycle.py @@ -21,6 +21,7 @@ from unittest import mock import fixtures +import pytest from testtools.matchers import ( Contains, DirExists, @@ -45,6 +46,7 @@ from . import LifecycleTestBase +@pytest.mark.slow class ExecutionTestCase(LifecycleTestBase): def test_replace_in_parts(self): class Options: @@ -409,6 +411,7 @@ def test_non_prime_and_no_version(self): lifecycle.execute(steps.PULL, project_config) +@pytest.mark.slow class CleanTestCase(LifecycleTestBase): def test_clean_removes_global_state(self): project_config = self.make_snapcraft_project( @@ -444,6 +447,7 @@ def test_clean_leaves_prime_alone_for_tried(self, mock_for_root): ) +@pytest.mark.slow class RecordSnapcraftYamlTestCase(LifecycleTestBase): def test_prime_without_build_info_does_not_record(self): self.useFixture(fixtures.EnvironmentVariable("SNAPCRAFT_BUILD_INFO", None)) diff --git a/tests/legacy/unit/lifecycle/test_status_cache.py b/tests/legacy/unit/lifecycle/test_status_cache.py index 01e7b4176e..af3794d79c 100644 --- a/tests/legacy/unit/lifecycle/test_status_cache.py +++ b/tests/legacy/unit/lifecycle/test_status_cache.py @@ -21,7 +21,9 @@ from . import LifecycleTestBase +import pytest +@pytest.mark.slow class StatusCacheTestCase(LifecycleTestBase): def setUp(self): super().setUp() diff --git a/tests/legacy/unit/meta/test_meta.py b/tests/legacy/unit/meta/test_meta.py index 766f74846e..f1065ea086 100644 --- a/tests/legacy/unit/meta/test_meta.py +++ b/tests/legacy/unit/meta/test_meta.py @@ -24,6 +24,7 @@ import fixtures import testtools +import pytest from testtools.matchers import ( Annotate, Contains, @@ -43,6 +44,7 @@ from tests.legacy import fixture_setup, unit +@pytest.mark.slow class CreateBaseTestCase(unit.TestCase): def setUp(self): super().setUp() @@ -414,6 +416,7 @@ def test_ambiguous_key_fails(self): ) self.assertThat(raised.keys, Equals("'confinement'")) + @pytest.mark.slow def test_app_ambiguous_key_fails(self): self.config_data["apps"] = { "foo": { @@ -438,6 +441,7 @@ def test_hook_ambiguous_key_fails(self): ) self.assertThat(raised.keys, Equals("'plugs'")) + @pytest.mark.slow def test_warn_once_only(self): fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(fake_logger) @@ -638,6 +642,7 @@ def setUp(self): class CreateMetadataFromSourceTestCase(CreateMetadataFromSourceBaseTestCase): + @pytest.mark.slow def test_create_metadata_with_missing_parse_info(self): del self.config_data["summary"] del self.config_data["parts"]["test-part"]["parse-info"] @@ -654,6 +659,7 @@ def test_create_metadata_with_wrong_adopt_info(self): ) self.assertThat(raised.part, Equals("wrong-part")) + @pytest.mark.slow def test_metadata_doesnt_overwrite_specified(self): fake_logger = fixtures.FakeLogger(level=logging.WARNING) self.useFixture(fake_logger) @@ -683,6 +689,7 @@ def _fake_extractor(file_path, workdir): ), ) + @pytest.mark.slow def test_metadata_with_unexisting_icon(self): def _fake_extractor(file_path, workdir): return extractors.ExtractedMetadata( @@ -694,6 +701,7 @@ def _fake_extractor(file_path, workdir): # The meta generation should just ignore the dead path, and not fail. self.generate_meta_yaml(build=True) + @pytest.mark.slow def test_metadata_satisfies_required_property(self): del self.config_data["summary"] @@ -711,6 +719,7 @@ def _fake_extractor(file_path, workdir): self.assertThat(y["summary"], Equals("extracted summary")) self.assertThat(y["description"], Equals(self.config_data["description"])) + @pytest.mark.slow def test_metadata_not_all_properties_satisfied(self): del self.config_data["summary"] del self.config_data["description"] @@ -813,6 +822,7 @@ def test_local_is_not_copied_to_snap_with_build_aux(self): self.assert_create_meta_with_hook("build-aux/snap") +@pytest.mark.slow class MetadataFromSourceWithIconFileTestCase(CreateMetadataFromSourceBaseTestCase): def assert_no_overwrite(self, snapcraft_assets_dir, directory, file_name): os.makedirs(directory) @@ -855,6 +865,7 @@ def test_build_aux_gui_png(self): self.assert_no_overwrite("build-aux/snap", "build-aux/snap/gui", "icon.png") +@pytest.mark.slow class MetadataFromSourceWithDesktopFileTestCase(CreateMetadataFromSourceBaseTestCase): def assert_no_overwrite(self, snapcraft_assets_dir, directory): os.makedirs(directory) @@ -892,6 +903,7 @@ def test_build_aux_gui(self): self.assert_no_overwrite("build-aux/snap", "build-aux/snap/gui") +@pytest.mark.slow class ScriptletsMetadataTestCase(CreateMetadataFromSourceBaseTestCase): def assert_scriptlets_satisfy_required_property( self, keyword, original, value, setter diff --git a/tests/legacy/unit/pluginhandler/test_clean.py b/tests/legacy/unit/pluginhandler/test_clean.py index f65a8f23c7..74fc710c6f 100644 --- a/tests/legacy/unit/pluginhandler/test_clean.py +++ b/tests/legacy/unit/pluginhandler/test_clean.py @@ -16,6 +16,7 @@ import pathlib from unittest.mock import MagicMock, call, patch +import pytest from testtools.matchers import Equals from snapcraft_legacy import file_utils @@ -73,6 +74,7 @@ def test_clean_part_remaining_parts(self, mock_listdir, mock_rmdir, mock_is_clea mock_listdir.assert_called_once_with(partdir) self.assertFalse(mock_rmdir.called) + @pytest.mark.slow def test_clean_prime_multiple_independent_parts(self): # Create part1 and get it through the "build" step. handler1 = self.load_part("part1") @@ -123,6 +125,7 @@ def test_clean_prime_multiple_independent_parts(self): "Expected part2's primeped files to be untouched", ) + @pytest.mark.slow def test_clean_prime_after_fileset_change(self): # Create part1 and get it through the "build" step. handler = self.load_part("part1") @@ -188,6 +191,7 @@ def test_clean_prime_old_prime_state(self): self.assertThat(raised.step, Equals(steps.PRIME)) self.assertTrue(os.path.isfile(primed_file)) + @pytest.mark.slow def test_clean_stage_multiple_independent_parts(self): # Create part1 and get it through the "build" step. handler1 = self.load_part("part1") @@ -299,6 +303,7 @@ def test_clean_stage_old_stage_state(self): self.assertTrue(os.path.isfile(staged_file)) +@pytest.mark.slow class TestCleanPrime: scenarios = [ ("all", {"fileset": ["*"]}), diff --git a/tests/legacy/unit/pluginhandler/test_pluginhandler.py b/tests/legacy/unit/pluginhandler/test_pluginhandler.py index d65989f191..7b0bcb0815 100644 --- a/tests/legacy/unit/pluginhandler/test_pluginhandler.py +++ b/tests/legacy/unit/pluginhandler/test_pluginhandler.py @@ -789,6 +789,7 @@ def test_organize( ) +@pytest.mark.slow class RealStageTestCase(unit.TestCase): def setUp(self): super().setUp() @@ -1435,6 +1436,7 @@ def test_get_excludes(self): class SourcesTestCase(unit.TestCase): + @pytest.mark.slow def test_do_not_follow_links(self): properties = dict(source=".") handler = self.load_part("test-part", part_properties=properties) diff --git a/tests/legacy/unit/pluginhandler/test_scriptlets.py b/tests/legacy/unit/pluginhandler/test_scriptlets.py index a166dd7f4e..f266d46798 100644 --- a/tests/legacy/unit/pluginhandler/test_scriptlets.py +++ b/tests/legacy/unit/pluginhandler/test_scriptlets.py @@ -21,6 +21,7 @@ from unittest import mock import fixtures +import pytest import testtools from testscenarios.scenarios import multiply_scenarios from testtools.matchers import Equals @@ -31,6 +32,8 @@ from tests.legacy.unit.commands import CommandBaseTestCase +pytestmark = [pytest.mark.slow] + class ScriptletCommandsTestCase(CommandBaseTestCase): def setUp(self): super().setUp() diff --git a/tests/legacy/unit/pluginhandler/test_state.py b/tests/legacy/unit/pluginhandler/test_state.py index 633a55b2d8..6fc9b7cf4b 100644 --- a/tests/legacy/unit/pluginhandler/test_state.py +++ b/tests/legacy/unit/pluginhandler/test_state.py @@ -19,6 +19,7 @@ from unittest.mock import call, patch import fixtures +import pytest from testtools.matchers import Contains, Equals from snapcraft_legacy import extractors @@ -313,6 +314,7 @@ def _fake_extractor(file_path, workdir): files, Equals([os.path.join(self.handler.part_build_dir, "metadata-file")]) ) + @pytest.mark.slow def test_build_state_with_scriptlet_metadata(self): self.handler = self.load_part( "test_part", @@ -385,6 +387,7 @@ def test_stage_state(self): self.assertTrue(type(state.project_options) is OrderedDict) self.assertThat(len(state.project_options), Equals(0)) + @pytest.mark.slow def test_stage_state_with_scriptlet_metadata(self): self.handler = self.load_part( "test_part", @@ -532,6 +535,7 @@ def test_clean_stage_old_state(self): self.assertThat(raised.step, Equals(steps.STAGE)) + @pytest.mark.slow @patch("shutil.copy") def test_prime_state(self, mock_copy): self.assertRaises(errors.NoLatestStepError, self.handler.latest_step) @@ -571,6 +575,7 @@ def test_prime_state(self, mock_copy): self.assertTrue(type(state.project_options) is OrderedDict) self.assertThat(len(state.project_options), Equals(0)) + @pytest.mark.slow def test_prime_state_with_scriptlet_metadata(self): self.handler = self.load_part( "test_part", @@ -608,6 +613,7 @@ def test_prime_state_with_scriptlet_metadata(self): metadata = state.scriptlet_metadata self.assertThat(metadata.get_version(), Equals("override-version")) + @pytest.mark.slow @patch("shutil.copy") def test_prime_state_with_stuff_already_primed(self, mock_copy): self.assertRaises(errors.NoLatestStepError, self.handler.latest_step) @@ -650,6 +656,7 @@ def test_prime_state_with_stuff_already_primed(self, mock_copy): self.assertTrue(type(state.project_options) is OrderedDict) self.assertThat(len(state.project_options), Equals(0)) + @pytest.mark.slow @patch("snapcraft_legacy.internal.elf.ElfFile._extract_attributes") @patch("snapcraft_legacy.internal.elf.ElfFile.load_dependencies") @patch("snapcraft_legacy.internal.pluginhandler._migrate_files") @@ -721,6 +728,7 @@ def test_prime_state_with_dependencies( self.assertTrue(type(state.project_options) is OrderedDict) self.assertThat(len(state.project_options), Equals(0)) + @pytest.mark.slow @patch("snapcraft_legacy.internal.elf.ElfFile._extract_attributes") @patch("snapcraft_legacy.internal.elf.ElfFile.load_dependencies") @patch("snapcraft_legacy.internal.pluginhandler._migrate_files") @@ -779,6 +787,7 @@ def test_prime_state_missing_libraries( # The rest should be considered missing. self.assertThat(state.dependency_paths, Equals({"lib3"})) + @pytest.mark.slow @patch("snapcraft_legacy.internal.elf.ElfFile._extract_attributes") @patch("snapcraft_legacy.internal.elf.ElfFile.load_dependencies") @patch("snapcraft_legacy.internal.pluginhandler._migrate_files") @@ -825,6 +834,7 @@ def test_prime_state_with_shadowed_dependencies( self.assertTrue(type(state) is states.PrimeState) self.assertThat(state.dependency_paths, Equals({"foo/bar"})) + @pytest.mark.slow @patch("shutil.copy") def test_prime_state_with_prime_keyword(self, mock_copy): self.handler = self.load_part("test_part", part_properties={"prime": ["bin/1"]}) diff --git a/tests/legacy/unit/sources/test_git.py b/tests/legacy/unit/sources/test_git.py index dc1753f1ca..221b71fb2d 100644 --- a/tests/legacy/unit/sources/test_git.py +++ b/tests/legacy/unit/sources/test_git.py @@ -20,6 +20,7 @@ from unittest import mock import fixtures +import pytest from testtools.matchers import Equals from snapcraft_legacy.internal import sources @@ -652,6 +653,7 @@ def check_file_contents(self, path, expected): self.assertThat(body, Equals(expected)) +@pytest.mark.slow class TestGitConflicts(GitBaseTestCase): """Test that git pull errors don't kill the parser""" @@ -773,6 +775,7 @@ def test_git_submodules(self): ) +@pytest.mark.slow class GitDetailsTestCase(GitBaseTestCase): def setUp(self): def _add_and_commit_file(filename, content=None, message=None): diff --git a/tests/legacy/unit/store/test_store_client.py b/tests/legacy/unit/store/test_store_client.py index 3309bf13bf..2bfe0b7493 100644 --- a/tests/legacy/unit/store/test_store_client.py +++ b/tests/legacy/unit/store/test_store_client.py @@ -48,6 +48,7 @@ def setUp(self): self.client.login(email="dummy", password="test correct password", ttl=2) +@pytest.mark.slow class DownloadTestCase(StoreTestCase): # sha3-384 of tests/data/test-snap.snap EXPECTED_SHA3_384 = "" @@ -153,6 +154,7 @@ def test_download_with_hash_mismatch_raises_exception(self): ) +@pytest.mark.slow class PushSnapBuildTestCase(StoreTestCase): def test_push_snap_build_invalid_data(self): raised = self.assertRaises( @@ -171,6 +173,7 @@ def test_push_snap_build_successfully(self): self.client.push_snap_build("snap-id", "dummy") +@pytest.mark.slow class GetAccountInformationTestCase(StoreTestCase): def test_get_account_information_successfully(self): self.assertThat( @@ -242,6 +245,7 @@ def test_get_account_information_successfully(self): ) +@pytest.mark.slow class RegisterKeyTestCase(StoreTestCase): def test_register_key_successfully(self): # No exception will be raised if this is successful. @@ -269,6 +273,7 @@ def test_invalid_data(self): ) +@pytest.mark.slow class RegisterTestCase(StoreTestCase): def test_register_name_successfully(self): # No exception will be raised if this is successful @@ -374,6 +379,7 @@ def test_unhandled_registration_error_path(self): ) +@pytest.mark.slow class ValidationSetsTestCase(StoreTestCase): def setUp(self): super().setUp() @@ -534,6 +540,7 @@ def test_get_invalid_sequence(self): ) +@pytest.mark.slow class ValidationsTestCase(StoreTestCase): def setUp(self): super().setUp() @@ -618,6 +625,7 @@ def test_push_bad_response(self): self.assertIn("Invalid response from the server", self.fake_logger.output) +@pytest.mark.slow class ReleaseTest(StoreTestCase): def test_release_snap(self): channel_map = self.client.release("test-snap", "19", ["beta"]) @@ -689,6 +697,7 @@ def test_release_to_curly_braced_channel(self): ) +@pytest.mark.slow class GetSnapStatusTestCase(StoreTestCase): def setUp(self): super().setUp() @@ -799,6 +808,7 @@ def test_get_snap_status_no_id(self): self.assertThat(e.snap_name, Equals("no-id")) +@pytest.mark.slow class SnapsMetricsTest(StoreTestCase): def test_get_metrics(self): mf = metrics.MetricsFilter( @@ -868,6 +878,7 @@ def test_get_metrics_unmarshal_error(self): ) +@pytest.mark.slow class WhoAmITest(StoreTestCase): def test_whoami(self): self.assertThat( @@ -876,6 +887,7 @@ def test_whoami(self): ) +@pytest.mark.slow class SignDeveloperAgreementTestCase(StoreTestCase): def test_sign_dev_agreement_success(self): response = { @@ -904,6 +916,7 @@ def test_sign_dev_agreement_exception(self): ) +@pytest.mark.slow class UploadMetadataTestCase(StoreTestCase): def setUp(self): super().setUp() @@ -1003,6 +1016,7 @@ def test_braces_in_error_messages_are_literals(self): self.assertThat(str(raised), Equals(dedent(should).strip())) +@pytest.mark.slow class UploadBinaryMetadataTestCase(StoreTestCase): def setUp(self): super().setUp() @@ -1091,6 +1105,7 @@ def test_braces_in_error_messages_are_literals(self): self.assertThat(str(raised), Equals(dedent(should).strip())) +@pytest.mark.slow class SnapNotFoundTestCase(StoreTestCase): def _setup_snap(self): """Login, register and upload a snap. diff --git a/tests/spread/core-devel/basic/snap/snapcraft.yaml b/tests/spread/core-devel/basic/snap/snapcraft.yaml index 0616761408..695afc0b72 100644 --- a/tests/spread/core-devel/basic/snap/snapcraft.yaml +++ b/tests/spread/core-devel/basic/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: build-base-devel -version: '1.0' +version: "1.0" summary: build-base-devel description: Build a base snap with a build-base of devel confinement: strict @@ -13,4 +13,4 @@ grade: devel parts: build-base-devel: plugin: nil - stage-packages: [base-files] \ No newline at end of file + stage-packages: [base-files] diff --git a/tests/spread/core22/clean/snaps/clean-with-long-name/snap/snapcraft.yaml b/tests/spread/core22/clean/snaps/clean-with-long-name/snap/snapcraft.yaml index 41d9714960..5a0b806e5d 100644 --- a/tests/spread/core22/clean/snaps/clean-with-long-name/snap/snapcraft.yaml +++ b/tests/spread/core22/clean/snaps/clean-with-long-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: clean-i-am-40-characters-long-xxxxxxxxxx -version: '1.0' +version: "1.0" summary: test description: test grade: stable diff --git a/tests/spread/core22/clean/snaps/clean/snap/snapcraft.yaml b/tests/spread/core22/clean/snaps/clean/snap/snapcraft.yaml index 028287c079..6529845c88 100644 --- a/tests/spread/core22/clean/snaps/clean/snap/snapcraft.yaml +++ b/tests/spread/core22/clean/snaps/clean/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: clean -version: '1.0' +version: "1.0" summary: test description: test grade: stable diff --git a/tests/spread/core22/clean/task.yaml b/tests/spread/core22/clean/task.yaml index a5d3600c45..577a3d690e 100644 --- a/tests/spread/core22/clean/task.yaml +++ b/tests/spread/core22/clean/task.yaml @@ -59,4 +59,4 @@ execute: | snapcraft clean --destructive-mode - test ! -d parts && test ! -d stage && test ! -d prime + test ! -d parts && test ! -d stage && test ! -d prime diff --git a/tests/spread/core22/components/expected-component.yaml b/tests/spread/core22/components/expected-component.yaml index eb411fb64b..7f72c1a09b 100644 --- a/tests/spread/core22/components/expected-component.yaml +++ b/tests/spread/core22/components/expected-component.yaml @@ -1,6 +1,6 @@ component: hello-components+share type: test -version: '1.0' +version: "1.0" summary: Hello World description: Hello World provenance: test-provenance diff --git a/tests/spread/core22/components/expected-snap.yaml b/tests/spread/core22/components/expected-snap.yaml index 0b4c53d969..b8c9979d17 100644 --- a/tests/spread/core22/components/expected-snap.yaml +++ b/tests/spread/core22/components/expected-snap.yaml @@ -1,9 +1,9 @@ name: hello-components -version: '1.0' +version: "1.0" summary: Build a snap with components description: Build a snap with components architectures: -- amd64 + - amd64 base: core22 apps: hello: @@ -22,5 +22,5 @@ components: hooks: install: plugs: - - home - - network + - home + - network diff --git a/tests/spread/core22/components/task.yaml b/tests/spread/core22/components/task.yaml index c4b613034c..c8b79e78ce 100644 --- a/tests/spread/core22/components/task.yaml +++ b/tests/spread/core22/components/task.yaml @@ -38,7 +38,7 @@ execute: | echo "Expected 'other-file-in-component' not to be in the 'share' component" exit 1 fi - + component_meta_dir="component-contents/meta" # assert component metadata diff --git a/tests/spread/core22/craftctl/test-craftctl-default/snap/snapcraft.yaml b/tests/spread/core22/craftctl/test-craftctl-default/snap/snapcraft.yaml index 1dbb998f5d..ebe4a89fa8 100644 --- a/tests/spread/core22/craftctl/test-craftctl-default/snap/snapcraft.yaml +++ b/tests/spread/core22/craftctl/test-craftctl-default/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: craftctl-default -version: '1.0' +version: "1.0" summary: test description: test grade: stable diff --git a/tests/spread/core22/environment/snaps/paths-all-null/expected_snap.yaml b/tests/spread/core22/environment/snaps/paths-all-null/expected_snap.yaml index 9836d5293c..6a34c85016 100644 --- a/tests/spread/core22/environment/snaps/paths-all-null/expected_snap.yaml +++ b/tests/spread/core22/environment/snaps/paths-all-null/expected_snap.yaml @@ -1,5 +1,5 @@ name: paths-all-null -version: '1' +version: "1" summary: test description: | Setting PATH and LD_LIBRARY_PATH to null and @@ -7,7 +7,7 @@ description: | cause the environment field to not be included in the resulting snap.yaml. architectures: -- amd64 + - amd64 base: core22 apps: paths-all-null: diff --git a/tests/spread/core22/environment/snaps/paths-one-null/expected_snap.yaml b/tests/spread/core22/environment/snaps/paths-one-null/expected_snap.yaml index 67f11d3ee2..679d637665 100644 --- a/tests/spread/core22/environment/snaps/paths-one-null/expected_snap.yaml +++ b/tests/spread/core22/environment/snaps/paths-one-null/expected_snap.yaml @@ -1,12 +1,12 @@ name: paths-one-null -version: '1' +version: "1" summary: test description: | Setting either LD_LIBRARY_PATH or PATH to null should cause that variable to be excluded, while other variables are still handled. architectures: -- amd64 + - amd64 base: core22 apps: paths-one-null: diff --git a/tests/spread/core22/environment/snaps/paths-user-defined/expected_snap.yaml b/tests/spread/core22/environment/snaps/paths-user-defined/expected_snap.yaml index 66d2ea911f..36d4882f3d 100644 --- a/tests/spread/core22/environment/snaps/paths-user-defined/expected_snap.yaml +++ b/tests/spread/core22/environment/snaps/paths-user-defined/expected_snap.yaml @@ -1,9 +1,9 @@ name: paths-user-defined -version: '1' +version: "1" summary: test description: Defining LD_LIBRARY_PATH or PATH should override default values. architectures: -- amd64 + - amd64 base: core22 apps: paths-user-defined: diff --git a/tests/spread/core22/environment/snaps/staged-common-library/expected_snap.yaml b/tests/spread/core22/environment/snaps/staged-common-library/expected_snap.yaml index 3eeded9b2c..f27e761163 100644 --- a/tests/spread/core22/environment/snaps/staged-common-library/expected_snap.yaml +++ b/tests/spread/core22/environment/snaps/staged-common-library/expected_snap.yaml @@ -1,11 +1,11 @@ name: staged-common-library -version: '1' +version: "1" summary: test description: | Staging a standard library causes common library paths to be included in the LD_LIBRARY_PATH environmental variable. architectures: -- amd64 + - amd64 base: core22 apps: staged-common-library: diff --git a/tests/spread/core22/linters/classic-libc/snap/snapcraft.yaml b/tests/spread/core22/linters/classic-libc/snap/snapcraft.yaml index ef0f51c893..901b9c6ed4 100644 --- a/tests/spread/core22/linters/classic-libc/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/classic-libc/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: classic-linter-test base: core22 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | This is my-snap's description. You have a paragraph or two to tell the diff --git a/tests/spread/core22/linters/classic/snap/snapcraft.yaml b/tests/spread/core22/linters/classic/snap/snapcraft.yaml index 7f27d0a407..4f922b35dc 100644 --- a/tests/spread/core22/linters/classic/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/classic/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: classic-linter-test base: core22 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | This is my-snap's description. You have a paragraph or two to tell the diff --git a/tests/spread/core22/linters/library-ignore-missing/snap/snapcraft.yaml b/tests/spread/core22/linters/library-ignore-missing/snap/snapcraft.yaml index 6a2c9c7eff..c236af657a 100644 --- a/tests/spread/core22/linters/library-ignore-missing/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library-ignore-missing/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: library-ignore-missing base: core22 -version: '0.1' +version: "0.1" summary: Ignore missing library linter issues description: spread test @@ -10,7 +10,7 @@ confinement: strict lint: ignore: - library: - - linter-test + - linter-test parts: my-part: @@ -19,5 +19,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core22/linters/library-ignore-unused/snap/snapcraft.yaml b/tests/spread/core22/linters/library-ignore-unused/snap/snapcraft.yaml index 8013ee01a3..df6e32b6ec 100644 --- a/tests/spread/core22/linters/library-ignore-unused/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library-ignore-unused/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: library-ignore-unused base: core22 -version: '0.1' +version: "0.1" summary: Ignore unused library linter issues description: spread test @@ -10,7 +10,7 @@ confinement: strict lint: ignore: - library: - - usr/lib/*/libpng16.so* + - usr/lib/*/libpng16.so* parts: my-part: @@ -18,5 +18,4 @@ parts: source: src stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c diff --git a/tests/spread/core22/linters/library-ignored-mixed/snap/snapcraft.yaml b/tests/spread/core22/linters/library-ignored-mixed/snap/snapcraft.yaml index 38c8b10f63..adec7e9233 100644 --- a/tests/spread/core22/linters/library-ignored-mixed/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library-ignored-mixed/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: library-ignore-mixed base: core22 -version: '0.1' +version: "0.1" summary: Ignore a mix of unused and missing library linter issues description: spread test @@ -10,9 +10,9 @@ confinement: strict lint: ignore: - unused-library: - - usr/lib/*/libpng16.so* + - usr/lib/*/libpng16.so* - missing-library: - - linter-test-missing + - linter-test-missing parts: unused-part: @@ -20,8 +20,7 @@ parts: source: src stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test-unused test_unused.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test-unused test_unused.c missing-part: plugin: nil @@ -29,6 +28,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test-missing test_missing.c -lcaca - + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test-missing test_missing.c -lcaca diff --git a/tests/spread/core22/linters/library-missing/snap/snapcraft.yaml b/tests/spread/core22/linters/library-missing/snap/snapcraft.yaml index 1685636072..f565898ad1 100644 --- a/tests/spread/core22/linters/library-missing/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library-missing/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: library-missing base: core22 -version: '0.1' +version: "0.1" summary: Raise linter warnings for missing libraries description: spread test @@ -14,5 +14,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core22/linters/library-unused/snap/snapcraft.yaml b/tests/spread/core22/linters/library-unused/snap/snapcraft.yaml index 8c5ada3d83..130ad40037 100644 --- a/tests/spread/core22/linters/library-unused/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library-unused/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: library-unused base: core22 -version: '0.1' +version: "0.1" summary: Raise linter warnings for unused libraries. description: spread test @@ -13,5 +13,4 @@ parts: source: src stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c diff --git a/tests/spread/core22/linters/library/snap/snapcraft.yaml b/tests/spread/core22/linters/library/snap/snapcraft.yaml index 25b624f8a5..824c421e6c 100644 --- a/tests/spread/core22/linters/library/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/library/snap/snapcraft.yaml @@ -46,7 +46,7 @@ parts: meson-deps: plugin: nil source: https://github.com/mesonbuild/meson.git - source-branch: '0.62' + source-branch: "0.62" override-build: | pip install . build-packages: @@ -63,9 +63,9 @@ parts: - usr/lib/*/libadwaita* gnome-calculator: - after: [ meson-deps ] + after: [meson-deps] source: https://gitlab.gnome.org/GNOME/gnome-calculator.git - source-branch: 'gnome-42' + source-branch: "gnome-42" plugin: meson meson-parameters: - --prefix=/snap/gnome-calculator/current/usr @@ -73,7 +73,7 @@ parts: - -Ddisable-introspection=true organize: snap/gnome-calculator/current/usr: usr - build-snaps: [ gnome-42-2204-sdk/latest/edge ] + build-snaps: [gnome-42-2204-sdk/latest/edge] build-packages: - libmpc-dev - libmpfr-dev diff --git a/tests/spread/core22/linters/lint-file/snapcraft.yaml b/tests/spread/core22/linters/lint-file/snapcraft.yaml index 4c45132562..25bb8ff62e 100644 --- a/tests/spread/core22/linters/lint-file/snapcraft.yaml +++ b/tests/spread/core22/linters/lint-file/snapcraft.yaml @@ -1,6 +1,6 @@ name: lint-file base: core22 -version: '0.1' +version: "0.1" summary: Lint a packaged snapcraft file. description: spread test @@ -16,5 +16,4 @@ parts: - libcaca-dev stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core22/linters/linter-ros2-humble-mixed/snap/snapcraft.yaml b/tests/spread/core22/linters/linter-ros2-humble-mixed/snap/snapcraft.yaml index d6c6de42d8..52b5539989 100644 --- a/tests/spread/core22/linters/linter-ros2-humble-mixed/snap/snapcraft.yaml +++ b/tests/spread/core22/linters/linter-ros2-humble-mixed/snap/snapcraft.yaml @@ -29,4 +29,4 @@ parts: lint: ignore: - unused-library: - - usr/lib/*/libpng16.so* \ No newline at end of file + - usr/lib/*/libpng16.so* diff --git a/tests/spread/core22/package-repo-archs/armhf.yaml b/tests/spread/core22/package-repo-archs/armhf.yaml index de3376e9ee..4a84f9f411 100644 --- a/tests/spread/core22/package-repo-archs/armhf.yaml +++ b/tests/spread/core22/package-repo-archs/armhf.yaml @@ -1,5 +1,5 @@ name: test-archs -version: '1.0' +version: "1.0" summary: test package repos with different architectures description: test package repos with different architectures grade: stable @@ -20,9 +20,9 @@ package-repositories: # Also add the armhf arch for the "ports" repo, to fetch python's deps. We # need to do this because the default archives don't have armhf. - type: apt - architectures: [ armhf ] - components: [ main ] - suites: [ jammy, jammy-security, jammy-updates ] + architectures: [armhf] + components: [main] + suites: [jammy, jammy-security, jammy-updates] key-id: F6ECB3762474EDA9D21B7022871920D1991BC93C url: http://ports.ubuntu.com/ubuntu-ports diff --git a/tests/spread/core22/package-repo-archs/i386.yaml b/tests/spread/core22/package-repo-archs/i386.yaml index b2e99953f4..f6e1326969 100644 --- a/tests/spread/core22/package-repo-archs/i386.yaml +++ b/tests/spread/core22/package-repo-archs/i386.yaml @@ -1,5 +1,5 @@ name: test-archs -version: '1.0' +version: "1.0" summary: test package repos with different architectures description: test package repos with different architectures grade: stable diff --git a/tests/spread/core22/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml index 5d1aa6e17c..1da17a90d9 100644 --- a/tests/spread/core22/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-fingerprint -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -15,8 +15,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-apt-key-name/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-apt-key-name/snap/snapcraft.yaml index 50627b4710..26ec727815 100644 --- a/tests/spread/core22/package-repositories/test-apt-key-name/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-apt-key-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-name -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -15,8 +15,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-apt-keyserver/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-apt-keyserver/snap/snapcraft.yaml index 60e22f1532..de20eab632 100644 --- a/tests/spread/core22/package-repositories/test-apt-keyserver/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-apt-keyserver/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-keyserver -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -15,8 +15,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-apt-path/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-apt-path/snap/snapcraft.yaml index f82ce23637..b407624f8c 100644 --- a/tests/spread/core22/package-repositories/test-apt-path/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-apt-path/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -10,7 +10,7 @@ parts: test-ppa: plugin: nil stage-packages: - - datacenter-gpu-manager + - datacenter-gpu-manager package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-apt-ppa/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-apt-ppa/snap/snapcraft.yaml index 1bbc9a7b32..a6450855e6 100644 --- a/tests/spread/core22/package-repositories/test-apt-ppa/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-apt-ppa/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -15,8 +15,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-multi-keys/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-multi-keys/snap/snapcraft.yaml index b5035779e3..f6c67e0175 100644 --- a/tests/spread/core22/package-repositories/test-multi-keys/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-multi-keys/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-multi-keys -version: '1.0' +version: "1.0" summary: test description: test installing a package repository with an asset file with multiple keys grade: stable @@ -16,8 +16,8 @@ parts: - puppet-tools-release # Comes from the Puppet repo apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/core22/package-repositories/test-pin/snap/snapcraft.yaml b/tests/spread/core22/package-repositories/test-pin/snap/snapcraft.yaml index 67ada22704..416a73b8fe 100644 --- a/tests/spread/core22/package-repositories/test-pin/snap/snapcraft.yaml +++ b/tests/spread/core22/package-repositories/test-pin/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-pin -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -26,5 +26,5 @@ package-repositories: priority: 999 apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa diff --git a/tests/spread/core22/packing/snap/snapcraft.yaml b/tests/spread/core22/packing/snap/snapcraft.yaml index 3222b1c8e5..c224faf4fb 100644 --- a/tests/spread/core22/packing/snap/snapcraft.yaml +++ b/tests/spread/core22/packing/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: my-snap-name -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap # 79 char long summary description: | This is my-snap's description. You have a paragraph or two to tell the @@ -7,7 +7,6 @@ description: | we live in tweetspace and your description wants to look good in the snap store. base: core22 - grade: devel confinement: devmode diff --git a/tests/spread/core22/packing/task.yaml b/tests/spread/core22/packing/task.yaml index ce2a7eaeae..97cb1d151f 100644 --- a/tests/spread/core22/packing/task.yaml +++ b/tests/spread/core22/packing/task.yaml @@ -32,7 +32,7 @@ execute: | if [[ "$SPREAD_VARIANT" =~ "pack_directory" ]]; then snapcraft prime --destructive-mode fi - + # shellcheck disable=SC2086 snapcraft $CMD --destructive-mode diff --git a/tests/spread/core22/patchelf/classic-patchelf/snap/snapcraft.yaml b/tests/spread/core22/patchelf/classic-patchelf/snap/snapcraft.yaml index deb5211e63..db09127d62 100644 --- a/tests/spread/core22/patchelf/classic-patchelf/snap/snapcraft.yaml +++ b/tests/spread/core22/patchelf/classic-patchelf/snap/snapcraft.yaml @@ -5,7 +5,6 @@ description: | Build a classic confined snap, mostly used to test the provisioning of `core` inside a snap. base: core22 - grade: devel confinement: classic diff --git a/tests/spread/core22/patchelf/strict-patchelf/snap/snapcraft.yaml b/tests/spread/core22/patchelf/strict-patchelf/snap/snapcraft.yaml index 7549c03004..4aecacd358 100644 --- a/tests/spread/core22/patchelf/strict-patchelf/snap/snapcraft.yaml +++ b/tests/spread/core22/patchelf/strict-patchelf/snap/snapcraft.yaml @@ -4,7 +4,6 @@ summary: Build a strictly confined snap description: | Build a strictly confined snap to test ELF patching base: core22 - grade: devel confinement: strict diff --git a/tests/spread/core22/patchelf/strict-patchelf/task.yaml b/tests/spread/core22/patchelf/strict-patchelf/task.yaml index eb6848f97d..31c785a726 100644 --- a/tests/spread/core22/patchelf/strict-patchelf/task.yaml +++ b/tests/spread/core22/patchelf/strict-patchelf/task.yaml @@ -44,4 +44,3 @@ execute: | # Verify binary rpath patching without existing rpath patchelf --print-interpreter prime/bin/hello-strict-enable-patchelf | MATCH "^/snap/$base/current/lib.*ld.*.so.*" patchelf --print-rpath prime/bin/hello-strict-enable-patchelf | MATCH "${RPATH_MATCH}" - diff --git a/tests/spread/core22/plugs-warn/snap/snapcraft.yaml b/tests/spread/core22/plugs-warn/snap/snapcraft.yaml index 20693a3635..2bde8faaa6 100644 --- a/tests/spread/core22/plugs-warn/snap/snapcraft.yaml +++ b/tests/spread/core22/plugs-warn/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: plugs-warn base: core22 -version: '0.1' +version: "0.1" summary: Check warnings for top-level enabling of slots and plugs description: Check warnings for top-level enabling of slots and plugs. diff --git a/tests/spread/core22/remote-build/task.yaml b/tests/spread/core22/remote-build/task.yaml index 6283eb800b..b182d5528c 100644 --- a/tests/spread/core22/remote-build/task.yaml +++ b/tests/spread/core22/remote-build/task.yaml @@ -53,7 +53,7 @@ execute: | if [[ -e "arguments.txt" ]]; then call_args=$(cat "arguments.txt") fi - + # shellcheck disable=SC2086 snapcraft remote-build --launchpad-accept-public-upload $call_args diff --git a/tests/spread/core22/remove-hook/snap/snapcraft.yaml b/tests/spread/core22/remove-hook/snap/snapcraft.yaml index 8273a13dd1..5c6d1f8a56 100644 --- a/tests/spread/core22/remove-hook/snap/snapcraft.yaml +++ b/tests/spread/core22/remove-hook/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: remove-hook base: core22 -version: '1.0' -summary: 'remove-hook' +version: "1.0" +summary: "remove-hook" description: Verify remove hook works. grade: stable confinement: strict diff --git a/tests/spread/core22/root-packages/task.yaml b/tests/spread/core22/root-packages/task.yaml index e7a70ec967..621312cc13 100644 --- a/tests/spread/core22/root-packages/task.yaml +++ b/tests/spread/core22/root-packages/task.yaml @@ -10,7 +10,7 @@ execute: | echo hello snap was not installed exit 1 fi - + if ! dpkg -V hello; then echo hello deb was not installed exit 1 diff --git a/tests/spread/core22/scriptlets/empty-overrides/snap/snapcraft.yaml b/tests/spread/core22/scriptlets/empty-overrides/snap/snapcraft.yaml index cfe8f68763..61111761af 100644 --- a/tests/spread/core22/scriptlets/empty-overrides/snap/snapcraft.yaml +++ b/tests/spread/core22/scriptlets/empty-overrides/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: test-snap base: core22 -version: '0.1' +version: "0.1" summary: test snap description: test snap grade: stable @@ -9,4 +9,4 @@ parts: test-part: plugin: nil override-build: touch $CRAFT_PART_INSTALL/foo.bar - override-prime: '' + override-prime: "" diff --git a/tests/spread/core22/scriptlets/scriptlet-failures/snap/snapcraft.yaml b/tests/spread/core22/scriptlets/scriptlet-failures/snap/snapcraft.yaml index bec55a0e4d..d7ecbe3cd5 100644 --- a/tests/spread/core22/scriptlets/scriptlet-failures/snap/snapcraft.yaml +++ b/tests/spread/core22/scriptlets/scriptlet-failures/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: craftctl-build-failure base: core22 -version: '0.1' +version: "0.1" summary: Fail on snapcraftctl build description: | Failing with purpose. diff --git a/tests/spread/core22/set-version-twice/modified-snapcraft.yaml b/tests/spread/core22/set-version-twice/modified-snapcraft.yaml index c002a7f939..6b19a66ce9 100644 --- a/tests/spread/core22/set-version-twice/modified-snapcraft.yaml +++ b/tests/spread/core22/set-version-twice/modified-snapcraft.yaml @@ -1,13 +1,12 @@ name: test-set-version-twice base: core22 -version: '0.1' +version: "0.1" summary: Test fix for set version and out of order step execution description: | As described in https://bugs.launchpad.net/snapcraft/+bug/1831135/comments/10, a bug in craft-parts caused unexpected double setting of project variables such as `version`. Make sure this scenario builds correctly. adopt-info: part1 - grade: devel confinement: devmode diff --git a/tests/spread/core22/set-version-twice/original-snapcraft.yaml b/tests/spread/core22/set-version-twice/original-snapcraft.yaml index 48af83e031..7236dfe7ae 100644 --- a/tests/spread/core22/set-version-twice/original-snapcraft.yaml +++ b/tests/spread/core22/set-version-twice/original-snapcraft.yaml @@ -1,13 +1,12 @@ name: test-set-version-twice base: core22 -version: '0.1' +version: "0.1" summary: Test fix for set version and out of order step execution description: | As described in https://bugs.launchpad.net/snapcraft/+bug/1831135/comments/10, a bug in craft-parts caused unexpected double setting of project variables such as `version`. Make sure this scenario builds correctly. adopt-info: part1 - grade: devel confinement: devmode diff --git a/tests/spread/core22/snap-creation/package-cutoff/snap/snapcraft.yaml b/tests/spread/core22/snap-creation/package-cutoff/snap/snapcraft.yaml index 6068e88b11..18f09a4497 100644 --- a/tests/spread/core22/snap-creation/package-cutoff/snap/snapcraft.yaml +++ b/tests/spread/core22/snap-creation/package-cutoff/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: package-cutoff base: core22 -version: '1.0' -summary: 'test' +version: "1.0" +summary: "test" description: test grade: devel confinement: devmode diff --git a/tests/spread/core22/try/snapcraft.yaml b/tests/spread/core22/try/snapcraft.yaml index 6eef9a1c72..63e2ee883d 100644 --- a/tests/spread/core22/try/snapcraft.yaml +++ b/tests/spread/core22/try/snapcraft.yaml @@ -1,6 +1,6 @@ name: hello-try base: core22 -version: '0.1' +version: "0.1" summary: snapcraft try spread test description: snapcraft try spread test diff --git a/tests/spread/core22/try/task.yaml b/tests/spread/core22/try/task.yaml index 8c94bb5967..2aadbceafc 100644 --- a/tests/spread/core22/try/task.yaml +++ b/tests/spread/core22/try/task.yaml @@ -5,15 +5,15 @@ execute: | # when trying to write to it from the instance. mkdir prime chmod a+w prime - + # Prime first to regression test snapcore/snapcraft#4219 snapcraft prime # Followed by the actual try snapcraft try - + find prime/meta/snap.yaml find prime/usr/bin/hello - + snap try prime hello-try | MATCH "Hello, world" snap remove hello-try diff --git a/tests/spread/core24-suites/environment/snaps/paths-all-null/expected_snap.yaml b/tests/spread/core24-suites/environment/snaps/paths-all-null/expected_snap.yaml index 426c1e0ddc..3a08d5c671 100644 --- a/tests/spread/core24-suites/environment/snaps/paths-all-null/expected_snap.yaml +++ b/tests/spread/core24-suites/environment/snaps/paths-all-null/expected_snap.yaml @@ -1,5 +1,5 @@ name: paths-all-null -version: '1' +version: "1" summary: test description: | Setting PATH and LD_LIBRARY_PATH to null and @@ -7,7 +7,7 @@ description: | cause the environment field to not be included in the resulting snap.yaml. architectures: -- amd64 + - amd64 base: core24 apps: paths-all-null: diff --git a/tests/spread/core24-suites/environment/snaps/paths-one-null/expected_snap.yaml b/tests/spread/core24-suites/environment/snaps/paths-one-null/expected_snap.yaml index 2cf30c9857..8fa1baea41 100644 --- a/tests/spread/core24-suites/environment/snaps/paths-one-null/expected_snap.yaml +++ b/tests/spread/core24-suites/environment/snaps/paths-one-null/expected_snap.yaml @@ -1,12 +1,12 @@ name: paths-one-null -version: '1' +version: "1" summary: test description: | Setting either LD_LIBRARY_PATH or PATH to null should cause that variable to be excluded, while other variables are still handled. architectures: -- amd64 + - amd64 base: core24 apps: paths-one-null: diff --git a/tests/spread/core24-suites/environment/snaps/paths-user-defined/expected_snap.yaml b/tests/spread/core24-suites/environment/snaps/paths-user-defined/expected_snap.yaml index 8954cde57c..34ee388dd2 100644 --- a/tests/spread/core24-suites/environment/snaps/paths-user-defined/expected_snap.yaml +++ b/tests/spread/core24-suites/environment/snaps/paths-user-defined/expected_snap.yaml @@ -1,9 +1,9 @@ name: paths-user-defined -version: '1' +version: "1" summary: test description: Defining LD_LIBRARY_PATH or PATH should override default values. architectures: -- amd64 + - amd64 base: core24 apps: paths-user-defined: diff --git a/tests/spread/core24-suites/environment/snaps/staged-common-library/expected_snap.yaml b/tests/spread/core24-suites/environment/snaps/staged-common-library/expected_snap.yaml index 76c07b89fb..87e6ca8ba1 100644 --- a/tests/spread/core24-suites/environment/snaps/staged-common-library/expected_snap.yaml +++ b/tests/spread/core24-suites/environment/snaps/staged-common-library/expected_snap.yaml @@ -1,11 +1,11 @@ name: staged-common-library -version: '1' +version: "1" summary: test description: | Staging a standard library causes common library paths to be included in the LD_LIBRARY_PATH environmental variable. architectures: -- amd64 + - amd64 base: core24 apps: staged-common-library: diff --git a/tests/spread/core24-suites/environment/test-variables/task.yaml b/tests/spread/core24-suites/environment/test-variables/task.yaml index 22d50aeed0..4c02a969cd 100644 --- a/tests/spread/core24-suites/environment/test-variables/task.yaml +++ b/tests/spread/core24-suites/environment/test-variables/task.yaml @@ -62,7 +62,7 @@ execute: | grep -q "$exp" < "$file" done } - + # exercise lifecycle commands with and without `--platform` and `--build-for` snapcraft pull --platform s390x diff --git a/tests/spread/core24-suites/patchelf/classic-patchelf/snap/snapcraft.yaml b/tests/spread/core24-suites/patchelf/classic-patchelf/snap/snapcraft.yaml index cfd37b295f..363b31be42 100644 --- a/tests/spread/core24-suites/patchelf/classic-patchelf/snap/snapcraft.yaml +++ b/tests/spread/core24-suites/patchelf/classic-patchelf/snap/snapcraft.yaml @@ -5,7 +5,6 @@ description: | Build a classic confined snap, mostly used to test the provisioning of `core` inside a snap. base: core24 - grade: devel confinement: classic diff --git a/tests/spread/core24-suites/patchelf/strict-patchelf/snap/snapcraft.yaml b/tests/spread/core24-suites/patchelf/strict-patchelf/snap/snapcraft.yaml index 9566c93be0..0e7026c686 100644 --- a/tests/spread/core24-suites/patchelf/strict-patchelf/snap/snapcraft.yaml +++ b/tests/spread/core24-suites/patchelf/strict-patchelf/snap/snapcraft.yaml @@ -4,7 +4,6 @@ summary: Build a strictly confined snap description: | Build a strictly confined snap to test ELF patching base: core24 - grade: devel confinement: strict diff --git a/tests/spread/core24-suites/scriptlets/empty-overrides/snap/snapcraft.yaml b/tests/spread/core24-suites/scriptlets/empty-overrides/snap/snapcraft.yaml index 95b758946a..bd08dcceab 100644 --- a/tests/spread/core24-suites/scriptlets/empty-overrides/snap/snapcraft.yaml +++ b/tests/spread/core24-suites/scriptlets/empty-overrides/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: test-snap base: core24 -version: '0.1' +version: "0.1" summary: test snap description: test snap grade: devel @@ -9,4 +9,4 @@ parts: test-part: plugin: nil override-build: touch $CRAFT_PART_INSTALL/foo.bar - override-prime: '' + override-prime: "" diff --git a/tests/spread/core24-suites/scriptlets/empty-overrides/task.yaml b/tests/spread/core24-suites/scriptlets/empty-overrides/task.yaml index 87fdb154cd..1d58823c0f 100644 --- a/tests/spread/core24-suites/scriptlets/empty-overrides/task.yaml +++ b/tests/spread/core24-suites/scriptlets/empty-overrides/task.yaml @@ -1,7 +1,7 @@ summary: Execute empty scriptlets restore: | - snapcraft clean --destructive-mode + snapcraft clean --destructive-mode execute: | snapcraft prime --destructive-mode diff --git a/tests/spread/core24-suites/scriptlets/scriptlet-failures/snap/snapcraft.yaml b/tests/spread/core24-suites/scriptlets/scriptlet-failures/snap/snapcraft.yaml index bf97b18cd1..1f863f2af1 100644 --- a/tests/spread/core24-suites/scriptlets/scriptlet-failures/snap/snapcraft.yaml +++ b/tests/spread/core24-suites/scriptlets/scriptlet-failures/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: craftctl-build-failure base: core24 -version: '0.1' +version: "0.1" summary: Fail on snapcraftctl build description: | Failing with purpose. diff --git a/tests/spread/core24-suites/scriptlets/scriptlet-failures/task.yaml b/tests/spread/core24-suites/scriptlets/scriptlet-failures/task.yaml index 0aa6782800..15a0a29d25 100644 --- a/tests/spread/core24-suites/scriptlets/scriptlet-failures/task.yaml +++ b/tests/spread/core24-suites/scriptlets/scriptlet-failures/task.yaml @@ -1,6 +1,7 @@ summary: Validate scriptlet failures -restore: | # If this next line fails, delete it and replace it with the one following it +restore: + | # If this next line fails, delete it and replace it with the one following it snapcraft clean rm -f ./*.snap diff --git a/tests/spread/core24/appstream-desktop/desktop/expected_snap.yaml b/tests/spread/core24/appstream-desktop/desktop/expected_snap.yaml index 8b4b15e543..1f62dc6fd2 100644 --- a/tests/spread/core24/appstream-desktop/desktop/expected_snap.yaml +++ b/tests/spread/core24/appstream-desktop/desktop/expected_snap.yaml @@ -15,7 +15,7 @@ description: |- Test me please. license: GPL-2.0+ architectures: -- amd64 + - amd64 base: core24 apps: appstream-desktop: @@ -28,4 +28,4 @@ environment: PATH: $SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH links: website: - - https://snapcraft.io + - https://snapcraft.io diff --git a/tests/spread/core24/appstream-desktop/icon-desktop/expected_snap.yaml b/tests/spread/core24/appstream-desktop/icon-desktop/expected_snap.yaml index 8b4b15e543..1f62dc6fd2 100644 --- a/tests/spread/core24/appstream-desktop/icon-desktop/expected_snap.yaml +++ b/tests/spread/core24/appstream-desktop/icon-desktop/expected_snap.yaml @@ -15,7 +15,7 @@ description: |- Test me please. license: GPL-2.0+ architectures: -- amd64 + - amd64 base: core24 apps: appstream-desktop: @@ -28,4 +28,4 @@ environment: PATH: $SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH links: website: - - https://snapcraft.io + - https://snapcraft.io diff --git a/tests/spread/core24/clean/snaps/clean-with-long-name/snap/snapcraft.yaml b/tests/spread/core24/clean/snaps/clean-with-long-name/snap/snapcraft.yaml index 5133411b00..00fe0c1324 100644 --- a/tests/spread/core24/clean/snaps/clean-with-long-name/snap/snapcraft.yaml +++ b/tests/spread/core24/clean/snaps/clean-with-long-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: clean-i-am-40-characters-long-xxxxxxxxxx -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/clean/snaps/clean/snap/snapcraft.yaml b/tests/spread/core24/clean/snaps/clean/snap/snapcraft.yaml index 64c5dc68b2..073652a2d4 100644 --- a/tests/spread/core24/clean/snaps/clean/snap/snapcraft.yaml +++ b/tests/spread/core24/clean/snaps/clean/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: clean -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/clean/task.yaml b/tests/spread/core24/clean/task.yaml index 088d547652..99d2b8f09f 100644 --- a/tests/spread/core24/clean/task.yaml +++ b/tests/spread/core24/clean/task.yaml @@ -62,4 +62,4 @@ execute: | snapcraft clean --destructive-mode - test ! -d parts && test ! -d stage && test ! -d prime + test ! -d parts && test ! -d stage && test ! -d prime diff --git a/tests/spread/core24/components/expected-component.yaml b/tests/spread/core24/components/expected-component.yaml index eb411fb64b..7f72c1a09b 100644 --- a/tests/spread/core24/components/expected-component.yaml +++ b/tests/spread/core24/components/expected-component.yaml @@ -1,6 +1,6 @@ component: hello-components+share type: test -version: '1.0' +version: "1.0" summary: Hello World description: Hello World provenance: test-provenance diff --git a/tests/spread/core24/components/expected-snap.yaml b/tests/spread/core24/components/expected-snap.yaml index 931151f098..5a214911fa 100644 --- a/tests/spread/core24/components/expected-snap.yaml +++ b/tests/spread/core24/components/expected-snap.yaml @@ -1,9 +1,9 @@ name: hello-components -version: '1.0' +version: "1.0" summary: Build a snap with components description: Build a snap with components architectures: -- amd64 + - amd64 base: core24 apps: hello: @@ -22,5 +22,5 @@ components: hooks: install: plugs: - - home - - network + - home + - network diff --git a/tests/spread/core24/components/task.yaml b/tests/spread/core24/components/task.yaml index bac51f617d..cf9b4cba5f 100644 --- a/tests/spread/core24/components/task.yaml +++ b/tests/spread/core24/components/task.yaml @@ -38,7 +38,7 @@ execute: | echo "Expected 'other-file-in-component' not to be in the 'share' component" exit 1 fi - + component_meta_dir="component-contents/meta" # assert component metadata diff --git a/tests/spread/core24/content-interface-provider-found/snapcraft.yaml b/tests/spread/core24/content-interface-provider-found/snapcraft.yaml index 0061214868..3c711c1ee7 100644 --- a/tests/spread/core24/content-interface-provider-found/snapcraft.yaml +++ b/tests/spread/core24/content-interface-provider-found/snapcraft.yaml @@ -1,5 +1,5 @@ name: content-test -version: '0.1' +version: "0.1" summary: snap using a plug with a content interface should install description: | Defining a plug using the content interface should install the snap diff --git a/tests/spread/core24/content-interface-provider-found/task.yaml b/tests/spread/core24/content-interface-provider-found/task.yaml index f59545c449..a7ea2b9e5a 100644 --- a/tests/spread/core24/content-interface-provider-found/task.yaml +++ b/tests/spread/core24/content-interface-provider-found/task.yaml @@ -10,4 +10,3 @@ execute: | echo "snap listed as default provider was not installed" exit 1 fi - diff --git a/tests/spread/core24/content-interface-provider-not-found/snapcraft.yaml b/tests/spread/core24/content-interface-provider-not-found/snapcraft.yaml index 79804f2bb7..d34a6d9893 100644 --- a/tests/spread/core24/content-interface-provider-not-found/snapcraft.yaml +++ b/tests/spread/core24/content-interface-provider-not-found/snapcraft.yaml @@ -1,5 +1,5 @@ name: content-test -version: '0.1' +version: "0.1" summary: snap using a plug with a content interface that cannot be found description: | Defining a plug using the content interface should only warn when it diff --git a/tests/spread/core24/craftctl/test-craftctl-default/snap/snapcraft.yaml b/tests/spread/core24/craftctl/test-craftctl-default/snap/snapcraft.yaml index 578942fe00..4ca9a8b6c0 100644 --- a/tests/spread/core24/craftctl/test-craftctl-default/snap/snapcraft.yaml +++ b/tests/spread/core24/craftctl/test-craftctl-default/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: craftctl-default -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/craftgit/snap/snapcraft.yaml b/tests/spread/core24/craftgit/snap/snapcraft.yaml index 5e82e67e48..9f8b495c2d 100644 --- a/tests/spread/core24/craftgit/snap/snapcraft.yaml +++ b/tests/spread/core24/craftgit/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: craftgit-test base: core24 -version: '0.1' +version: "0.1" summary: Echo description: Just a dummy build to check if craft.git from package works confinement: strict diff --git a/tests/spread/core24/dotnet/snapcraft.yaml b/tests/spread/core24/dotnet/snapcraft.yaml index 7ab22ace9b..e59d6648cc 100644 --- a/tests/spread/core24/dotnet/snapcraft.yaml +++ b/tests/spread/core24/dotnet/snapcraft.yaml @@ -1,6 +1,6 @@ name: dotnet-hello base: core24 -version: '1.0' +version: "1.0" summary: a simple dotnet snap description: a simple dotnet snap diff --git a/tests/spread/core24/grammar-all/snap/snapcraft.yaml b/tests/spread/core24/grammar-all/snap/snapcraft.yaml index 3280b16185..fd2b3b7b88 100644 --- a/tests/spread/core24/grammar-all/snap/snapcraft.yaml +++ b/tests/spread/core24/grammar-all/snap/snapcraft.yaml @@ -15,7 +15,7 @@ platforms: build-packages: - libzstd1 - on amd64 to all: - - libogg-dev + - libogg-dev parts: hello-world: @@ -23,15 +23,15 @@ parts: # grammar-only string source: - - on amd64 to all: src/on-amd64-to-all + - on amd64 to all: src/on-amd64-to-all # grammar dictionary organize: - - on amd64 to all: - hello-world.sh: hello-world-all.sh + - on amd64 to all: + hello-world.sh: hello-world-all.sh # grammar list (including non-grammar elements) build-environment: - - HELLO: hello - - on amd64 to all: - - ARCH: all + - HELLO: hello + - on amd64 to all: + - ARCH: all diff --git a/tests/spread/core24/grammar/snap/snapcraft.yaml b/tests/spread/core24/grammar/snap/snapcraft.yaml index 50707366a3..99c0813037 100644 --- a/tests/spread/core24/grammar/snap/snapcraft.yaml +++ b/tests/spread/core24/grammar/snap/snapcraft.yaml @@ -18,9 +18,9 @@ platforms: build-packages: - libzstd1 - on amd64 to amd64: - - libogg-dev + - libogg-dev - on amd64 to arm64: - - libpci-dev + - libpci-dev parts: hello-world: @@ -28,21 +28,20 @@ parts: # grammar-only string source: - - on amd64 to amd64: src/on-amd64-to-amd64 - - on amd64 to arm64: src/on-amd64-to-arm64 + - on amd64 to amd64: src/on-amd64-to-amd64 + - on amd64 to arm64: src/on-amd64-to-arm64 # grammar dictionary organize: - - on amd64 to amd64: - hello-world.sh: hello-world-amd64.sh - - on amd64 to arm64: - hello-world.sh: hello-world-arm64.sh - + - on amd64 to amd64: + hello-world.sh: hello-world-amd64.sh + - on amd64 to arm64: + hello-world.sh: hello-world-arm64.sh # grammar list (including non-grammar elements) build-environment: - - HELLO: hello - - on amd64 to amd64: - - ARCH: amd64 - - on amd64 to arm64: - - ARCH: arm64 + - HELLO: hello + - on amd64 to amd64: + - ARCH: amd64 + - on amd64 to arm64: + - ARCH: arm64 diff --git a/tests/spread/core24/hooks/aux/build-aux/snap/snapcraft.yaml b/tests/spread/core24/hooks/aux/build-aux/snap/snapcraft.yaml index 5977e3b290..1e37eecff3 100644 --- a/tests/spread/core24/hooks/aux/build-aux/snap/snapcraft.yaml +++ b/tests/spread/core24/hooks/aux/build-aux/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: hooks base: core24 -version: '1.0' +version: "1.0" summary: Test conflicting generated and project hooks. description: Project hooks in $PROJECT/snap/hooks/ should take priority over conflicting code generated hooks. confinement: strict @@ -13,4 +13,3 @@ parts: organize: bin/install: snap/hooks/install bin/configure: snap/hooks/configure - diff --git a/tests/spread/core24/hooks/default/snap/snapcraft.yaml b/tests/spread/core24/hooks/default/snap/snapcraft.yaml index 5977e3b290..1e37eecff3 100644 --- a/tests/spread/core24/hooks/default/snap/snapcraft.yaml +++ b/tests/spread/core24/hooks/default/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: hooks base: core24 -version: '1.0' +version: "1.0" summary: Test conflicting generated and project hooks. description: Project hooks in $PROJECT/snap/hooks/ should take priority over conflicting code generated hooks. confinement: strict @@ -13,4 +13,3 @@ parts: organize: bin/install: snap/hooks/install bin/configure: snap/hooks/configure - diff --git a/tests/spread/core24/hooks/task.yaml b/tests/spread/core24/hooks/task.yaml index ddf1b9f30d..722fec4cd1 100644 --- a/tests/spread/core24/hooks/task.yaml +++ b/tests/spread/core24/hooks/task.yaml @@ -3,16 +3,16 @@ summary: setup hooks environment: SNAP/default: default SNAP/build_aux: aux - + restore: | cd "${SNAP}" - + snapcraft clean --destructive-mode rm -rf hooks_*.snap execute: | cd "${SNAP}" - + snapcraft pack --destructive-mode # verify hooks were staged @@ -34,4 +34,3 @@ execute: | # verify snap is installable snap install hooks_1.0_*.snap --dangerous - diff --git a/tests/spread/core24/lifecycle/snapcraft.yaml b/tests/spread/core24/lifecycle/snapcraft.yaml index 8602ccb7bc..a3be1b4bbe 100644 --- a/tests/spread/core24/lifecycle/snapcraft.yaml +++ b/tests/spread/core24/lifecycle/snapcraft.yaml @@ -1,6 +1,6 @@ name: hello base: core24 -version: '0.1' +version: "0.1" summary: snapcraft lifecycle description: | A test to ensure we can pull, build, stage and prime diff --git a/tests/spread/core24/linters-file/lint-file/snapcraft.yaml b/tests/spread/core24/linters-file/lint-file/snapcraft.yaml index c1c3c0539d..1b6048d994 100644 --- a/tests/spread/core24/linters-file/lint-file/snapcraft.yaml +++ b/tests/spread/core24/linters-file/lint-file/snapcraft.yaml @@ -1,6 +1,6 @@ name: lint-file base: core24 -version: '0.1' +version: "0.1" summary: Lint a packaged snapcraft file. description: spread test @@ -15,5 +15,4 @@ parts: - libcaca-dev stage-packages: - libogg0 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core24/linters-pack/classic-libc/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/classic-libc/snap/snapcraft.yaml index 47201f620a..9559a90c92 100644 --- a/tests/spread/core24/linters-pack/classic-libc/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/classic-libc/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | This is my-snap's description. You have a paragraph or two to tell the diff --git a/tests/spread/core24/linters-pack/classic/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/classic/snap/snapcraft.yaml index 58bdc57d40..0d3fcc10cc 100644 --- a/tests/spread/core24/linters-pack/classic/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/classic/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | This is my-snap's description. You have a paragraph or two to tell the diff --git a/tests/spread/core24/linters-pack/library-gnome/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-gnome/snap/snapcraft.yaml index 73203f52c7..e70ee13be8 100644 --- a/tests/spread/core24/linters-pack/library-gnome/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-gnome/snap/snapcraft.yaml @@ -53,7 +53,7 @@ parts: gnome-calculator: source: https://gitlab.gnome.org/GNOME/gnome-calculator.git - source-branch: 'gnome-46' + source-branch: "gnome-46" plugin: meson meson-parameters: - --prefix=/snap/gnome-calculator/current/usr diff --git a/tests/spread/core24/linters-pack/library-ignore-missing/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-ignore-missing/snap/snapcraft.yaml index d510a77d7a..afbf92c07a 100644 --- a/tests/spread/core24/linters-pack/library-ignore-missing/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-ignore-missing/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Ignore missing library linter issues description: spread test @@ -9,7 +9,7 @@ confinement: strict lint: ignore: - library: - - linter-test + - linter-test parts: my-part: @@ -18,5 +18,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core24/linters-pack/library-ignore-unused/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-ignore-unused/snap/snapcraft.yaml index 67e791d295..14ea5f32e1 100644 --- a/tests/spread/core24/linters-pack/library-ignore-unused/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-ignore-unused/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Ignore unused library linter issues description: spread test @@ -9,7 +9,7 @@ confinement: strict lint: ignore: - library: - - usr/lib/*/libpng16.so* + - usr/lib/*/libpng16.so* parts: my-part: @@ -17,5 +17,4 @@ parts: source: src stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c diff --git a/tests/spread/core24/linters-pack/library-ignored-mixed/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-ignored-mixed/snap/snapcraft.yaml index d98417e57f..3c2cdf06e3 100644 --- a/tests/spread/core24/linters-pack/library-ignored-mixed/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-ignored-mixed/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Ignore a mix of unused and missing library linter issues description: spread test @@ -9,9 +9,9 @@ confinement: strict lint: ignore: - unused-library: - - usr/lib/*/libpng16.so* + - usr/lib/*/libpng16.so* - missing-library: - - linter-test-missing + - linter-test-missing parts: unused-part: @@ -19,8 +19,7 @@ parts: source: src stage-packages: - libpng16-16 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test-unused test_unused.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test-unused test_unused.c missing-part: plugin: nil @@ -28,6 +27,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test-missing test_missing.c -lcaca - + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test-missing test_missing.c -lcaca diff --git a/tests/spread/core24/linters-pack/library-missing/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-missing/snap/snapcraft.yaml index 19fe4b07e3..c8334239ac 100644 --- a/tests/spread/core24/linters-pack/library-missing/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-missing/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Raise linter warnings for missing libraries description: spread test @@ -13,5 +13,4 @@ parts: build-packages: - gcc - libcaca-dev - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c -lcaca diff --git a/tests/spread/core24/linters-pack/library-unused/snap/snapcraft.yaml b/tests/spread/core24/linters-pack/library-unused/snap/snapcraft.yaml index 71f62f0474..f9cdb5ac52 100644 --- a/tests/spread/core24/linters-pack/library-unused/snap/snapcraft.yaml +++ b/tests/spread/core24/linters-pack/library-unused/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: linter-test base: core24 -version: '0.1' +version: "0.1" summary: Raise linter warnings for unused libraries. description: spread test @@ -12,5 +12,4 @@ parts: source: src stage-packages: - libpng16-16t64 - override-build: - gcc -o $CRAFT_PART_INSTALL/linter-test test.c + override-build: gcc -o $CRAFT_PART_INSTALL/linter-test test.c diff --git a/tests/spread/core24/package-filter/task.yaml b/tests/spread/core24/package-filter/task.yaml index 6a4dd8fbb1..314869512f 100644 --- a/tests/spread/core24/package-filter/task.yaml +++ b/tests/spread/core24/package-filter/task.yaml @@ -5,7 +5,7 @@ restore: | execute: | snapcraft prime --destructive-mode - + # Staging "python3-cffi" should also stage "python3-cffi-backend", even though # it's already contained in the base snap test -e prime/usr/lib/python3/dist-packages/_cffi_backend.cpython-*-linux-gnu.so diff --git a/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml index 502f8ab677..9cc2cfab08 100644 --- a/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-fingerprint -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/package-repositories/test-apt-key-name/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-key-name/snap/snapcraft.yaml index 7c66f33f8c..79f157a977 100644 --- a/tests/spread/core24/package-repositories/test-apt-key-name/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-key-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-name -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/package-repositories/test-apt-keyserver/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-keyserver/snap/snapcraft.yaml index 9bbbc92dbf..ee6899dfff 100644 --- a/tests/spread/core24/package-repositories/test-apt-keyserver/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-keyserver/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-keyserver -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/package-repositories/test-apt-path/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-path/snap/snapcraft.yaml index da10b2186f..8a6ca6e508 100644 --- a/tests/spread/core24/package-repositories/test-apt-path/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-path/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test confinement: strict @@ -9,7 +9,7 @@ parts: test-ppa: plugin: nil stage-packages: - - datacenter-gpu-manager + - datacenter-gpu-manager package-repositories: - type: apt diff --git a/tests/spread/core24/package-repositories/test-apt-ppa/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-ppa/snap/snapcraft.yaml index 427fc2885b..caea6b5390 100644 --- a/tests/spread/core24/package-repositories/test-apt-ppa/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-ppa/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/package-repositories/test-foreign-armhf/snapcraft.yaml b/tests/spread/core24/package-repositories/test-foreign-armhf/snapcraft.yaml index fa2251c31a..39c1d16ac5 100644 --- a/tests/spread/core24/package-repositories/test-foreign-armhf/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-foreign-armhf/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-foreign-armhf -version: '1.0' +version: "1.0" summary: test package repos with different architectures description: test package repos with different architectures confinement: strict @@ -19,9 +19,9 @@ package-repositories: # Also add the armhf arch for the "ports" repo, to fetch python's deps. We # need to do this because the default archives don't have armhf. - type: apt - architectures: [ armhf ] - components: [ main ] - suites: [ jammy, jammy-security, jammy-updates ] + architectures: [armhf] + components: [main] + suites: [jammy, jammy-security, jammy-updates] key-id: F6ECB3762474EDA9D21B7022871920D1991BC93C url: http://ports.ubuntu.com/ubuntu-ports diff --git a/tests/spread/core24/package-repositories/test-foreign-i386/snapcraft.yaml b/tests/spread/core24/package-repositories/test-foreign-i386/snapcraft.yaml index a2913b0c2f..fa07f53b6c 100644 --- a/tests/spread/core24/package-repositories/test-foreign-i386/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-foreign-i386/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-foreign-i386 -version: '1.0' +version: "1.0" summary: test package repos with different architectures description: test package repos with different architectures confinement: strict diff --git a/tests/spread/core24/package-repositories/test-key-conflict/snapcraft.yaml b/tests/spread/core24/package-repositories/test-key-conflict/snapcraft.yaml index 4252620f38..6fb4236e7d 100644 --- a/tests/spread/core24/package-repositories/test-key-conflict/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-key-conflict/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-key-conflict -version: '1.0' +version: "1.0" summary: test package repos with keys already present on the system description: test package repos with keys already present on the system confinement: strict @@ -33,7 +33,7 @@ parts: stage-packages: - zlib1g:i386 # To ensure the package-repo is setup correctly - zlib1g:armhf - - hello # there is no hello:i386 in the archives + - hello # there is no hello:i386 in the archives apps: test-key-conflict: diff --git a/tests/spread/core24/package-repositories/test-multi-keys/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-multi-keys/snap/snapcraft.yaml index 6121b5953a..b070ab8397 100644 --- a/tests/spread/core24/package-repositories/test-multi-keys/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-multi-keys/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-multi-keys -version: '1.0' +version: "1.0" summary: test description: test installing a package repository with an asset file with multiple keys confinement: strict diff --git a/tests/spread/core24/package-repositories/test-pin/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-pin/snap/snapcraft.yaml index c4456cdc1c..8402162aad 100644 --- a/tests/spread/core24/package-repositories/test-pin/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-pin/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-pin -version: '1.0' +version: "1.0" summary: test description: test confinement: strict diff --git a/tests/spread/core24/packing/snap/snapcraft.yaml b/tests/spread/core24/packing/snap/snapcraft.yaml index fa56341a49..74f19e782f 100644 --- a/tests/spread/core24/packing/snap/snapcraft.yaml +++ b/tests/spread/core24/packing/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: my-snap-name -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap # 79 char long summary description: | This is my-snap's description. You have a paragraph or two to tell the @@ -7,7 +7,6 @@ description: | we live in tweetspace and your description wants to look good in the snap store. base: core24 - confinement: devmode parts: diff --git a/tests/spread/core24/packing/task.yaml b/tests/spread/core24/packing/task.yaml index 8f19370961..13e448712a 100644 --- a/tests/spread/core24/packing/task.yaml +++ b/tests/spread/core24/packing/task.yaml @@ -21,7 +21,7 @@ prepare: | restore: | rm -Rf subdir ./*.snap - + # 'pack_directory' tests are run in destructive-mode if [[ "$SPREAD_VARIANT" =~ "pack_directory" ]]; then snapcraft clean --destructive-mode @@ -38,7 +38,7 @@ execute: | if [[ "$SPREAD_VARIANT" =~ "pack_directory" ]]; then snapcraft prime --destructive-mode fi - + # shellcheck disable=SC2086 snapcraft $CMD diff --git a/tests/spread/core24/plugs-warn/snap/snapcraft.yaml b/tests/spread/core24/plugs-warn/snap/snapcraft.yaml index 1be35b8234..97f868f770 100644 --- a/tests/spread/core24/plugs-warn/snap/snapcraft.yaml +++ b/tests/spread/core24/plugs-warn/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: plugs-warn base: core24 -version: '0.1' +version: "0.1" summary: Check warnings for top-level enabling of slots and plugs description: Check warnings for top-level enabling of slots and plugs. diff --git a/tests/spread/core24/remote-build/task.yaml b/tests/spread/core24/remote-build/task.yaml index 14bd5dfefd..62692f9c6d 100644 --- a/tests/spread/core24/remote-build/task.yaml +++ b/tests/spread/core24/remote-build/task.yaml @@ -55,7 +55,7 @@ execute: | if [[ -e "arguments.txt" ]]; then call_args=$(cat "arguments.txt") fi - + # shellcheck disable=SC2086 snapcraft remote-build --launchpad-accept-public-upload $call_args diff --git a/tests/spread/core24/root-packages/task.yaml b/tests/spread/core24/root-packages/task.yaml index e7a70ec967..621312cc13 100644 --- a/tests/spread/core24/root-packages/task.yaml +++ b/tests/spread/core24/root-packages/task.yaml @@ -10,7 +10,7 @@ execute: | echo hello snap was not installed exit 1 fi - + if ! dpkg -V hello; then echo hello deb was not installed exit 1 diff --git a/tests/spread/core24/set-version-twice/modified-snapcraft.yaml b/tests/spread/core24/set-version-twice/modified-snapcraft.yaml index 216df4fcef..57106ea937 100644 --- a/tests/spread/core24/set-version-twice/modified-snapcraft.yaml +++ b/tests/spread/core24/set-version-twice/modified-snapcraft.yaml @@ -1,13 +1,12 @@ name: test-set-version-twice base: core24 -version: '0.1' +version: "0.1" summary: Test fix for set version and out of order step execution description: | As described in https://bugs.launchpad.net/snapcraft/+bug/1831135/comments/10, a bug in craft-parts caused unexpected double setting of project variables such as `version`. Make sure this scenario builds correctly. adopt-info: part1 - confinement: devmode parts: diff --git a/tests/spread/core24/set-version-twice/original-snapcraft.yaml b/tests/spread/core24/set-version-twice/original-snapcraft.yaml index 49db00c152..fa8360c3bc 100644 --- a/tests/spread/core24/set-version-twice/original-snapcraft.yaml +++ b/tests/spread/core24/set-version-twice/original-snapcraft.yaml @@ -1,13 +1,12 @@ name: test-set-version-twice base: core24 -version: '0.1' +version: "0.1" summary: Test fix for set version and out of order step execution description: | As described in https://bugs.launchpad.net/snapcraft/+bug/1831135/comments/10, a bug in craft-parts caused unexpected double setting of project variables such as `version`. Make sure this scenario builds correctly. adopt-info: part1 - confinement: devmode parts: diff --git a/tests/spread/core24/set-version-twice/task.yaml b/tests/spread/core24/set-version-twice/task.yaml index 31c5db723c..2da4b85cf5 100644 --- a/tests/spread/core24/set-version-twice/task.yaml +++ b/tests/spread/core24/set-version-twice/task.yaml @@ -4,7 +4,8 @@ prepare: | #shellcheck source=tests/spread/tools/snapcraft-yaml.sh . "$TOOLS_DIR/snapcraft-yaml.sh" -restore: | # If this next line fails, delete it and replace it with the one following it +restore: + | # If this next line fails, delete it and replace it with the one following it snapcraft clean rm -Rf subdir ./*.snap rm -f snap/*.yaml diff --git a/tests/spread/core24/snap-creation/package-cutoff/snap/snapcraft.yaml b/tests/spread/core24/snap-creation/package-cutoff/snap/snapcraft.yaml index b84ab422d0..148e2f4f60 100644 --- a/tests/spread/core24/snap-creation/package-cutoff/snap/snapcraft.yaml +++ b/tests/spread/core24/snap-creation/package-cutoff/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: package-cutoff base: core24 -version: '1.0' -summary: 'test' +version: "1.0" +summary: "test" description: test confinement: devmode diff --git a/tests/spread/core24/try/snapcraft.yaml b/tests/spread/core24/try/snapcraft.yaml index 5d11867235..d8dcbae9c2 100644 --- a/tests/spread/core24/try/snapcraft.yaml +++ b/tests/spread/core24/try/snapcraft.yaml @@ -1,6 +1,6 @@ name: hello-try base: core24 -version: '0.1' +version: "0.1" summary: snapcraft try spread test description: snapcraft try spread test diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-error/snap/snapcraft.yaml index 6c9a767e88..3379f684d7 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-multi-arch-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_BUILD_FOR should raise an error for multi-arch builds. grade: stable diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-triplet-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-triplet-error/snap/snapcraft.yaml index ef888a20e6..f7d6d105ef 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-triplet-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-multi-arch-triplet-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-multi-arch-triplet-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_TRIPLET_BUILD_FOR should raise an error for multi-arch builds. grade: stable diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-part-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-part-error/snap/snapcraft.yaml index 375f19e60e..6df32b6c1f 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-part-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-part-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-part-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_BUILD_FOR inside a part definition should raise an error if the arch cannot be determined. grade: stable @@ -13,5 +13,4 @@ architectures: parts: my-part: plugin: nil - override-pull: - echo ${SNAPCRAFT_ARCH_BUILD_FOR} + override-pull: echo ${SNAPCRAFT_ARCH_BUILD_FOR} diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-part-triplet-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-part-triplet-error/snap/snapcraft.yaml index 1c16416dd6..3cf2054d14 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-part-triplet-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-part-triplet-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-part-triplet-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_TRIPLET_BUILD_FOR inside a part definition should raise an error if the arch cannot be determined. grade: stable @@ -13,5 +13,4 @@ architectures: parts: my-part: plugin: nil - override-pull: - echo ${SNAPCRAFT_ARCH_TRIPLET_BUILD_FOR} + override-pull: echo ${SNAPCRAFT_ARCH_TRIPLET_BUILD_FOR} diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-error/snap/snapcraft.yaml index 221105ac0b..e65e900e61 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-unknown-arch-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_BUILD_FOR should raise an error when the build-for arch is unknown. grade: stable diff --git a/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-triplet-error/snap/snapcraft.yaml b/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-triplet-error/snap/snapcraft.yaml index 41bbd28359..6c4e71b013 100644 --- a/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-triplet-error/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment-errors/snaps/build-for-unknown-arch-triplet-error/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-unknown-arch-triplet-error base: core20 -version: '1.0' +version: "1.0" summary: test description: Using SNAPCRAFT_ARCH_TRIPLET_BUILD_FOR should raise an error when the build-for arch is unknown. grade: stable diff --git a/tests/spread/cross-compile/environment/snaps/build-for-multi-arch/snap/snapcraft.yaml b/tests/spread/cross-compile/environment/snaps/build-for-multi-arch/snap/snapcraft.yaml index f3fe0bfdcf..e53bb932f3 100644 --- a/tests/spread/cross-compile/environment/snaps/build-for-multi-arch/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment/snaps/build-for-multi-arch/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-multi-arch base: core20 -version: '1.0' +version: "1.0" summary: test description: Only BUILD_ON envvars can be evaluated for multi-arch builds. grade: stable diff --git a/tests/spread/cross-compile/environment/snaps/build-for-single-arch/snap/snapcraft.yaml b/tests/spread/cross-compile/environment/snaps/build-for-single-arch/snap/snapcraft.yaml index 66af3c477c..7744b08c78 100644 --- a/tests/spread/cross-compile/environment/snaps/build-for-single-arch/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment/snaps/build-for-single-arch/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-single-arch base: core20 -version: '1.0' +version: "1.0" summary: test description: BUILD_ON and BUILD_FOR envvars should be evaluated when the build-for arch is a scalar. grade: stable diff --git a/tests/spread/cross-compile/environment/snaps/build-for-unknown-arch/snap/snapcraft.yaml b/tests/spread/cross-compile/environment/snaps/build-for-unknown-arch/snap/snapcraft.yaml index 5fa92ed01c..46407a50fe 100644 --- a/tests/spread/cross-compile/environment/snaps/build-for-unknown-arch/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment/snaps/build-for-unknown-arch/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: build-for-unknown-arch base: core20 -version: '1.0' +version: "1.0" summary: test description: Only BUILD_ON envvars can be evaluated when the build-for arch is unknown. grade: stable diff --git a/tests/spread/cross-compile/environment/snaps/target-arch/snap/snapcraft.yaml b/tests/spread/cross-compile/environment/snaps/target-arch/snap/snapcraft.yaml index 5eec02078e..31c2bacdde 100644 --- a/tests/spread/cross-compile/environment/snaps/target-arch/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/environment/snaps/target-arch/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: target-arch base: core20 -version: '1.0' +version: "1.0" summary: test description: BUILD_ON and BUILD_FOR envvars can be evaluated when `--target-arch` is provided grade: stable diff --git a/tests/spread/cross-compile/stage-packages/snap/snapcraft.yaml b/tests/spread/cross-compile/stage-packages/snap/snapcraft.yaml index 9a2279cd12..cad9f1439c 100644 --- a/tests/spread/cross-compile/stage-packages/snap/snapcraft.yaml +++ b/tests/spread/cross-compile/stage-packages/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: cross-compile-stage-package-test base: core20 -version: '0.1' +version: "0.1" summary: Test description: | Test xcompile stage-packages behavior for core20. @@ -12,15 +12,15 @@ parts: my-part: plugin: nil stage-packages: - - jq - - to amd64: - - tar:amd64 - - xxd - - to armhf: - - tar:armhf - - on amd64 to armhf: - - xxd - - on amd64: - - grep - - else: - - grep + - jq + - to amd64: + - tar:amd64 + - xxd + - to armhf: + - tar:armhf + - on amd64 to armhf: + - xxd + - on amd64: + - grep + - else: + - grep diff --git a/tests/spread/extensions/catkin-tools-noetic-meta-hello/task.yaml b/tests/spread/extensions/catkin-tools-noetic-meta-hello/task.yaml index 1a1a7b1822..3422049e1c 100644 --- a/tests/spread/extensions/catkin-tools-noetic-meta-hello/task.yaml +++ b/tests/spread/extensions/catkin-tools-noetic-meta-hello/task.yaml @@ -3,7 +3,6 @@ summary: Build and run a basic ROS snap using meta-ros extension kill-timeout: 180m environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP: catkin-tools-noetic-hello diff --git a/tests/spread/extensions/env-injector/task.yaml b/tests/spread/extensions/env-injector/task.yaml index 69731ef048..458c38a056 100644 --- a/tests/spread/extensions/env-injector/task.yaml +++ b/tests/spread/extensions/env-injector/task.yaml @@ -4,7 +4,6 @@ systems: - ubuntu-24.04* environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP_DIR: ../snaps/env-injector-hello SNAP: env-injector-hello diff --git a/tests/spread/extensions/ros-noetic-meta-hello/task.yaml b/tests/spread/extensions/ros-noetic-meta-hello/task.yaml index 38de63a0fc..325e014eae 100644 --- a/tests/spread/extensions/ros-noetic-meta-hello/task.yaml +++ b/tests/spread/extensions/ros-noetic-meta-hello/task.yaml @@ -3,7 +3,6 @@ summary: Build and run a basic ROS snap using meta-ros extension kill-timeout: 180m environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP: catkin-noetic-hello diff --git a/tests/spread/extensions/ros-noetic-meta-talker-listener/task.yaml b/tests/spread/extensions/ros-noetic-meta-talker-listener/task.yaml index 89f50c9e5b..cb6108e6af 100644 --- a/tests/spread/extensions/ros-noetic-meta-talker-listener/task.yaml +++ b/tests/spread/extensions/ros-noetic-meta-talker-listener/task.yaml @@ -3,7 +3,6 @@ summary: Build and run a basic ROS snap using meta-ros extension kill-timeout: 180m environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP: catkin-roslaunch-wrapper diff --git a/tests/spread/extensions/ros2-humble-meta-hello/task.yaml b/tests/spread/extensions/ros2-humble-meta-hello/task.yaml index d841082f43..5ea3a78646 100644 --- a/tests/spread/extensions/ros2-humble-meta-hello/task.yaml +++ b/tests/spread/extensions/ros2-humble-meta-hello/task.yaml @@ -3,7 +3,6 @@ summary: Build and run a basic ROS 2 snap using meta-ros extension kill-timeout: 180m environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP: colcon-ros2-wrapper diff --git a/tests/spread/extensions/ros2-jazzy-hello/task.yaml b/tests/spread/extensions/ros2-jazzy-hello/task.yaml index b28462a18b..1187a0b3be 100644 --- a/tests/spread/extensions/ros2-jazzy-hello/task.yaml +++ b/tests/spread/extensions/ros2-jazzy-hello/task.yaml @@ -11,7 +11,6 @@ systems: - ubuntu-24.04-arm64 environment: - SNAP_DIR: ../snaps/ros2-jazzy-hello SNAP: ros2-jazzy-hello diff --git a/tests/spread/extensions/ros2-jazzy-meta-hello/task.yaml b/tests/spread/extensions/ros2-jazzy-meta-hello/task.yaml index 9aaa7599d0..6dadc5e722 100644 --- a/tests/spread/extensions/ros2-jazzy-meta-hello/task.yaml +++ b/tests/spread/extensions/ros2-jazzy-meta-hello/task.yaml @@ -3,7 +3,6 @@ summary: Build and run a basic ROS 2 snap using meta-ros extension kill-timeout: 180m environment: - SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS: "1" SNAP: ros2-jazzy-hello diff --git a/tests/spread/extensions/snaps/env-injector-hello/snap/snapcraft.yaml b/tests/spread/extensions/snaps/env-injector-hello/snap/snapcraft.yaml index fc925f609f..24b1c37bc9 100644 --- a/tests/spread/extensions/snaps/env-injector-hello/snap/snapcraft.yaml +++ b/tests/spread/extensions/snaps/env-injector-hello/snap/snapcraft.yaml @@ -10,21 +10,20 @@ confinement: strict apps: hello1: command: usr/bin/exec-env - extensions: [ env-injector ] + extensions: [env-injector] hello2: command: usr/bin/exec-env - extensions: [ env-injector ] + extensions: [env-injector] hello-demo: command: usr/bin/exec-env environment: # user-defined alias env_alias: myapp - extensions: [ env-injector ] + extensions: [env-injector] parts: env: plugin: dump source: . - diff --git a/tests/spread/general/appstream-desktop/expected_snap.yaml b/tests/spread/general/appstream-desktop/expected_snap.yaml index 3aed34bb7d..196beffb60 100644 --- a/tests/spread/general/appstream-desktop/expected_snap.yaml +++ b/tests/spread/general/appstream-desktop/expected_snap.yaml @@ -17,11 +17,11 @@ apps: command: usr/bin/appstream-desktop common-id: io.snapcraft.appstream command-chain: - - snap/command-chain/snapcraft-runner + - snap/command-chain/snapcraft-runner architectures: -- amd64 + - amd64 assumes: -- command-chain + - command-chain base: core18 confinement: strict grade: devel diff --git a/tests/spread/general/appstream-desktop/expected_snap_core22.yaml b/tests/spread/general/appstream-desktop/expected_snap_core22.yaml index b86ec8f3e5..e79b673924 100644 --- a/tests/spread/general/appstream-desktop/expected_snap_core22.yaml +++ b/tests/spread/general/appstream-desktop/expected_snap_core22.yaml @@ -15,7 +15,7 @@ description: |- Test me please. license: GPL-2.0+ architectures: -- amd64 + - amd64 base: core22 apps: appstream-desktop: @@ -28,4 +28,4 @@ environment: PATH: $SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH links: website: - - https://snapcraft.io + - https://snapcraft.io diff --git a/tests/spread/general/appstream-icon-from-desktop/expected_snap.yaml b/tests/spread/general/appstream-icon-from-desktop/expected_snap.yaml index 3aed34bb7d..196beffb60 100644 --- a/tests/spread/general/appstream-icon-from-desktop/expected_snap.yaml +++ b/tests/spread/general/appstream-icon-from-desktop/expected_snap.yaml @@ -17,11 +17,11 @@ apps: command: usr/bin/appstream-desktop common-id: io.snapcraft.appstream command-chain: - - snap/command-chain/snapcraft-runner + - snap/command-chain/snapcraft-runner architectures: -- amd64 + - amd64 assumes: -- command-chain + - command-chain base: core18 confinement: strict grade: devel diff --git a/tests/spread/general/appstream-icon-from-desktop/expected_snap_core22.yaml b/tests/spread/general/appstream-icon-from-desktop/expected_snap_core22.yaml index b86ec8f3e5..e79b673924 100644 --- a/tests/spread/general/appstream-icon-from-desktop/expected_snap_core22.yaml +++ b/tests/spread/general/appstream-icon-from-desktop/expected_snap_core22.yaml @@ -15,7 +15,7 @@ description: |- Test me please. license: GPL-2.0+ architectures: -- amd64 + - amd64 base: core22 apps: appstream-desktop: @@ -28,4 +28,4 @@ environment: PATH: $SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH links: website: - - https://snapcraft.io + - https://snapcraft.io diff --git a/tests/spread/general/appstream-remote-gfx/expected_snap.yaml b/tests/spread/general/appstream-remote-gfx/expected_snap.yaml index 3aed34bb7d..196beffb60 100644 --- a/tests/spread/general/appstream-remote-gfx/expected_snap.yaml +++ b/tests/spread/general/appstream-remote-gfx/expected_snap.yaml @@ -17,11 +17,11 @@ apps: command: usr/bin/appstream-desktop common-id: io.snapcraft.appstream command-chain: - - snap/command-chain/snapcraft-runner + - snap/command-chain/snapcraft-runner architectures: -- amd64 + - amd64 assumes: -- command-chain + - command-chain base: core18 confinement: strict grade: devel diff --git a/tests/spread/general/appstream-remote-gfx/expected_snap_core22.yaml b/tests/spread/general/appstream-remote-gfx/expected_snap_core22.yaml index b86ec8f3e5..e79b673924 100644 --- a/tests/spread/general/appstream-remote-gfx/expected_snap_core22.yaml +++ b/tests/spread/general/appstream-remote-gfx/expected_snap_core22.yaml @@ -15,7 +15,7 @@ description: |- Test me please. license: GPL-2.0+ architectures: -- amd64 + - amd64 base: core22 apps: appstream-desktop: @@ -28,4 +28,4 @@ environment: PATH: $SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH links: website: - - https://snapcraft.io + - https://snapcraft.io diff --git a/tests/spread/general/content-interface-provider-found/snaps/provider/snap/snapcraft.yaml b/tests/spread/general/content-interface-provider-found/snaps/provider/snap/snapcraft.yaml index c8226b3a95..de574da9f2 100644 --- a/tests/spread/general/content-interface-provider-found/snaps/provider/snap/snapcraft.yaml +++ b/tests/spread/general/content-interface-provider-found/snaps/provider/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: content-test -version: '0.1' +version: "0.1" summary: snap using a plug with a content interface should install description: | Defining a plug using the content interface should install the snap diff --git a/tests/spread/general/content-interface-provider-found/task.yaml b/tests/spread/general/content-interface-provider-found/task.yaml index 72efdd889d..040b6c0da2 100644 --- a/tests/spread/general/content-interface-provider-found/task.yaml +++ b/tests/spread/general/content-interface-provider-found/task.yaml @@ -25,4 +25,3 @@ execute: | echo "snap listed as default provider was not installed" exit 1 fi - diff --git a/tests/spread/general/content-interface-provider-not-found/snaps/provider/snap/snapcraft.yaml b/tests/spread/general/content-interface-provider-not-found/snaps/provider/snap/snapcraft.yaml index 4d5d7aee73..bd0850c286 100644 --- a/tests/spread/general/content-interface-provider-not-found/snaps/provider/snap/snapcraft.yaml +++ b/tests/spread/general/content-interface-provider-not-found/snaps/provider/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: content-test -version: '0.1' +version: "0.1" summary: snap using a plug with a content interface that cannot be found description: | Defining a plug using the content interface should only warn when it diff --git a/tests/spread/general/dependency-check-missing-lib/snaps/missing-lib/snap/snapcraft.yaml b/tests/spread/general/dependency-check-missing-lib/snaps/missing-lib/snap/snapcraft.yaml index 4219c646a1..d2d608affa 100644 --- a/tests/spread/general/dependency-check-missing-lib/snaps/missing-lib/snap/snapcraft.yaml +++ b/tests/spread/general/dependency-check-missing-lib/snaps/missing-lib/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: missing-lib -version: 'test1' +version: "test1" summary: test description: test grade: stable diff --git a/tests/spread/general/dependency-check-missing-none/snaps/missing-none/snap/snapcraft.yaml b/tests/spread/general/dependency-check-missing-none/snaps/missing-none/snap/snapcraft.yaml index 721e5242ba..24ea4f7467 100644 --- a/tests/spread/general/dependency-check-missing-none/snaps/missing-none/snap/snapcraft.yaml +++ b/tests/spread/general/dependency-check-missing-none/snaps/missing-none/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: missing-none -version: 'test1' +version: "test1" summary: test description: test grade: stable diff --git a/tests/spread/general/environment/expected_snap.yaml b/tests/spread/general/environment/expected_snap.yaml index f50a5a8a7b..ada8e3a9c9 100644 --- a/tests/spread/general/environment/expected_snap.yaml +++ b/tests/spread/general/environment/expected_snap.yaml @@ -1,5 +1,5 @@ name: environment-tests -version: '1.0' +version: "1.0" summary: environment-tests description: environment-tests apps: @@ -10,11 +10,11 @@ apps: c: foo b: foo command-chain: - - snap/command-chain/snapcraft-runner + - snap/command-chain/snapcraft-runner architectures: -- amd64 + - amd64 assumes: -- command-chain + - command-chain base: core18 confinement: strict environment: diff --git a/tests/spread/general/environment/snaps/environment-tests/snapcraft.yaml b/tests/spread/general/environment/snaps/environment-tests/snapcraft.yaml index bcdf5a9af6..496b6fe61b 100644 --- a/tests/spread/general/environment/snaps/environment-tests/snapcraft.yaml +++ b/tests/spread/general/environment/snaps/environment-tests/snapcraft.yaml @@ -11,8 +11,7 @@ parts: environment-tests: plugin: nil source: . - override-build: - install -m 0755 hello $SNAPCRAFT_PART_INSTALL/ + override-build: install -m 0755 hello $SNAPCRAFT_PART_INSTALL/ apps: hello: diff --git a/tests/spread/general/expand-extensions/snapcraft.yaml b/tests/spread/general/expand-extensions/snapcraft.yaml index 4a523ece6e..014dbeec2f 100644 --- a/tests/spread/general/expand-extensions/snapcraft.yaml +++ b/tests/spread/general/expand-extensions/snapcraft.yaml @@ -1,6 +1,6 @@ name: expand-extensions base: core22 -version: '0.1' +version: "0.1" summary: "Test `expand-extensions` expands extensions." description: | This snapcraft.yaml includes regression tests to verify extensions, parse-info, @@ -20,7 +20,7 @@ parts: nil: plugin: nil parse-info: - - usr/share/metainfo/app.appdata.xml + - usr/share/metainfo/app.appdata.xml stage-packages: - mesa-opencl-icd - ocl-icd-libopencl1 diff --git a/tests/spread/general/grammar/snap/snapcraft.yaml b/tests/spread/general/grammar/snap/snapcraft.yaml index 7d489d89bc..073fed7abd 100644 --- a/tests/spread/general/grammar/snap/snapcraft.yaml +++ b/tests/spread/general/grammar/snap/snapcraft.yaml @@ -17,5 +17,5 @@ parts: hello-world: plugin: dump source: - - on amd64 to amd64: src/on-amd64-to-amd64 - - on amd64 to arm64: src/on-amd64-to-arm64 + - on amd64 to amd64: src/on-amd64-to-amd64 + - on amd64 to arm64: src/on-amd64-to-arm64 diff --git a/tests/spread/general/hooks/generated-and-project-hooks/snap/snapcraft.yaml b/tests/spread/general/hooks/generated-and-project-hooks/snap/snapcraft.yaml index c5154e2503..5714a4cbdd 100644 --- a/tests/spread/general/hooks/generated-and-project-hooks/snap/snapcraft.yaml +++ b/tests/spread/general/hooks/generated-and-project-hooks/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: generated-and-project-hooks base: core22 -version: '1.0' +version: "1.0" summary: Test conflicting generated and project hooks. description: Project hooks in $PROJECT/snap/hooks/ should take priority over conflicting code generated hooks. grade: stable diff --git a/tests/spread/general/hooks/generated-hooks/snap/snapcraft.yaml b/tests/spread/general/hooks/generated-hooks/snap/snapcraft.yaml index e2c69ec4ee..b397273795 100644 --- a/tests/spread/general/hooks/generated-hooks/snap/snapcraft.yaml +++ b/tests/spread/general/hooks/generated-hooks/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: generated-hooks base: core22 -version: '1.0' +version: "1.0" summary: Test generated hooks. description: Code generated hooks should be built and executed via a hook wrapper. grade: stable diff --git a/tests/spread/general/hooks/generated-then-project-hooks/snap/snapcraft.yaml b/tests/spread/general/hooks/generated-then-project-hooks/snap/snapcraft.yaml index ae3393c296..78dbcd72dc 100644 --- a/tests/spread/general/hooks/generated-then-project-hooks/snap/snapcraft.yaml +++ b/tests/spread/general/hooks/generated-then-project-hooks/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: generated-then-project-hooks base: core22 -version: '1.0' +version: "1.0" summary: Test generated and project hooks. description: Execute snapcraft with a code generated hook, then add a conflicting project hook and re-execute snapcraft. grade: stable diff --git a/tests/spread/general/hooks/project-hooks-updated/snap/snapcraft.yaml b/tests/spread/general/hooks/project-hooks-updated/snap/snapcraft.yaml index fd989fbc01..c15f6d8479 100644 --- a/tests/spread/general/hooks/project-hooks-updated/snap/snapcraft.yaml +++ b/tests/spread/general/hooks/project-hooks-updated/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: project-hooks-updated base: core22 -version: '1.0' +version: "1.0" summary: Test project hook updates. description: Execute snapcraft, update project hook, then re-executed snapcraft. grade: stable diff --git a/tests/spread/general/hooks/project-hooks/snap/snapcraft.yaml b/tests/spread/general/hooks/project-hooks/snap/snapcraft.yaml index 317f6dc01e..6f5a555575 100644 --- a/tests/spread/general/hooks/project-hooks/snap/snapcraft.yaml +++ b/tests/spread/general/hooks/project-hooks/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: project-hooks base: core22 -version: '1.0' +version: "1.0" summary: Test project hooks. description: Project hooks should be copied from $PROJECT/snap/hooks/ to $PRIME/meta/hooks/. grade: stable diff --git a/tests/spread/general/hooks/stub-hooks/task.yaml b/tests/spread/general/hooks/stub-hooks/task.yaml index a55641d3e9..ebced6e2d9 100644 --- a/tests/spread/general/hooks/stub-hooks/task.yaml +++ b/tests/spread/general/hooks/stub-hooks/task.yaml @@ -31,7 +31,7 @@ execute: | echo "Stub hook missing" exit 1 fi - + # Verify stub hook content hook_content=$(cat prime/meta/hooks/install) if [ "${hook_content}" != "#!/bin/true" ]; then diff --git a/tests/spread/general/invalid-elf/snaps/invalid_elf/snap/snapcraft.yaml b/tests/spread/general/invalid-elf/snaps/invalid_elf/snap/snapcraft.yaml index 6dc87245ed..8a23b576d7 100644 --- a/tests/spread/general/invalid-elf/snaps/invalid_elf/snap/snapcraft.yaml +++ b/tests/spread/general/invalid-elf/snaps/invalid_elf/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: invalid-elf-test -version: '1.0' +version: "1.0" summary: Snap to test that corrupted ELF files don't throw off priming step description: | If this snap primes properly, then snapcraft doesn't throw errors when it encounters diff --git a/tests/spread/general/list-plugins/snapcraft.yaml b/tests/spread/general/list-plugins/snapcraft.yaml index 3b53d44f40..9da58b1265 100644 --- a/tests/spread/general/list-plugins/snapcraft.yaml +++ b/tests/spread/general/list-plugins/snapcraft.yaml @@ -1,6 +1,6 @@ name: list-plugins base: core22 -version: '0.1' +version: "0.1" summary: "Test `list-plugins` and `plugins` can successfully parse plugins." description: | This snapcraft.yaml includes regression tests to verify extensions, parse-info, @@ -18,7 +18,7 @@ parts: nil: plugin: nil parse-info: - - usr/share/metainfo/photos.ansel.app.appdata.xml + - usr/share/metainfo/photos.ansel.app.appdata.xml stage-packages: - mesa-opencl-icd - ocl-icd-libopencl1 diff --git a/tests/spread/general/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml b/tests/spread/general/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml index 10f6abe73a..6aa7543ee9 100644 --- a/tests/spread/general/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml +++ b/tests/spread/general/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-fingerprint -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -13,8 +13,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/general/package-repositories/test-apt-key-name/snap/snapcraft.yaml b/tests/spread/general/package-repositories/test-apt-key-name/snap/snapcraft.yaml index 787e9be022..a59099882f 100644 --- a/tests/spread/general/package-repositories/test-apt-key-name/snap/snapcraft.yaml +++ b/tests/spread/general/package-repositories/test-apt-key-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-key-name -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -13,8 +13,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/general/package-repositories/test-apt-keyserver/snap/snapcraft.yaml b/tests/spread/general/package-repositories/test-apt-keyserver/snap/snapcraft.yaml index b2c71fac97..962969d900 100644 --- a/tests/spread/general/package-repositories/test-apt-keyserver/snap/snapcraft.yaml +++ b/tests/spread/general/package-repositories/test-apt-keyserver/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-keyserver -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -13,8 +13,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/general/package-repositories/test-apt-path/snap/snapcraft.yaml b/tests/spread/general/package-repositories/test-apt-path/snap/snapcraft.yaml index d04258d0d6..df0bb27831 100644 --- a/tests/spread/general/package-repositories/test-apt-path/snap/snapcraft.yaml +++ b/tests/spread/general/package-repositories/test-apt-path/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -10,7 +10,7 @@ parts: test-ppa: plugin: nil stage-packages: - - datacenter-gpu-manager + - datacenter-gpu-manager package-repositories: - type: apt diff --git a/tests/spread/general/package-repositories/test-apt-ppa/snap/snapcraft.yaml b/tests/spread/general/package-repositories/test-apt-ppa/snap/snapcraft.yaml index 9d32c7ebdc..2eee0380d9 100644 --- a/tests/spread/general/package-repositories/test-apt-ppa/snap/snapcraft.yaml +++ b/tests/spread/general/package-repositories/test-apt-ppa/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: test-apt-ppa -version: '1.0' +version: "1.0" summary: test description: test grade: stable @@ -13,8 +13,8 @@ parts: - test-ppa apps: - test-ppa: - command: usr/bin/test-ppa + test-ppa: + command: usr/bin/test-ppa package-repositories: - type: apt diff --git a/tests/spread/general/parallel-install/snap/snapcraft.yaml b/tests/spread/general/parallel-install/snap/snapcraft.yaml index ba81a157b2..410e740e40 100644 --- a/tests/spread/general/parallel-install/snap/snapcraft.yaml +++ b/tests/spread/general/parallel-install/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: parallel-install base: core22 -version: '1.0' -summary: 'remove-hook' +version: "1.0" +summary: "remove-hook" description: Verify snapcraft can be installed in parallel. grade: stable confinement: strict diff --git a/tests/spread/general/parallel-install/task.yaml b/tests/spread/general/parallel-install/task.yaml index 6e7cc7abab..b36cb403f0 100644 --- a/tests/spread/general/parallel-install/task.yaml +++ b/tests/spread/general/parallel-install/task.yaml @@ -1,5 +1,5 @@ summary: Verify snapcraft can be installed in parallel -kill-timeout: 45m # Needed for 18.04 - newer distros should be fine at 30m. +kill-timeout: 45m # Needed for 18.04 - newer distros should be fine at 30m. prepare: | #shellcheck source=tests/spread/tools/snapcraft-yaml.sh diff --git a/tests/spread/general/passthrough/expected_snap.yaml b/tests/spread/general/passthrough/expected_snap.yaml index 2d32a494b5..7a91416e4a 100644 --- a/tests/spread/general/passthrough/expected_snap.yaml +++ b/tests/spread/general/passthrough/expected_snap.yaml @@ -1,17 +1,17 @@ name: passthrough-tests -version: '1.0' +version: "1.0" summary: passthrough-tests description: passthrough-tests apps: test-cmd: command: test-cmd command-chain: - - snap/command-chain/snapcraft-runner + - snap/command-chain/snapcraft-runner pt-test-app: pt-test-app architectures: -- amd64 + - amd64 assumes: -- command-chain + - command-chain base: core20 confinement: strict grade: devel diff --git a/tests/spread/general/passthrough/snaps/passthrough-tests/snap/snapcraft.yaml b/tests/spread/general/passthrough/snaps/passthrough-tests/snap/snapcraft.yaml index 0e6957f809..894e7ba4aa 100644 --- a/tests/spread/general/passthrough/snaps/passthrough-tests/snap/snapcraft.yaml +++ b/tests/spread/general/passthrough/snaps/passthrough-tests/snap/snapcraft.yaml @@ -11,8 +11,7 @@ parts: passthrough-tests: plugin: nil source: . - override-build: - install -m 0755 test-cmd $SNAPCRAFT_PART_INSTALL/ + override-build: install -m 0755 test-cmd $SNAPCRAFT_PART_INSTALL/ apps: test-cmd: diff --git a/tests/spread/general/project-variables/snap/snapcraft.yaml b/tests/spread/general/project-variables/snap/snapcraft.yaml index 683132e2b2..ff35388e3e 100644 --- a/tests/spread/general/project-variables/snap/snapcraft.yaml +++ b/tests/spread/general/project-variables/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: project-variables base: core20 -version: '1.0' +version: "1.0" summary: test description: | Project variables should be evaluated in $VAR or ${VAR} form. diff --git a/tests/spread/general/scriptlets/scriptlet-failures/snap/snapcraft.yaml b/tests/spread/general/scriptlets/scriptlet-failures/snap/snapcraft.yaml index 417cbc35eb..9cb544d48c 100644 --- a/tests/spread/general/scriptlets/scriptlet-failures/snap/snapcraft.yaml +++ b/tests/spread/general/scriptlets/scriptlet-failures/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: snapcraftctl-build-failure base: core20 -version: '0.1' +version: "0.1" summary: Fail on snapcraftctl build description: | Failing with purpose. diff --git a/tests/spread/general/snap-config/snap/snapcraft.yaml b/tests/spread/general/snap-config/snap/snapcraft.yaml index 7aa04a0177..5159111c59 100644 --- a/tests/spread/general/snap-config/snap/snapcraft.yaml +++ b/tests/spread/general/snap-config/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: hello-world base: core22 -version: '1.0' -summary: 'hello-world' +version: "1.0" +summary: "hello-world" description: | Run `cat` on a config file. grade: stable diff --git a/tests/spread/general/snaps/classic-patchelf/snap/snapcraft.yaml b/tests/spread/general/snaps/classic-patchelf/snap/snapcraft.yaml index 74033432e9..3cf851bd9c 100644 --- a/tests/spread/general/snaps/classic-patchelf/snap/snapcraft.yaml +++ b/tests/spread/general/snaps/classic-patchelf/snap/snapcraft.yaml @@ -5,7 +5,6 @@ description: | Build a classic confined snap, mostly used to test the provisioning of `core` inside a snap. base: core - grade: devel confinement: classic diff --git a/tests/spread/general/snaps/strict-patchelf/snap/snapcraft.yaml b/tests/spread/general/snaps/strict-patchelf/snap/snapcraft.yaml index b3394b36d7..7a72a05e05 100644 --- a/tests/spread/general/snaps/strict-patchelf/snap/snapcraft.yaml +++ b/tests/spread/general/snaps/strict-patchelf/snap/snapcraft.yaml @@ -4,7 +4,6 @@ summary: Build a strictly confined snap description: | Build a strictly confined snap to test ELF patching base: core - grade: devel confinement: strict diff --git a/tests/spread/general/sources/snaps/bzr-commit/snapcraft.yaml b/tests/spread/general/sources/snaps/bzr-commit/snapcraft.yaml index c5605f9917..0318533b19 100644 --- a/tests/spread/general/sources/snaps/bzr-commit/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/bzr-commit/snapcraft.yaml @@ -6,8 +6,8 @@ description: a longer description confinement: strict parts: - bzr: - plugin: dump - source: lp:gnuhello - source-type: bzr - source-commit: "1" + bzr: + plugin: dump + source: lp:gnuhello + source-type: bzr + source-commit: "1" diff --git a/tests/spread/general/sources/snaps/bzr-head/snapcraft.yaml b/tests/spread/general/sources/snaps/bzr-head/snapcraft.yaml index ff634ab4b5..47cdbfca00 100644 --- a/tests/spread/general/sources/snaps/bzr-head/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/bzr-head/snapcraft.yaml @@ -6,7 +6,7 @@ description: a longer description confinement: strict parts: - bzr: - plugin: dump - source: lp:gnuhello - source-type: bzr + bzr: + plugin: dump + source: lp:gnuhello + source-type: bzr diff --git a/tests/spread/general/sources/snaps/bzr-tag/snapcraft.yaml b/tests/spread/general/sources/snaps/bzr-tag/snapcraft.yaml index a2369908f0..fd9818ffc3 100644 --- a/tests/spread/general/sources/snaps/bzr-tag/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/bzr-tag/snapcraft.yaml @@ -6,8 +6,8 @@ description: a longer description confinement: strict parts: - bzr: - plugin: dump - source: lp:gnuhello - source-type: bzr - source-tag: v2.7.1 + bzr: + plugin: dump + source: lp:gnuhello + source-type: bzr + source-tag: v2.7.1 diff --git a/tests/spread/general/sources/snaps/git-commit/snapcraft.yaml b/tests/spread/general/sources/snaps/git-commit/snapcraft.yaml index b08b1f51cd..c6950c7512 100644 --- a/tests/spread/general/sources/snaps/git-commit/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/git-commit/snapcraft.yaml @@ -6,8 +6,8 @@ description: a longer description confinement: strict parts: - git: - plugin: dump - source: https://github.com/snapcore/core18 - source-type: git - source-commit: "HEAD" + git: + plugin: dump + source: https://github.com/snapcore/core18 + source-type: git + source-commit: "HEAD" diff --git a/tests/spread/general/sources/snaps/git-depth/snapcraft.yaml b/tests/spread/general/sources/snaps/git-depth/snapcraft.yaml index 9656102d07..6384bcce46 100644 --- a/tests/spread/general/sources/snaps/git-depth/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/git-depth/snapcraft.yaml @@ -6,8 +6,8 @@ description: Make sure source-depth works confinement: strict parts: - git: - plugin: dump - source: https://github.com/snapcore/core18 - source-type: git - source-depth: 1 + git: + plugin: dump + source: https://github.com/snapcore/core18 + source-type: git + source-depth: 1 diff --git a/tests/spread/general/sources/snaps/git-head/snapcraft.yaml b/tests/spread/general/sources/snaps/git-head/snapcraft.yaml index 4c41577deb..666c6106d5 100644 --- a/tests/spread/general/sources/snaps/git-head/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/git-head/snapcraft.yaml @@ -6,7 +6,7 @@ description: a longer description confinement: strict parts: - git: - plugin: dump - source: https://github.com/snapcore/core18 - source-type: git + git: + plugin: dump + source: https://github.com/snapcore/core18 + source-type: git diff --git a/tests/spread/general/sources/snaps/git-submodules/snapcraft.yaml b/tests/spread/general/sources/snaps/git-submodules/snapcraft.yaml index c5c42bdc6d..928ff7b4c5 100644 --- a/tests/spread/general/sources/snaps/git-submodules/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/git-submodules/snapcraft.yaml @@ -6,10 +6,10 @@ description: Make sure source-submodules works confinement: strict parts: - git: - plugin: dump - source: https://github.com/snapcore/core18 - source-type: git - source-submodules: - - submodule_1 - - dir/submodule_2 + git: + plugin: dump + source: https://github.com/snapcore/core18 + source-type: git + source-submodules: + - submodule_1 + - dir/submodule_2 diff --git a/tests/spread/general/sources/snaps/local-source-type/snapcraft.yaml b/tests/spread/general/sources/snaps/local-source-type/snapcraft.yaml index 3106709801..4a154818d2 100644 --- a/tests/spread/general/sources/snaps/local-source-type/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/local-source-type/snapcraft.yaml @@ -6,7 +6,7 @@ description: a longer description confinement: strict parts: - make-project: - plugin: dump - source: . - source-type: local + make-project: + plugin: dump + source: . + source-type: local diff --git a/tests/spread/general/sources/snaps/local-source/snapcraft.yaml b/tests/spread/general/sources/snaps/local-source/snapcraft.yaml index 7ce87ef8e1..c2331f45c9 100644 --- a/tests/spread/general/sources/snaps/local-source/snapcraft.yaml +++ b/tests/spread/general/sources/snaps/local-source/snapcraft.yaml @@ -6,6 +6,6 @@ description: a longer description confinement: strict parts: - make-project: - plugin: dump - source: . + make-project: + plugin: dump + source: . diff --git a/tests/spread/general/stage-snaps-normalization/task.yaml b/tests/spread/general/stage-snaps-normalization/task.yaml index 7e277eb06a..0e14ec6274 100644 --- a/tests/spread/general/stage-snaps-normalization/task.yaml +++ b/tests/spread/general/stage-snaps-normalization/task.yaml @@ -14,7 +14,7 @@ prepare: | snapcraft init set_base "snap/snapcraft.yaml" - + if [[ "$SPREAD_SYSTEM" =~ ubuntu-20.04 ]]; then PC_TRACK="20" else diff --git a/tests/spread/general/stage_snaps/task.yaml b/tests/spread/general/stage_snaps/task.yaml index c6b74ab271..2409c8a833 100644 --- a/tests/spread/general/stage_snaps/task.yaml +++ b/tests/spread/general/stage_snaps/task.yaml @@ -13,7 +13,7 @@ prepare: | cd test-snap snapcraft init set_base "snap/snapcraft.yaml" - + echo " stage-snaps: [$STAGE_SNAPS]" >> snap/snapcraft.yaml restore: | diff --git a/tests/spread/general/strict-patchelf/task.yaml b/tests/spread/general/strict-patchelf/task.yaml index 6f81b8cf1d..b429ae5049 100644 --- a/tests/spread/general/strict-patchelf/task.yaml +++ b/tests/spread/general/strict-patchelf/task.yaml @@ -64,4 +64,3 @@ execute: | # Verify binary rpath patching without existing rpath patchelf --print-interpreter prime/bin/hello-strict-enable-patchelf | MATCH "^/snap/$base/current/lib.*ld.*.so.*" patchelf --print-rpath prime/bin/hello-strict-enable-patchelf | MATCH "${RPATH_MATCH}" - diff --git a/tests/spread/general/unicode-metadata/expected_snap_tmpl.yaml b/tests/spread/general/unicode-metadata/expected_snap_tmpl.yaml index b08ca07c9b..4e51f2091b 100644 --- a/tests/spread/general/unicode-metadata/expected_snap_tmpl.yaml +++ b/tests/spread/general/unicode-metadata/expected_snap_tmpl.yaml @@ -1,5 +1,5 @@ name: unicode-description -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | GNOME Calculator is an application that solves mathematical equations. @@ -20,7 +20,7 @@ description: | decimal, and hexadecimal), boolean algebra, one’s and two’s complementation, character to character code conversion, and more. architectures: -- amd64 -base: {{BASE}} + - amd64 +base: { { BASE } } confinement: devmode grade: devel diff --git a/tests/spread/general/unicode-metadata/snap/snapcraft.yaml b/tests/spread/general/unicode-metadata/snap/snapcraft.yaml index 8a6e9a62e7..a5a57ea725 100644 --- a/tests/spread/general/unicode-metadata/snap/snapcraft.yaml +++ b/tests/spread/general/unicode-metadata/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: unicode-description base: core18 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap # 79 char long summary description: | GNOME Calculator is an application that solves mathematical equations. diff --git a/tests/spread/plugins/craft-parts/build-and-run-hello/conda-hello/snap/snapcraft.yaml b/tests/spread/plugins/craft-parts/build-and-run-hello/conda-hello/snap/snapcraft.yaml index dd11e3f1f4..c274b84ec0 100644 --- a/tests/spread/plugins/craft-parts/build-and-run-hello/conda-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/build-and-run-hello/conda-hello/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: conda-hello -version: '1.0' +version: "1.0" summary: Hello world using ipython from conda packages description: | Leverage conda-packages to install ipython and use it to say "hello world". @@ -10,15 +10,14 @@ confinement: strict apps: conda-hello: - command: - hello + command: hello parts: ipython: plugin: conda conda-miniconda-version: "py39_4.12.0" conda-packages: - - ipython + - ipython conda-python-version: "3.9" hello: plugin: dump diff --git a/tests/spread/plugins/craft-parts/build-and-run-hello/dotnet-hello/snap/snapcraft.yaml b/tests/spread/plugins/craft-parts/build-and-run-hello/dotnet-hello/snap/snapcraft.yaml index ff8345e692..08c3c723db 100644 --- a/tests/spread/plugins/craft-parts/build-and-run-hello/dotnet-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/build-and-run-hello/dotnet-hello/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: dotnet-hello base: core22 -version: '1.0' +version: "1.0" summary: a simple dotnet snap description: a simple dotnet snap diff --git a/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/analysis_options.yaml b/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/analysis_options.yaml index 61b6c4de17..fd16f92198 100644 --- a/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/analysis_options.yaml +++ b/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/analysis_options.yaml @@ -24,6 +24,5 @@ linter: rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/pubspec.yaml b/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/pubspec.yaml index da4590f864..d6892d4b9c 100644 --- a/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/pubspec.yaml +++ b/tests/spread/plugins/craft-parts/build-and-run-hello/flutter-hello/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=2.18.6 <3.0.0' + sdk: ">=2.18.6 <3.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -32,7 +32,6 @@ dependencies: flutter: sdk: flutter - # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 @@ -53,7 +52,6 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. diff --git a/tests/spread/plugins/craft-parts/build-and-run-hello/maven-hello/snap/snapcraft.yaml b/tests/spread/plugins/craft-parts/build-and-run-hello/maven-hello/snap/snapcraft.yaml index f98f6bd901..0cf9b19b7b 100644 --- a/tests/spread/plugins/craft-parts/build-and-run-hello/maven-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/build-and-run-hello/maven-hello/snap/snapcraft.yaml @@ -1,11 +1,11 @@ name: maven-hello -version: '1.0' +version: "1.0" summary: A test project description: | A test project for the maven plugin. It says hello. grade: stable # must be 'stable' to release into candidate/stable channels -confinement: strict # use 'strict' once you have the right plugs and slots +confinement: strict # use 'strict' once you have the right plugs and slots base: core22 lint: diff --git a/tests/spread/plugins/craft-parts/colcon-msg-package/colcon-msg-package/snap/snapcraft.yaml b/tests/spread/plugins/craft-parts/colcon-msg-package/colcon-msg-package/snap/snapcraft.yaml index e5715ee3eb..cd83945e9f 100644 --- a/tests/spread/plugins/craft-parts/colcon-msg-package/colcon-msg-package/snap/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/colcon-msg-package/colcon-msg-package/snap/snapcraft.yaml @@ -21,4 +21,3 @@ parts: source-branch: humble source-subdir: pendulum_msgs build-packages: [g++, make] - diff --git a/tests/spread/plugins/craft-parts/kernel/snapcraft.yaml b/tests/spread/plugins/craft-parts/kernel/snapcraft.yaml index fd5c67ff6c..6ef6c0e7f2 100644 --- a/tests/spread/plugins/craft-parts/kernel/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/kernel/snapcraft.yaml @@ -59,15 +59,15 @@ parts: - -kernel.img* build-packages: - - bison - - cpio - - curl - - debhelper - - dpkg-dev - - fakeroot - - flex - - gcc - - libfdt-dev - - libssl-dev - - libelf-dev - - sbsigntool + - bison + - cpio + - curl + - debhelper + - dpkg-dev + - fakeroot + - flex + - gcc + - libfdt-dev + - libssl-dev + - libelf-dev + - sbsigntool diff --git a/tests/spread/plugins/craft-parts/matter-sdk/snapcraft.yaml b/tests/spread/plugins/craft-parts/matter-sdk/snapcraft.yaml index 73766084c8..6d3f33917b 100644 --- a/tests/spread/plugins/craft-parts/matter-sdk/snapcraft.yaml +++ b/tests/spread/plugins/craft-parts/matter-sdk/snapcraft.yaml @@ -40,9 +40,8 @@ parts: cd ../../matter-sdk/build/examples/lighting-app/linux gn gen out/build ninja -C out/build - + ldd out/build/chip-lighting-app - + mkdir -p $CRAFT_PART_INSTALL/bin - cp out/build/chip-lighting-app $CRAFT_PART_INSTALL/bin/lighting-app - + cp out/build/chip-lighting-app $CRAFT_PART_INSTALL/bin/lighting-app diff --git a/tests/spread/plugins/craft-parts/matter-sdk/task.yaml b/tests/spread/plugins/craft-parts/matter-sdk/task.yaml index f293c114cd..0560c537d5 100644 --- a/tests/spread/plugins/craft-parts/matter-sdk/task.yaml +++ b/tests/spread/plugins/craft-parts/matter-sdk/task.yaml @@ -47,4 +47,3 @@ execute: | echo "Error: matter-lighting initialization failed." exit 1 fi - \ No newline at end of file diff --git a/tests/spread/plugins/craft-parts/python-symlinks/task.yaml b/tests/spread/plugins/craft-parts/python-symlinks/task.yaml index 9dbc838fc7..a7ddf24a6a 100644 --- a/tests/spread/plugins/craft-parts/python-symlinks/task.yaml +++ b/tests/spread/plugins/craft-parts/python-symlinks/task.yaml @@ -40,4 +40,4 @@ execute: | [ "$(readlink prime/bin/python3)" == "$(cat expected-symlink)" ] else snapcraft prime 2>&1 | MATCH "No suitable Python interpreter found, giving up." - fi + fi diff --git a/tests/spread/plugins/v1/x-local/snaps/source-get/snap/snapcraft.yaml b/tests/spread/plugins/v1/x-local/snaps/source-get/snap/snapcraft.yaml index 66ea5d7b9c..3d6c82e28b 100644 --- a/tests/spread/plugins/v1/x-local/snaps/source-get/snap/snapcraft.yaml +++ b/tests/spread/plugins/v1/x-local/snaps/source-get/snap/snapcraft.yaml @@ -7,6 +7,6 @@ confinement: strict grade: devel parts: - x-local-plugin: - plugin: x-local-plugin - source: . + x-local-plugin: + plugin: x-local-plugin + source: . diff --git a/tests/spread/plugins/v2/colcon-ros2-daemon/task.yaml b/tests/spread/plugins/v2/colcon-ros2-daemon/task.yaml index bb131dbbc8..9da104f163 100644 --- a/tests/spread/plugins/v2/colcon-ros2-daemon/task.yaml +++ b/tests/spread/plugins/v2/colcon-ros2-daemon/task.yaml @@ -1,5 +1,5 @@ summary: Build and run a basic daemon colcon snap -priority: 100 # Run this test early so we're not waiting for it +priority: 100 # Run this test early so we're not waiting for it environment: SNAP_DIR: ../snaps/colcon-daemon diff --git a/tests/spread/plugins/v2/kernel/snapcraft.yaml b/tests/spread/plugins/v2/kernel/snapcraft.yaml index 3bdb67e772..5e35ea8289 100644 --- a/tests/spread/plugins/v2/kernel/snapcraft.yaml +++ b/tests/spread/plugins/v2/kernel/snapcraft.yaml @@ -53,14 +53,14 @@ parts: curl -s ${trim_tool} | bash /dev/stdin ${SNAPCRAFT_PRIME} build-packages: - - bison - - cpio - - curl - - debhelper - - dpkg-dev - - fakeroot - - flex - - gcc - - libfdt-dev - - libssl-dev - - libelf-dev + - bison + - cpio + - curl + - debhelper + - dpkg-dev + - fakeroot + - flex + - gcc + - libfdt-dev + - libssl-dev + - libelf-dev diff --git a/tests/spread/plugins/v2/kernel/task.yaml b/tests/spread/plugins/v2/kernel/task.yaml index 3b39f9de97..967114a9b8 100644 --- a/tests/spread/plugins/v2/kernel/task.yaml +++ b/tests/spread/plugins/v2/kernel/task.yaml @@ -2,7 +2,7 @@ summary: V2 kernel plugin test manual: true kill-timeout: 180m -systems: +systems: - ubuntu-22.04-64 restore: | diff --git a/tests/spread/plugins/v2/snaps/catkin-stage-snaps/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/catkin-stage-snaps/snap/snapcraft.yaml index 342113e9ec..b6ea27ae50 100644 --- a/tests/spread/plugins/v2/snaps/catkin-stage-snaps/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/catkin-stage-snaps/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: catkin-stage-snaps -version: '1.0' +version: "1.0" summary: ROS stage-snaps test description: Verify that ROS stage-snaps are checked for dependencies. confinement: strict @@ -19,11 +19,11 @@ package-repositories: parts: ros1-noetic-extension: - build-packages: - - ros-noetic-catkin - override-build: install -D -m 0755 launch ${SNAPCRAFT_PART_INSTALL}/snap/command-chain/ros1-launch - plugin: nil - source: $SNAPCRAFT_EXTENSIONS_DIR/ros1 + build-packages: + - ros-noetic-catkin + override-build: install -D -m 0755 launch ${SNAPCRAFT_PART_INSTALL}/snap/command-chain/ros1-launch + plugin: nil + source: $SNAPCRAFT_EXTENSIONS_DIR/ros1 catkin-part: plugin: catkin source: . diff --git a/tests/spread/plugins/v2/snaps/colcon-stage-snaps/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/colcon-stage-snaps/snap/snapcraft.yaml index 0f97c38419..c9573a0d16 100644 --- a/tests/spread/plugins/v2/snaps/colcon-stage-snaps/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/colcon-stage-snaps/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: colcon-stage-snaps -version: '1.0' +version: "1.0" summary: ROS 2 stage-snaps test description: Verify that ROS 2 stage-snaps are checked for dependencies. confinement: strict diff --git a/tests/spread/plugins/v2/snaps/conda-hello/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/conda-hello/snap/snapcraft.yaml index ddf4c9fef3..6d3ac9d4d6 100644 --- a/tests/spread/plugins/v2/snaps/conda-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/conda-hello/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: conda-hello -version: '1.0' +version: "1.0" summary: Hello world using ipython from conda packages description: | Leverage conda-packages to install ipython and use it to say "hello world". @@ -10,15 +10,14 @@ confinement: strict apps: conda-hello: - command: - hello + command: hello parts: ipython: plugin: conda conda-miniconda-version: "py39_4.12.0" conda-packages: - - ipython + - ipython conda-python-version: "3.9" hello: plugin: dump diff --git a/tests/spread/plugins/v2/snaps/make-hello/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/make-hello/snap/snapcraft.yaml index 79bc55c5c8..661d79a9a9 100644 --- a/tests/spread/plugins/v2/snaps/make-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/make-hello/snap/snapcraft.yaml @@ -20,4 +20,3 @@ parts: make-parameters: - HELLO=1 source: . - diff --git a/tests/spread/plugins/v2/snaps/npm-hello/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/npm-hello/snap/snapcraft.yaml index f0dc462a84..323e70dfce 100644 --- a/tests/spread/plugins/v2/snaps/npm-hello/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/npm-hello/snap/snapcraft.yaml @@ -21,4 +21,3 @@ parts: source: . plugin: npm npm-node-version: "12.16.2" - diff --git a/tests/spread/plugins/v2/snaps/python-hello-multiple-parts-staged/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/python-hello-multiple-parts-staged/snap/snapcraft.yaml index 716ef63238..edb94f45b0 100644 --- a/tests/spread/plugins/v2/snaps/python-hello-multiple-parts-staged/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/python-hello-multiple-parts-staged/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: python-hello-multiple-parts-staged base: core20 -version: '1.0' +version: "1.0" summary: Test multiple python parts (staged python) description: Test multiple python parts (staged python) diff --git a/tests/spread/plugins/v2/snaps/python-hello-multiple-parts/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/python-hello-multiple-parts/snap/snapcraft.yaml index 08c958d7eb..b06fce8ade 100644 --- a/tests/spread/plugins/v2/snaps/python-hello-multiple-parts/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/python-hello-multiple-parts/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: python-hello-multiple-parts base: core20 -version: '1.0' +version: "1.0" summary: Test multiple python parts description: Test multiple python parts diff --git a/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros-package-core20/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros-package-core20/snap/snapcraft.yaml index 56b6b72254..f2d4e71779 100644 --- a/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros-package-core20/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros-package-core20/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: test-snapcraft-fake-ros-package-core20 base: core20 -version: '0.1' +version: "0.1" summary: Bare-bones ROS dependency for snapcraft CLI test description: | This snap contains a single unusable ROS package. This snap is not meant to @@ -24,11 +24,11 @@ package-repositories: parts: ros1-noetic-extension: - build-packages: - - ros-noetic-catkin - override-build: install -D -m 0755 launch ${SNAPCRAFT_PART_INSTALL}/snap/command-chain/ros1-launch - plugin: nil - source: $SNAPCRAFT_EXTENSIONS_DIR/ros1 + build-packages: + - ros-noetic-catkin + override-build: install -D -m 0755 launch ${SNAPCRAFT_PART_INSTALL}/snap/command-chain/ros1-launch + plugin: nil + source: $SNAPCRAFT_EXTENSIONS_DIR/ros1 catkin-part: plugin: catkin source: . diff --git a/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros2-package-core20/snap/snapcraft.yaml b/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros2-package-core20/snap/snapcraft.yaml index 01e753170a..bdc5756492 100644 --- a/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros2-package-core20/snap/snapcraft.yaml +++ b/tests/spread/plugins/v2/snaps/test-snapcraft-fake-ros2-package-core20/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: test-snapcraft-fake-ros2-package-core20 base: core20 -version: '0.1' +version: "0.1" summary: Bare-bones ROS 2 dependency for snapcraft CLI test description: | This snap contains a single unusable ROS 2 package. This snap is not meant to diff --git a/tests/spread/providers/lxd-type-base/task.yaml b/tests/spread/providers/lxd-type-base/task.yaml index 060380f4c7..9777c96817 100644 --- a/tests/spread/providers/lxd-type-base/task.yaml +++ b/tests/spread/providers/lxd-type-base/task.yaml @@ -24,7 +24,7 @@ execute: | /snap/bin/lxc start snapcraft-core20 /snap/bin/lxc exec snapcraft-core20 cat /etc/os-release | MATCH "VERSION_CODENAME=focal" - + # Retry stopping, as on the Google runners this sometimes times out due to system load. for _ in {1..4}; do sleep 5 diff --git a/tests/spread/providers/snaps/devices/snap/snapcraft.yaml b/tests/spread/providers/snaps/devices/snap/snapcraft.yaml index 09d9d4a4d4..378187e7f8 100644 --- a/tests/spread/providers/snaps/devices/snap/snapcraft.yaml +++ b/tests/spread/providers/snaps/devices/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: devices -version: '0.1' +version: "0.1" summary: Help verify (some) device files can be created in LXD builds description: ... diff --git a/tests/spread/providers/snaps/env-passthrough/snap/snapcraft.yaml b/tests/spread/providers/snaps/env-passthrough/snap/snapcraft.yaml index cc92349ccc..2e0c60977d 100644 --- a/tests/spread/providers/snaps/env-passthrough/snap/snapcraft.yaml +++ b/tests/spread/providers/snaps/env-passthrough/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: env-passthrough -version: '0.1' +version: "0.1" summary: Help verify environment passthrough variables are set. description: | Help verify environment passthrough variables are set. diff --git a/tests/spread/providers/snaps/exit1/snap/snapcraft.yaml b/tests/spread/providers/snaps/exit1/snap/snapcraft.yaml index c0312a3caf..a21a883d7b 100644 --- a/tests/spread/providers/snaps/exit1/snap/snapcraft.yaml +++ b/tests/spread/providers/snaps/exit1/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: exit1 -version: '0.1' +version: "0.1" summary: Single-line elevator pitch for your amazing snap description: | This is my-snap's description. You have a paragraph or two to tell the @@ -15,4 +15,3 @@ parts: test: plugin: nil override-pull: exit 1 - diff --git a/tests/spread/providers/snaps/long-name/snap/snapcraft.yaml b/tests/spread/providers/snaps/long-name/snap/snapcraft.yaml index 6fc3db5e97..2ac3ea3695 100644 --- a/tests/spread/providers/snaps/long-name/snap/snapcraft.yaml +++ b/tests/spread/providers/snaps/long-name/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: hello-world-i-am-40-characters-long-xxxx -version: '1.0' +version: "1.0" summary: test description: test grade: stable diff --git a/tests/spread/providers/snaps/managed-environment/snap/snapcraft.yaml b/tests/spread/providers/snaps/managed-environment/snap/snapcraft.yaml index 7bdc626735..fd250afd81 100644 --- a/tests/spread/providers/snaps/managed-environment/snap/snapcraft.yaml +++ b/tests/spread/providers/snaps/managed-environment/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: managed-environment -version: '0.1' +version: "0.1" summary: Help verify managed environment configuration is correct. description: | Help verify managed environment configuration is correct. diff --git a/tests/spread/snaps/lxd/task.yaml b/tests/spread/snaps/lxd/task.yaml index 7914f94592..c7ddc63996 100644 --- a/tests/spread/snaps/lxd/task.yaml +++ b/tests/spread/snaps/lxd/task.yaml @@ -2,8 +2,8 @@ summary: Build lxd using LXD and on host kill-timeout: 90m systems: -- ubuntu-20.04-64 -- ubuntu-20.04 + - ubuntu-20.04-64 + - ubuntu-20.04 environment: SNAP_REPO: https://github.com/lxc/lxd-pkg-snap diff --git a/tests/spread/snaps/maas/task.yaml b/tests/spread/snaps/maas/task.yaml index 6be68bd37d..329ab88147 100644 --- a/tests/spread/snaps/maas/task.yaml +++ b/tests/spread/snaps/maas/task.yaml @@ -2,10 +2,10 @@ summary: Build and test MaaS kill-timeout: 90m systems: -- ubuntu-18.04-64 -- ubuntu-18.04 -- ubuntu-20.04-64 -- ubuntu-20.04 + - ubuntu-18.04-64 + - ubuntu-18.04 + - ubuntu-20.04-64 + - ubuntu-20.04 environment: SNAP_REPO: https://git.launchpad.net/maas @@ -16,13 +16,13 @@ environment: prepare: | # shellcheck source=tests/spread/snaps/maas/maas_helpers.sh . maas_helpers.sh - + prepare restore: | # shellcheck source=tests/spread/snaps/maas/maas_helpers.sh . maas_helpers.sh - + restore execute: | diff --git a/tests/spread/snaps/microk8s/task.yaml b/tests/spread/snaps/microk8s/task.yaml index 52a21565a2..091cc3bf7a 100644 --- a/tests/spread/snaps/microk8s/task.yaml +++ b/tests/spread/snaps/microk8s/task.yaml @@ -2,8 +2,8 @@ summary: Build microk8s using LXD kill-timeout: 30m systems: -- ubuntu-18.04-64 -- ubuntu-18.04 + - ubuntu-18.04-64 + - ubuntu-18.04 environment: SNAP_REPO: https://github.com/ubuntu/microk8s.git diff --git a/tests/spread/store/basic-workflow/task.yaml b/tests/spread/store/basic-workflow/task.yaml index c6035c2bcf..00e18369d8 100644 --- a/tests/spread/store/basic-workflow/task.yaml +++ b/tests/spread/store/basic-workflow/task.yaml @@ -76,7 +76,7 @@ execute: | # Status snapcraft status "${snap_name}" snapcraft status "${snap_name}" --track latest --arch amd64 - + # Progressive Release snapcraft release --progressive 50 "${snap_name}" 1 candidate diff --git a/tests/unit/commands/test_remote.py b/tests/unit/commands/test_remote.py index eb9a32c8ec..3e1856cacb 100644 --- a/tests/unit/commands/test_remote.py +++ b/tests/unit/commands/test_remote.py @@ -224,6 +224,7 @@ def test_command_accept_upload( mock_run_remote_build.assert_called_once() +@pytest.mark.slow @pytest.mark.parametrize("base", const.CURRENT_BASES) @pytest.mark.usefixtures( "mock_argv", "mock_confirm", "emitter", "fake_services", "fake_sudo" diff --git a/tests/unit/extensions/test_kde_neon.py b/tests/unit/extensions/test_kde_neon.py index cc7d5fd16f..279e21a51a 100644 --- a/tests/unit/extensions/test_kde_neon.py +++ b/tests/unit/extensions/test_kde_neon.py @@ -686,12 +686,15 @@ def test_get_parts_snippet_with_external_sdk_different_channel( kde_neon_extension_with_default_build_snap_from_latest_edge_core24, ): source = get_extensions_data_dir() / "desktop" / "command-chain-kde" - assert kde_neon_extension_with_default_build_snap_from_latest_edge_core24.get_parts_snippet() == { - "kde-neon/sdk": { - "source": str(source), - "plugin": "make", - "make-parameters": [ - "GPU_WRAPPER=gpu-2404-wrapper", - ], + assert ( + kde_neon_extension_with_default_build_snap_from_latest_edge_core24.get_parts_snippet() + == { + "kde-neon/sdk": { + "source": str(source), + "plugin": "make", + "make-parameters": [ + "GPU_WRAPPER=gpu-2404-wrapper", + ], + } } - } + ) diff --git a/tests/unit/extensions/test_kde_neon_6.py b/tests/unit/extensions/test_kde_neon_6.py index 173b7f5dc6..49aec14aa7 100644 --- a/tests/unit/extensions/test_kde_neon_6.py +++ b/tests/unit/extensions/test_kde_neon_6.py @@ -696,12 +696,15 @@ def test_get_parts_snippet_with_external_sdk_different_channel( kde_neon_6_extension_with_default_build_snap_from_latest_edge_core24, ): source = get_extensions_data_dir() / "desktop" / "command-chain-kde" - assert kde_neon_6_extension_with_default_build_snap_from_latest_edge_core24.get_parts_snippet() == { - "kde-neon-6/sdk": { - "source": str(source), - "plugin": "make", - "make-parameters": [ - "GPU_WRAPPER=gpu-2404-wrapper", - ], + assert ( + kde_neon_6_extension_with_default_build_snap_from_latest_edge_core24.get_parts_snippet() + == { + "kde-neon-6/sdk": { + "source": str(source), + "plugin": "make", + "make-parameters": [ + "GPU_WRAPPER=gpu-2404-wrapper", + ], + } } - } + ) diff --git a/tests/unit/services/test_lifecycle.py b/tests/unit/services/test_lifecycle.py index 36e0db8a75..77a7dfeeee 100644 --- a/tests/unit/services/test_lifecycle.py +++ b/tests/unit/services/test_lifecycle.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Tests for the Snapcraft Lifecycle service.""" + import json import platform import shutil diff --git a/tests/unit/services/test_lifecycle_components.py b/tests/unit/services/test_lifecycle_components.py index 314373a9d0..b8c01e91af 100644 --- a/tests/unit/services/test_lifecycle_components.py +++ b/tests/unit/services/test_lifecycle_components.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Tests for Components in Snapcraft's Lifecycle service.""" + import pytest from snapcraft import errors @@ -22,7 +23,6 @@ @pytest.fixture def extra_project_params(extra_project_params): - extra_project_params["components"] = { "firstcomponent": { "type": "test", @@ -52,7 +52,6 @@ def extra_project_params(extra_project_params): ], ) def test_lifecycle_get_prime_dir(lifecycle_service, component, expected_prime): - lifecycle_service.setup() assert ( diff --git a/tests/unit/services/test_package.py b/tests/unit/services/test_package.py index 9590130d01..dc1d0b78dc 100644 --- a/tests/unit/services/test_package.py +++ b/tests/unit/services/test_package.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Tests for the Snapcraft Package service.""" + import datetime import shutil from pathlib import Path diff --git a/tests/unit/services/test_package_components.py b/tests/unit/services/test_package_components.py index a4b93b3120..06321bede3 100644 --- a/tests/unit/services/test_package_components.py +++ b/tests/unit/services/test_package_components.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Tests for Components in Snapcraft's Package service.""" + import shutil from pathlib import Path from textwrap import dedent diff --git a/tests/unit/test_application.py b/tests/unit/test_application.py index 96510664a3..0dbd984f22 100644 --- a/tests/unit/test_application.py +++ b/tests/unit/test_application.py @@ -750,7 +750,7 @@ def test_get_argv_command(command, monkeypatch): "sys.argv", [ "snapcraft", - "--verbosity" "trace", + "--verbositytrace", "--build-for=armhf", "--shell-after", command, diff --git a/tests/unit/test_snap_config.py b/tests/unit/test_snap_config.py index 7cc56b770a..b57e71e372 100644 --- a/tests/unit/test_snap_config.py +++ b/tests/unit/test_snap_config.py @@ -15,6 +15,7 @@ # along with this program. If not, see . """Unit tests for SnapConfig class.""" + from unittest.mock import MagicMock, patch import pytest diff --git a/todo.org b/todo.org deleted file mode 100644 index bce3474c32..0000000000 --- a/todo.org +++ /dev/null @@ -1,88 +0,0 @@ -#+TITLE: Snapcraft Tasks -#+STARTUP: content -#+TODO: TODO(t) STRT(s) | DONE(d) CANCELED(c) - -* Specifications - -** 2020 - -*** STRT [[file:specifications/core20-plugins.org][Snapcraft Core20 Plugins]] [7/11] - -- [X] Move =BasePlugin= to a v1 import path -- [X] Add backwards compatibility for =BasePlugin= -- [X] Rework in-tree plugin importing into a map -- [X] Introduce =snapcraft.plugins.v2.PluginV2= -- [X] Add =PluginHandler= logic for the =core20= plugin -- [ ] Plugin manifest generation. -- [ ] Detection of property changes for rebuilds. -- [X] Add CLI support for =help= -- [X] Add CLI support for =list-plugins= -- [ ] Add CLI support for =expand-plugins= -- [X] Introduce new custom plugin loading logic for =core20= - -*** TODO [[file:specifications/enabling-experimental-features.org][Enabling Experimental Features]] - -*** DONE [[file:specifications/enabling-experimental-lzo-compression.org][Enabling Experimental LZO Compression]] [3/3] -CLOSED: [2020-06-24] -- [X] Amend schema to allow =compression= -- [X] Replace =mksquashfs= with =snap pack= -- [X] Toggle compression with =snap pack= - -*** STRT [[file:specifications/progressive-releases.org][Progressive Releases]] [6/11] - -- [X] Implement channel-map endpoint -- [X] Add support for the status command -- [X] Add support for the release command -- [X] Add support for the close command -- [X] Add support for the promote command -- [X] Add support for the upload and release command -- [ ] Migrate promote away from using the state endpoint -- [ ] Remove the state endpoint -- [ ] Add support for metrics -- [ ] Add support for specific channel-map endpoint errors -- [ ] Remove experimental flag - -*** TODO [[file:specifications/environment-management.org][Build Environment Management]] [/] - -- [ ] Implement general datastore. -- [ ] Implement provider datastore. -- [ ] Migrate BuildProviders to new provider datastores. -- [ ] Implement =snapcraft clean --all-projects= command. -- [ ] Implement =snapcraft clean --all-projects --dry-run= command. -- [ ] Update providers to match documented lifecycle. -- [ ] Update documentation on snapcraft.io. - -*** STRT [[file:specifications/flutter-extension.org][Flutter Extension]] [2/4] - -- [X] Add extension variant for master -- [X] Add extension variant for dev -- [ ] Add extension variant for beta -- [ ] Add extension variant for stable - -*** TODO [[file:specifications/default-tracks.org][Default Tracks]] [2/4] - -- [X] Implement =snapcraft set-default-tracks= -- [ ] Error handling for setting invalid track names ([[https://bugs.launchpad.net/snapcraft/+bug/1892553][LP: 1892553]]) -- [X] Implement =snapcraft list-tracks= -- [ ] Add documentation for track management to the [[https://snapcraft.io/docs/release-management][Release management]] docs. - -*** TODO [[file:specifications/configurable-apt-mirror.org][Configurable APT Mirror]] [0/7] -- [ ] Add =--snapcraft-apt-mirror= command-line argument with matching - =SNAPCRAFT_APT_MIRROR= environment variable. -- [ ] Replace usage of =SNAPCRAFT_BUILD_ENVIRONMENT_PRIMARY_MIRROR= with - =SNAPCRAFT_APT_MIRROR=. - -*** DONE [[file:specifications/desktop-extensions-font-hook.org][Desktop Extensions Font Hook]] [3/3] -CLOSED: [2020-10-01 jue 10:00] - -- [X] Support hook stubs when =command-chain= is defined -- [X] Generate =configure= hook =command-chain= in desktop parts -- [X] Extend yaml for neon, gnome-2-28 and gnome-3-34 to use desktop - part's =command-chain= for the =configure= hook - -*** DONE [[file:specifications/history-to-releases.org][Snap Store API migration from v1 history to v2 releases]] [3/3] -CLOSED: [2020-10-22] - -- [X] Add bindings to Snap Store package -- [X] Use releases bindings for CLI implementing new output -- [X] Remove v1 history bindings diff --git a/tools/environment-setup-local.sh b/tools/environment-setup-local.sh deleted file mode 100755 index 881346a128..0000000000 --- a/tools/environment-setup-local.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -ex - -SNAPCRAFT_DIR=${SNAPCRAFT_DIR:=$( cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null 2>&1 && pwd )} -SNAPCRAFT_VIRTUAL_ENV_DIR=${SNAPCRAFT_VIRTUAL_ENV_DIR:=${HOME}/.venv/snapcraft} - -sudo apt update -sudo apt install --yes \ - execstack \ - g++ \ - gcc \ - intltool \ - libapt-pkg-dev \ - libffi-dev \ - libsodium-dev \ - libssl-dev \ - libxml2-dev \ - libxslt1-dev \ - libyaml-dev \ - make \ - patchelf \ - python3-dev \ - python3-pip \ - python3-venv \ - rpm2cpio \ - squashfs-tools \ - xdelta3 - -# Create a virtual environment -python3 -m venv "${SNAPCRAFT_VIRTUAL_ENV_DIR}" - -# Activate virtual environment -# shellcheck source=/dev/null -source "${SNAPCRAFT_VIRTUAL_ENV_DIR}/bin/activate" - -# Install python dependencies -export CRYPTOGRAPHY_DONT_BUILD_RUST=1 -pip install --upgrade wheel pip setuptools -pip install -r "${SNAPCRAFT_DIR}/requirements-devel.txt" -pip install -r "${SNAPCRAFT_DIR}/requirements.txt" - -# Install the project for quick tests -pip install --editable "${SNAPCRAFT_DIR}" - -# Install black to run static tests. -sudo snap install black --beta - -# Install shellcheck for static tests. -sudo snap install shellcheck - -# Install pyright for static tests. -sudo snap install pyright --classic - -# Install ruff for linting -sudo snap install ruff - -echo "Virtual environment may be activated by running:" -echo "source ${SNAPCRAFT_VIRTUAL_ENV_DIR}/bin/activate" diff --git a/tools/environment-setup.sh b/tools/environment-setup.sh deleted file mode 100755 index dfe52a4477..0000000000 --- a/tools/environment-setup.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -e - -SNAPCRAFT_DIR=${SNAPCRAFT_DIR:=$( cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null 2>&1 && pwd )} - -# Check if SNAPCRAFT_DIR is pointing to snapcraft sources. -if ! grep -q '^name: snapcraft$' "${SNAPCRAFT_DIR}/snap/snapcraft.yaml"; then - echo "This is not the snapcraft.yaml for the snapcraft project" - exit 1 -fi - -# Create the container. -if ! lxc info snapcraft-dev >/dev/null 2>&1; then - lxc init ubuntu:22.04 snapcraft-dev -fi -if ! lxc config get snapcraft-dev raw.idmap | grep -q "both $UID 1000"; then - lxc config set snapcraft-dev raw.idmap "both $UID 1000" -fi - -if ! lxc info snapcraft-dev | grep -q "Status: Running"; then - lxc start snapcraft-dev -fi - -# Wait for cloud-init before moving on. -lxc exec snapcraft-dev -- cloud-init status --wait - -# First login for ubuntu user. -lxc exec snapcraft-dev -- sudo -iu ubuntu bash -c true - -# Now that /home/ubuntu has been used, add the project. -if ! lxc config device show snapcraft-dev | grep -q snapcraft-project; then - lxc config device add snapcraft-dev snapcraft-project disk \ - source="$SNAPCRAFT_DIR" path=/home/ubuntu/snapcraft -fi - -# Install snapcraft and dependencies. -lxc exec snapcraft-dev -- sudo -iu ubuntu /home/ubuntu/snapcraft/tools/environment-setup-local.sh - -# Set virtual environment on login. -lxc exec snapcraft-dev -- sudo -iu ubuntu bash -c \ - "echo 'source /home/ubuntu/.venv/snapcraft/bin/activate' >> .profile" -lxc exec snapcraft-dev -- sudo -iu ubuntu bash -c \ - "echo 'source /home/ubuntu/.venv/snapcraft/bin/activate' >> .bashrc" - -echo "Container ready, enter it by running: " -echo "lxc exec snapcraft-dev -- sudo -iu ubuntu bash" diff --git a/tools/freeze-requirements.sh b/tools/freeze-requirements.sh deleted file mode 100755 index 41b7c45158..0000000000 --- a/tools/freeze-requirements.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -eux - -requirements_fixups() { - req_file="$1" - - # Python apt library pinned to source. - sed -i '/python-apt=*/d' "$req_file" - echo 'python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz ; sys.platform == "linux"' >> "$req_file" - - # https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1635463 - sed -i '/pkg[-_]resources==0.0.0/d' "$req_file" - - # Pinned pyinstaller for windows. - if [[ "$req_file" == "requirements-devel.txt" ]]; then - sed -i '/pyinstaller/d' "$req_file" - echo 'pyinstaller==5.13.1; sys.platform == "win32"' >> "$req_file" - fi -} - -venv_dir="$(mktemp -d)" - -# Enable system-site-packages to find python3-apt. -python3 -m venv "$venv_dir" - -# shellcheck disable=SC1090,SC1091 -source "$venv_dir/bin/activate" - -pip install -U setuptools pip wheel pip-tools - -# Pull in host python3-apt site package to avoid installation. -site_pkgs="$(readlink -f "$venv_dir"/lib/python3.*/site-packages/)" -temp_dir="$(mktemp -d)" -pushd "$temp_dir" -apt download python3-apt -dpkg -x ./*.deb . -cp -r usr/lib/python3/dist-packages/* "$site_pkgs" -popd - -pip-compile --upgrade --output-file requirements.txt -requirements_fixups "requirements.txt" - -pip-compile --upgrade --extra docs --output-file requirements-docs.txt -requirements_fixups "requirements-docs.txt" - -pip-compile --upgrade --extra dev --output-file requirements-devel.txt -requirements_fixups "requirements-devel.txt" - -rm -rf "$venv_dir" diff --git a/tools/spread-shellcheck.py b/tools/spread-shellcheck.py deleted file mode 100755 index 4baeb94453..0000000000 --- a/tools/spread-shellcheck.py +++ /dev/null @@ -1,286 +0,0 @@ -#!/usr/bin/python3 - -# Copyright (C) 2018 Canonical Ltd -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 3 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import argparse -import logging -import os -import subprocess -from concurrent.futures import ThreadPoolExecutor -from multiprocessing import cpu_count - -import yaml - -# path for shellcheck binary -SHELLCHECK = os.getenv("SHELLCHECK", "shellcheck") -# set to non-empty to ignore all errors -NO_FAIL = os.getenv("NO_FAIL") -# set to non empty to enable 'set -x' -D = os.getenv("D") -# set to non-empty to enable verbose logging -V = os.getenv("V") -# set to a number to use these many threads -N = int(os.getenv("N") or cpu_count()) -# file with list of files that can fail validation -CAN_FAIL = os.getenv("CAN_FAIL") - -# names of sections -SECTIONS = frozenset( - [ - "prepare", - "prepare-each", - "restore", - "restore-each", - "debug", - "debug-each", - "execute", - "repack", - ] -) - - -def parse_arguments(): - parser = argparse.ArgumentParser(description="spread shellcheck helper") - parser.add_argument("-s", "--shell", default="bash", help="shell") - parser.add_argument( - "-n", - "--no-errors", - action="store_true", - default=False, - help="ignore all errors ", - ) - parser.add_argument( - "-v", "--verbose", action="store_true", default=False, help="verbose logging" - ) - parser.add_argument( - "--can-fail", - default=None, - help=("file with list of files that are can fail " "validation"), - ) - parser.add_argument( - "-P", - "--max-procs", - default=N, - type=int, - metavar="N", - help="run these many shellchecks in parallel (default: %(default)s)", - ) - parser.add_argument("paths", nargs="+", help="paths to check") - return parser.parse_args() - - -class ShellcheckRunError(Exception): - def __init__(self, stderr): - super().__init__() - self.stderr = stderr - - -class ShellcheckError(Exception): - def __init__(self, path): - super().__init__() - self.sectionerrors = {} - self.path = path - - def addfailure(self, section, error): - self.sectionerrors[section] = error - - def __len__(self): - return len(self.sectionerrors) - - -class ShellcheckFailures(Exception): - def __init__(self, failures=None): - super().__init__() - self.failures = set() - if failures: - self.failures = set(failures) - - def merge(self, otherfailures): - self.failures = self.failures.union(otherfailures.failures) - - def __len__(self): - return len(self.failures) - - def intersection(self, other): - return self.failures.intersection(other) - - def difference(self, other): - return self.failures.difference(other) - - def __iter__(self): - return iter(self.failures) - - -def checksection(data): - # spread shell snippets are executed under 'set -e' shell, make sure - # shellcheck knows about that - data = "set -eu\n" + data - proc = subprocess.Popen( - [SHELLCHECK, "-s", "bash", "-x", "-"], - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - ) - stdout, _ = proc.communicate(input=data.encode("utf-8"), timeout=10) - if proc.returncode != 0: - raise ShellcheckRunError(stdout) - - -def checkfile(path): - logging.debug("checking file %s", path) - with open(path) as inf: - data = yaml.safe_load(inf) - - errors = ShellcheckError(path) - - for section in SECTIONS & data.keys(): - try: - logging.debug("%s: checking section %s", path, section) - checksection(data[section]) - except ShellcheckRunError as serr: - errors.addfailure(section, serr.stderr.decode("utf-8")) - - if path.endswith("spread.yaml") and "suites" in data: - # check suites - for suite_name, suite in data["suites"].items(): - for section in SECTIONS & suite.keys(): - try: - logging.debug( - "%s (suite %s): checking section %s", path, suite_name, section - ) - checksection(suite[section]) - except ShellcheckRunError as serr: - errors.addfailure( - "suites/" + suite_name + "/" + section, - serr.stderr.decode("utf-8"), - ) - - if errors: - raise errors - - -def findfiles(indir): - for root, _, files in os.walk(indir, topdown=True): - for name in files: - if name in ["spread.yaml", "task.yaml"]: - yield os.path.join(root, name) - - -def checkpath(loc, max_workers): - if os.path.isdir(loc): - # setup iterator - locations = findfiles(loc) - else: - locations = [loc] - - failed = [] - - def check1path(path): - try: - checkfile(path) - except ShellcheckError as err: - return err - return None - - with ThreadPoolExecutor(max_workers=max_workers) as executor: - for serr in executor.map(check1path, locations): - if serr is None: - continue - logging.error( - ("shellcheck failed for file %s in sections: " "%s; error log follows"), - serr.path, - ", ".join(serr.sectionerrors.keys()), - ) - for section, error in serr.sectionerrors.items(): - logging.error("%s: section '%s':\n%s", serr.path, section, error) - failed.append(serr.path) - - if failed: - raise ShellcheckFailures(failures=failed) - - -def loadfilelist(flistpath): - flist = set() - with open(flistpath) as inf: - for line in inf: - if not line.startswith("#"): - flist.add(line.strip()) - return flist - - -def main(opts): - paths = opts.paths or ["."] - failures = ShellcheckFailures() - for pth in paths: - try: - checkpath(pth, opts.max_procs) - except ShellcheckFailures as sf: - failures.merge(sf) - - if failures: - if opts.can_fail: - can_fail = loadfilelist(opts.can_fail) - - unexpected = failures.difference(can_fail) - if unexpected: - logging.error( - ( - "validation failed for the following " - "non-whitelisted files:\n%s" - ), - "\n".join([" - " + f for f in sorted(unexpected)]), - ) - raise SystemExit(1) - - did_not_fail = can_fail - failures.intersection(can_fail) - if did_not_fail: - logging.error( - ( - "the following files are whitelisted " - "but validated successfully:\n%s" - ), - "\n".join([" - " + f for f in sorted(did_not_fail)]), - ) - raise SystemExit(1) - - # no unexpected failures - return - - logging.error( - "validation failed for the following files:\n%s", - "\n".join([" - " + f for f in sorted(failures)]), - ) - - if NO_FAIL or opts.no_errors: - logging.warning("ignoring errors") - else: - raise SystemExit(1) - - -if __name__ == "__main__": - opts = parse_arguments() - if opts.verbose or D or V: - subprocess.call([SHELLCHECK, "--version"]) - lvl = logging.DEBUG - else: - lvl = logging.INFO - logging.basicConfig(level=lvl) - - if CAN_FAIL: - opts.can_fail = CAN_FAIL - - if NO_FAIL: - opts.no_errors = True - - main(opts) diff --git a/tools/staging_env.sh b/tools/staging_env.sh deleted file mode 100755 index b2cb883a82..0000000000 --- a/tools/staging_env.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -deactivate() { - unset STORE_DASHBOARD_URL - unset STORE_API_URL - unset STORE_UPLOAD_URL - unset UBUNTU_ONE_SSO_URL - unset TEST_STORE - export PS1="$ORIGINAL_PS1" - unset ORIGINAL_PS1 - unset deactivate -} - -export STORE_DASHBOARD_URL="https://dashboard.staging.snapcraft.io" -export STORE_API_URL="https://api.staging.snapcraft.io" -export STORE_UPLOAD_URL="https://storage.staging.snapcraftcontent.com" -export UBUNTU_ONE_SSO_URL="https://login.staging.ubuntu.com" -export TEST_STORE="staging" - -export ORIGINAL_PS1="$PS1" -export PS1="$PS1 snapcraft staging servers> " diff --git a/tools/version.py b/tools/version.py deleted file mode 100755 index 672d508a92..0000000000 --- a/tools/version.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python3 -# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*- -# -# Copyright (C) 2021 Canonical Ltd -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 3 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -import fileinput -import os -import pathlib -import subprocess -import sys - - -def determine_version(): - # Examples (git describe -> python package version): - # 4.1.1-0-gad012482d -> 4.1.1 - # 4.1.1-16-g2d8943dbc -> 4.1.1.post16+g2d8943dbc - # - # For shallow clones or repositories missing tags: - # 0ae7c04 - - desc = ( - subprocess.run( - ["git", "describe", "--always", "--long"], - stdout=subprocess.PIPE, - check=False, - text=True, - ) - .stdout - .strip() - ) - - if not desc: - return os.environ.get("SNAP_VERSION", "0.0.0+devel") - - split_desc = desc.split("-") - assert ( - len(split_desc) == 3 - ), f"Failed to parse Snapcraft git version description {desc!r}. Confirm that git repository is present and has the required tags/history." - - version = split_desc[0] - distance = split_desc[1] - commit = split_desc[2] - - if distance == "0": - return version - - return f"{version}.post{distance}+git{commit[1:]}" - - -def set_snapcraft_iss(): - snapcraft_iss_path = pathlib.Path("windows/snapcraft.iss") - assert ( - snapcraft_iss_path.exists() - ), f"Run from project root and ensure {snapcraft_iss_path!s} exists." - with fileinput.input(str(snapcraft_iss_path), inplace=True) as iss_file: - for line in iss_file: - if line.startswith("AppVersion="): - print(f"AppVersion={determine_version()}") - else: - print(line, end="") - - -if __name__ == "__main__": - if len(sys.argv) == 2 and sys.argv[1] == "set-snapcraft-iss": - set_snapcraft_iss() - else: - print(determine_version()) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 7d34e32222..0000000000 --- a/tox.ini +++ /dev/null @@ -1,178 +0,0 @@ -# Differences from the starbase tox.ini: -# * Uses requirements-devel.txt -# * No library code for pyright type checking -# * Documentation envs removed -# * Pytest uses wheel package -# * Legacy tests instead of integration tests -# * Additional test environment "noreq" runs all the tests without requirements.txt -# * lint-shellcheck includes spread-shellcheck.py -# * Additional ruff configuration for snapcraft_legacy -# * Do not use tmpfs for a temporary directory as it does not support user xattrs -# * Legacy tests (inherited from integration tests) include coverage - -[tox] -env_list = # Environments to run when called with no parameters. - lint-{black,ruff,mypy,pyright,shellcheck,codespell,yaml} - test-py312 - test-legacy-py312 -minversion = 4.5 -# Tox will use these requirements to bootstrap a venv if necessary. -# tox-igore-env-name-mismatch allows us to have one virtualenv for all linting. -# By setting requirements here, we make this INI file compatible with older -# versions of tox. Tox >= 3.8 will automatically provision the version provided -# inside of a virtual environment, so users of Ubuntu >= focal can simply -# install tox from apt. Older than that, the user gets an upgrade warning. -requires = - # renovate: datasource=pypi - tox-ignore-env-name-mismatch==0.2.0.post2 - # renovate: datasource=pypi - tox-gh==1.3.2 -# Allow tox to access the user's $TMPDIR environment variable if set. -# This workaround is required to avoid circular dependencies for TMPDIR, -# since tox will otherwise attempt to use the environment's TMPDIR variable. -user_tmp_dir = {env:TMPDIR} - -[testenv] # Default config for all environments. Overridable in each env. -# We have many tests that create temporary files. Unless the user has set a -# TMPDIR, this will prefer putting those temp files in $XDG_RUNTIME_DIR, -# which will speed up those tests since they'll run on a ramdisk. -env_tmp_dir = {user_tmp_dir:{work_dir}}/tox_tmp/{env_name} -set_env = - SNAPCRAFT_IGNORE_YAML_BINDINGS = 1 - TMPDIR={env_tmp_dir} - COVERAGE_FILE={env_tmp_dir}/.coverage_{env_name} - -[test] # Base configuration for unit and integration tests -deps = -r{tox_root}/requirements-devel.txt -package = wheel -allowlist_externals = mkdir -commands_pre = mkdir -p results - -[testenv:test-{py312}] # Configuration for all tests using pytest -base = testenv, test -description = Run unit tests with pytest -labels = - py312: tests, unit-tests -commands = pytest {tty:--color=yes} --cov=snapcraft --cov-report=xml:results/coverage-{env_name}.xml --junit-xml=results/test-results-{env_name}.xml {posargs:tests/unit} - -[testenv:test-legacy-{py312}] -base = testenv, test -description = Run legacy tests with pytest -labels = - py312: tests, integration-tests -commands = pytest {tty:--color=yes} --cov=snapcraft_legacy --cov-report=xml:results/coverage-{env_name}.xml --junit-xml=results/test-results-{env_name}.xml {posargs:tests/legacy} - -[testenv:test-noreq] -base = testenv -description = Run all tests without using requirements.txt -package = wheel -deps = python-apt@https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu1/python-apt_2.4.0ubuntu1.tar.xz -extras = dev -allowlist_externals = mkdir -commands_pre = mkdir -p results -commands = - pytest {tty:--color=yes} --cov=snapcraft --cov-report=xml:results/coverage-{env_name}.xml --junit-xml=results/test-results-{env_name}.xml tests/unit {posargs} - pytest {tty:--color=yes} --junit-xml=results/legacy-test-results-{env_name}.xml tests/legacy {posargs} - -[testenv:test-all-py312] -base = testenv, test -description = Run all tests with the interpreter used in the snap -allowlist_externals = mkdir -commands_pre = mkdir -p results -commands = - pytest {tty:--color=yes} --cov=snapcraft --cov-report=xml:results/coverage-{env_name}.xml --junit-xml=results/test-results-{env_name}.xml tests {posargs} - -[lint] # Standard linting configuration -package = editable -extras = dev -env_dir = {work_dir}/linting -runner = ignore_env_name_mismatch - -[shellcheck] -find = git ls-files --empty-directory --deduplicate -filter = file --mime-type -Nnf- | grep shellscript$ | cut -f1 -d: -spread_filter = grep -E "^tests/spread/.*(spread|task)\.yaml$" - -[testenv:lint-{black,ruff,docstyle,shellcheck,codespell,yaml}] -description = Lint the source code -base = testenv, lint -labels = lint -deps = - -r{tox_root}/requirements-devel.txt -allowlist_externals = - shellcheck: bash, xargs - ruff: ruff -commands_pre = - shellcheck: bash -c '{[shellcheck]find} | {[shellcheck]filter} > {env_tmp_dir}/shellcheck_files' - shellcheck: bash -c '{[shellcheck]find} | {[shellcheck]spread_filter} > {env_tmp_dir}/spread_shellcheck_files' -commands = - black: black --check --diff {tty:--color} {posargs} . - ruff: ruff check --diff --respect-gitignore {posargs} - docstyle: pydocstyle snapcraft - shellcheck: xargs -ra {env_tmp_dir}/shellcheck_files shellcheck - shellcheck: xargs -ra {env_tmp_dir}/spread_shellcheck_files python3 tools/spread-shellcheck.py spread.yaml - codespell: codespell --toml {tox_root}/pyproject.toml {posargs} - yaml: yamllint {posargs} . - -[testenv:lint-{mypy,pyright}] -description = Static type checking -base = testenv -deps = - -r{tox_root}/requirements-devel.txt -env_dir = {work_dir}/typing -runner = ignore_env_name_mismatch -package = editable -extras = [dev, types] -labels = lint, type -allowlist_externals = - pyright: pyright - mypy: mkdir -commands_pre = - mypy: mkdir -p .mypy_cache -commands = - pyright: pyright {posargs} - mypy: mypy --install-types --non-interactive --exclude 'docs/sphinx-resources/conf.py' --exclude 'docs/common' . - -[testenv:format-{black,ruff,codespell}] -description = Automatically format source code -base = testenv, lint -labels = format -deps = - -r{tox_root}/requirements-devel.txt -allowlist_externals: - ruff: ruff -commands = - black: black {tty:--color} {posargs} . - ruff: ruff check --fix --respect-gitignore setup.py snapcraft tests tools - ruff: ruff check --fix --config snapcraft_legacy/ruff.toml snapcraft_legacy tests/legacy - codespell: codespell --toml {tox_root}/pyproject.toml --write-changes {posargs} - -[docs] # Sphinx documentation configuration -extras = docs -package = editable -no_package = true -env_dir = {work_dir}/docs -runner = ignore_env_name_mismatch -deps = - -r{tox_root}/requirements-docs.txt - -[testenv:build-docs] -description = Build sphinx documentation -base = docs -allowlist_externals = bash -commands_pre = - bash -c 'if [[ ! -e docs ]];then echo "No docs directory. Run `tox run -e sphinx-quickstart` to create one.;";return 1;fi' - bash -c 'git submodule update --init docs/sphinx-resources' -# "-W" is to treat warnings as errors -commands = sphinx-build {posargs:-b html} -W {tox_root}/docs {tox_root}/docs/_build - -[testenv:autobuild-docs] -description = Build documentation with an autoupdating server -base = docs -commands = sphinx-autobuild {posargs:-b html --open-browser --port 8080} {tox_root}/docs {tox_root}/docs/_build - -[testenv:lint-docs] -description = Lint the documentation with sphinx-lint -base = docs -commands = sphinx-lint --ignore docs/_build --max-line-length 120 --ignore docs/sphinx-resources -e all {posargs} docs/ -labels = lint diff --git a/units.py b/units.py deleted file mode 100644 index 16351b2fa9..0000000000 --- a/units.py +++ /dev/null @@ -1,5 +0,0 @@ -import unittest - -unittest.main( - "snapcraft_legacy.tests.unit.commands.test_build", argv=["BuildCommandTestCase"] -) # noqa diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000000..f19a710088 --- /dev/null +++ b/uv.lock @@ -0,0 +1,3057 @@ +version = 1 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +conflicts = [[ + { package = "snapcraft", group = "dev-jammy" }, + { package = "snapcraft", group = "dev-noble" }, + { package = "snapcraft", group = "dev-oracular" }, + { package = "snapcraft", group = "dev-plucky" }, +]] + +[[package]] +name = "alabaster" +version = "0.7.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, +] + +[[package]] +name = "altgraph" +version = "0.17.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", size = 48418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff", size = 21212 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "apeye" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "apeye-core" }, + { name = "domdf-python-tools" }, + { name = "platformdirs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/6b/cc65e31843d7bfda8313a9dc0c77a21e8580b782adca53c7cb3e511fe023/apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36", size = 99219 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/7b/2d63664777b3e831ac1b1d8df5bbf0b7c8bee48e57115896080890527b1b/apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e", size = 107989 }, +] + +[[package]] +name = "apeye-core" +version = "1.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "domdf-python-tools" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/4c/4f108cfd06923bd897bf992a6ecb6fb122646ee7af94d7f9a64abd071d4c/apeye_core-1.1.5.tar.gz", hash = "sha256:5de72ed3d00cc9b20fea55e54b7ab8f5ef8500eb33a5368bc162a5585e238a55", size = 96511 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/9f/fa9971d2a0c6fef64c87ba362a493a4f230eff4ea8dfb9f4c7cbdf71892e/apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf", size = 99286 }, +] + +[[package]] +name = "astroid" +version = "3.3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/c5/5c83c48bbf547f3dd8b587529db7cf5a265a3368b33e85e76af8ff6061d3/astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b", size = 398196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/28/0bc8a17d6cd4cc3c79ae41b7105a2b9a327c110e5ddd37a8a27b29a5c8a2/astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c", size = 275153 }, +] + +[[package]] +name = "attrs" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, +] + +[[package]] +name = "autodocsumm" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/96/92afe8a7912b327c01f0a8b6408c9556ee13b1aba5b98d587ac7327ff32d/autodocsumm-0.2.14.tar.gz", hash = "sha256:2839a9d4facc3c4eccd306c08695540911042b46eeafcdc3203e6d0bab40bc77", size = 46357 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/bc/3f66af9beb683728e06ca08797e4e9d3e44f432f339718cae3ba856a9cad/autodocsumm-0.2.14-py3-none-any.whl", hash = "sha256:3bad8717fc5190802c60392a7ab04b9f3c97aa9efa8b3780b3d81d615bfe5dc0", size = 14640 }, +] + +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "boolean-py" +version = "4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/d9/b6e56a303d221fc0bdff2c775e4eef7fedd58194aa5a96fa89fb71634cc9/boolean.py-4.0.tar.gz", hash = "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", size = 34504 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/02/6389ef0529af6da0b913374dedb9bbde8eabfe45767ceec38cc37801b0bd/boolean.py-4.0-py3-none-any.whl", hash = "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd", size = 25909 }, +] + +[[package]] +name = "bracex" +version = "2.5.post1" +source = { registry = "https://pypi.org/simple" } +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/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, +] + +[[package]] +name = "cachecontrol" +version = "0.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/a4/3390ac4dfa1773f661c8780368018230e8207ec4fd3800d2c0c3adee4456/cachecontrol-0.14.2.tar.gz", hash = "sha256:7d47d19f866409b98ff6025b6a0fca8e4c791fb31abbd95f622093894ce903a2", size = 28832 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/63/baffb44ca6876e7b5fc8fe17b24a7c07bf479d604a592182db9af26ea366/cachecontrol-0.14.2-py3-none-any.whl", hash = "sha256:ebad2091bf12d0d200dfc2464330db638c5deb41d546f6d7aca079e87290f3b0", size = 21780 }, +] + +[package.optional-dependencies] +filecache = [ + { name = "filelock" }, +] + +[[package]] +name = "canonical-sphinx" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "furo" }, + { name = "linkify-it-py" }, + { name = "myst-parser" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/19/b2101265969ba6bfacbb9b3355a32a22abdcccceba61542813f07fe0e965/canonical_sphinx-0.3.0.tar.gz", hash = "sha256:7914a1281e7520a032058e7a511d019fee25a152c032499a7bf9e15852f9d9e7", size = 1051001 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/ba/ab2e2113841f88a9725c6c55f4918a3031ef3efad6afd154d9444cd40c8e/canonical_sphinx-0.3.0-py3-none-any.whl", hash = "sha256:55dc07c54038ea7016a5a6a12fafa1bde8558a00009237f5224db1c65e919b0f", size = 1027670 }, +] + +[package.optional-dependencies] +full = [ + { name = "canonical-sphinx-extensions" }, + { name = "pyspelling" }, + { name = "sphinx-copybutton" }, + { name = "sphinx-design" }, + { name = "sphinx-notfound-page" }, + { name = "sphinx-reredirects" }, + { name = "sphinx-tabs" }, + { name = "sphinxcontrib-jquery" }, + { name = "sphinxext-opengraph" }, +] + +[[package]] +name = "canonical-sphinx-extensions" +version = "0.0.23" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "docutils" }, + { name = "gitpython" }, + { name = "requests" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/49/2e64462241adfe97615dd646ad3042e1a3e7bb77f14ed15e1aa0e543c3ff/canonical_sphinx_extensions-0.0.23.tar.gz", hash = "sha256:5178c97e8c515dcff42b1976a81a68e74e70ca77a8fb0b68af3dc097705a49eb", size = 20653 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/dd/e9079ddd7fee8f34bece4e69d9a33338f1f88630757a6a963ca0aac0e01f/canonical_sphinx_extensions-0.0.23-py3-none-any.whl", hash = "sha256:05113c93e37fe9c9be1a5f1ba6491c1dbb7492cdecd9b5202ed165e671973c31", size = 38023 }, +] + +[[package]] +name = "catkin-pkg" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/a2/88f8ba42a0119833887b8afe159f6e3ae96e2700720baf461eeabcc6acd8/catkin_pkg-1.0.0.tar.gz", hash = "sha256:476e9f52917282f464739241b4bcaf5ebbfba9a7a68d9af8f875225feac0e1b5", size = 64861 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/f7/86d933ec31f00450f513ef110fa9c0e5da4c6e2c992933a35c8d8fe7d01f/catkin_pkg-1.0.0-py3-none-any.whl", hash = "sha256:10a6589e9edf3cd5bd18e35e094d20b516e6351bcf0da891c28a0ff526fdb7cc", size = 75996 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "chardet" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + +[[package]] +name = "codespell" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coverage" +version = "7.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, + { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, + { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, + { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, + { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, + { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, + { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, + { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, + { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, + { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, + { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, + { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, + { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, + { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, + { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, + { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, + { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, + { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, + { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, + { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, + { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, + { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, + { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, + { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, + { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, + { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, + { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, + { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, + { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, + { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, +] + +[[package]] +name = "craft-application" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "craft-archives" }, + { name = "craft-cli" }, + { name = "craft-grammar" }, + { name = "craft-parts" }, + { name = "craft-platforms" }, + { name = "craft-providers" }, + { name = "jinja2" }, + { name = "license-expression" }, + { name = "platformdirs" }, + { name = "pydantic" }, + { name = "pygit2" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "snap-helpers" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/32/1f85995e9f7c7f9eca754cf16b0e1b7f2b8095fc91723edbe31cebcd2f1c/craft_application-4.4.0.tar.gz", hash = "sha256:c601c6c3794492cea368d1544e25469e273abe26c42e696d2fd57584b2c90f55", size = 208125 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e0/76871124ae36704f0a682d45cb1fa84fc411d0239281106a6c452061c142/craft_application-4.4.0-py3-none-any.whl", hash = "sha256:97231e934fe4b8ff85b7a6f9103242db64b91ba0664047927fb27529161d43db", size = 135302 }, +] + +[[package]] +name = "craft-archives" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distro" }, + { name = "launchpadlib" }, + { name = "lazr-restfulclient" }, + { name = "lazr-uri" }, + { name = "overrides" }, + { name = "pydantic" }, + { name = "python-debian" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/8e/efd531838ceb591d4aaa4d032807131082bf20e39112472be33346cc9267/craft-archives-2.0.2.tar.gz", hash = "sha256:8dfc0a78ba0bf1e63891975463e2a15c0028b9697b2282d6e9fe05bd6477960d", size = 74887 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/6f/930785e102111ded8acbbcb399de25fc74799ada41b56526d9aa8e980db5/craft_archives-2.0.2-py3-none-any.whl", hash = "sha256:8598e70b1228ce6cd2d73cab3c7bae5947ef329434d1ef865999c0a2a2c629b1", size = 32160 }, +] + +[[package]] +name = "craft-cli" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "overrides" }, + { name = "platformdirs" }, + { name = "pywin32", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pyyaml" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/a7/32b8170deaefb28a8ec4cbccbaa0fbc4fac019cf3edf3682079af271ffa9/craft_cli-2.15.0.tar.gz", hash = "sha256:83c94e521c597c0836eb4a649c68105827006731d2032ca925cf1aea27d9fc9c", size = 116960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/1c/9786bc93f1d210eadf6513868d27b75996ab6c3a40013782a4be86f5a98e/craft_cli-2.15.0-py3-none-any.whl", hash = "sha256:4ed2f7e409acce8f66a60d7038645431b38b2320d2eb88e133b7b9af1ce9843a", size = 46437 }, +] + +[[package]] +name = "craft-grammar" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "overrides" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/d6/073514a6dd3f79fd82f73b0532df0f5dfc39c5ba548795a8c1406851e914/craft_grammar-2.0.1.tar.gz", hash = "sha256:fd6d90b49f3dc1705d9a745192d61192f2eeb42ecb316d7a2b921083d7601c5a", size = 48405 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/46/dc5c80ac98a005aebdad33ac1ade4e84b3967b7d0280f56dc41046ee0daa/craft_grammar-2.0.1-py3-none-any.whl", hash = "sha256:f72ee5d2a4f73bc75190111b1728b1da9968831fdaf0f4ded35122fb5ba39e3c", size = 23877 }, +] + +[[package]] +name = "craft-parts" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "overrides" }, + { name = "pydantic" }, + { name = "pyxdg" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "requests-unixsocket2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/6c/ff0f9aa805da1670e408c644fbe5740d69056691de4953dbaa7546d80ce6/craft_parts-2.4.1.tar.gz", hash = "sha256:18f6c9a45fb99e5a366fcd9b827df8886d955dace9ded9f08759206f5e5ef729", size = 640144 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/13/0dbcca9f1fb0b2b61809cb65fcba88d6b676f015f87628ca603161be47ed/craft_parts-2.4.1-py3-none-any.whl", hash = "sha256:22adf92b77c25868518fa426ad789aee794b17c0e8c0408d22e902c846d3d325", size = 449809 }, +] + +[[package]] +name = "craft-platforms" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "distro" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/cb/898d65cfdde700565dc6339e09d919a6e0ac65e27486427ba4d7eb7f6434/craft_platforms-0.5.0.tar.gz", hash = "sha256:f41226163ca111517abd30fd3d1e8c16f08819eb3623b36e5a58d1db3ea8da21", size = 150900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/d5/a1231182a3012239940ca84bc3b289d54eba7b5841a140439b03226bbd7a/craft_platforms-0.5.0-py3-none-any.whl", hash = "sha256:f80e0eee22174ddc888a938206716dcb7abf66d1161479206e47127091fdfec1", size = 22332 }, +] + +[[package]] +name = "craft-providers" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "requests-unixsocket2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/1f/4c0eb72331e11ec8fec5cd24e993fe1e34ca04331251b90b8b6c7b1b72c7/craft_providers-2.1.0.tar.gz", hash = "sha256:9494a70cd0f86c13a746157bc1a54520e867656690f60d07d4ffdce39f60a99a", size = 180276 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/53/81f948ad5cd368bd7774b716e9afcae383ac8a389b7b462b214cd8981ade/craft_providers-2.1.0-py2.py3-none-any.whl", hash = "sha256:502e6fbb92435fac0db3bee0fcdaa84f0826880176b4635d896c5e4d429e3c5e", size = 97031 }, +] + +[[package]] +name = "craft-store" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "httpx" }, + { name = "jaraco-classes" }, + { name = "keyring" }, + { name = "macaroonbakery" }, + { name = "overrides" }, + { name = "pydantic" }, + { name = "pyxdg" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/51/8135945f2e2bad6a30c70fcfb6009194821818a730d306ee28c11e6a0273/craft_store-3.2.0.tar.gz", hash = "sha256:60bbe6b1e65b0b2691d0fe42df88ce0853df312507d2b853d2b508d7e5f80910", size = 200904 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/d7/39d43ec8a7df9082bce03f3fc82980501a5152c8a8f057a0caa97743cc36/craft_store-3.2.0-py3-none-any.whl", hash = "sha256:fb2feff7d4bebd0eba9f6b01916d6cad7c6cc69c10da5be3f2238856fd61294a", size = 53112 }, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +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 }, +] + +[[package]] +name = "cssutils" +version = "2.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/9f/329d26121fe165be44b1dfff21aa0dc348f04633931f1d20ed6cf448a236/cssutils-2.11.1.tar.gz", hash = "sha256:0563a76513b6af6eebbe788c3bf3d01c920e46b3f90c8416738c5cfc773ff8e2", size = 711657 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/ec/bb273b7208c606890dc36540fe667d06ce840a6f62f9fae7e658fcdc90fb/cssutils-2.11.1-py3-none-any.whl", hash = "sha256:a67bfdfdff4f3867fab43698ec4897c1a828eca5973f4073321b3bccaf1199b1", size = 385747 }, +] + +[[package]] +name = "dict2css" +version = "0.3.0.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cssutils" }, + { name = "domdf-python-tools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/24/eb/776eef1f1aa0188c0fc165c3a60b71027539f71f2eedc43ad21b060e9c39/dict2css-0.3.0.post1.tar.gz", hash = "sha256:89c544c21c4ca7472c3fffb9d37d3d926f606329afdb751dc1de67a411b70719", size = 7845 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/47/290daabcf91628f4fc0e17c75a1690b354ba067066cd14407712600e609f/dict2css-0.3.0.post1-py3-none-any.whl", hash = "sha256:f006a6b774c3e31869015122ae82c491fd25e7de4a75607a62aa3e798f837e0d", size = 25647 }, +] + +[[package]] +name = "dill" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, +] + +[[package]] +name = "docutils" +version = "0.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", size = 2056383 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", size = 570472 }, +] + +[[package]] +name = "domdf-python-tools" +version = "3.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "natsort" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/78/974e10c583ba9d2302e748c9585313a7f2c7ba00e4f600324f432e38fe68/domdf_python_tools-3.9.0.tar.gz", hash = "sha256:1f8a96971178333a55e083e35610d7688cd7620ad2b99790164e1fc1a3614c18", size = 103792 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/e9/7447a88b217650a74927d3444a89507986479a69b83741900eddd34167fe/domdf_python_tools-3.9.0-py3-none-any.whl", hash = "sha256:4e1ef365cbc24627d6d1e90cf7d46d8ab8df967e1237f4a26885f6986c78872e", size = 127106 }, +] + +[[package]] +name = "filelock" +version = "3.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/9c/0b15fb47b464e1b663b1acd1253a062aa5feecb07d4e597daea542ebd2b5/filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e", size = 18027 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, +] + +[[package]] +name = "fixtures" +version = "4.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pbr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/79/a63e71f7663b380e0fe74c1673bca12e114884dc7c1a61408e9fcde3db28/fixtures-4.2.2.tar.gz", hash = "sha256:af9368737fad6fd501638ca99c78000c3f3fb03fa40a60f9e9d39aa64f342bc1", size = 59199 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/9e/ab77b2e316b2960b64277d8927ded0dc6f95c9cf8b4dba29fabd7680832f/fixtures-4.2.2-py3-none-any.whl", hash = "sha256:5cf7668cb1c0152c2cddeae32e898e83b93d07be78e481a2e786db87354fd0f0", size = 64537 }, +] + +[[package]] +name = "flake8" +version = "7.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/72/e8d66150c4fcace3c0a450466aa3480506ba2cae7b61e100a2613afc3907/flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38", size = 48054 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/42/65004373ac4617464f35ed15931b30d764f53cdd30cc78d5aea349c8c050/flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213", size = 57731 }, +] + +[[package]] +name = "furo" +version = "2024.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "sphinx-basic-ng" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, +] + +[[package]] +name = "gnupg" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "psutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/6c/21f99b450d2f0821ff35343b9a7843b71e98de35192454606435c72991a8/gnupg-2.3.1.tar.gz", hash = "sha256:8db5a05c369dbc231dab4c98515ce828f2dffdc14f1534441a6c59b71c6d2031", size = 100437 } + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "html5lib" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httplib2" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/ad/2371116b22d616c194aa25ec410c9c6c37f23599dcd590502b74db197584/httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81", size = 351116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/6c/d2fbdaaa5959339d53ba38e94c123e4e84b8fbc4b84beb0e70d7c1608486/httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc", size = 96854 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "hupper" +version = "1.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/e6/bb064537288eee2be97f3e0fcad8e7242bc5bbe9664ae57c7d29b3fa18c2/hupper-1.12.1.tar.gz", hash = "sha256:06bf54170ff4ecf4c84ad5f188dee3901173ab449c2608ad05b9bfd6b13e32eb", size = 43231 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl", hash = "sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19", size = 22830 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "isort" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/28/b382d1656ac0ee4cef4bf579b13f9c6c813bff8a5cb5996669592c8c75fa/isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1", size = 828356 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c7/d6017f09ae5b1206fbe531f7af3b6dac1f67aedcbd2e79f3b386c27955d6/isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892", size = 94053 }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777 }, +] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825 }, +] + +[[package]] +name = "jaraco-functools" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", size = 19159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", size = 10187 }, +] + +[[package]] +name = "jeepney" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", size = 106005 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", size = 48435 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "jsonschema" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/0d/c816f5ea5adaf1293a1d81d32e4cdfdaf8496973aa5049786d7fdb14e7e7/jsonschema-2.5.1.tar.gz", hash = "sha256:36673ac378feed3daa5956276a829699056523d7961027911f064b52255ead41", size = 50855 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/cc/5388547ea3504bd8cbf99ba2ae7a3231598f54038e9b228cbd174f8ec6a1/jsonschema-2.5.1-py2.py3-none-any.whl", hash = "sha256:71e7b3bcf9fca408bcb65bb60892f375d3abdd2e4f296eeeb8fe0bbbfcde598e", size = 38953 }, +] + +[[package]] +name = "keyring" +version = "25.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "secretstorage", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085 }, +] + +[[package]] +name = "launchpadlib" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httplib2" }, + { name = "lazr-restfulclient" }, + { name = "lazr-uri" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/ec/e659321733decaafe95d4cf964ce360b153de48c5725d5f27cefe97bf5f8/launchpadlib-2.1.0.tar.gz", hash = "sha256:b4c25890bb75050d54c08123d2733156b78a59a2555f5461f69b0e44cd91242f", size = 209860 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/a2/2fbbee98e88322446edc71a9ea662c8bf288e5199777545b4480d09bf3d1/launchpadlib-2.1.0-py3-none-any.whl", hash = "sha256:28ae51a8f09deb6506c7f72e47e21d37b28edba2a0d4a1bc7ebecca35168e2ac", size = 217563 }, +] + +[[package]] +name = "lazr-restfulclient" +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distro" }, + { name = "httplib2" }, + { name = "oauthlib" }, + { name = "setuptools" }, + { name = "six" }, + { name = "wadllib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/a3/45d80620a048c6f5d1acecbc244f00e65989914bca370a9179e3612aeec8/lazr.restfulclient-0.14.6.tar.gz", hash = "sha256:43f12a1d3948463b1462038c47b429dcb5e42e0ba7f2e16511b02ba5d2adffdb", size = 58590 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/de/0588cc50519e5b7ec75742d3e7cb7234298c95ef580b97f0ed3ac8fbc891/lazr.restfulclient-0.14.6-py2.py3-none-any.whl", hash = "sha256:97e95b1d8f0ec7fed998b48aea773baf8dcab06cf78a4deb9a046af5cca0cea2", size = 67413 }, +] + +[[package]] +name = "lazr-uri" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/53/de9135d731a077b1b4a30672720870abdb62577f18b1f323c87e6e61b96c/lazr_uri-1.0.7.tar.gz", hash = "sha256:ed0cf6f333e450114752afb1ce0c299c36ac4b109063eb50354c4f87f825a3ee", size = 20125 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/86/e9ebca51e6da2715d3dbd46fffc016df0613feff6c4a4ae025a0b18b1935/lazr.uri-1.0.7-py3-none-any.whl", hash = "sha256:a11441f9a1b5f1788d186b31dabd55d6a968fbc2bb434256c45a2cd2f5404825", size = 21487 }, +] + +[[package]] +name = "legacy-cgi" +version = "2.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/2e/e1860989bc6cfdecba66db37f2f783636b97a1248ac25fbe864b6e931c22/legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f", size = 24794 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/cd/54d1fd92d7f6aca9523d8583052e00b273bdfe28aa7fd54a3a5759dab05e/legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff", size = 19572 }, +] + +[[package]] +name = "license-expression" +version = "30.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boolean-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/6f/8709031ea6e0573e6075d24ea34507b0eb32f83f10e1420f2e34606bf0da/license_expression-30.4.1.tar.gz", hash = "sha256:9f02105f9e0fcecba6a85dfbbed7d94ea1c3a70cf23ddbfb5adf3438a6f6fce0", size = 177184 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/84/8a89614b2e7eeeaf0a68a4046d6cfaea4544c8619ea02595ebeec9b2bae3/license_expression-30.4.1-py3-none-any.whl", hash = "sha256:679646bc3261a17690494a3e1cada446e5ee342dbd87dcfa4a0c24cc5dce13ee", size = 111457 }, +] + +[[package]] +name = "linkify-it-py" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "uc-micro-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820 }, +] + +[[package]] +name = "lxml" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, + { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, + { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, + { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, + { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, + { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, + { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, + { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, + { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, + { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, + { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, + { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, + { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, + { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, + { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, + { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, + { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, + { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, + { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, + { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, + { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, + { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, + { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, + { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, + { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, + { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, + { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, + { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, + { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, + { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, + { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, +] + +[[package]] +name = "macaroonbakery" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, + { name = "pymacaroons" }, + { name = "pynacl" }, + { name = "pyrfc3339" }, + { name = "requests" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/ae/59f5ab870640bd43673b708e5f24aed592dc2673cc72caa49b0053b4af37/macaroonbakery-1.3.4.tar.gz", hash = "sha256:41ca993a23e4f8ef2fe7723b5cd4a30c759735f1d5021e990770c8a0e0f33970", size = 82143 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/42/227f748dc222b7a1c5cb40c7c74ab4162c7fc146b88980776b490ab673a1/macaroonbakery-1.3.4-py2.py3-none-any.whl", hash = "sha256:1e952a189f5c1e96ef82b081b2852c770d7daa20987e2088e762dd5689fb253b", size = 103184 }, +] + +[[package]] +name = "macholib" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "altgraph" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30", size = 59309 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c", size = 38094 }, +] + +[[package]] +name = "markdown" +version = "3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +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 = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "more-itertools" +version = "10.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 }, +] + +[[package]] +name = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, +] + +[[package]] +name = "mypy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, + { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, + { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, + { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, + { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, + { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, + { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, + { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, + { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, + { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, + { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, + { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, + { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "myst-parser" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, +] + +[[package]] +name = "natsort" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268 }, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +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/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pastedeploy" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/97/0c4a613ec96a54d21daa7e089178263915554320402e89b4e319436a63cb/PasteDeploy-3.1.0.tar.gz", hash = "sha256:9ddbaf152f8095438a9fe81f82c78a6714b92ae8e066bed418b6a7ff6a095a95", size = 37841 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/30/cdddd9a88969683a59222a6d61cd6dce923977f2e9f9ffba38e1324149cd/PasteDeploy-3.1.0-py3-none-any.whl", hash = "sha256:76388ad53a661448d436df28c798063108f70e994ddc749540d733cdbd1b38cf", size = 16943 }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "pbr" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/35/80cf8f6a4f34017a7fe28242dc45161a1baa55c41563c354d8147e8358b2/pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24", size = 124032 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/44/6a65ecd630393d47ad3e7d5354768cb7f9a10b3a0eb2cd8c6f52b28211ee/pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a", size = 108529 }, +] + +[[package]] +name = "pefile" +version = "2023.2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pip" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/3e/68beeeeb306ea20ffd30b3ed993f531d16cd884ec4f60c9b1e238f69f2af/pip-25.0.tar.gz", hash = "sha256:8e0a97f7b4c47ae4a494560da84775e9e2f671d415d8d828e052efefb206b30b", size = 1950328 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/8a/1ddf40be20103bcc605db840e9ade09c8e8c9f920a03e9cfe88eae97a058/pip-25.0-py3-none-any.whl", hash = "sha256:b6eb97a803356a52b2dd4bb73ba9e65b2ba16caa6bcb25a7497350a4e5859b65", size = 1841506 }, +] + +[[package]] +name = "plaster" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/93/66df0f87f1442d8afea8531ae8a4a9eca656006a54eac2b4489427e92c10/plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98", size = 33232 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/8b/3f98db1448e3b4d2d142716874a7e02f6101685fdaa0f55a8668e9ffa048/plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d", size = 11554 }, +] + +[[package]] +name = "plaster-pastedeploy" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pastedeploy" }, + { name = "plaster" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/af/01a22f73ce97c6375c88d7ceaf6f5f4f345e940da93c94f98833d898a449/plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412", size = 20915 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/30/2d4cf89035c22a89bf0e34dbc50fdc07c42c9bdc90fd972d495257ad2b6e/plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f", size = 7823 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +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/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "polib" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/9a/79b1067d27e38ddf84fe7da6ec516f1743f31f752c6122193e7bce38bdbf/polib-1.2.0.tar.gz", hash = "sha256:f3ef94aefed6e183e342a8a269ae1fc4742ba193186ad76f175938621dbfc26b", size = 161658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/99/45bb1f9926efe370c6dbe324741c749658e44cb060124f28dad201202274/polib-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c77ee1b81feb31df9bca258cbc58db1bbb32d10214b173882452c73af06d62d", size = 20634 }, +] + +[[package]] +name = "progressbar" +version = "2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/a6/b8e451f6cff1c99b4747a2f7235aa904d2d49e8e1464e0b798272aa84358/progressbar-2.5.tar.gz", hash = "sha256:5d81cb529da2e223b53962afd6c8ca0f05c6670e40309a7219eacc36af9b6c63", size = 10046 } + +[[package]] +name = "protobuf" +version = "5.29.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/d1/e0a911544ca9993e0f17ce6d3cc0932752356c1b0a834397f28e63479344/protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620", size = 424945 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/7a/1e38f3cafa022f477ca0f57a1f49962f21ad25850c3ca0acd3b9d0091518/protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888", size = 422708 }, + { url = "https://files.pythonhosted.org/packages/61/fa/aae8e10512b83de633f2646506a6d835b151edf4b30d18d73afd01447253/protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a", size = 434508 }, + { url = "https://files.pythonhosted.org/packages/dd/04/3eaedc2ba17a088961d0e3bd396eac764450f431621b58a04ce898acd126/protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e", size = 417825 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7c467744d23c3979ce250397e26d8ad8eeb2bea7b18ca12ad58313c1b8d5/protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84", size = 319573 }, + { url = "https://files.pythonhosted.org/packages/a8/45/2ebbde52ad2be18d3675b6bee50e68cd73c9e0654de77d595540b5129df8/protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f", size = 319672 }, + { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 }, +] + +[[package]] +name = "psutil" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pyasynchat" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasyncore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/fd/aacc6309abcc5a388c66915829cd8175daccac583828fde40a1eea5768e4/pyasynchat-1.0.4.tar.gz", hash = "sha256:3f5333df649e46c56d48c57e6a4b7163fd07f626bfd884e22ef373ab3c3a4670", size = 9747 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/4f/b4a7aa2a35858d40f970bdb63ab3e9deda35d0d2116b9175f929f37d764d/pyasynchat-1.0.4-py3-none-any.whl", hash = "sha256:167feb25d635a01b61338e17e9ab1e3372cd9274005af4083dcda52d51f64a76", size = 7753 }, +] + +[[package]] +name = "pyasyncore" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/6e/956e2bc9b47e3310cd524036f506b779a77788c2a1eb732e544240ad346f/pyasyncore-1.0.4.tar.gz", hash = "sha256:2c7a8b9b750ba6260f1e5a061456d61320a80579c6a43d42183417da89c7d5d6", size = 15339 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/46/aaa0999302d7a584a033ec23b6ca21a452cf9c7f6d8dce8d174ac407eb3f/pyasyncore-1.0.4-py3-none-any.whl", hash = "sha256:9e5f6dc9dc057c56370b7a5cdb4c4670fd4b0556de2913ed1f428cd6a5366895", size = 10032 }, +] + +[[package]] +name = "pycodestyle" +version = "2.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/aa/210b2c9aedd8c1cbeea31a50e42050ad56187754b34eb214c46709445801/pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521", size = 39232 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/d8/a211b3f85e99a0daa2ddec96c949cac6824bd305b040571b82a03dd62636/pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3", size = 31284 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/7b/23dc30fba5793d7be3307f33bebb36e08f78f8af9c03fce608833f01bebd/pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141", size = 738772 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/07/bbfddb7b532b727a5769a8468a67ab388e74c029d4940e5de6b25231aba2/pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e", size = 423079 }, +] + +[[package]] +name = "pydantic-core" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/9802d053f33dbcf110d46e3f28667b06cd764b164f1e3f4189848cdd6e78/pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877", size = 388463 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/d7/b748dc1e92f019d0bf49dd62762425a1d4c713250b5dfac82616648a0e8c/pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17", size = 1839193 }, + { url = "https://files.pythonhosted.org/packages/df/20/e1a1a03a9c116bd63d68dabd51250e76e45e3a849456b32dd8fb5148c817/pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb", size = 1767120 }, + { url = "https://files.pythonhosted.org/packages/51/05/b903f4fd7f34d8548534b1e21f972664f9a5d03b884781b86d3f422997ca/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d", size = 1789229 }, + { url = "https://files.pythonhosted.org/packages/dc/d0/0686c898da81a339701fca5669bd8496c5923755d84dacb65c4d71dd2ab0/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce", size = 1773878 }, + { url = "https://files.pythonhosted.org/packages/be/c3/3510274ee06bc18c7c43923be40a0fcd7510daf6df5fab41a70463302130/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad", size = 1975737 }, + { url = "https://files.pythonhosted.org/packages/7c/23/f8a75d2f766f9fbe4a080c1ca2e00e2eb61f237b9d930976d0aba95cd691/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b", size = 2592099 }, + { url = "https://files.pythonhosted.org/packages/99/6a/8c9e41bd2848e6f2a970f93f4cf0f2f62ce5248ab2b23b85dd7247069f1a/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8", size = 2100808 }, + { url = "https://files.pythonhosted.org/packages/34/a9/33f27da3de0dfff881beca6c2e19b05f928f24ff3346c1ff6faae85f6cf4/pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608", size = 1900858 }, + { url = "https://files.pythonhosted.org/packages/0c/00/fde56cd48a4ebb9d7dfe9e38aa14737be7349dd8d30de162955182e38e16/pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1", size = 1966902 }, + { url = "https://files.pythonhosted.org/packages/de/dc/bc741bf0a400f983cab9e5d4feac936040c0fc7665a65da5bc6c8db275a2/pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af", size = 2119825 }, + { url = "https://files.pythonhosted.org/packages/a8/51/0d66a7a600f0e33eaeafb65ce5693a90130d00072eaecb184881dd5bd37a/pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918", size = 1717259 }, + { url = "https://files.pythonhosted.org/packages/4a/d4/ec35826073e92b0b37c2df2075b0aa7abecc2d8217480a90e864f7f3e39f/pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d", size = 1898028 }, + { url = "https://files.pythonhosted.org/packages/82/0d/25e4087d8380fa696cbde556fa2694947038872d50cb01f86909d59fc4b4/pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c", size = 1838761 }, + { url = "https://files.pythonhosted.org/packages/cb/ac/42aa7ee25d816c9fed9fe1bf4ee11472ba8057814262c8f713fa010ed4d7/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b", size = 1789150 }, + { url = "https://files.pythonhosted.org/packages/0b/3e/d93ae7810b35d44d8777768b561001eff279040580aebf71ce9c8e9a613f/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243", size = 1773533 }, + { url = "https://files.pythonhosted.org/packages/f5/fd/a07dc6fcdf9e0b2f5e4c016dd74a188fc19311aceac89cee1fd2471e3b06/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38", size = 1975497 }, + { url = "https://files.pythonhosted.org/packages/b8/d1/9148ea8c18212a297c6b256e0197268523f30e02057474157784c9f5835e/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc", size = 2591911 }, + { url = "https://files.pythonhosted.org/packages/2a/fb/379309fab9af69d30c523978a971f8050d96bd3e36fb317b2c57bfd65548/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392", size = 2100735 }, + { url = "https://files.pythonhosted.org/packages/6f/23/f100db088bb343a4a9e8d3085cb84d349bcf6004b101eebb5c8812226e23/pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c", size = 1900739 }, + { url = "https://files.pythonhosted.org/packages/10/4e/a4808cc751651329b7f0372454bbe486e79e7189b974748fba361abadecc/pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997", size = 1966597 }, + { url = "https://files.pythonhosted.org/packages/10/a8/1ce3a2af38c87890ad27d97f405cadab56aecdbf7e8e88dc39f45eeb63ab/pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e", size = 2119457 }, + { url = "https://files.pythonhosted.org/packages/60/8c/1da883ec849c75256210db8370906a151898e5dce5be85ced7881e980a44/pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d", size = 1717499 }, + { url = "https://files.pythonhosted.org/packages/59/04/475e9c2013aeb8d130d40818466b1f8eee017d2e3a5ecc3324211fe69c8f/pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c", size = 1923306 }, +] + +[[package]] +name = "pyelftools" +version = "0.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/56/0f2d69ed9a0060da009f672ddec8a71c041d098a66f6b1d80264bf6bbdc0/pyelftools-0.31.tar.gz", hash = "sha256:c774416b10310156879443b81187d182d8d9ee499660380e645918b50bc88f99", size = 14108889 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/64/711030d9fe9ccaf6ee3ab1bcf4801c6bb3d0e585af18824a50b016b4f39c/pyelftools-0.31-py3-none-any.whl", hash = "sha256:f52de7b3c7e8c64c8abc04a79a1cf37ac5fb0b8a49809827130b858944840607", size = 180473 }, +] + +[[package]] +name = "pyflakes" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/f9/669d8c9c86613c9d568757c7f5824bd3197d7b1c6c27553bc5618a27cce2/pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", size = 63788 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a", size = 62725 }, +] + +[[package]] +name = "pyftpdlib" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasynchat" }, + { name = "pyasyncore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/0c/32bf0a7c88efe147bc3bc6586216d92269d196c59f149b05efa973834946/pyftpdlib-2.0.1.tar.gz", hash = "sha256:ef0d172a82bfae10e2dec222e87533514609d41bf4b0fd0f07e29d4380fb96bf", size = 202285 } + +[[package]] +name = "pygit2" +version = "1.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/50/f0795db653ceda94f4388d2b40598c188aa4990715909fabcf16b381b843/pygit2-1.13.3.tar.gz", hash = "sha256:0257c626011e4afb99bdb20875443f706f84201d4c92637f02215b98eac13ded", size = 752098 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/af/e874991f3513e5d56020bed5fbd278dcb1824aaf881d01c7a6436e089ecd/pygit2-1.13.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:07b17f766c88ce1d05d264b5819e75ad261f3b60e33e4105a71f02467d0f6d39", size = 5793582 }, + { url = "https://files.pythonhosted.org/packages/69/df/a391d29563431e9e107d26b871aebc7adc7a421f801747d4ffac0a29f86e/pygit2-1.13.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81bfe9ca394cdc896b632f18cd5f9c656a5f6c03c61deb1570b9081f2406776b", size = 4759604 }, + { url = "https://files.pythonhosted.org/packages/cb/f4/927fbb9b1bf35047c410fdcdf83867468248ebef8f45b2418fab540c45aa/pygit2-1.13.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c83e6e5ac357a9e87698c1eb25f430846f208bce12362d2209e7c9ac214e00c", size = 5055898 }, + { url = "https://files.pythonhosted.org/packages/6b/f2/fcf58c2b237d426e6f45b7d65fe14ee4e5f45aab5f674af1d82217086fb0/pygit2-1.13.3-cp312-cp312-win32.whl", hash = "sha256:de481a2cee7ef98143109bd9d2b30690022aeb8ba849feeba082a3b48a53c214", size = 1150594 }, + { url = "https://files.pythonhosted.org/packages/e3/53/69d648828082c2a1cf0c5204d2fcae22c80fdc8569d4421e0e48566f9009/pygit2-1.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:0353b55f8bed1742dab15083ee9ee508ed91feb5c2563e2a612af277317030c6", size = 1232240 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyinstaller" +version = "6.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "altgraph" }, + { name = "macholib", marker = "sys_platform == 'darwin' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "packaging" }, + { name = "pefile", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pyinstaller-hooks-contrib" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/d4/54f5f5c73b803e6256ea97ffc6ba8a305d9a5f57f85f9b00b282512bf18a/pyinstaller-6.11.1.tar.gz", hash = "sha256:491dfb4d9d5d1d9650d9507daec1ff6829527a254d8e396badd60a0affcb72ef", size = 4249772 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/15/b0f1c0985ee32fcd2f6ad9a486ef94e4db3fef9af025a3655e76cb708009/pyinstaller-6.11.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:44e36172de326af6d4e7663b12f71dbd34e2e3e02233e181e457394423daaf03", size = 991780 }, + { url = "https://files.pythonhosted.org/packages/fd/0f/9f54cb18abe2b1d89051bc9214c0cb40d7b5f4049c151c315dacc067f4a2/pyinstaller-6.11.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6d12c45a29add78039066a53fb05967afaa09a672426072b13816fe7676abfc4", size = 711739 }, + { url = "https://files.pythonhosted.org/packages/32/f7/79d10830780eff8339bfa793eece1df4b2459e35a712fc81983e8536cc29/pyinstaller-6.11.1-py3-none-manylinux2014_i686.whl", hash = "sha256:ddc0fddd75f07f7e423da1f0822e389a42af011f9589e0269b87e0d89aa48c1f", size = 714053 }, + { url = "https://files.pythonhosted.org/packages/25/f7/9961ef02cdbd2dbb1b1a215292656bd0ea72a83aafd8fb6373513849711e/pyinstaller-6.11.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0d6475559c4939f0735122989611d7f739ed3bf02f666ce31022928f7a7e4fda", size = 719133 }, + { url = "https://files.pythonhosted.org/packages/6f/4d/7f854842a1ce798de762a0b0bc5d5a4fc26ad06164a98575dc3c54abed1f/pyinstaller-6.11.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:e21c7806e34f40181e7606926a14579f848bfb1dc52cbca7eea66eccccbfe977", size = 709591 }, + { url = "https://files.pythonhosted.org/packages/7f/e0/00d29fc90c3ba50620c61554e26ebb4d764569507be7cd1c8794aa696f9a/pyinstaller-6.11.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:32c742a24fe65d0702958fadf4040f76de85859c26bec0008766e5dbabc5b68f", size = 710068 }, + { url = "https://files.pythonhosted.org/packages/3e/57/d14b44a69f068d2caaee49d15e45f9fa0f37c6a2d2ad778c953c1722a1ca/pyinstaller-6.11.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:208c0ef6dab0837a0a273ea32d1a3619a208e3d1fe3fec3785eea71a77fd00ce", size = 714439 }, + { url = "https://files.pythonhosted.org/packages/88/01/256824bb57ca208099c86c2fb289f888ca7732580e91ced48fa14e5903b2/pyinstaller-6.11.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ad84abf465bcda363c1d54eafa76745d77b6a8a713778348377dc98d12a452f7", size = 710457 }, + { url = "https://files.pythonhosted.org/packages/7c/f0/98c9138f5f0ff17462f1ad6d712dcfa643b9a283d6238d464d8145bc139d/pyinstaller-6.11.1-py3-none-win32.whl", hash = "sha256:2e8365276c5131c9bef98e358fbc305e4022db8bedc9df479629d6414021956a", size = 1280261 }, + { url = "https://files.pythonhosted.org/packages/7d/08/f43080614b3e8bce481d4dfd580e579497c7dcdaf87656d9d2ad912e5796/pyinstaller-6.11.1-py3-none-win_amd64.whl", hash = "sha256:7ac83c0dc0e04357dab98c487e74ad2adb30e7eb186b58157a8faf46f1fa796f", size = 1340482 }, + { url = "https://files.pythonhosted.org/packages/ed/56/953c6594cb66e249563854c9cc04ac5a055c6c99d1614298feeaeaa9b87e/pyinstaller-6.11.1-py3-none-win_arm64.whl", hash = "sha256:35e6b8077d240600bb309ed68bb0b1453fd2b7ab740b66d000db7abae6244423", size = 1267519 }, +] + +[[package]] +name = "pyinstaller-hooks-contrib" +version = "2025.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/2e/eb876675aa5338f6ebb2d86dd91cc530542e054e9b6bce1ee938c14fdc07/pyinstaller_hooks_contrib-2025.0.tar.gz", hash = "sha256:6dc0b55a1acaab2ffee36ed4a05b073aa0a22e46f25fb5c66a31e217454135ed", size = 146002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/46/f0654c01d3e16ee652e62dd59c8e80b67842d83d9c103d69d0654507954a/pyinstaller_hooks_contrib-2025.0-py3-none-any.whl", hash = "sha256:3c0623799c3f81a37293127f485d65894c20fd718f722cb588785a3e52581ad1", size = 344671 }, +] + +[[package]] +name = "pylint" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/b9/50be49afc91469f832c4bf12318ab4abe56ee9aa3700a89aad5359ad195f/pylint-3.3.4.tar.gz", hash = "sha256:74ae7a38b177e69a9b525d0794bd8183820bfa7eb68cc1bee6e8ed22a42be4ce", size = 1518905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/8b/eef15df5f4e7aa393de31feb96ca9a3d6639669bd59d589d0685d5ef4e62/pylint-3.3.4-py3-none-any.whl", hash = "sha256:289e6a1eb27b453b08436478391a48cd53bb0efb824873f949e709350f3de018", size = 522280 }, +] + +[[package]] +name = "pylxd" +version = "2.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "ws4py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/8e/6a31a694560adaba20df521c3102bdecec06a0fea9c73ff1466834e2df30/pylxd-2.3.5.tar.gz", hash = "sha256:d67973dd2dc1728e3e1b41cc973e11e6cbceae87878d193ac04cc2b65a7158ef", size = 71781 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/44/ea48223c7fd42376cc9c6cdff3a8bf3cd19045a3c3722a2fcc9655cfd8a3/pylxd-2.3.5-py3-none-any.whl", hash = "sha256:f74affdb8a852c6241593c6bc022be1d6e2e700d9bc5efb180aeb7e7697a268d", size = 98084 }, +] + +[[package]] +name = "pymacaroons" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pynacl" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/b4/52ff00b59e91c4817ca60210c33caf11e85a7f68f7b361748ca2eb50923e/pymacaroons-0.13.0.tar.gz", hash = "sha256:1e6bba42a5f66c245adf38a5a4006a99dcc06a0703786ea636098667d42903b8", size = 21083 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/87/fd9b54258216e3f19671f6e9dd76da1ebc49e93ea0107c986b1071dd3068/pymacaroons-0.13.0-py2.py3-none-any.whl", hash = "sha256:3e14dff6a262fdbf1a15e769ce635a8aea72e6f8f91e408f9a97166c53b91907", size = 19463 }, +] + +[[package]] +name = "pynacl" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba", size = 3392854 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/75/0b8ede18506041c0bf23ac4d8e2971b4161cd6ce630b177d0a08eb0d8857/PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1", size = 349920 }, + { url = "https://files.pythonhosted.org/packages/59/bb/fddf10acd09637327a97ef89d2a9d621328850a72f1fdc8c08bdf72e385f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92", size = 601722 }, + { url = "https://files.pythonhosted.org/packages/5d/70/87a065c37cca41a75f2ce113a5a2c2aa7533be648b184ade58971b5f7ccc/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394", size = 680087 }, + { url = "https://files.pythonhosted.org/packages/ee/87/f1bb6a595f14a327e8285b9eb54d41fef76c585a0edef0a45f6fc95de125/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d", size = 856678 }, + { url = "https://files.pythonhosted.org/packages/66/28/ca86676b69bf9f90e710571b67450508484388bfce09acf8a46f0b8c785f/PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858", size = 1133660 }, + { url = "https://files.pythonhosted.org/packages/3d/85/c262db650e86812585e2bc59e497a8f59948a005325a11bbbc9ecd3fe26b/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b", size = 663824 }, + { url = "https://files.pythonhosted.org/packages/fd/1a/cc308a884bd299b651f1633acb978e8596c71c33ca85e9dc9fa33a5399b9/PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff", size = 1117912 }, + { url = "https://files.pythonhosted.org/packages/25/2d/b7df6ddb0c2a33afdb358f8af6ea3b8c4d1196ca45497dd37a56f0c122be/PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543", size = 204624 }, + { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, +] + +[[package]] +name = "pyramid" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hupper" }, + { name = "plaster" }, + { name = "plaster-pastedeploy" }, + { name = "setuptools" }, + { name = "translationstring" }, + { name = "venusian" }, + { name = "webob" }, + { name = "zope-deprecation" }, + { name = "zope-interface" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/c3/5d5736e692fc7ff052577f03136b5edfdf1e2e177eff2f4b91206acae11d/pyramid-2.0.2.tar.gz", hash = "sha256:372138a738e4216535cc76dcce6eddd5a1aaca95130f2354fb834264c06f18de", size = 2637533 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/41/a2114b8dd2187ae007e022a2baabdc7937cc78211cefc0c01fc5452193af/pyramid-2.0.2-py3-none-any.whl", hash = "sha256:2e6585ac55c147f0a51bc00dadf72075b3bdd9a871b332ff9e5e04117ccd76fa", size = 247277 }, +] + +[[package]] +name = "pyrfc3339" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/52/75ea0ae249ba885c9429e421b4f94bc154df68484847f1ac164287d978d7/pyRFC3339-1.1.tar.gz", hash = "sha256:81b8cbe1519cdb79bed04910dd6fa4e181faf8c88dff1e1b987b5f7ab23a5b1a", size = 5290 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/7a/725f5c16756ec6211b1e7eeac09f469084595513917ea069bc023c40a5e2/pyRFC3339-1.1-py2.py3-none-any.whl", hash = "sha256:67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4", size = 5669 }, +] + +[[package]] +name = "pyspelling" +version = "2.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "html5lib" }, + { name = "lxml" }, + { name = "markdown" }, + { name = "pyyaml" }, + { name = "soupsieve" }, + { name = "wcmatch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/07/168a857755a29b7e41550a28cd8f527025bc62fcb36a951d8f3f2eedcdf7/pyspelling-2.10.tar.gz", hash = "sha256:acd67133c1b7cecd410e3d4489e61f2e4b1f0b6acf1ae6c48c240fbb21729c37", size = 148239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/16/242558b5c5cb73efd52490f1e6bfb03eae63b2585770b9cae78bd491ef0b/pyspelling-2.10-py3-none-any.whl", hash = "sha256:9b079dd238bd0616a49f9ac5df32799beb851dddc5ed7634f551e7df1aeee943", size = 45035 }, +] + +[[package]] +name = "pytest" +version = "8.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, +] + +[[package]] +name = "pytest-check" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/d3/178a723f0420cf4e06fb6ddf43fc1ec68c1d0d4ea3db1ecf8f6df21b345f/pytest_check-2.4.1.tar.gz", hash = "sha256:5224efcef059bf7f0cda253f8d0f62704b4819ff48c93f51c675aea6a014f650", size = 28933 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/25/465756acbb66db47ad40e0be6b457d8644c7b9f882b2ff7f5e92dde07915/pytest_check-2.4.1-py3-none-any.whl", hash = "sha256:74f38938183880d9921aeb85662437d2b13e1e053e1bed7d186d54613d3068c7", size = 13789 }, +] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pytest" }, +] +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/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, +] + +[[package]] +name = "pytest-mock" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863 }, +] + +[[package]] +name = "pytest-subprocess" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/ae/3ad5c609a5088936608af12f42ad72567a877d3c64303500ebc3b7df0297/pytest_subprocess-1.5.3.tar.gz", hash = "sha256:c00b1140fb0211b3153e09500d770db10770baccbe6e05ee9c140036d1d811d5", size = 42282 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/82/a038e8fdb86d5494a39b8730547ec79767731d02ecb556121e40c0892803/pytest_subprocess-1.5.3-py3-none-any.whl", hash = "sha256:b62580f5a84335fb9f2ec65d49e56a3c93f4722c148fe1771a002835d310a75b", size = 21759 }, +] + +[[package]] +name = "python-apt" +version = "2.4.0+ubuntu4" +source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +wheels = [ + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp312-cp312-manylinux_2_35_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp312-cp312-manylinux_2_35_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp312-cp312-manylinux_2_35_x86_64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp313-cp313-manylinux_2_35_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp313-cp313-manylinux_2_35_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.4.0+ubuntu4-cp313-cp313-manylinux_2_35_x86_64.whl" }, +] + +[[package]] +name = "python-apt" +version = "2.7.7+ubuntu3" +source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +wheels = [ + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp312-cp312-manylinux_2_39_aarch64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp312-cp312-manylinux_2_39_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp312-cp312-manylinux_2_39_riscv64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp312-cp312-manylinux_2_39_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp312-cp312-manylinux_2_39_x86_64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp313-cp313-manylinux_2_39_aarch64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp313-cp313-manylinux_2_39_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp313-cp313-manylinux_2_39_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.7.7+ubuntu3-cp313-cp313-manylinux_2_39_x86_64.whl" }, +] + +[[package]] +name = "python-apt" +version = "2.9.0+ubuntu1" +source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version < '3.13'", +] +wheels = [ + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp312-cp312-manylinux_2_40_aarch64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp312-cp312-manylinux_2_40_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp312-cp312-manylinux_2_40_riscv64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp312-cp312-manylinux_2_40_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp312-cp312-manylinux_2_40_x86_64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp313-cp313-manylinux_2_40_aarch64.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp313-cp313-manylinux_2_40_ppc64le.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp313-cp313-manylinux_2_40_s390x.whl" }, + { url = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/python-apt/python_apt-2.9.0+ubuntu1-cp313-cp313-manylinux_2_40_x86_64.whl" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-debian" +version = "0.1.49" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/8d/2ebc549adf1f623d4044b108b30ff5cdac5756b0384cd9dddac63fe53eae/python-debian-0.1.49.tar.gz", hash = "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", size = 121690 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/37/6e38e7aafa55c1257f63ca9f575e8e3cf2560c896c5202a16c9f33ee7657/python_debian-0.1.49-py3-none-any.whl", hash = "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", size = 132460 }, +] + +[[package]] +name = "pytz" +version = "2024.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, +] + +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, +] + +[[package]] +name = "pyxdg" +version = "0.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/25/7998cd2dec731acbd438fbf91bc619603fc5188de0a9a17699a781840452/pyxdg-0.28.tar.gz", hash = "sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4", size = 77776 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/8d/cf41b66a8110670e3ad03dab9b759704eeed07fa96e90fdc0357b2ba70e2/pyxdg-0.28-py2.py3-none-any.whl", hash = "sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab", size = 49520 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "raven" +version = "6.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/57/b74a86d74f96b224a477316d418389af9738ba7a63c829477e7a86dd6f47/raven-6.10.0.tar.gz", hash = "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", size = 288902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/8e/62e26a88c0a1bbae677200baf0767c1022321a6555634f8129e6d55c5ddc/raven-6.10.0-py2.py3-none-any.whl", hash = "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4", size = 284314 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "requests-unixsocket2" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/66/88737c8720685f44e6a1c04cb2185301a6ec4538ac82324f0f33c9dc5fd5/requests_unixsocket2-0.4.2.tar.gz", hash = "sha256:929c58ecc5981f3d127661ceb9ec8c76e0f08d31c52e44ab1462ac0dcd55b5f5", size = 6367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/34/b1072b2b1310572d8b801adcf3b148197eea2f8207f3750f73fcd2a6db5d/requests_unixsocket2-0.4.2-py3-none-any.whl", hash = "sha256:701fcd49d74bc0f759bbe45c4dfda0045fd89652948c2b473b1a312214c3770b", size = 7786 }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml-clib", marker = "(python_full_version < '3.13' and platform_python_implementation == 'CPython') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (python_full_version >= '3.13' and extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (platform_python_implementation != 'CPython' and extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729 }, +] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.12" +source = { registry = "https://pypi.org/simple" } +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/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/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, + { 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/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, + { 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 = "secretstorage" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", size = 19739 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", size = 15221 }, +] + +[[package]] +name = "setuptools" +version = "75.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, +] + +[[package]] +name = "simplejson" +version = "3.19.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/29/085111f19717f865eceaf0d4397bf3e76b08d60428b076b64e2a1903706d/simplejson-3.19.3.tar.gz", hash = "sha256:8e086896c36210ab6050f2f9f095a5f1e03c83fa0e7f296d6cba425411364680", size = 85237 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/15/513fea93fafbdd4993eacfcb762965b2ff3d29e618c029e2956174d68c4b/simplejson-3.19.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:66a0399e21c2112acacfebf3d832ebe2884f823b1c7e6d1363f2944f1db31a99", size = 92921 }, + { url = "https://files.pythonhosted.org/packages/a4/4f/998a907ae1a6c104dc0ee48aa248c2478490152808d34d8e07af57f396c3/simplejson-3.19.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6ef9383c5e05f445be60f1735c1816163c874c0b1ede8bb4390aff2ced34f333", size = 75311 }, + { url = "https://files.pythonhosted.org/packages/db/44/acd6122201e927451869d45952b9ab1d3025cdb5e61548d286d08fbccc08/simplejson-3.19.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42e5acf80d4d971238d4df97811286a044d720693092b20a56d5e56b7dcc5d09", size = 74964 }, + { url = "https://files.pythonhosted.org/packages/27/ca/d0a1e8f16e1bbdc0b8c6d88166f45f565ed7285f53928cfef3b6ce78f14d/simplejson-3.19.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0b0efc7279d768db7c74d3d07f0b5c81280d16ae3fb14e9081dc903e8360771", size = 150106 }, + { url = "https://files.pythonhosted.org/packages/63/59/0554b78cf26c98e2b9cae3f44723bd72c2394e2afec1a14eedc6211f7187/simplejson-3.19.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0552eb06e7234da892e1d02365cd2b7b2b1f8233aa5aabdb2981587b7cc92ea0", size = 158347 }, + { url = "https://files.pythonhosted.org/packages/b2/fe/9f30890352e431e8508cc569912d3322147d3e7e4f321e48c0adfcb4c97d/simplejson-3.19.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf6a3b9a7d7191471b464fe38f684df10eb491ec9ea454003edb45a011ab187", size = 148456 }, + { url = "https://files.pythonhosted.org/packages/37/e3/663a09542ee021d4131162f7a164cb2e7f04ef48433a67591738afbf12ea/simplejson-3.19.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7017329ca8d4dca94ad5e59f496e5fc77630aecfc39df381ffc1d37fb6b25832", size = 152190 }, + { url = "https://files.pythonhosted.org/packages/31/20/4e0c4d35e10ff6465003bec304316d822a559a1c38c66ef6892ca199c207/simplejson-3.19.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67a20641afebf4cfbcff50061f07daad1eace6e7b31d7622b6fa2c40d43900ba", size = 149846 }, + { url = "https://files.pythonhosted.org/packages/08/7a/46e2e072cac3987cbb05946f25167f0ad2fe536748e7405953fd6661a486/simplejson-3.19.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd6a7dabcc4c32daf601bc45e01b79175dde4b52548becea4f9545b0a4428169", size = 151714 }, + { url = "https://files.pythonhosted.org/packages/7f/7d/dbeeac10eb61d5d8858d0bb51121a21050d281dc83af4c557f86da28746c/simplejson-3.19.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:08f9b443a94e72dd02c87098c96886d35790e79e46b24e67accafbf13b73d43b", size = 158777 }, + { url = "https://files.pythonhosted.org/packages/fc/8f/a98bdbb799c6a4a884b5823db31785a96ba895b4b0f4d8ac345d6fe98bbf/simplejson-3.19.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa97278ae6614346b5ca41a45a911f37a3261b57dbe4a00602048652c862c28b", size = 154230 }, + { url = "https://files.pythonhosted.org/packages/b1/db/852eebceb85f969ae40e06babed1a93d3bacb536f187d7a80ff5823a5979/simplejson-3.19.3-cp312-cp312-win32.whl", hash = "sha256:ef28c3b328d29b5e2756903aed888960bc5df39b4c2eab157ae212f70ed5bf74", size = 74002 }, + { url = "https://files.pythonhosted.org/packages/fe/68/9f0e5df0651cb79ef83cba1378765a00ee8038e6201cc82b8e7178a7778e/simplejson-3.19.3-cp312-cp312-win_amd64.whl", hash = "sha256:1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a", size = 75596 }, + { url = "https://files.pythonhosted.org/packages/93/3a/5896821ed543899fcb9c4256c7e71bb110048047349a00f42bc8b8fb379f/simplejson-3.19.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0959e6cb62e3994b5a40e31047ff97ef5c4138875fae31659bead691bed55896", size = 92931 }, + { url = "https://files.pythonhosted.org/packages/39/15/5d33d269440912ee40d856db0c8be2b91aba7a219690ab01f86cb0edd590/simplejson-3.19.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a7bfad839c624e139a4863007233a3f194e7c51551081f9789cba52e4da5167", size = 75318 }, + { url = "https://files.pythonhosted.org/packages/2a/8d/2e7483a2bf7ec53acf7e012bafbda79d7b34f90471dda8e424544a59d484/simplejson-3.19.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afab2f7f2486a866ff04d6d905e9386ca6a231379181a3838abce1f32fbdcc37", size = 74971 }, + { url = "https://files.pythonhosted.org/packages/4d/9d/9bdf34437c8834a7cf7246f85e9d5122e30579f512c10a0c2560e994294f/simplejson-3.19.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00313681015ac498e1736b304446ee6d1c72c5b287cd196996dad84369998f7", size = 150112 }, + { url = "https://files.pythonhosted.org/packages/a7/e2/1f2ae2d89eaf85f6163c82150180aae5eaa18085cfaf892f8a57d4c51cbd/simplejson-3.19.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d936ae682d5b878af9d9eb4d8bb1fdd5e41275c8eb59ceddb0aeed857bb264a2", size = 158354 }, + { url = "https://files.pythonhosted.org/packages/60/83/26f610adf234c8492b3f30501e12f2271e67790f946c6898fe0c58aefe99/simplejson-3.19.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c6657485393f2e9b8177c77a7634f13ebe70d5e6de150aae1677d91516ce6b", size = 148455 }, + { url = "https://files.pythonhosted.org/packages/b5/4b/109af50006af77133653c55b5b91b4bd2d579ff8254ce11216c0b75f911b/simplejson-3.19.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a6a750d3c7461b1c47cfc6bba8d9e57a455e7c5f80057d2a82f738040dd1129", size = 152191 }, + { url = "https://files.pythonhosted.org/packages/75/dc/108872a8825cbd99ae6f4334e0490ff1580367baf12198bcaf988f6820ba/simplejson-3.19.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ea7a4a998c87c5674a27089e022110a1a08a7753f21af3baf09efe9915c23c3c", size = 149954 }, + { url = "https://files.pythonhosted.org/packages/eb/be/deec1d947a5d0472276ab4a4d1a9378dc5ee27f3dc9e54d4f62ffbad7a08/simplejson-3.19.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6300680d83a399be2b8f3b0ef7ef90b35d2a29fe6e9c21438097e0938bbc1564", size = 151812 }, + { url = "https://files.pythonhosted.org/packages/e9/58/4ee130702d36b1551ef66e7587eefe56651f3669255bf748cd71691e2434/simplejson-3.19.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ab69f811a660c362651ae395eba8ce84f84c944cea0df5718ea0ba9d1e4e7252", size = 158880 }, + { url = "https://files.pythonhosted.org/packages/0f/e1/59cc6a371b60f89e3498d9f4c8109f6b7359094d453f5fe80b2677b777b0/simplejson-3.19.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:256e09d0f94d9c3d177d9e95fd27a68c875a4baa2046633df387b86b652f5747", size = 154344 }, + { url = "https://files.pythonhosted.org/packages/79/45/1b36044670016f5cb25ebd92497427d2d1711ecb454d00f71eb9a00b77cc/simplejson-3.19.3-cp313-cp313-win32.whl", hash = "sha256:2c78293470313aefa9cfc5e3f75ca0635721fb016fb1121c1c5b0cb8cc74712a", size = 74002 }, + { url = "https://files.pythonhosted.org/packages/e2/58/b06226e6b0612f2b1fa13d5273551da259f894566b1eef32249ddfdcce44/simplejson-3.19.3-cp313-cp313-win_amd64.whl", hash = "sha256:3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c", size = 75599 }, + { url = "https://files.pythonhosted.org/packages/0d/e7/f9fafbd4f39793a20cc52e77bbd766f7384312526d402c382928dc7667f6/simplejson-3.19.3-py3-none-any.whl", hash = "sha256:49cc4c7b940d43bd12bf87ec63f28cbc4964fc4e12c031cc8cd01650f43eb94e", size = 57004 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, +] + +[[package]] +name = "snap-helpers" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/2a/221ab0a9c0200065bdd8a5d2b131997e3e19ce81832fdf8138a7f5247216/snap-helpers-0.4.2.tar.gz", hash = "sha256:ef3b8621e331bb71afe27e54ef742a7dd2edd9e8026afac285beb42109c8b9a9", size = 20100 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/2c/c1304eb8787bbed23cfc0b07cee6b21e1310ceb6a6f7a4193dab02525c91/snap_helpers-0.4.2-py3-none-any.whl", hash = "sha256:04d0ebd167c943849c99ec68b87829fef4a915cbe9b02d8afc3891d889327327", size = 22805 }, +] + +[[package]] +name = "snapcraft" +source = { editable = "." } +dependencies = [ + { name = "attrs" }, + { name = "catkin-pkg", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "click" }, + { name = "craft-application" }, + { name = "craft-archives" }, + { name = "craft-cli" }, + { name = "craft-grammar" }, + { name = "craft-parts" }, + { name = "craft-platforms" }, + { name = "craft-store" }, + { name = "cryptography" }, + { name = "gnupg" }, + { name = "jsonschema" }, + { name = "launchpadlib" }, + { name = "lazr-restfulclient" }, + { name = "lxml" }, + { name = "macaroonbakery" }, + { name = "mypy-extensions" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "progressbar" }, + { name = "pydantic" }, + { name = "pyelftools" }, + { name = "pygit2" }, + { name = "pylxd", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pymacaroons" }, + { name = "python-debian", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pyxdg" }, + { name = "pyyaml" }, + { name = "raven" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "requests-unixsocket2" }, + { name = "simplejson" }, + { name = "snap-helpers" }, + { name = "tabulate" }, + { name = "tinydb" }, + { name = "toml" }, + { name = "typing-extensions" }, + { name = "validators" }, +] + +[package.dev-dependencies] +apt-jammy = [ + { name = "python-apt", version = "2.4.0+ubuntu4", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +apt-noble = [ + { name = "python-apt", version = "2.7.7+ubuntu3", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +apt-oracular = [ + { name = "python-apt", version = "2.9.0+ubuntu1", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +apt-plucky = [ + { name = "python-apt", version = "2.9.0+ubuntu1", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +dev = [ + { name = "coverage" }, + { name = "fixtures" }, + { name = "flake8" }, + { name = "mccabe" }, + { name = "pexpect" }, + { name = "pip" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, + { name = "pyftpdlib" }, + { name = "pyinstaller", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "pylint" }, + { name = "pyramid" }, + { name = "pytest" }, + { name = "pytest-check" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, + { name = "pytest-subprocess" }, + { name = "testscenarios" }, +] +dev-jammy = [ + { name = "python-apt", version = "2.4.0+ubuntu4", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +dev-noble = [ + { name = "python-apt", version = "2.7.7+ubuntu3", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +dev-oracular = [ + { name = "python-apt", version = "2.9.0+ubuntu1", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +dev-plucky = [ + { name = "python-apt", version = "2.9.0+ubuntu1", source = { registry = "https://people.canonical.com/~lengau/python-apt-ubuntu-wheels/" }, marker = "sys_platform == 'linux'" }, +] +docs = [ + { name = "canonical-sphinx", extra = ["full"] }, + { name = "docutils" }, + { name = "pyspelling" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-typehints" }, + { name = "sphinx-lint" }, + { name = "sphinx-toolbox" }, + { name = "sphinxcontrib-details-directive" }, +] +lint = [ + { name = "codespell" }, + { name = "mypy" }, + { name = "types-pyyaml" }, + { name = "types-requests" }, + { name = "types-setuptools" }, + { name = "types-simplejson" }, + { name = "types-tabulate" }, + { name = "types-toml" }, + { name = "yamllint" }, +] +types = [ + { name = "mypy" }, + { name = "types-pyyaml" }, + { name = "types-requests" }, + { name = "types-setuptools" }, + { name = "types-simplejson" }, + { name = "types-tabulate" }, + { name = "types-toml" }, +] + +[package.metadata] +requires-dist = [ + { name = "attrs", specifier = "==24.2.0" }, + { name = "catkin-pkg", marker = "sys_platform == 'linux'", specifier = "==1.0.0" }, + { name = "click", specifier = "==8.1.7" }, + { name = "craft-application", specifier = "==4.4.0" }, + { name = "craft-archives", specifier = "~=2.0" }, + { name = "craft-cli", specifier = ">=2.15.0" }, + { name = "craft-grammar", specifier = ">=2.0.1,<3.0.0" }, + { name = "craft-parts", specifier = "==2.4.1" }, + { name = "craft-platforms", specifier = "~=0.4" }, + { name = "craft-store", specifier = ">=3.0.2,<4.0.0" }, + { name = "cryptography", specifier = "==43.0.3" }, + { name = "gnupg" }, + { name = "jsonschema", specifier = "==2.5.1" }, + { name = "launchpadlib" }, + { name = "lazr-restfulclient" }, + { name = "lxml" }, + { name = "macaroonbakery" }, + { name = "mypy-extensions" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "progressbar" }, + { name = "pydantic", specifier = "==2.8" }, + { name = "pyelftools" }, + { name = "pygit2", specifier = "~=1.13.0" }, + { name = "pylxd", marker = "sys_platform == 'linux'" }, + { name = "pymacaroons" }, + { name = "python-debian", marker = "sys_platform == 'linux'" }, + { name = "pyxdg" }, + { name = "pyyaml" }, + { name = "raven" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "requests-unixsocket2" }, + { name = "simplejson" }, + { name = "snap-helpers" }, + { name = "tabulate" }, + { name = "tinydb" }, + { name = "toml" }, + { name = "typing-extensions" }, + { name = "validators", specifier = ">=0.28.3" }, +] + +[package.metadata.requires-dev] +apt-jammy = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = "~=2.4.0" }] +apt-noble = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = "~=2.7.0" }] +apt-oracular = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = ">=2.9.0" }] +apt-plucky = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = ">=2.9.0" }] +dev = [ + { name = "coverage", extras = ["toml"] }, + { name = "fixtures" }, + { name = "flake8" }, + { name = "mccabe" }, + { name = "pexpect" }, + { name = "pip" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, + { name = "pyftpdlib" }, + { name = "pyinstaller", marker = "sys_platform == 'win32'" }, + { name = "pylint" }, + { name = "pyramid" }, + { name = "pytest" }, + { name = "pytest-check" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, + { name = "pytest-subprocess" }, + { name = "testscenarios" }, +] +dev-jammy = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = "~=2.4.0" }] +dev-noble = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = "~=2.7.0" }] +dev-oracular = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = ">=2.9.0" }] +dev-plucky = [{ name = "python-apt", marker = "sys_platform == 'linux'", specifier = ">=2.9.0" }] +docs = [ + { name = "canonical-sphinx", extras = ["full"], specifier = ">=0.2.0" }, + { name = "docutils", specifier = "<0.20" }, + { name = "pyspelling" }, + { name = "sphinx-autobuild" }, + { name = "sphinx-autodoc-typehints" }, + { name = "sphinx-lint" }, + { name = "sphinx-toolbox" }, + { name = "sphinxcontrib-details-directive" }, +] +lint = [ + { name = "codespell", extras = ["toml"] }, + { name = "mypy" }, + { name = "types-pyyaml" }, + { name = "types-requests", specifier = "==2.31.0.6" }, + { name = "types-setuptools" }, + { name = "types-simplejson" }, + { name = "types-tabulate" }, + { name = "types-toml" }, + { name = "yamllint", specifier = "~=1.34" }, +] +types = [ + { name = "mypy" }, + { name = "types-pyyaml" }, + { name = "types-requests", specifier = "==2.31.0.6" }, + { name = "types-setuptools" }, + { name = "types-simplejson" }, + { name = "types-tabulate" }, + { name = "types-toml" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[package]] +name = "sphinx" +version = "7.3.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/0a/b88033900b1582f5ed8f880263363daef968d1cd064175e32abfd9714410/sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc", size = 7094808 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/fa/130c32ed94cf270e3d0b9ded16fb7b2c8fea86fa7263c29a696a30c1dde7/sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", size = 3335650 }, +] + +[[package]] +name = "sphinx-autobuild" +version = "2024.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "sphinx" }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908 }, +] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/cd/03e7b917230dc057922130a79ba0240df1693bfd76727ea33fae84b39138/sphinx_autodoc_typehints-2.3.0.tar.gz", hash = "sha256:535c78ed2d6a1bad393ba9f3dfa2602cf424e2631ee207263e07874c38fde084", size = 40709 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f3/e0a4ce49da4b6f4e4ce84b3c39a0677831884cb9d8a87ccbf1e9e56e53ac/sphinx_autodoc_typehints-2.3.0-py3-none-any.whl", hash = "sha256:3098e2c6d0ba99eacd013eb06861acc9b51c6e595be86ab05c08ee5506ac0c67", size = 19836 }, +] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, +] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, +] + +[[package]] +name = "sphinx-design" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 }, +] + +[[package]] +name = "sphinx-jinja2-compat" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "standard-imghdr", marker = "python_full_version >= '3.13' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/df/27282da6f8c549f765beca9de1a5fc56f9651ed87711a5cac1e914137753/sphinx_jinja2_compat-0.3.0.tar.gz", hash = "sha256:f3c1590b275f42e7a654e081db5e3e5fb97f515608422bde94015ddf795dfe7c", size = 4998 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/42/2fd09d672eaaa937d6893d8b747d07943f97a6e5e30653aee6ebd339b704/sphinx_jinja2_compat-0.3.0-py3-none-any.whl", hash = "sha256:b1e4006d8e1ea31013fa9946d1b075b0c8d2a42c6e3425e63542c1e9f8be9084", size = 7883 }, +] + +[[package]] +name = "sphinx-lint" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polib" }, + { name = "regex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/46/f2dad36a4076e9ce88498b25b3f0de82eb7d341ea0ef715cd6c48005bcef/sphinx_lint-1.0.0.tar.gz", hash = "sha256:6eafdb44172ce526f405bf36c713eb246f1340ec2d667e7298e2487ed76decd2", size = 33574 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/d2/a130ffba531af7cbbb0e7ad24c7d577d3de0b797437f61d3a7234ed6d836/sphinx_lint-1.0.0-py3-none-any.whl", hash = "sha256:6117a0f340b2dc73eadfc57db7531d4477e0929f92a0c1a2f61e6edbc272f0bc", size = 20163 }, +] + +[[package]] +name = "sphinx-notfound-page" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/b2/67603444a8ee97b4a8ea71b0a9d6bab1727ed65e362c87e02f818ee57b8a/sphinx_notfound_page-1.1.0.tar.gz", hash = "sha256:913e1754370bb3db201d9300d458a8b8b5fb22e9246a816643a819a9ea2b8067", size = 7392 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/d4/019fe439c840a7966012bbb95ccbdd81c5c10271749706793b43beb05145/sphinx_notfound_page-1.1.0-py3-none-any.whl", hash = "sha256:835dc76ff7914577a1f58d80a2c8418fb6138c0932c8da8adce4d9096fbcd389", size = 8167 }, +] + +[[package]] +name = "sphinx-prompt" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/fb/7a07b8df1ca2418147a6b13e3f6b445071f2565198b45efa631d0d6ef0cd/sphinx_prompt-1.8.0.tar.gz", hash = "sha256:47482f86fcec29662fdfd23e7c04ef03582714195d01f5d565403320084372ed", size = 5121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/49/f890a2668b7cbf375f5528b549c8d36dd2e801b0fbb7b2b5ef65663ecb6c/sphinx_prompt-1.8.0-py3-none-any.whl", hash = "sha256:369ecc633f0711886f9b3a078c83264245be1adf46abeeb9b88b5519e4b51007", size = 7298 }, +] + +[[package]] +name = "sphinx-reredirects" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/1d/b1229d825a418738ce1a03930629a7b873cd6a0ff05953493604de35a3d5/sphinx_reredirects-0.1.5.tar.gz", hash = "sha256:cfa753b441020a22708ce8eb17d4fd553a28fc87a609330092917ada2a6da0d8", size = 7095 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/97/1f8143f87330f4c9ccc2c08ae9cd3cb1ce2944c51e98dd7ff141154fbcc7/sphinx_reredirects-0.1.5-py3-none-any.whl", hash = "sha256:444ae1438fba4418242ca76d6a6de3eaee82aaf0d8f2b0cac71a15d32ce6eba2", size = 5673 }, +] + +[[package]] +name = "sphinx-tabs" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "pygments" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/32/ab475e252dc2b704e82a91141fa404cdd8901a5cf34958fd22afacebfccd/sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531", size = 16070 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/9f/4ac7dbb9f23a2ff5a10903a4f9e9f43e0ff051f63a313e989c962526e305/sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09", size = 9904 }, +] + +[[package]] +name = "sphinx-toolbox" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "apeye" }, + { name = "autodocsumm" }, + { name = "beautifulsoup4" }, + { name = "cachecontrol", extra = ["filecache"] }, + { name = "dict2css" }, + { name = "docutils" }, + { name = "domdf-python-tools" }, + { name = "filelock" }, + { name = "html5lib" }, + { name = "ruamel-yaml" }, + { name = "sphinx" }, + { name = "sphinx-autodoc-typehints" }, + { name = "sphinx-jinja2-compat" }, + { name = "sphinx-prompt" }, + { name = "sphinx-tabs" }, + { name = "tabulate" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/80/f837e85c8c216cdeef9b60393e4b00c9092a1e3d734106e0021abbf5930c/sphinx_toolbox-3.8.1.tar.gz", hash = "sha256:a4b39a6ea24fc8f10e24f052199bda17837a0bf4c54163a56f521552395f5e1a", size = 111977 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/d6/2a28ee4cbc158ae65afb2cfcb6895ef54d972ce1e167f8a63c135b14b080/sphinx_toolbox-3.8.1-py3-none-any.whl", hash = "sha256:53d8e77dd79e807d9ef18590c4b2960a5aa3c147415054b04c31a91afed8b88b", size = 194621 }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, +] + +[[package]] +name = "sphinxcontrib-details-directive" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/0a/2de87a4f6e0e33415692ed4b03e0b7dfde7d91a691d1486c1577191f875c/sphinxcontrib-details-directive-0.1.0.tar.gz", hash = "sha256:78bd6a67f786a21868abf0e6a5973340d7e7a6fd71b1890de9c856f92877b38b", size = 7969 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/9e/9cb96fbdca829ba3eb094d966d0f48bb018215e73f96c8750088e73f2f19/sphinxcontrib_details_directive-0.1.0-py2.py3-none-any.whl", hash = "sha256:ed4d4f47b36e3e905601d425945cbe9d50d4cbcf9964bbf9c863d5a983fb7bf6", size = 10724 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, +] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", size = 121104 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, +] + +[[package]] +name = "sphinxext-opengraph" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/5b/4302fe33c88dbfb572e2c1cad26735164c23f16fb8dba94ddb1867d0ef06/sphinxext-opengraph-0.9.1.tar.gz", hash = "sha256:dd2868a1e7c9497977fbbf44cc0844a42af39ca65fe1bb0272518af225d06fc5", size = 1034511 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/0a/970b80b4fa1feeb6deb6f2e22d4cb14e388b27b315a1afdb9db930ff91a4/sphinxext_opengraph-0.9.1-py3-none-any.whl", hash = "sha256:b3b230cc6a5b5189139df937f0d9c7b23c7c204493b22646273687969dcb760e", size = 1005241 }, +] + +[[package]] +name = "standard-imghdr" +version = "3.10.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/d2/2eb5521072c9598886035c65c023f39f7384bcb73eed70794f469e34efac/standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52", size = 5474 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/d0/9852f70eb01f814843530c053542b72d30e9fbf74da7abb0107e71938389/standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2", size = 5598 }, +] + +[[package]] +name = "starlette" +version = "0.45.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507 }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, +] + +[[package]] +name = "testscenarios" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pbr" }, + { name = "testtools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/de/b0b5b98c0f38fd7086d082c47fcb455eedd39a044abe7c595f5f40cd6eed/testscenarios-0.5.0.tar.gz", hash = "sha256:c257cb6b90ea7e6f8fef3158121d430543412c9a87df30b5dde6ec8b9b57a2b6", size = 20951 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/25/2f10da0d5427989fefa5ab51e697bc02625bbb7de2be3bc8452462efac78/testscenarios-0.5.0-py2.py3-none-any.whl", hash = "sha256:480263fa5d6e618125bdf092aab129a3aeed5996b1e668428f12cc56d6d01d28", size = 21002 }, +] + +[[package]] +name = "testtools" +version = "2.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/05/a543317ac62cf72e98dc40de5ab117ef14508f36352ed715cb3cd3fe1bbb/testtools-2.7.2.tar.gz", hash = "sha256:5be5bbc1f0fa0f8b60aca6ceec07845d41d0c475cf445bfadb4d2c45ec397ea3", size = 201430 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/76/17eb3cfd467e7a53f2727e7a879a77c514970a12e23e3ac12e40ad3e0ac4/testtools-2.7.2-py3-none-any.whl", hash = "sha256:11712e29cebbe92187c3ad47ace5c32f91e1bb7a9f1ac5e8684c2b01eaa6fd2d", size = 179922 }, +] + +[[package]] +name = "tinydb" +version = "4.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/79/4af51e2bb214b6ea58f857c51183d92beba85b23f7ba61c983ab3de56c33/tinydb-4.8.2.tar.gz", hash = "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", size = 32566 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/17/853354204e1ca022d6b7d011ca7f3206c4f8faa3cc743e92609b49c1d83f/tinydb-4.8.2-py3-none-any.whl", hash = "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3", size = 24888 }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, +] + +[[package]] +name = "tomlkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, +] + +[[package]] +name = "translationstring" +version = "1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/39/32325add93da9439775d7fe4b4887eb7986dbc1d5675b0431f4531f560e5/translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3", size = 24199 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/98/36187601a15e3d37e9bfcf0e0e1055532b39d044353b06861c3a519737a9/translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262", size = 15028 }, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20241230" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/f9/4d566925bcf9396136c0a2e5dc7e230ff08d86fa011a69888dd184469d80/types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c", size = 17078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/c1/48474fbead512b70ccdb4f81ba5eb4a58f69d100ba19f17c92c0c4f50ae6/types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6", size = 20029 }, +] + +[[package]] +name = "types-requests" +version = "2.31.0.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "types-urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/b8/c1e8d39996b4929b918aba10dba5de07a8b3f4c8487bb61bb79882544e69/types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0", size = 15535 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/a1/6f8dc74d9069e790d604ddae70cb46dcbac668f1bb08136e7b0f2f5cd3bf/types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9", size = 14516 }, +] + +[[package]] +name = "types-setuptools" +version = "75.8.0.20250110" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/42/5713e90d4f9683f2301d900f33e4fc2405ad8ac224dda30f6cb7f4cd215b/types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271", size = 48185 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/a3/dbfd106751b11c728cec21cc62cbfe7ff7391b935c4b6e8f0bdc2e6fd541/types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480", size = 71521 }, +] + +[[package]] +name = "types-simplejson" +version = "3.19.0.20241221" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/f0/3d4dd216dc527a52ab564cbecd2fd8b3c8b96722348745f8f5cb9ab59801/types_simplejson-3.19.0.20241221.tar.gz", hash = "sha256:114af9db0f49ad15755d2b6ad8e6fd04b5a493815e2fc1e011729d4650defc70", size = 9688 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/2f/4a5fcab9225bec1d075d543d00f005fe83685ddc1bd395ab1b382b9553db/types_simplejson-3.19.0.20241221-py3-none-any.whl", hash = "sha256:179dfaef8c357156c781fa47cfdfcd953a7953fc375dfe9ab19a20054a828980", size = 10285 }, +] + +[[package]] +name = "types-tabulate" +version = "0.9.0.20241207" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/43/16030404a327e4ff8c692f2273854019ed36718667b2993609dc37d14dd4/types_tabulate-0.9.0.20241207.tar.gz", hash = "sha256:ac1ac174750c0a385dfd248edc6279fa328aaf4ea317915ab879a2ec47833230", size = 8195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/86/a9ebfd509cbe74471106dffed320e208c72537f9aeb0a55eaa6b1b5e4d17/types_tabulate-0.9.0.20241207-py3-none-any.whl", hash = "sha256:b8dad1343c2a8ba5861c5441370c3e35908edd234ff036d4298708a1d4cf8a85", size = 8307 }, +] + +[[package]] +name = "types-toml" +version = "0.10.8.20240310" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/47/3e4c75042792bff8e90d7991aa5c51812cc668828cc6cce711e97f63a607/types-toml-0.10.8.20240310.tar.gz", hash = "sha256:3d41501302972436a6b8b239c850b26689657e25281b48ff0ec06345b8830331", size = 4392 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/a2/d32ab58c0b216912638b140ab2170ee4b8644067c293b170e19fba340ccc/types_toml-0.10.8.20240310-py3-none-any.whl", hash = "sha256:627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d", size = 4777 }, +] + +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/de/b9d7a68ad39092368fb21dd6194b362b98a1daeea5dcfef5e1adb5031c7e/types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f", size = 11239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/7b/3fc711b2efea5e85a7a0bbfe269ea944aa767bbba5ec52f9ee45d362ccf3/types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e", size = 15377 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "uvicorn" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, +] + +[[package]] +name = "validators" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/07/91582d69320f6f6daaf2d8072608a4ad8884683d4840e7e4f3a9dbdcc639/validators-0.34.0.tar.gz", hash = "sha256:647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f", size = 70955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/78/36828a4d857b25896f9774c875714ba4e9b3bc8a92d2debe3f4df3a83d4f/validators-0.34.0-py3-none-any.whl", hash = "sha256:c804b476e3e6d3786fa07a30073a4ef694e617805eb1946ceee3fe5a9b8b1321", size = 43536 }, +] + +[[package]] +name = "venusian" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/4c/eefa68085c555dc11e6744b9c6fbe5966b1c9378c47267776a448923e9a5/venusian-3.1.1.tar.gz", hash = "sha256:534fb3b355669283eb3954581931e5d1d071fce61d029d58f3219a5e3a6f0c41", size = 39269 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/4b/34d926eba40db81b204066a60b4efdc5d8867a8efcbfe44d69b634b1c907/venusian-3.1.1-py3-none-any.whl", hash = "sha256:0845808a985976acbceaa1fbb871c7fac4fb28ae75453232970e9c2c2866dbf4", size = 14026 }, +] + +[[package]] +name = "wadllib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lazr-uri" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/54/82866d8c2bf602ed9df52c8f8b7a45e94f8c2441b3d1e9e46d34f0e3270f/wadllib-2.0.0.tar.gz", hash = "sha256:1edbaf23e4fa34fea70c9b380baa2a139b1086ae489ebcccc4b3b65fc9737427", size = 65960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/a1/3789e82241db565f25e2c6a69c6ebe79f3db84431e93760a4abb451822bd/wadllib-2.0.0-py3-none-any.whl", hash = "sha256:f8e0fc4f19c2c96b3ca8a091f04c86ca196ec9590d44c4d864320aa9533473ea", size = 61733 }, +] + +[[package]] +name = "watchfiles" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, + { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, + { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, + { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, + { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, + { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, + { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, + { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, + { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, + { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, + { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, + { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, + { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, + { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, + { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, + { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, + { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, + { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, + { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, + { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, + { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, + { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, + { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, + { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, + { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, +] + +[[package]] +name = "wcmatch" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bracex" }, +] +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/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "webob" +version = "1.8.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "legacy-cgi", marker = "python_full_version >= '3.13' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/0b/1732085540b01f65e4e7999e15864fe14cd18b12a95731a43fd6fd11b26a/webob-1.8.9.tar.gz", hash = "sha256:ad6078e2edb6766d1334ec3dee072ac6a7f95b1e32ce10def8ff7f0f02d56589", size = 279775 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/bd/c336448be43d40be28e71f2e0f3caf7ccb28e2755c58f4c02c065bfe3e8e/WebOb-1.8.9-py2.py3-none-any.whl", hash = "sha256:45e34c58ed0c7e2ecd238ffd34432487ff13d9ad459ddfd77895e67abba7c1f9", size = 115364 }, +] + +[[package]] +name = "websockets" +version = "14.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/54/8359678c726243d19fae38ca14a334e740782336c9f19700858c4eb64a1e/websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5", size = 164394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/81/04f7a397653dc8bec94ddc071f34833e8b99b13ef1a3804c149d59f92c18/websockets-14.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f20522e624d7ffbdbe259c6b6a65d73c895045f76a93719aa10cd93b3de100c", size = 163096 }, + { url = "https://files.pythonhosted.org/packages/ec/c5/de30e88557e4d70988ed4d2eabd73fd3e1e52456b9f3a4e9564d86353b6d/websockets-14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:647b573f7d3ada919fd60e64d533409a79dcf1ea21daeb4542d1d996519ca967", size = 160758 }, + { url = "https://files.pythonhosted.org/packages/e5/8c/d130d668781f2c77d106c007b6c6c1d9db68239107c41ba109f09e6c218a/websockets-14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6af99a38e49f66be5a64b1e890208ad026cda49355661549c507152113049990", size = 160995 }, + { url = "https://files.pythonhosted.org/packages/a6/bc/f6678a0ff17246df4f06765e22fc9d98d1b11a258cc50c5968b33d6742a1/websockets-14.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:091ab63dfc8cea748cc22c1db2814eadb77ccbf82829bac6b2fbe3401d548eda", size = 170815 }, + { url = "https://files.pythonhosted.org/packages/d8/b2/8070cb970c2e4122a6ef38bc5b203415fd46460e025652e1ee3f2f43a9a3/websockets-14.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b374e8953ad477d17e4851cdc66d83fdc2db88d9e73abf755c94510ebddceb95", size = 169759 }, + { url = "https://files.pythonhosted.org/packages/81/da/72f7caabd94652e6eb7e92ed2d3da818626e70b4f2b15a854ef60bf501ec/websockets-14.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a39d7eceeea35db85b85e1169011bb4321c32e673920ae9c1b6e0978590012a3", size = 170178 }, + { url = "https://files.pythonhosted.org/packages/31/e0/812725b6deca8afd3a08a2e81b3c4c120c17f68c9b84522a520b816cda58/websockets-14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0a6f3efd47ffd0d12080594f434faf1cd2549b31e54870b8470b28cc1d3817d9", size = 170453 }, + { url = "https://files.pythonhosted.org/packages/66/d3/8275dbc231e5ba9bb0c4f93144394b4194402a7a0c8ffaca5307a58ab5e3/websockets-14.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:065ce275e7c4ffb42cb738dd6b20726ac26ac9ad0a2a48e33ca632351a737267", size = 169830 }, + { url = "https://files.pythonhosted.org/packages/a3/ae/e7d1a56755ae15ad5a94e80dd490ad09e345365199600b2629b18ee37bc7/websockets-14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9d0e53530ba7b8b5e389c02282f9d2aa47581514bd6049d3a7cffe1385cf5fe", size = 169824 }, + { url = "https://files.pythonhosted.org/packages/b6/32/88ccdd63cb261e77b882e706108d072e4f1c839ed723bf91a3e1f216bf60/websockets-14.2-cp312-cp312-win32.whl", hash = "sha256:20e6dd0984d7ca3037afcb4494e48c74ffb51e8013cac71cf607fffe11df7205", size = 163981 }, + { url = "https://files.pythonhosted.org/packages/b3/7d/32cdb77990b3bdc34a306e0a0f73a1275221e9a66d869f6ff833c95b56ef/websockets-14.2-cp312-cp312-win_amd64.whl", hash = "sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce", size = 164421 }, + { url = "https://files.pythonhosted.org/packages/82/94/4f9b55099a4603ac53c2912e1f043d6c49d23e94dd82a9ce1eb554a90215/websockets-14.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f1372e511c7409a542291bce92d6c83320e02c9cf392223272287ce55bc224e", size = 163102 }, + { url = "https://files.pythonhosted.org/packages/8e/b7/7484905215627909d9a79ae07070057afe477433fdacb59bf608ce86365a/websockets-14.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4da98b72009836179bb596a92297b1a61bb5a830c0e483a7d0766d45070a08ad", size = 160766 }, + { url = "https://files.pythonhosted.org/packages/a3/a4/edb62efc84adb61883c7d2c6ad65181cb087c64252138e12d655989eec05/websockets-14.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8a86a269759026d2bde227652b87be79f8a734e582debf64c9d302faa1e9f03", size = 160998 }, + { url = "https://files.pythonhosted.org/packages/f5/79/036d320dc894b96af14eac2529967a6fc8b74f03b83c487e7a0e9043d842/websockets-14.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86cf1aaeca909bf6815ea714d5c5736c8d6dd3a13770e885aafe062ecbd04f1f", size = 170780 }, + { url = "https://files.pythonhosted.org/packages/63/75/5737d21ee4dd7e4b9d487ee044af24a935e36a9ff1e1419d684feedcba71/websockets-14.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b0f6c3ba3b1240f602ebb3971d45b02cc12bd1845466dd783496b3b05783a5", size = 169717 }, + { url = "https://files.pythonhosted.org/packages/2c/3c/bf9b2c396ed86a0b4a92ff4cdaee09753d3ee389be738e92b9bbd0330b64/websockets-14.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c3e101c246aa85bc8534e495952e2ca208bd87994650b90a23d745902db9a", size = 170155 }, + { url = "https://files.pythonhosted.org/packages/75/2d/83a5aca7247a655b1da5eb0ee73413abd5c3a57fc8b92915805e6033359d/websockets-14.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eabdb28b972f3729348e632ab08f2a7b616c7e53d5414c12108c29972e655b20", size = 170495 }, + { url = "https://files.pythonhosted.org/packages/79/dd/699238a92761e2f943885e091486378813ac8f43e3c84990bc394c2be93e/websockets-14.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2066dc4cbcc19f32c12a5a0e8cc1b7ac734e5b64ac0a325ff8353451c4b15ef2", size = 169880 }, + { url = "https://files.pythonhosted.org/packages/c8/c9/67a8f08923cf55ce61aadda72089e3ed4353a95a3a4bc8bf42082810e580/websockets-14.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ab95d357cd471df61873dadf66dd05dd4709cae001dd6342edafc8dc6382f307", size = 169856 }, + { url = "https://files.pythonhosted.org/packages/17/b1/1ffdb2680c64e9c3921d99db460546194c40d4acbef999a18c37aa4d58a3/websockets-14.2-cp313-cp313-win32.whl", hash = "sha256:a9e72fb63e5f3feacdcf5b4ff53199ec8c18d66e325c34ee4c551ca748623bbc", size = 163974 }, + { url = "https://files.pythonhosted.org/packages/14/13/8b7fc4cb551b9cfd9890f0fd66e53c18a06240319915533b033a56a3d520/websockets-14.2-cp313-cp313-win_amd64.whl", hash = "sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f", size = 164420 }, + { url = "https://files.pythonhosted.org/packages/7b/c8/d529f8a32ce40d98309f4470780631e971a5a842b60aec864833b3615786/websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b", size = 157416 }, +] + +[[package]] +name = "ws4py" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/55/dd8a5e1f975d1549494fe8692fc272602f17e475fe70de910cdd53aec902/ws4py-0.6.0.tar.gz", hash = "sha256:9f87b19b773f0a0744a38f3afa36a803286dd3197f0bb35d9b75293ec7002d19", size = 53288 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/62/dad08725f855f9695d1c2b34466cf0d1482d1168bb54d73d22b6b0124ba3/ws4py-0.6.0-py3-none-any.whl", hash = "sha256:1499c3fc103a65eb12d7b1ead7566f88487f6f678ab10ee4e53cf2411c068752", size = 45806 }, +] + +[[package]] +name = "yamllint" +version = "1.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathspec" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/06/d8cee5c3dfd550cc0a466ead8b321138198485d1034130ac1393cc49d63e/yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd", size = 134583 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/28/2abf1ec14df2d584b9e7ce3b0be458838741e6aaff7a540374ba9af83916/yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3", size = 66738 }, +] + +[[package]] +name = "zope-deprecation" +version = "5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/22/0e621e31b5826b2ff121fea5b1ea91173c88f86e182181f012abcc84a51f/zope_deprecation-5.1.tar.gz", hash = "sha256:46bed4611fb53edc731aadeb64b28308bcb848f4cc150c60c948d078f7108721", size = 24453 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/88/5fc32633682a452260f50417da3d4be26137dd220ef617bbd8ed52f0cfa9/zope.deprecation-5.1-py3-none-any.whl", hash = "sha256:60f957b964d8f947a4a592c647d51ce0f4f844d1f041657956ddde0d9fa9a76a", size = 10020 }, +] + +[[package]] +name = "zope-interface" +version = "7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/93/9210e7606be57a2dfc6277ac97dcc864fd8d39f142ca194fdc186d596fda/zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe", size = 252960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/0b/c7516bc3bad144c2496f355e35bd699443b82e9437aa02d9867653203b4a/zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7", size = 208959 }, + { url = "https://files.pythonhosted.org/packages/a2/e9/1463036df1f78ff8c45a02642a7bf6931ae4a38a4acd6a8e07c128e387a7/zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465", size = 209357 }, + { url = "https://files.pythonhosted.org/packages/07/a8/106ca4c2add440728e382f1b16c7d886563602487bdd90004788d45eb310/zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89", size = 264235 }, + { url = "https://files.pythonhosted.org/packages/fc/ca/57286866285f4b8a4634c12ca1957c24bdac06eae28fd4a3a578e30cf906/zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54", size = 259253 }, + { url = "https://files.pythonhosted.org/packages/96/08/2103587ebc989b455cf05e858e7fbdfeedfc3373358320e9c513428290b1/zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d", size = 264702 }, + { url = "https://files.pythonhosted.org/packages/5f/c7/3c67562e03b3752ba4ab6b23355f15a58ac2d023a6ef763caaca430f91f2/zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5", size = 212466 }, + { url = "https://files.pythonhosted.org/packages/c6/3b/e309d731712c1a1866d61b5356a069dd44e5b01e394b6cb49848fa2efbff/zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98", size = 208961 }, + { url = "https://files.pythonhosted.org/packages/49/65/78e7cebca6be07c8fc4032bfbb123e500d60efdf7b86727bb8a071992108/zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d", size = 209356 }, + { url = "https://files.pythonhosted.org/packages/11/b1/627384b745310d082d29e3695db5f5a9188186676912c14b61a78bbc6afe/zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c", size = 264196 }, + { url = "https://files.pythonhosted.org/packages/b8/f6/54548df6dc73e30ac6c8a7ff1da73ac9007ba38f866397091d5a82237bd3/zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398", size = 259237 }, + { url = "https://files.pythonhosted.org/packages/b6/66/ac05b741c2129fdf668b85631d2268421c5cd1a9ff99be1674371139d665/zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b", size = 264696 }, + { url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472 }, +]