diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 1b1554b23..d6fc38d3b 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -4,8 +4,6 @@ ignoreDeps: [ // Each ignore is probably connected with an ignore in pyproject.toml. // Ensure you change this and those simultaneously. - "pydantic", // Needs to wait for libraries. - "pydantic-yaml", // Needs to wait for pydantic "urllib3", "windows", // We'll update Windows versions manually. ], diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 9789ab83f..caaca6885 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -45,7 +45,24 @@ jobs: run-tests: strategy: matrix: - os: [ubuntu-22.04, macos-12, macos-13, windows-2019, windows-2022] + os: [ubuntu-22.04, ubuntu-24.04, macos-12, macos-13, windows-2019, windows-2022] + include: + - os: windows-2019 + python-version: | + 3.11 + 3.12 + - os: windows-2022 + python-version: | + 3.11 + 3.12 + - os: macos-12 + python_version: | + 3.10 + 3.12 + - os: macos-13 + python_version: | + 3.10 + 3.12 runs-on: ${{ matrix.os }} steps: - name: Checkout code @@ -53,44 +70,46 @@ jobs: with: fetch-depth: 0 - name: Set up Python + if: ${{ matrix.python-version }} uses: actions/setup-python@v5 with: - python-version: | - 3.10 - 3.12 + python-version: ${{ matrix.python-version }} cache: "pip" - name: Install Ubuntu-specific dependencies if: ${{ startsWith(matrix.os, 'ubuntu') }} run: | sudo apt update sudo apt install -y python3-pip python3-setuptools python3-wheel python3-venv libapt-pkg-dev - export $(cat /etc/os-release | grep VERSION_CODENAME) - pip install -U -r "requirements-${VERSION_CODENAME}.txt" - - name: Install external dependencies with homebrew + - name: Install skopeo (mac) # This is only necessary for Linux until skopeo >= 1.11 is in repos. # Once we're running on Noble, we can get skopeo from apt. - if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }} + if: ${{ runner.os == 'macOS' }} run: | - if [[ $(uname --kernel-name) == "Linux" ]]; then + brew install skopeo + - name: Install skopeo (Linux) + if: ${{ runner.os == 'Linux' }} + run: | + if [[ $(cat /etc/os-release | grep VERSION_CODENAME) == 'VERSION_CODENAME=jammy' ]]; then eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + brew install skopeo + sudo rm -f /bin/skopeo + sudo ln -s $(which skopeo) /bin/skopeo + else + sudo apt install skopeo fi - brew install skopeo + # Allow skopeo to access the contents of /run/containers + sudo chmod 777 /run/containers + # Add an xdg runtime dir for skopeo to look into for an auth.json file + sudo mkdir -p /run/user/$(id -u) + sudo chown $USER /run/user/$(id -u) - name: Configure environment run: | - python -m pip install tox + pipx install tox tox run --colored yes -m tests --notest - name: Run tests shell: bash run: | if [[ $(uname --kernel-name) == "Linux" ]]; then - # Ensure the version of skopeo comes from homebrew - # This is only necessary until we move to noble. - eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - # Allow skopeo to access the contents of /run/containers - sudo chmod 777 /run/containers - # Add an xdg runtime dir for skopeo to look into for an auth.json file - sudo mkdir -p /run/user/$(id -u) - sudo chown $USER /run/user/$(id -u) export XDG_RUNTIME_DIR=/run/user/$(id -u) fi tox run --skip-pkg-install --no-list-dependencies --result-json results/tox-${{ matrix.platform }}.json --colored yes -m tests @@ -211,7 +230,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.11' - name: Install dependencies run: | pip install -U pyinstaller -r requirements.txt diff --git a/charmcraft/application/commands/store.py b/charmcraft/application/commands/store.py index ec0a4bd16..ed30c4b32 100644 --- a/charmcraft/application/commands/store.py +++ b/charmcraft/application/commands/store.py @@ -1683,7 +1683,9 @@ def run(self, parsed_args: argparse.Namespace) -> None: declared_libs = {lib.lib: lib for lib in charm_libs} missing_store_libs = declared_libs.keys() - libs_metadata.keys() if missing_store_libs: - missing_libs_source = [declared_libs[lib].dict() for lib in sorted(missing_store_libs)] + missing_libs_source = [ + declared_libs[lib].model_dump() for lib in sorted(missing_store_libs) + ] libs_yaml = util.dump_yaml(missing_libs_source) raise errors.CraftError( f"Could not find the following libraries on charmhub:\n{libs_yaml}", @@ -2205,7 +2207,7 @@ def run(self, parsed_args): "revision": item.revision, "created at": item.created_at.isoformat(), "size": item.size, - "bases": [base.dict() for base in item.bases], + "bases": [base.model_dump() for base in item.bases], } for item in result ] diff --git a/charmcraft/models/actions.py b/charmcraft/models/actions.py index 4864400d9..70f4af2a5 100644 --- a/charmcraft/models/actions.py +++ b/charmcraft/models/actions.py @@ -20,11 +20,10 @@ import re import pydantic +from craft_application.models import CraftBaseModel -from charmcraft.models.basic import ModelConfigDefaults - -class JujuActions(ModelConfigDefaults, frozen=True): +class JujuActions(CraftBaseModel): """Juju actions for charms. See also: https://juju.is/docs/sdk/actions @@ -33,7 +32,7 @@ class JujuActions(ModelConfigDefaults, frozen=True): _action_name_regex = re.compile(r"^[a-zA-Z_][a-zA-Z0-9-_]*$") actions: dict[str, dict] | None - @pydantic.validator("actions") + @pydantic.field_validator("actions", mode="after") def validate_actions(cls, actions): """Verify actions names and descriptions.""" if not isinstance(actions, dict): @@ -48,8 +47,8 @@ def validate_actions(cls, actions): return actions - @pydantic.validator("actions", each_item=True) - def validate_each_action(cls, action): + @pydantic.field_validator("actions", mode="after") + def _validate_actions(cls, action): """Verify actions names and descriptions.""" if not isinstance(action, dict): raise TypeError(f"'{action}' is not a dictionary") diff --git a/charmcraft/models/basic.py b/charmcraft/models/basic.py index da15ca4aa..bb49e23a1 100644 --- a/charmcraft/models/basic.py +++ b/charmcraft/models/basic.py @@ -15,80 +15,48 @@ # For further info, check https://github.com/canonical/charmcraft """Charmcraft basic pydantic model.""" -import craft_application.models -import pydantic - - -class ModelConfigDefaults( - craft_application.models.CraftBaseModel, - frozen=True, # pyright: ignore[reportGeneralTypeIssues] - validate_all=True, - allow_population_by_field_name=False, - alias_generator=pydantic.BaseConfig.alias_generator, -): - """Define Charmcraft's defaults for the BaseModel configuration.""" - - -class CustomStrictStr(pydantic.StrictStr): - """Generic class to create custom strict strings validated by pydantic.""" - - @classmethod - def __get_validators__(cls): - """Yield the relevant validators.""" - yield from super().__get_validators__() - yield cls.custom_validate - - -class RelativePath(CustomStrictStr): - """Constrained string which must be a relative path.""" - - @classmethod - def custom_validate(cls, value: str) -> str: - """Validate relative path. +from typing import Annotated - Check if it's an absolute path using POSIX's '/' (not os.path.sep, as the charm's - config is independent of the platform where charmcraft is running. - """ - if not value: - raise ValueError(f"{value!r} must be a valid relative path (cannot be empty)") - - if value[0] == "/": - raise ValueError(f"{value!r} must be a valid relative path (cannot start with '/')") - - return value - - -class AttributeName(CustomStrictStr): - """Constrained string that must match the name of an attribute from linters.CHECKERS.""" - - @classmethod - def custom_validate(cls, value: str) -> str: - """Validate attribute name.""" - from charmcraft import linters # import here to avoid cyclic imports - - valid_names = [ - checker.name - for checker in linters.CHECKERS - if checker.check_type == linters.CheckType.ATTRIBUTE - ] - if value not in valid_names: - raise ValueError(f"Bad attribute name {value!r}") - return value - - -class LinterName(CustomStrictStr): - """Constrained string that must match the name of a linter from linters.CHECKERS.""" +import craft_parts.constraints +import pydantic - @classmethod - def custom_validate(cls, value: str) -> str: - """Validate attribute name.""" - from charmcraft import linters # import here to avoid cyclic imports - valid_names = [ - checker.name - for checker in linters.CHECKERS - if checker.check_type == linters.CheckType.LINT - ] - if value not in valid_names: - raise ValueError(f"Bad lint name {value!r}") - return value +def _validate_attribute_name(value: str) -> str: + """Validate attribute name.""" + from charmcraft import linters # import here to avoid cyclic imports + + valid_names = [ + checker.name + for checker in linters.CHECKERS + if checker.check_type == linters.CheckType.ATTRIBUTE + ] + if value not in valid_names: + raise ValueError(f"Bad attribute name {value!r}") + return value + + +def _validate_linter_name(value: str) -> str: + """Validate linter name.""" + from charmcraft import linters # import here to avoid cyclic imports + + valid_names = [ + checker.name + for checker in linters.CHECKERS + if checker.check_type == linters.CheckType.LINT + ] + if value not in valid_names: + raise ValueError(f"Bad lint name {value!r}") + return value + + +RelativePath = craft_parts.constraints.RelativePathStr +AttributeName = Annotated[ # TODO: Turn this into a StrEnum + str, + pydantic.Field(strict=True), + pydantic.BeforeValidator(_validate_attribute_name), +] +LinterName = Annotated[ + str, + pydantic.Field(strict=True), + pydantic.BeforeValidator(_validate_linter_name), +] diff --git a/charmcraft/models/charmcraft.py b/charmcraft/models/charmcraft.py index cb5dc753c..991581fec 100644 --- a/charmcraft/models/charmcraft.py +++ b/charmcraft/models/charmcraft.py @@ -15,20 +15,33 @@ # For further info, check https://github.com/canonical/charmcraft """Charmcraft configuration pydantic model.""" -from typing import cast +from typing import TypedDict, cast import pydantic from craft_application import util +from craft_application.models import CraftBaseModel from typing_extensions import Self -from charmcraft.models.basic import AttributeName, LinterName, ModelConfigDefaults +from charmcraft.models.basic import AttributeName, LinterName -class CharmhubConfig( - ModelConfigDefaults, - alias_generator=lambda s: s.replace("_", "-"), - frozen=True, -): +class BaseDict(TypedDict, total=False): + """TypedDict that describes only one base. + + This is equivalent to the short form base definition. + """ + + name: str + channel: str + architectures: list[str] + + +LongFormBasesDict = TypedDict( + "LongFormBasesDict", {"build-on": list[BaseDict], "run-on": list[BaseDict]} +) + + +class Charmhub(CraftBaseModel): """Definition of Charmhub endpoint configuration.""" api_url: pydantic.HttpUrl = cast(pydantic.HttpUrl, "https://api.charmhub.io") @@ -36,7 +49,7 @@ class CharmhubConfig( registry_url: pydantic.HttpUrl = cast(pydantic.HttpUrl, "https://registry.jujucharms.com") -class Base(ModelConfigDefaults, frozen=True): +class Base(CraftBaseModel): """Represents a base.""" name: pydantic.StrictStr @@ -54,11 +67,7 @@ def from_str_and_arch(cls, base_str: str, architectures: list[str]) -> Self: return cls(name=name, channel=channel, architectures=architectures) -class BasesConfiguration( - ModelConfigDefaults, - alias_generator=lambda s: s.replace("_", "-"), - frozen=True, -): +class BasesConfiguration(CraftBaseModel): """Definition of build-on/run-on combinations. Example:: @@ -80,30 +89,37 @@ class BasesConfiguration( build_on: list[Base] run_on: list[Base] + @pydantic.model_validator(mode="before") + def _expand_base(cls, base: BaseDict | LongFormBasesDict) -> LongFormBasesDict: + """Expand short-form bases into long-form bases.""" + if "build-on" in base: # Assume long-form base already. + return cast(LongFormBasesDict, base) + return cast(LongFormBasesDict, {"build-on": [base], "run-on": [base]}) + -class Ignore(ModelConfigDefaults, frozen=True): +class Ignore(CraftBaseModel): """Definition of `analysis.ignore` configuration.""" attributes: list[AttributeName] = [] linters: list[LinterName] = [] -class AnalysisConfig(ModelConfigDefaults, allow_population_by_field_name=True, frozen=True): +class AnalysisConfig(CraftBaseModel): """Definition of `analysis` configuration.""" ignore: Ignore = Ignore() -class Links(ModelConfigDefaults, frozen=True): +class Links(CraftBaseModel): """Definition of `links` in metadata.""" - contact: pydantic.StrictStr | list[pydantic.StrictStr] | None + contact: pydantic.StrictStr | list[pydantic.StrictStr] | None = None """Instructions for contacting the owner of the charm.""" - documentation: pydantic.AnyHttpUrl | None + documentation: pydantic.AnyHttpUrl | None = None """The URL of the documentation for this charm.""" - issues: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None + issues: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None = None """A link to the issue tracker for this charm.""" - source: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None + source: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None = None """Where to find this charm's source code.""" - website: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None + website: pydantic.AnyHttpUrl | list[pydantic.AnyHttpUrl] | None = None """The website for this charm.""" diff --git a/charmcraft/models/config.py b/charmcraft/models/config.py index 85cb57325..75b3664dc 100644 --- a/charmcraft/models/config.py +++ b/charmcraft/models/config.py @@ -18,47 +18,45 @@ from typing import Annotated, Literal import pydantic +from craft_application.models import CraftBaseModel -from charmcraft.models.basic import ModelConfigDefaults - -class _BaseJujuOption(ModelConfigDefaults, frozen=True): +class _BaseJujuOption(CraftBaseModel): """A Juju option field. Do not use (use the child classes below).""" - type: str description: str | None = None default: str | int | float | bool | None = None -class JujuStringOption(_BaseJujuOption, frozen=True): +class JujuStringOption(_BaseJujuOption): """A Juju option field containing a string.""" type: Literal["string"] default: str | None = None -class JujuIntOption(_BaseJujuOption, frozen=True): +class JujuIntOption(_BaseJujuOption): """A Juju option field containing an integer.""" type: Literal["int"] default: pydantic.StrictInt | None = None -class JujuFloatOption(_BaseJujuOption, frozen=True): +class JujuFloatOption(_BaseJujuOption): """A Juju option field containing a floating-point number.""" type: Literal["float"] default: float | None = None -class JujuBooleanOption(_BaseJujuOption, frozen=True): +class JujuBooleanOption(_BaseJujuOption): """A Juju option field containing a boolean value.""" type: Literal["boolean"] default: bool | None = None -class JujuSecretOption(_BaseJujuOption, frozen=True): +class JujuSecretOption(_BaseJujuOption): """A Juju option field containing a secret ID.""" type: Literal["secret"] @@ -66,7 +64,9 @@ class JujuSecretOption(_BaseJujuOption, frozen=True): # that anyone would know what the secret ID (specific to # the deployment in a model) is at the time that they are # writing the config, but included for completeness. - default: Annotated[str, pydantic.constr(regex=r"^secret:[a-z0-9]{20}$")] | None = None + default: ( + Annotated[str, pydantic.StringConstraints(pattern=r"^secret:[a-z0-9]{20}$")] | None + ) = None JujuOption = Annotated[ @@ -75,11 +75,11 @@ class JujuSecretOption(_BaseJujuOption, frozen=True): ] -class JujuConfig(ModelConfigDefaults, frozen=True): +class JujuConfig(CraftBaseModel): """Juju configs for charms. See also: https://juju.is/docs/sdk/config and: https://juju.is/docs/sdk/config-yaml """ - options: dict[str, JujuOption] | None + options: dict[str, JujuOption] | None = None diff --git a/charmcraft/models/extension.py b/charmcraft/models/extension.py deleted file mode 100644 index c22057870..000000000 --- a/charmcraft/models/extension.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2023 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# For further info, check https://github.com/canonical/charmcraft -"""Extension models.""" -from typing import Any - -from charmcraft.models.basic import ModelConfigDefaults - - -# Mypy complaining about frozen inheritance. -class ExtensionModel(ModelConfigDefaults, frozen=True): # type: ignore[misc] - """Extension model for presentation.""" - - name: str - bases: list[tuple[str, str]] - - def marshal(self) -> dict[str, str | list[str] | dict[str, Any]]: - """Marshal model into a dictionary for presentation.""" - return { - "Extension name": self.name, - "Supported bases": ", ".join(f"'{d} {v}'" for d, v in self.bases), - } diff --git a/charmcraft/models/metadata.py b/charmcraft/models/metadata.py index f3493792d..4133680d4 100644 --- a/charmcraft/models/metadata.py +++ b/charmcraft/models/metadata.py @@ -64,8 +64,8 @@ def from_charm(cls, charm: Charm) -> Self: Performs the necessary renaming and reorganisation. """ - charm_dict = charm.dict( - include=const.METADATA_YAML_KEYS | {"title"}, + charm_dict = charm.model_dump( + include={"title"} | const.METADATA_YAML_KEYS, exclude_none=True, by_alias=True, ) @@ -85,7 +85,7 @@ def from_charm(cls, charm: Charm) -> Self: if "title" in charm_dict: charm_dict["display-name"] = charm_dict.pop("title") - return cls.parse_obj(charm_dict) + return cls.model_validate(charm_dict) class CharmMetadataLegacy(CharmMetadata): @@ -122,7 +122,7 @@ def unmarshal(cls, data: dict[str, Any]) -> Self: data["maintainers"] = [data["maintainer"]] del data["maintainer"] - return cls.parse_obj(data) + return cls.model_validate(data) class BundleMetadata(models.BaseMetadata): @@ -136,6 +136,6 @@ def from_bundle(cls, bundle: Bundle) -> Self: """Turn a populated bundle model into a metadata.yaml model.""" bundle_dict = bundle.marshal() if "bundle" in bundle_dict: - return cls.parse_obj(bundle_dict["bundle"]) + return cls.model_validate(bundle_dict["bundle"]) del bundle_dict["type"] - return cls.parse_obj(bundle_dict) + return cls.model_validate(bundle_dict) diff --git a/charmcraft/models/project.py b/charmcraft/models/project.py index fc68c2a34..a09a27525 100644 --- a/charmcraft/models/project.py +++ b/charmcraft/models/project.py @@ -22,105 +22,60 @@ import textwrap from collections.abc import Iterable, Iterator from typing import ( + Annotated, Any, Literal, cast, ) import pydantic +import pydantic.v1 from craft_application import errors, models, util from craft_application.util import safe_yaml_load from craft_cli import CraftError from craft_providers import bases from pydantic import dataclasses -from typing_extensions import Self, TypedDict +from typing_extensions import Self from charmcraft import const, preprocess, utils from charmcraft.const import ( BaseStr, BuildBaseStr, - CharmArch, ) from charmcraft.models import charmcraft from charmcraft.models.charmcraft import ( AnalysisConfig, BasesConfiguration, - CharmhubConfig, + Charmhub, Links, ) from charmcraft.parts import process_part_config - -class BaseDict(TypedDict, total=False): - """TypedDict that describes only one base. - - This is equivalent to the short form base definition. - """ - - name: str - channel: str - architectures: list[str] - - -LongFormBasesDict = TypedDict( - "LongFormBasesDict", {"build-on": list[BaseDict], "run-on": list[BaseDict]} -) - - -class CharmcraftSummaryStr(models.SummaryStr): - """A brief summary of this charm or bundle. Ideally, this should fit into one line.""" - +CharmcraftSummaryStr = Annotated[ + str, + models.SummaryStr, + pydantic.StringConstraints(max_length=200), # Maximum length was set to 200 characters because the 78 character maximum # inherited from craft-application is too restrictive, as several hundred charms # already exceed this maximum. # Eventually this limit will be reduced, ideally to 78 characters, though that may # never happen entirely. Reductions will only occur on major releases. # https://github.com/canonical/charmcraft/issues/1598 - max_length = 200 - - -class CharmPlatform(pydantic.ConstrainedStr): - """The platform string for a charm file. +] - This is to be generated in the form of the bases config in a charm file name. - A charm's filename may look as follows: - "{name}_{base0}_{base1}_{base...}.charm" - where each base takes the form of: - "{base_name}-{version}-{arch0}-{arch1}-{arch...}" - For example, a charm called "test" that's built to run on Alma Linux 9 and Ubuntu 22.04 - on s390x and riscv64 platforms will have the name: - test_almalinux-9-riscv64-s390x_ubuntu-22.04-riscv64-s390x.charm - """ +def get_charm_file_platform_str(bases: Iterable[charmcraft.Base]) -> str: + """Get the "platform" section of a charm file name from an iterable of bases.""" + base_strings = [] + for base in bases: + name = base.name + version = base.channel + architectures = "-".join(base.architectures) + base_strings.append(f"{name}-{version}-{architectures}") + return "_".join(base_strings) - min_length = 4 - strict = True - strip_whitespace = True - _host_arch = util.get_host_architecture() - @classmethod - def from_bases(cls: type[Self], bases: Iterable[charmcraft.Base]) -> Self: - """Generate a platform name from a list of charm bases.""" - base_strings = [] - for base in bases: - name = base.name - version = base.channel - architectures = "-".join(base.architectures) - base_strings.append(f"{name}-{version}-{architectures}") - return cls("_".join(base_strings)) - - -class Platform(models.CraftBaseModel): - """Project platform definition.""" - - build_on: list[CharmArch] = pydantic.Field(min_items=1) - build_for: list[CharmArch | Literal["all"]] = pydantic.Field(min_items=1, max_items=1) - - @pydantic.validator("build_on", "build_for", pre=True) - def _listify_architectures(cls, value: str | list[str]) -> list[str]: - if isinstance(value, str): - return [value] - return value +CharmPlatform = Annotated[str, pydantic.StringConstraints(min_length=4, strict=True)] class CharmLib(models.CraftBaseModel): @@ -128,14 +83,14 @@ class CharmLib(models.CraftBaseModel): lib: str = pydantic.Field( title="Library Path (e.g. my-charm.my_library)", - regex=r"[a-z][a-z0-9_-]+\.[a-z][a-z0-9_]+", + pattern=r"[a-z][a-z0-9_-]+\.[a-z][a-z0-9_]+", ) version: str = pydantic.Field( title="Version filter for the charm. Either an API version or a specific [api].[patch].", - regex=r"[0-9]+(\.[0-9]+)?", + pattern=r"[0-9]+(\.[0-9]+)?", ) - @pydantic.validator("lib", pre=True) + @pydantic.field_validator("lib", mode="before") def _validate_name(cls, value: str) -> str: """Validate the lib field, providing a useful error message on failure.""" charm_name, _, lib_name = str(value).partition(".") @@ -156,7 +111,7 @@ def _validate_name(cls, value: str) -> str: ) return f"{charm_name}.{lib_name}" - @pydantic.validator("version", pre=True) + @pydantic.field_validator("version", mode="before") def _validate_api_version(cls, value: str) -> str: """Validate the API version field, providing a useful error message on failure.""" api, *_ = str(value).partition(".") @@ -166,7 +121,7 @@ def _validate_api_version(cls, value: str) -> str: raise ValueError(f"API version not valid. Expected an integer, got {api!r}") from None return str(value) - @pydantic.validator("version", pre=True) + @pydantic.field_validator("version", mode="before") def _validate_patch_version(cls, value: str) -> str: """Validate the optional patch version, providing a useful error message.""" api, separator, patch = value.partition(".") @@ -237,7 +192,7 @@ def from_build_on_run_on( build_for = "-".join(sorted(all_architectures)) - platform = CharmPlatform.from_bases(run_on) + platform = get_charm_file_platform_str(run_on) return cls( platform=platform, @@ -357,14 +312,7 @@ class CharmcraftBuildPlanner(models.BuildPlanner): bases: list[BasesConfiguration] = pydantic.Field(default_factory=list) base: str | None = None build_base: str | None = None - platforms: dict[str, Platform | None] | None = None # type: ignore[assignment] - - @pydantic.validator("bases", pre=True, each_item=True, allow_reuse=True) - def expand_base(cls, base: BaseDict | LongFormBasesDict) -> LongFormBasesDict: - """Expand short-form bases into long-form bases.""" - if "name" not in base: # Assume long-form base already. - return cast(LongFormBasesDict, base) - return cast(LongFormBasesDict, {"build-on": [base], "run-on": [base]}) + platforms: dict[str, models.Platform | None] | None = None # type: ignore[assignment] def get_build_plan(self) -> list[models.BuildInfo]: """Get build bases for this charm. @@ -414,7 +362,8 @@ def get_build_plan(self) -> list[models.BuildInfo]: ) ) else: - for build_on in platform.build_on: + # TODO: this should go to craft-platforms, so silence mypy for now. + for build_on in platform.build_on: # type: ignore[union-attr] build_infos.extend( [ models.BuildInfo( @@ -423,7 +372,7 @@ def get_build_plan(self) -> list[models.BuildInfo]: build_for=str(build_for), base=base, ) - for build_for in platform.build_for + for build_for in platform.build_for # type: ignore[union-attr] ] ) return build_infos @@ -441,9 +390,9 @@ class CharmcraftProject(models.Project, metaclass=abc.ABCMeta): """ type: Literal["charm", "bundle"] - title: models.ProjectTitle | None - summary: CharmcraftSummaryStr | None - description: str | None + title: models.ProjectTitle | None = None + summary: CharmcraftSummaryStr | None = None + description: str | None = None analysis: AnalysisConfig | None = pydantic.Field( default=None, @@ -454,7 +403,7 @@ class CharmcraftProject(models.Project, metaclass=abc.ABCMeta): Currently the only options are to ignore attributes or linters.""" ), ) - charmhub: CharmhubConfig | None = pydantic.Field( + charmhub: Charmhub | None = pydantic.Field( default=None, description="(DEPRECATED): Configuration for accessing charmhub." ) parts: dict[str, dict[str, Any]] = pydantic.Field(default_factory=dict) @@ -474,7 +423,9 @@ class CharmcraftProject(models.Project, metaclass=abc.ABCMeta): # These private attributes are not part of the project model but are attached here # because Charmcraft uses this metadata. - _started_at: datetime.datetime = pydantic.PrivateAttr(default_factory=datetime.datetime.utcnow) + _started_at: datetime.datetime = pydantic.PrivateAttr( + default_factory=lambda: datetime.datetime.now(tz=datetime.timezone.utc) + ) _valid: bool = pydantic.PrivateAttr(default=False) @property @@ -486,7 +437,7 @@ def started_at(self) -> datetime.datetime: def unmarshal(cls, data: dict[str, Any]): """Create a Charmcraft project from a dictionary of data.""" if cls is not CharmcraftProject: - return cls.parse_obj(data) + return cls.model_validate(data) project_type = data.get("type") if project_type == "charm": if "bases" in data: @@ -541,24 +492,28 @@ def from_yaml_file(cls, path: pathlib.Path) -> Self: return project - @pydantic.root_validator(pre=True, allow_reuse=True) - def preprocess(cls, values: dict[str, Any]) -> dict[str, Any]: + @pydantic.model_validator(mode="before") + @classmethod + def _preprocess(cls, values: dict[str, Any]) -> dict[str, Any]: """Preprocess any values that charmcraft infers, before attribute validation.""" if "type" not in values: raise ValueError("Project type must be declared in charmcraft.yaml.") return values - @pydantic.validator("parts", pre=True, always=True, allow_reuse=True) - def preprocess_parts( - cls, parts: dict[str, dict[str, Any]] | None, values: dict[str, Any] + @pydantic.field_validator("parts", mode="before") + @classmethod + def _preprocess_parts( + cls, parts: dict[str, dict[str, Any]] | None, info: pydantic.ValidationInfo ) -> dict[str, dict[str, Any]]: """Preprocess parts object for a charm or bundle, creating an implicit part if needed.""" if parts is not None and not isinstance(parts, dict): raise TypeError("'parts' in charmcraft.yaml must conform to the charmcraft.yaml spec.") if not parts: - if "type" in values: - parts = {values["type"]: {"plugin": values["type"]}} + if info.config and info.config.get("title") == "Bundle": + parts = {"bundle": {"plugin": "bundle"}} + elif "type" in info.data: + parts = {info.data["type"]: {"plugin": info.data["type"]}} else: parts = {} for name, part in parts.items(): @@ -574,24 +529,11 @@ def preprocess_parts( if name == "bundle" and part["plugin"] == "bundle": part.setdefault("source", ".") - return parts - - @pydantic.validator("parts", each_item=True, allow_reuse=True) - def validate_each_part(cls, item): - """Verify each part in the parts section. Craft-parts will re-validate them.""" - return process_part_config(item) + return {name: process_part_config(part) for name, part in parts.items()} -class BasesCharm(CharmcraftProject): - """A charm using the deprecated ``bases`` keyword. - - This type of charm only supports the following bases: - - Ubuntu 18.04 - - Ubuntu 20.04 - - Ubuntu 22.04 - - CentOS 7 - - Alma Linux 9 - """ +class CharmProject(CharmcraftProject): + """A base class for all charm types.""" type: Literal["charm"] """The type of project. Must be the string ``charm``.""" @@ -611,18 +553,12 @@ class BasesCharm(CharmcraftProject): "mysql-k8s", ], ) - summary: CharmcraftSummaryStr = pydantic.Field( + summary: CharmcraftSummaryStr = pydantic.Field( # pyright: ignore[reportGeneralTypeIssues] description="A brief (one-line) summary of your charm.", ) - description: str = pydantic.Field(description="A multi-line summary of your charm.") - platforms: None = None # type: ignore[assignment] - - # This is defined this way because using conlist makes mypy sad and using - # a ConstrainedList child class has pydantic issues. This appears to be - # solved with Pydantic 2. - bases: list[BasesConfiguration] = pydantic.Field(min_items=1) - - base: None = None + description: str = pydantic.Field( # pyright: ignore[reportGeneralTypeIssues] + description="A multi-line summary of your charm." + ) parts: dict[str, dict[str, Any]] = pydantic.Field( default={"charm": {"plugin": "charm", "source": "."}}, @@ -1020,89 +956,76 @@ class BasesCharm(CharmcraftProject): ], ) - @pydantic.validator("bases", pre=True, each_item=True, allow_reuse=True) - def _validate_base(cls, base: BaseDict | LongFormBasesDict) -> LongFormBasesDict: - """Expand short-form bases into long-form bases.""" - if "name" in base: # Convert short form to long form - base = cast(LongFormBasesDict, {"build-on": [base], "run-on": [base]}) - else: # Cast to long form since we know it is one. - base = cast(LongFormBasesDict, base) - - # Ensure we're only allowing legacy bases. - for build_base in base["build-on"]: - if not cls._check_base_is_legacy(build_base): - raise ValueError(f"Base requires 'platforms' definition: {build_base}") - for run_base in base["run-on"]: - if not cls._check_base_is_legacy(run_base): - raise ValueError(f"Base requires 'platforms' definition: {run_base}") - - return base - - @staticmethod - def _check_base_is_legacy(base: BaseDict) -> bool: - """Check that the given base is a legacy base, usable with 'bases'.""" - # This pyright ignore can go away once we're on Python minimum version 3.11. - # At that point we can mark items as required or not required. - # https://docs.python.org/3/library/typing.html#typing.Required - if ( - base["name"] == "ubuntu" # pyright: ignore[reportTypedDictNotRequiredAccess] - and base["channel"] < "24.04" # pyright: ignore[reportTypedDictNotRequiredAccess] - ): - return True - return base in ({"name": "centos", "channel": "7"}, {"name": "almalinux", "channel": "9"}) - - -class PlatformCharm(CharmcraftProject): - """Model for defining a charm using Platforms.""" - type: Literal["charm"] - name: models.ProjectName - summary: CharmcraftSummaryStr - description: str +def _check_base_is_legacy(base: charmcraft.BaseDict) -> bool: + """Check that the given base is a legacy base, usable with 'bases'.""" + # This pyright ignore can go away once we're on Python minimum version 3.11. + # At that point we can mark items as required or not required. + # https://docs.python.org/3/library/typing.html#typing.Required + if ( + base["name"] == "ubuntu" # pyright: ignore[reportTypedDictNotRequiredAccess] + and base["channel"] < "24.04" # pyright: ignore[reportTypedDictNotRequiredAccess] + ): + return True + return base in ({"name": "centos", "channel": "7"}, {"name": "almalinux", "channel": "9"}) + + +def _validate_base( + base: charmcraft.BaseDict | charmcraft.LongFormBasesDict, +) -> charmcraft.LongFormBasesDict: + if "name" in base: # Convert short form to long form + base = cast(charmcraft.LongFormBasesDict, {"build-on": [base], "run-on": [base]}) + else: # Cast to long form since we know it is one. + base = cast(charmcraft.LongFormBasesDict, base) + + # Ensure we're only allowing legacy bases. + for build_base in base["build-on"]: + if not _check_base_is_legacy(build_base): + raise ValueError(f"Base requires 'platforms' definition: {build_base}") + for run_base in base["run-on"]: + if not _check_base_is_legacy(run_base): + raise ValueError(f"Base requires 'platforms' definition: {run_base}") + return base + + +class BasesCharm(CharmProject): + """A charm using the deprecated ``bases`` keyword. + + This type of charm only supports the following bases: + - Ubuntu 18.04 + - Ubuntu 20.04 + - Ubuntu 22.04 + - CentOS 7 + - Alma Linux 9 + """ + + platforms: None = None # type: ignore[assignment] + + # This is defined this way because using conlist makes mypy sad and using + # a ConstrainedList child class has pydantic issues. This appears to be + # solved with Pydantic 2. + bases: list[Annotated[BasesConfiguration, pydantic.BeforeValidator(_validate_base)]] = ( + pydantic.Field(min_length=1) + ) + + base: None = None + + +class PlatformCharm(CharmProject): + """Model for defining a charm using Platforms.""" # Silencing pyright because it complains about missing default value base: BaseStr # pyright: ignore[reportGeneralTypeIssues] build_base: BuildBaseStr | None = None - platforms: dict[str, Platform | None] # type: ignore[assignment] - parts: dict[str, dict[str, Any]] # pyright: ignore[reportGeneralTypeIssues] - - actions: dict[str, Any] | None - assumes: list[str | dict[str, list | dict]] | None - containers: dict[str, Any] | None - devices: dict[str, Any] | None - extra_bindings: dict[str, Any] | None - peers: dict[str, Any] | None - provides: dict[str, Any] | None - requires: dict[str, Any] | None - resources: dict[str, Any] | None - storage: dict[str, Any] | None - subordinate: bool | None - terms: list[str] | None - links: Links | None - config: dict[str, Any] | None - - @staticmethod - def _check_base_is_legacy(base: BaseDict) -> bool: - """Check that the given base is a legacy base, usable with 'bases'.""" - # This pyright ignore can go away once we're on Python minimum version 3.11. - # At that point we can mark items as required or not required. - # https://docs.python.org/3/library/typing.html#typing.Required - if ( - base["name"] == "ubuntu" # pyright: ignore[reportTypedDictNotRequiredAccess] - and base["channel"] < "24.04" # pyright: ignore[reportTypedDictNotRequiredAccess] - ): - return True - return base in ({"name": "centos", "channel": "7"}, {"name": "almalinux", "channel": "9"}) - - @pydantic.validator("build_base", always=True) - def _validate_dev_base_needs_build_base( - cls, build_base: str | None, values: dict[str, Any] - ) -> str | None: - if not build_base and (base := values["base"]) in const.DEVEL_BASE_STRINGS: + platforms: dict[str, models.Platform | None] # type: ignore[assignment] + + @pydantic.model_validator(mode="after") + def _validate_dev_base_needs_build_base(self) -> Self: + if not self.build_base and self.base in const.DEVEL_BASE_STRINGS: raise ValueError( - f"Base {base} requires a build-base (recommended: 'build-base: ubuntu@devel')" + f"Base {self.base} requires a build-base (recommended: 'build-base: ubuntu@devel')" ) - return build_base + return self Charm = BasesCharm | PlatformCharm @@ -1114,13 +1037,13 @@ class Bundle(CharmcraftProject): type: Literal["bundle"] bundle: dict[str, Any] = {} name: models.ProjectName | None = None # type: ignore[assignment] - title: models.ProjectTitle | None - summary: CharmcraftSummaryStr | None - description: pydantic.StrictStr | None - charmhub: CharmhubConfig = CharmhubConfig() + title: models.ProjectTitle | None = None + summary: CharmcraftSummaryStr | None = None + description: pydantic.StrictStr | None = None platforms: None = None # type: ignore[assignment] - @pydantic.root_validator(pre=True) + @pydantic.model_validator(mode="before") + @classmethod def preprocess_bundle(cls, values: dict[str, Any]) -> dict[str, Any]: """Preprocess any values that charmcraft infers, before attribute validation.""" if "name" not in values: diff --git a/charmcraft/parts/__init__.py b/charmcraft/parts/__init__.py index 11341631c..eec52a538 100644 --- a/charmcraft/parts/__init__.py +++ b/charmcraft/parts/__init__.py @@ -70,8 +70,8 @@ def process_part_config(data: dict[str, Any]) -> dict[str, Any]: # get plugin properties data if it's model based (otherwise it's empty), and # update with the received config - if isinstance(plugin_properties, plugins.PluginModel): - full_config = plugin_properties.dict(by_alias=True) + if isinstance(plugin_properties, plugins.PluginProperties): + full_config = plugin_properties.model_dump(by_alias=True, exclude_unset=True) else: full_config = {} full_config.update(data) diff --git a/charmcraft/parts/bundle.py b/charmcraft/parts/bundle.py index aac1082e7..057131997 100644 --- a/charmcraft/parts/bundle.py +++ b/charmcraft/parts/bundle.py @@ -1,4 +1,4 @@ -# Copyright 2023 Canonical Ltd. +# Copyright 2023-2024 Canonical Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,31 +15,17 @@ # For further info, check https://github.com/canonical/charmcraft """Bundle plugin for craft-parts.""" import sys -from typing import Any +from typing import Literal import overrides from craft_parts import plugins -class BundlePluginProperties(plugins.PluginProperties, plugins.PluginModel): +class BundlePluginProperties(plugins.PluginProperties, frozen=True): """Properties used to pack bundles.""" - source: str - - @classmethod - def unmarshal(cls, data: dict[str, Any]): - """Populate bundle properties from the part specification. - - :param data: A dictionary containing part properties. - - :return: The populated plugin properties data object. - - :raise pydantic.ValidationError: If validation fails. - """ - plugin_data = plugins.extract_plugin_properties( - data, plugin_name="bundle", required=["source"] - ) - return cls(**plugin_data) + plugin: Literal["bundle"] = "bundle" + source: str = "." class BundlePlugin(plugins.Plugin): diff --git a/charmcraft/parts/charm.py b/charmcraft/parts/charm.py index 9cf01b901..fcfa4b249 100644 --- a/charmcraft/parts/charm.py +++ b/charmcraft/parts/charm.py @@ -1,4 +1,4 @@ -# Copyright 2023 Canonical Ltd. +# Copyright 2023-2024 Canonical Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import shlex import sys from contextlib import suppress -from typing import Any, cast +from typing import Literal, cast import overrides import pydantic @@ -28,16 +28,18 @@ from craft_parts.errors import OsReleaseIdError, OsReleaseVersionIdError from craft_parts.packages import platform from craft_parts.utils import os_utils +from typing_extensions import Self from charmcraft import charm_builder, env, instrum PACKAGE_NAME_REGEX = re.compile(r"[A-Za-z0-9_.-]+") -class CharmPluginProperties(plugins.PluginProperties, plugins.PluginModel): +class CharmPluginProperties(plugins.PluginProperties, frozen=True): """Properties used in charm building.""" - source: str + plugin: Literal["charm"] = "charm" + source: str = "." charm_entrypoint: str = "src/charm.py" charm_binary_python_packages: list[str] = [] charm_python_packages: list[str] = [] @@ -52,15 +54,15 @@ class CharmPluginProperties(plugins.PluginProperties, plugins.PluginModel): ``charm-strict-dependencies`` is mutually exclusive with ``charm-python-packages``. """ - @pydantic.validator("charm_entrypoint") - def validate_entry_point(cls, charm_entrypoint, values): + @pydantic.field_validator("charm_entrypoint", mode="after") + def _validate_entrypoint(cls, charm_entrypoint: str, info: pydantic.ValidationInfo) -> str: """Validate the entry point.""" # the location of the project is needed - if "source" not in values: + if "source" not in info.data: raise ValueError( "cannot validate 'charm-entrypoint' because invalid 'source' configuration" ) - project_dirpath = pathlib.Path(values["source"]).resolve() + project_dirpath = pathlib.Path(info.data["source"]).resolve() # check that the entrypoint is inside the project filepath = (project_dirpath / charm_entrypoint).resolve() @@ -72,65 +74,60 @@ def validate_entry_point(cls, charm_entrypoint, values): rel_entrypoint = (project_dirpath / charm_entrypoint).relative_to(project_dirpath) return rel_entrypoint.as_posix() - @pydantic.validator("charm_requirements", always=True) - def validate_requirements(cls, charm_requirements, values): + @pydantic.model_validator(mode="after") + def _validate_requirements(self) -> Self: """Validate the specified requirement or dynamically default it. The default is dynamic because it's only requirements.txt if the file is there. """ # the location of the project is needed - if "source" not in values: + if not self.source: raise ValueError( - "cannot validate 'charm-requirements' because invalid 'source' configuration" + "cannot validate 'charm-requirements' because no 'source' was provided" ) - project_dirpath = pathlib.Path(values["source"]) + project_dirpath = pathlib.Path(self.source) # if nothing indicated, and default file is there, use it default_reqs_name = "requirements.txt" - if not charm_requirements and (project_dirpath / default_reqs_name).is_file(): - charm_requirements.append(default_reqs_name) + if not self.charm_requirements and (project_dirpath / default_reqs_name).is_file(): + self.charm_requirements.append(default_reqs_name) - return charm_requirements + return self - @pydantic.validator("charm_strict_dependencies") - def validate_strict_dependencies( - cls, charm_strict_dependencies: bool, values: dict[str, Any] - ) -> bool: + @pydantic.model_validator(mode="after") + def _validate_strict_dependencies(self) -> Self: """Validate basic requirements if strict dependencies are enabled. Full validation that the requirements file contains all dependencies is done later, but we can fail early if the strict dependencies setting causes the charm to be invalid. """ - if not charm_strict_dependencies: - return charm_strict_dependencies + if not self.charm_strict_dependencies: + return self - if values.get("charm_python_packages"): + if self.charm_python_packages: raise ValueError( "'charm-python-packages' must not be set if 'charm-strict-dependencies' is enabled" ) - if not values.get("charm_requirements"): + if not self.charm_requirements: raise ValueError( "'charm-strict-dependencies' requires at least one requirements file." ) - return charm_strict_dependencies + invalid_binaries = set() + for binary_package in self.charm_binary_python_packages: + if not PACKAGE_NAME_REGEX.fullmatch(binary_package): + invalid_binaries.add(binary_package) - @classmethod - def unmarshal(cls, data: dict[str, Any]): - """Populate charm properties from the part specification. - - :param data: A dictionary containing part properties. - - :return: The populated plugin properties data object. + if invalid_binaries: + raise ValueError( + "'charm-binary-python-packages' may contain only package names allowed " + "to be installed from binary if 'charm-strict-dependencies' is enabled. " + f"Invalid package names: {sorted(invalid_binaries)}" + ) - :raise pydantic.ValidationError: If validation fails. - """ - plugin_data = plugins.extract_plugin_properties( - data, plugin_name="charm", required=["source"] - ) - return cls(**plugin_data) + return self class CharmPlugin(plugins.Plugin): diff --git a/charmcraft/parts/reactive.py b/charmcraft/parts/reactive.py index 9f7b54bd4..275979740 100644 --- a/charmcraft/parts/reactive.py +++ b/charmcraft/parts/reactive.py @@ -1,4 +1,4 @@ -# Copyright 2021-2022 Canonical Ltd. +# Copyright 2021-2024 Canonical Ltd. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -19,34 +19,20 @@ import subprocess import sys from pathlib import Path -from typing import Any, cast +from typing import Literal, cast import overrides from craft_parts import plugins from craft_parts.errors import PluginEnvironmentValidationError -class ReactivePluginProperties(plugins.PluginProperties, plugins.PluginModel): +class ReactivePluginProperties(plugins.PluginProperties, frozen=True): """Properties used to pack reactive charms using charm-tools.""" - source: str + plugin: Literal["reactive"] = "reactive" + source: str = "." reactive_charm_build_arguments: list[str] = [] - @classmethod - def unmarshal(cls, data: dict[str, Any]): - """Populate reactive plugin properties from the part specification. - - :param data: A dictionary containing part properties. - - :return: The populated plugin properties data object. - - :raise pydantic.ValidationError: If validation fails. - """ - plugin_data = plugins.extract_plugin_properties( - data, plugin_name="reactive", required=["source"] - ) - return cls(**plugin_data) - class ReactivePluginEnvironmentValidator(plugins.validator.PluginEnvironmentValidator): """Check the execution environment for the Reactive plugin. diff --git a/charmcraft/preprocess.py b/charmcraft/preprocess.py index 0eae25022..f114a87e3 100644 --- a/charmcraft/preprocess.py +++ b/charmcraft/preprocess.py @@ -32,7 +32,7 @@ def add_default_parts(yaml_data: dict[str, Any]) -> None: :param yaml_data: The raw YAML dictionary of the project. :returns: The same dictionary passed in, with necessary mutations. """ - if "parts" in yaml_data: # Only operate if there isn't a parts key + if yaml_data.get("parts"): # Only operate if there aren't any parts. return if yaml_data.get("type") == "bundle": diff --git a/charmcraft/services/package.py b/charmcraft/services/package.py index 5ee1f5b87..0a23e752d 100644 --- a/charmcraft/services/package.py +++ b/charmcraft/services/package.py @@ -115,7 +115,7 @@ def get_charm_path(self, dest_dir: pathlib.Path) -> pathlib.Path: """Get a charm file name for the appropriate set of run-on bases.""" if self._platform: return dest_dir / f"{self._project.name}_{self._platform}.charm" - build_plan = models.CharmcraftBuildPlanner.parse_obj( + build_plan = models.CharmcraftBuildPlanner.model_validate( self._project.marshal() ).get_build_plan() platform = utils.get_os_platform() @@ -208,10 +208,13 @@ def get_manifest_bases(self) -> list[models.Base]: if isinstance(self._project, PlatformCharm): if not self._platform: architectures = [util.get_host_architecture()] - elif platform := self._project.platforms.get(self._platform): - architectures = [str(arch) for arch in platform.build_for] elif self._platform in (*const.SUPPORTED_ARCHITECTURES, "all"): architectures = [self._platform] + elif platform := self._project.platforms.get(self._platform): + if platform.build_for: + architectures = [str(arch) for arch in platform.build_for] + else: + raise ValueError(f"Platform {self._platform} contains unknown build-for.") else: architectures = [util.get_host_architecture()] return [models.Base.from_str_and_arch(self._project.base, architectures)] @@ -244,7 +247,9 @@ def write_metadata(self, path: pathlib.Path) -> None: # crystal wine glass. (path / "manifest.yaml").write_text( utils.dump_yaml( - manifest.dict(by_alias=True, exclude_unset=False, exclude_none=True) + manifest.model_dump( + mode="json", by_alias=True, exclude_unset=False, exclude_none=True + ) ) ) diff --git a/charmcraft/services/provider.py b/charmcraft/services/provider.py index 910c4b4e6..01db7069b 100644 --- a/charmcraft/services/provider.py +++ b/charmcraft/services/provider.py @@ -42,7 +42,7 @@ def setup(self) -> None: def get_base( self, - base_name: bases.BaseName | tuple[str, str], + base_name: bases.BaseName, *, instance_name: str, **kwargs: bool | str | None | pathlib.Path, diff --git a/charmcraft/utils/yaml.py b/charmcraft/utils/yaml.py index 4f1bcd194..13ac9b255 100644 --- a/charmcraft/utils/yaml.py +++ b/charmcraft/utils/yaml.py @@ -48,7 +48,9 @@ def _repr_str(dumper: yaml.SafeDumper, data: str) -> yaml.ScalarNode: def dump_yaml(data: Any) -> str: # noqa: ANN401: yaml.dump takes anything, so why can't we? """Dump a craft model to a YAML string.""" yaml.add_representer(str, _repr_str, Dumper=yaml.SafeDumper) - yaml.add_representer(pydantic.AnyHttpUrl, _repr_str, Dumper=yaml.SafeDumper) + yaml.add_representer( + pydantic.AnyHttpUrl, _repr_str, Dumper=yaml.SafeDumper # type: ignore[arg-type] + ) yaml.add_representer( const.CharmArch, yaml.representer.SafeRepresenter.represent_str, diff --git a/pyproject.toml b/pyproject.toml index f37b1ebf1..0b43cb789 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,20 +4,20 @@ dynamic = ["version"] description = "The main tool to build, upload, and develop in general the Juju charms." readme = "README.md" dependencies = [ - "craft-application~=3.0", + "craft-application>=4.0.0", "craft-cli>=2.3.0", - "craft-parts>=1.18", + "craft-grammar>=2.0.0", + "craft-parts>=2.0.0", + "craft-providers>=2.0.0", "craft-platforms~=0.1", - "craft-providers>=1.23.0", - "craft-store>=2.4", + "craft-providers>=2.0.0", + "craft-store>=3.0.0", "distro>=1.3.0", "docker>=7.0.0", "humanize>=2.6.0", "jsonschema", "jinja2", - # Pydantic will need to be updated all at once with our libraries. - # When you update it, remove the pydantic constraints from renovate. - "pydantic>=1.10,<2.0", + "pydantic~=2.0", "python-dateutil", "pyyaml", "requests", @@ -70,6 +70,7 @@ types = [ "mypy[reports]~=1.5", "pyright==1.1.366", "types-python-dateutil", + "types-PyYAML", "types-requests<2.31.0.20240312", # Frozen until we can get urllib3 v2 "types-setuptools", "types-tabulate", @@ -81,7 +82,7 @@ apt = [ docs = [ "canonical-sphinx~=0.1", "pyspelling", - "autodoc-pydantic<=2.0", + "autodoc-pydantic~=2.0", "sphinx-autobuild~=2024.2", "sphinx-pydantic~=0.1", "sphinx-toolbox~=3.5", diff --git a/requirements-dev.lock b/requirements-dev.lock new file mode 100644 index 000000000..51663cfd0 --- /dev/null +++ b/requirements-dev.lock @@ -0,0 +1,1361 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: ["dev","lint","types","apt"] +# all-features: false +# with-sources: true +# generate-hashes: true +# universal: true + +--extra-index-url https://people.canonical.com/~lengau/pypi/ +--index-url https://pypi.org/simple/ + +-e file:. +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via craft-platforms + # via pydantic +attrs==24.2.0 \ + --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ + --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 + # via hypothesis + # via jsonschema + # via referencing +black==24.8.0 \ + --hash=sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6 \ + --hash=sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e \ + --hash=sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f \ + --hash=sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018 \ + --hash=sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e \ + --hash=sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd \ + --hash=sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4 \ + --hash=sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed \ + --hash=sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2 \ + --hash=sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42 \ + --hash=sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af \ + --hash=sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb \ + --hash=sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368 \ + --hash=sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb \ + --hash=sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af \ + --hash=sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed \ + --hash=sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47 \ + --hash=sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2 \ + --hash=sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a \ + --hash=sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c \ + --hash=sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920 \ + --hash=sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1 + # via charmcraft +boolean-py==4.0 \ + --hash=sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4 \ + --hash=sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd + # via license-expression +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 + # via requests +cffi==1.17.0 \ + --hash=sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f \ + --hash=sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab \ + --hash=sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499 \ + --hash=sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058 \ + --hash=sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693 \ + --hash=sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb \ + --hash=sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377 \ + --hash=sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885 \ + --hash=sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2 \ + --hash=sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401 \ + --hash=sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4 \ + --hash=sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b \ + --hash=sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59 \ + --hash=sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f \ + --hash=sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c \ + --hash=sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555 \ + --hash=sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa \ + --hash=sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424 \ + --hash=sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb \ + --hash=sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2 \ + --hash=sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8 \ + --hash=sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e \ + --hash=sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9 \ + --hash=sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82 \ + --hash=sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828 \ + --hash=sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759 \ + --hash=sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc \ + --hash=sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118 \ + --hash=sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf \ + --hash=sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932 \ + --hash=sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a \ + --hash=sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29 \ + --hash=sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206 \ + --hash=sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2 \ + --hash=sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c \ + --hash=sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c \ + --hash=sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0 \ + --hash=sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a \ + --hash=sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195 \ + --hash=sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6 \ + --hash=sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9 \ + --hash=sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc \ + --hash=sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb \ + --hash=sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0 \ + --hash=sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7 \ + --hash=sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb \ + --hash=sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a \ + --hash=sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492 \ + --hash=sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720 \ + --hash=sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42 \ + --hash=sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7 \ + --hash=sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d \ + --hash=sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d \ + --hash=sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb \ + --hash=sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4 \ + --hash=sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2 \ + --hash=sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b \ + --hash=sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8 \ + --hash=sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e \ + --hash=sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204 \ + --hash=sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3 \ + --hash=sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150 \ + --hash=sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4 \ + --hash=sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76 \ + --hash=sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e \ + --hash=sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb \ + --hash=sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91 + # via cryptography + # via pygit2 + # via pynacl +charset-normalizer==3.3.2 \ + --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ + --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ + --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ + --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ + --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ + --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ + --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ + --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ + --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ + --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ + --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ + --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ + --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ + --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ + --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ + --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ + --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ + --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ + --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ + --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ + --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ + --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ + --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ + --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ + --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ + --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ + --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ + --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ + --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ + --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ + --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ + --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ + --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ + --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ + --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ + --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ + --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ + --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ + --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ + --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ + --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ + --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ + --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ + --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ + --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ + --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ + --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ + --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ + --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ + --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ + --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ + --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ + --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ + --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ + --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ + --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ + --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ + --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ + --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ + --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ + --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ + --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ + --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ + --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ + --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ + --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ + --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ + --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ + --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ + --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ + --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ + --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ + --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ + --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ + --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ + --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ + --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ + --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ + --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ + --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ + --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ + --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ + --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ + --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ + --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ + --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ + --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ + --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ + --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 + # via requests +click==8.1.7 \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de + # via black +codespell==2.3.0 \ + --hash=sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f \ + --hash=sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1 + # via charmcraft +colorama==0.4.6 ; platform_system == 'Windows' or sys_platform == 'win32' \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via click + # via pytest +coverage==7.6.1 \ + --hash=sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca \ + --hash=sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d \ + --hash=sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6 \ + --hash=sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989 \ + --hash=sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c \ + --hash=sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b \ + --hash=sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223 \ + --hash=sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f \ + --hash=sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56 \ + --hash=sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3 \ + --hash=sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8 \ + --hash=sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb \ + --hash=sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388 \ + --hash=sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0 \ + --hash=sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a \ + --hash=sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8 \ + --hash=sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f \ + --hash=sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a \ + --hash=sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962 \ + --hash=sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8 \ + --hash=sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391 \ + --hash=sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc \ + --hash=sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2 \ + --hash=sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155 \ + --hash=sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb \ + --hash=sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0 \ + --hash=sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c \ + --hash=sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a \ + --hash=sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004 \ + --hash=sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060 \ + --hash=sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232 \ + --hash=sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93 \ + --hash=sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129 \ + --hash=sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163 \ + --hash=sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de \ + --hash=sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6 \ + --hash=sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23 \ + --hash=sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569 \ + --hash=sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d \ + --hash=sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778 \ + --hash=sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d \ + --hash=sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36 \ + --hash=sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a \ + --hash=sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6 \ + --hash=sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34 \ + --hash=sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704 \ + --hash=sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106 \ + --hash=sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9 \ + --hash=sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862 \ + --hash=sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b \ + --hash=sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255 \ + --hash=sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16 \ + --hash=sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3 \ + --hash=sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133 \ + --hash=sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb \ + --hash=sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657 \ + --hash=sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d \ + --hash=sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca \ + --hash=sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36 \ + --hash=sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c \ + --hash=sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e \ + --hash=sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff \ + --hash=sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7 \ + --hash=sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5 \ + --hash=sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02 \ + --hash=sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c \ + --hash=sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df \ + --hash=sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3 \ + --hash=sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a \ + --hash=sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959 \ + --hash=sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234 \ + --hash=sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc + # via charmcraft + # via pytest-cov +craft-application==4.0.0 \ + --hash=sha256:0ea7ae7c467f15a4bde3cc2840a96a5df9576dd2e86b5ca5b869ddf3bea440a5 \ + --hash=sha256:ea8e38e3393c05e20868bac80e817478f87d8f809aa6e5bbae1a8f98a74d67a8 + # via charmcraft +craft-archives==2.0.0 \ + --hash=sha256:3e0c8593ea0f77d32b115599fa29836fbd7a1df17e3c861739a39c80ab6363e2 \ + --hash=sha256:f0f69d4ee67dbeae3213036879510c5767205a67f0df33af8bc4b3dabc4e6e09 + # via craft-application +craft-cli==2.6.0 \ + --hash=sha256:138453abad5207ca872369496ffc7731a4124d6d36aed523c6f2f7f73924e814 \ + --hash=sha256:48208b40cad0800a633519a5c45e70c1b4801d296450d8f7cc01d1f5d548d972 + # via charmcraft + # via craft-application +craft-grammar==2.0.0 \ + --hash=sha256:3dd8c44aad6d36f4e06a56e6466903cc6996085d77901e7f895dd8da36f33cac \ + --hash=sha256:7b086496bd020e439f196cc688cdc7d847310cbfbdde06251bc5af34c9628865 + # via charmcraft + # via craft-application +craft-parts==2.0.0 \ + --hash=sha256:2c547f2b2fc9a0df8d9be7cca36506434f15df0856f9ea121b5a40061173338a \ + --hash=sha256:aa09b904c26baa0b2db2be97463a48eae091cf84500f04ff5574b55c6292d58f + # via charmcraft + # via craft-application +craft-platforms==0.1.1 \ + --hash=sha256:183d2df56bbe10225d97c6fac3e6644752233dcf5b2d010b00a5b126b8153361 \ + --hash=sha256:462da03aac2fadb656dbdeb4207de44a2208dcfbb9977f1433d59e59d6b74f42 + # via charmcraft +craft-providers==2.0.0 \ + --hash=sha256:55e9a97dbaabbad01111bbbc57c4e4cbc19a1e79127fcb559118ae7dd129e342 \ + --hash=sha256:6b49e22e5b6ee80de7d39cd4666077fab47cbed06d8fc6f3fe379d6e388f0105 + # via charmcraft + # via craft-application +craft-store==3.0.0 \ + --hash=sha256:0a0d63e5e1b36f65383aa6191b10f43ba094d3dce757c830ce162d64e6b5fe9c \ + --hash=sha256:f3644b1df09dccb26d5250fdbd91b3618abeede3958fa185c54fa6b5462863b3 + # via charmcraft +cryptography==43.0.0 ; sys_platform == 'linux' \ + --hash=sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709 \ + --hash=sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069 \ + --hash=sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2 \ + --hash=sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b \ + --hash=sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e \ + --hash=sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70 \ + --hash=sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778 \ + --hash=sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22 \ + --hash=sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895 \ + --hash=sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf \ + --hash=sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431 \ + --hash=sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f \ + --hash=sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947 \ + --hash=sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74 \ + --hash=sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc \ + --hash=sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66 \ + --hash=sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66 \ + --hash=sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf \ + --hash=sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f \ + --hash=sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5 \ + --hash=sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e \ + --hash=sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f \ + --hash=sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55 \ + --hash=sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1 \ + --hash=sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47 \ + --hash=sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5 \ + --hash=sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0 + # via secretstorage +distro==1.9.0 \ + --hash=sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 + # via charmcraft + # via craft-archives + # via craft-platforms + # via lazr-restfulclient +docker==7.1.0 \ + --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \ + --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0 + # via charmcraft +exceptiongroup==1.2.2 ; python_version < '3.11' \ + --hash=sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b \ + --hash=sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc + # via hypothesis + # via pytest +flake8==7.1.1 \ + --hash=sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38 \ + --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 + # via charmcraft +freezegun==1.5.1 \ + --hash=sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9 \ + --hash=sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1 + # via charmcraft +httplib2==0.22.0 \ + --hash=sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc \ + --hash=sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81 + # via launchpadlib + # via lazr-restfulclient +humanize==4.10.0 \ + --hash=sha256:06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978 \ + --hash=sha256:39e7ccb96923e732b5c2e27aeaa3b10a8dfeeba3eb965ba7b74a3eb0e30040a6 + # via charmcraft +hypothesis==6.110.1 \ + --hash=sha256:4b54a4ed3385c53b247b99e7b3c9630e7b665ef3cfdb2c557dd1c0b34d090481 \ + --hash=sha256:a138bfaea11aba6daadf8effd9065251a6fec1549f25b7d72ac9881a413f76b0 + # via charmcraft +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 + # via requests +importlib-metadata==8.2.0 \ + --hash=sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369 \ + --hash=sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d + # via keyring + # via pydantic-yaml +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + # via pytest +jaraco-classes==3.4.0 \ + --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 + # via keyring +jeepney==0.8.0 ; sys_platform == 'linux' \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via keyring + # via secretstorage +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + # via charmcraft +jsonschema==4.23.0 \ + --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + # via charmcraft +jsonschema-specifications==2023.12.1 \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c + # via jsonschema +keyring==24.3.1 \ + --hash=sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db \ + --hash=sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218 + # via craft-store +launchpadlib==2.0.0 \ + --hash=sha256:5d4a9095e91773a7565d4c159594ae30eca792fd5f9b89ded459d711484a96cb \ + --hash=sha256:bd158ec67e6a3e37d16aeb06b4dca4ef0da7ff1b684c51c896b03feef9aab875 + # via craft-archives +lazr-restfulclient==0.14.6 \ + --hash=sha256:43f12a1d3948463b1462038c47b429dcb5e42e0ba7f2e16511b02ba5d2adffdb \ + --hash=sha256:97e95b1d8f0ec7fed998b48aea773baf8dcab06cf78a4deb9a046af5cca0cea2 + # via craft-archives + # via launchpadlib +lazr-uri==1.0.6 \ + --hash=sha256:5026853fcbf6f91d5a6b11ea7860a641fe27b36d4172c731f4aa16b900cf8464 + # via craft-archives + # via launchpadlib + # via wadllib +license-expression==30.3.0 \ + --hash=sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5 \ + --hash=sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41 + # via craft-application +lxml==5.2.2 \ + --hash=sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3 \ + --hash=sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a \ + --hash=sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0 \ + --hash=sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b \ + --hash=sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f \ + --hash=sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6 \ + --hash=sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73 \ + --hash=sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d \ + --hash=sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad \ + --hash=sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b \ + --hash=sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a \ + --hash=sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5 \ + --hash=sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab \ + --hash=sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316 \ + --hash=sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6 \ + --hash=sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df \ + --hash=sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca \ + --hash=sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264 \ + --hash=sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8 \ + --hash=sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f \ + --hash=sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b \ + --hash=sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3 \ + --hash=sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5 \ + --hash=sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed \ + --hash=sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab \ + --hash=sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5 \ + --hash=sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726 \ + --hash=sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d \ + --hash=sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632 \ + --hash=sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706 \ + --hash=sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8 \ + --hash=sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472 \ + --hash=sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835 \ + --hash=sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf \ + --hash=sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db \ + --hash=sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d \ + --hash=sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545 \ + --hash=sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9 \ + --hash=sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be \ + --hash=sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe \ + --hash=sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905 \ + --hash=sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438 \ + --hash=sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db \ + --hash=sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776 \ + --hash=sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c \ + --hash=sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed \ + --hash=sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd \ + --hash=sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484 \ + --hash=sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d \ + --hash=sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6 \ + --hash=sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30 \ + --hash=sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182 \ + --hash=sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61 \ + --hash=sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425 \ + --hash=sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb \ + --hash=sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1 \ + --hash=sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511 \ + --hash=sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e \ + --hash=sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207 \ + --hash=sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b \ + --hash=sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585 \ + --hash=sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56 \ + --hash=sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391 \ + --hash=sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85 \ + --hash=sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147 \ + --hash=sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18 \ + --hash=sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1 \ + --hash=sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa \ + --hash=sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48 \ + --hash=sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3 \ + --hash=sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184 \ + --hash=sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67 \ + --hash=sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7 \ + --hash=sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34 \ + --hash=sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706 \ + --hash=sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8 \ + --hash=sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c \ + --hash=sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115 \ + --hash=sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009 \ + --hash=sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466 \ + --hash=sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526 \ + --hash=sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d \ + --hash=sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525 \ + --hash=sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14 \ + --hash=sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3 \ + --hash=sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0 \ + --hash=sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b \ + --hash=sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1 \ + --hash=sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f \ + --hash=sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf \ + --hash=sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf \ + --hash=sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0 \ + --hash=sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b \ + --hash=sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff \ + --hash=sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88 \ + --hash=sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2 \ + --hash=sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40 \ + --hash=sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716 \ + --hash=sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2 \ + --hash=sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2 \ + --hash=sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a \ + --hash=sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734 \ + --hash=sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87 \ + --hash=sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48 \ + --hash=sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36 \ + --hash=sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b \ + --hash=sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07 \ + --hash=sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c \ + --hash=sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573 \ + --hash=sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001 \ + --hash=sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9 \ + --hash=sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3 \ + --hash=sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce \ + --hash=sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3 \ + --hash=sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04 \ + --hash=sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927 \ + --hash=sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083 \ + --hash=sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d \ + --hash=sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32 \ + --hash=sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9 \ + --hash=sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f \ + --hash=sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2 \ + --hash=sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c \ + --hash=sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d \ + --hash=sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393 \ + --hash=sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8 \ + --hash=sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6 \ + --hash=sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66 \ + --hash=sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5 \ + --hash=sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97 \ + --hash=sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196 \ + --hash=sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836 \ + --hash=sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae \ + --hash=sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297 \ + --hash=sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421 \ + --hash=sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6 \ + --hash=sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981 \ + --hash=sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30 \ + --hash=sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30 \ + --hash=sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f \ + --hash=sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324 \ + --hash=sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b + # via mypy +macaroonbakery==1.3.4 \ + --hash=sha256:1e952a189f5c1e96ef82b081b2852c770d7daa20987e2088e762dd5689fb253b \ + --hash=sha256:41ca993a23e4f8ef2fe7723b5cd4a30c759735f1d5021e990770c8a0e0f33970 + # via craft-store +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 + # via jinja2 +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via flake8 +more-itertools==10.4.0 \ + --hash=sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27 \ + --hash=sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923 + # via jaraco-classes +mypy==1.11.1 \ + --hash=sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54 \ + --hash=sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a \ + --hash=sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72 \ + --hash=sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69 \ + --hash=sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b \ + --hash=sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe \ + --hash=sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4 \ + --hash=sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd \ + --hash=sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0 \ + --hash=sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525 \ + --hash=sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2 \ + --hash=sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c \ + --hash=sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5 \ + --hash=sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de \ + --hash=sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74 \ + --hash=sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c \ + --hash=sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e \ + --hash=sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58 \ + --hash=sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b \ + --hash=sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417 \ + --hash=sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411 \ + --hash=sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb \ + --hash=sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03 \ + --hash=sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca \ + --hash=sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8 \ + --hash=sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08 \ + --hash=sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809 + # via charmcraft +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ + --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 + # via black + # via mypy +nodeenv==1.9.1 \ + --hash=sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f \ + --hash=sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9 + # via pyright +oauthlib==3.2.2 \ + --hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \ + --hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918 + # via lazr-restfulclient +overrides==7.7.0 \ + --hash=sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 + # via craft-archives + # via craft-grammar + # via craft-parts + # via craft-store +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + # via black + # via craft-providers + # via pytest +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 + # via black + # via yamllint +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 + # via black + # via craft-application + # via craft-cli +pluggy==1.5.0 \ + --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 + # via pytest +protobuf==5.27.3 \ + --hash=sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035 \ + --hash=sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7 \ + --hash=sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f \ + --hash=sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c \ + --hash=sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5 \ + --hash=sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25 \ + --hash=sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1 \ + --hash=sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce \ + --hash=sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e \ + --hash=sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf \ + --hash=sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b + # via macaroonbakery +pycodestyle==2.12.1 \ + --hash=sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3 \ + --hash=sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521 + # via flake8 +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc + # via cffi +pydantic==2.8.2 \ + --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ + --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 + # via charmcraft + # via craft-application + # via craft-archives + # via craft-grammar + # via craft-parts + # via craft-providers + # via craft-store + # via pydantic-yaml +pydantic-core==2.20.1 \ + --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ + --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ + --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ + --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ + --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ + --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ + --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ + --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ + --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ + --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ + --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ + --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ + --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ + --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ + --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ + --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ + --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ + --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ + --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ + --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ + --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ + --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ + --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ + --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ + --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ + --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ + --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ + --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ + --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ + --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ + --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ + --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ + --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ + --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ + --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ + --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ + --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ + --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ + --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ + --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ + --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ + --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ + --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ + --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ + --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ + --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ + --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ + --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ + --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ + --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ + --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ + --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ + --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ + --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ + --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ + --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ + --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ + --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ + --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ + --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ + --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ + --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ + --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ + --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ + --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ + --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ + --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ + --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ + --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ + --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ + --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ + --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ + --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ + --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ + --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ + --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ + --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ + --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ + --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ + --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ + --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ + --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ + --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ + --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ + --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ + --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ + --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ + --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ + --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 + # via pydantic +pydantic-yaml==1.3.0 \ + --hash=sha256:0684255a860522c9226d4eff5c0e8ba44339683b5c5fa79fac4470c0e3821911 \ + --hash=sha256:5671c9ef1731570aa2644432ae1e2dd34c406bd4a0a393df622f6b897a88df83 + # via craft-parts +pydocstyle==6.3.0 \ + --hash=sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019 \ + --hash=sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1 + # via charmcraft +pyfakefs==5.6.0 \ + --hash=sha256:1a45bba8615323ec29d65929d32dc66d7b59a1e60a02109950440edb0486c539 \ + --hash=sha256:7a549b32865aa97d8ba6538285a93816941d9b7359be2954ac60ec36b277e879 + # via charmcraft +pyflakes==3.2.0 \ + --hash=sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a + # via flake8 +pygit2==1.14.1 \ + --hash=sha256:0fff3d1aaf1d7372757888c4620347d6ad8b1b3a637b30a3abd156da7cf9476b \ + --hash=sha256:11058be23a5d6c1308303fd450d690eada117c564154634d81676e66530056be \ + --hash=sha256:141a1b37fc431d98b3de2f4651eab8b1b1b038cd50de42bfd1c8de057ec2284e \ + --hash=sha256:15db91695259f672f8be3080eb943889f7c8bdc5fbd8b89555e0c53ba2481f15 \ + --hash=sha256:230493d43945e10365070d349da206d39cc885ae8c52fdeca93942f36661dd93 \ + --hash=sha256:404d3d9bac22ff022157de3fbfd8997c108d86814ba88cbc8709c1c2daef833a \ + --hash=sha256:46ae2149851d5da2934e27c9ac45c375d04af1e549f8c4cbb4e9e4de5f43dc42 \ + --hash=sha256:67b6e5911101dc5ecb679bf241c0b9ee2099f4d76aa0ad66b326400cb4590afa \ + --hash=sha256:760614370fcce4e9606ff675d6fc11165badb59aaedc2ea6cb2e7ec1855616c2 \ + --hash=sha256:793f49ce66640d41d977e1337ddb5dec9b3b4ff818040d78d3ded052e1ea52e6 \ + --hash=sha256:7b6d1202d6a0c21281d2697321292aff9e2e2e195d6ce553efcdf86c2de2af1a \ + --hash=sha256:8589c8c0005b5ba373b3b101f903d4451338f3dfc09f8a38c76da6584fef84d0 \ + --hash=sha256:9d96e46b94dc706e6316e6cc293c0a0692e5b0811a6f8f2738728a4a68d7a827 \ + --hash=sha256:a03de11ba5205628996d867280e5181605009c966c801dbb94781bed55b740d7 \ + --hash=sha256:acb849cea89438192e78eea91a27fb9c54c7286a82aac65a3f746ea8c498fedb \ + --hash=sha256:acc7be8a439274fc6227e33b63b9ec83cd51fa210ab898eaadffb7bf930c0087 \ + --hash=sha256:bc3326a5ce891ef26429ae6d4290acb80ea0064947b4184a4c4940b4bd6ab4a3 \ + --hash=sha256:c22027f748d125698964ed696406075dac85f114e01d50547e67053c1bb03308 \ + --hash=sha256:e4f371c4b7ee86c0a751209fac7c941d1f6a3aca6af89ac09481469dbe0ea1cc \ + --hash=sha256:ea505739af41496b1d36c99bc15e2bd5631880059514458977c8931e27063a8d \ + --hash=sha256:ec5958571b82a6351785ca645e5394c31ae45eec5384b2fa9c4e05dde3597ad6 \ + --hash=sha256:ed16f2bc8ca9c42af8adb967c73227b1de973e9c4d717bd738fb2f177890ca2c \ + --hash=sha256:f2378f9a70cea27809a2c78b823e22659691a91db9d81b1f3a58d537067815ac \ + --hash=sha256:f35152b96a31ab705cdd63aef08fb199d6c1e87fc6fd45b1945f8cd040a43b7b \ + --hash=sha256:f5a87744e6c36f03fe488b975c73d3eaef22eadce433152516a2b8dbc4015233 + # via craft-application +pymacaroons==0.13.0 \ + --hash=sha256:1e6bba42a5f66c245adf38a5a4006a99dcc06a0703786ea636098667d42903b8 \ + --hash=sha256:3e14dff6a262fdbf1a15e769ce635a8aea72e6f8f91e408f9a97166c53b91907 + # via macaroonbakery +pynacl==1.5.0 \ + --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ + --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \ + --hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \ + --hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \ + --hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \ + --hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \ + --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ + --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ + --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 + # via macaroonbakery + # via pymacaroons +pyparsing==3.1.2 \ + --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ + --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 + # via httplib2 +pyrfc3339==1.1 \ + --hash=sha256:67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4 \ + --hash=sha256:81b8cbe1519cdb79bed04910dd6fa4e181faf8c88dff1e1b987b5f7ab23a5b1a + # via macaroonbakery +pyright==1.1.366 \ + --hash=sha256:10e4d60be411f6d960cd39b0b58bf2ff76f2c83b9aeb102ffa9d9fda2e1303cb \ + --hash=sha256:c09e73ccc894976bcd6d6a5784aa84d724dbd9ceb7b873b39d475ca61c2de071 + # via charmcraft +pytest==8.3.2 \ + --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ + --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce + # via charmcraft + # via pytest-check + # via pytest-cov + # via pytest-mock + # via pytest-subprocess +pytest-check==2.3.1 \ + --hash=sha256:51b8f18a8ccaa426c5d913c4e0e46f014aaa7579481ea03d22d7e1f498f689b2 \ + --hash=sha256:c54c18f0b890cac1c610c78ef2bb3d8ecb29cf33d1cf09fc1166802d6ab88e28 + # via charmcraft +pytest-cov==5.0.0 \ + --hash=sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 \ + --hash=sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857 + # via charmcraft +pytest-mock==3.14.0 \ + --hash=sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f \ + --hash=sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0 + # via charmcraft +pytest-subprocess==1.5.2 \ + --hash=sha256:23ac7732aa8bd45f1757265b1316eb72a7f55b41fb21e2ca22e149ba3629fa46 \ + --hash=sha256:ad3ca8a35e798bf9c82d9f16d88700b30d98c5a28236117b86c5d6e581a8ed97 + # via charmcraft +python-apt==2.7.7+ubuntu1 ; sys_platform == 'linux' + # via charmcraft +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via charmcraft + # via freezegun +pytz==2024.1 \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 + # via pyrfc3339 +pywin32==306 ; sys_platform == 'win32' \ + --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ + --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \ + --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \ + --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \ + --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \ + --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \ + --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \ + --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \ + --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \ + --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \ + --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \ + --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \ + --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \ + --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0 + # via craft-cli + # via docker +pywin32-ctypes==0.2.2 ; sys_platform == 'win32' \ + --hash=sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60 \ + --hash=sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7 + # via keyring +pyxdg==0.28 \ + --hash=sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4 \ + --hash=sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab + # via craft-parts + # via craft-store +pyyaml==6.0.2 \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 + # via charmcraft + # via craft-application + # via craft-cli + # via craft-parts + # via craft-providers + # via responses + # via snap-helpers + # via yamllint +referencing==0.35.1 \ + --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ + --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + # via jsonschema + # via jsonschema-specifications +requests==2.31.0 \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 + # via charmcraft + # via craft-application + # via craft-parts + # via craft-providers + # via craft-store + # via docker + # via macaroonbakery + # via requests-toolbelt + # via requests-unixsocket + # via responses +requests-toolbelt==1.0.0 \ + --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 + # via charmcraft + # via craft-store +requests-unixsocket==0.3.0 \ + --hash=sha256:28304283ea9357d45fff58ad5b11e47708cfbf5806817aa59b2a363228ee971e \ + --hash=sha256:c685c680f0809e1b2955339b1e5afc3c0022b3066f4f7eb343f43a6065fc0e5d + # via charmcraft + # via craft-parts + # via craft-providers +responses==0.25.3 \ + --hash=sha256:521efcbc82081ab8daa588e08f7e8a64ce79b91c39f6e62199b19159bea7dbcb \ + --hash=sha256:617b9247abd9ae28313d57a75880422d55ec63c29d33d629697590a034358dba + # via charmcraft +rpds-py==0.20.0 \ + --hash=sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c \ + --hash=sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585 \ + --hash=sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5 \ + --hash=sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6 \ + --hash=sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef \ + --hash=sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2 \ + --hash=sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29 \ + --hash=sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 \ + --hash=sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b \ + --hash=sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399 \ + --hash=sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739 \ + --hash=sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee \ + --hash=sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174 \ + --hash=sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a \ + --hash=sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344 \ + --hash=sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2 \ + --hash=sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03 \ + --hash=sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5 \ + --hash=sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22 \ + --hash=sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e \ + --hash=sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96 \ + --hash=sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91 \ + --hash=sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752 \ + --hash=sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075 \ + --hash=sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253 \ + --hash=sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee \ + --hash=sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad \ + --hash=sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5 \ + --hash=sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce \ + --hash=sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7 \ + --hash=sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b \ + --hash=sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8 \ + --hash=sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57 \ + --hash=sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3 \ + --hash=sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec \ + --hash=sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 \ + --hash=sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921 \ + --hash=sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045 \ + --hash=sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074 \ + --hash=sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580 \ + --hash=sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7 \ + --hash=sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5 \ + --hash=sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3 \ + --hash=sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0 \ + --hash=sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24 \ + --hash=sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139 \ + --hash=sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db \ + --hash=sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc \ + --hash=sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789 \ + --hash=sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f \ + --hash=sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2 \ + --hash=sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c \ + --hash=sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232 \ + --hash=sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6 \ + --hash=sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c \ + --hash=sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29 \ + --hash=sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 \ + --hash=sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94 \ + --hash=sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751 \ + --hash=sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2 \ + --hash=sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda \ + --hash=sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9 \ + --hash=sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51 \ + --hash=sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c \ + --hash=sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8 \ + --hash=sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989 \ + --hash=sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511 \ + --hash=sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1 \ + --hash=sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2 \ + --hash=sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150 \ + --hash=sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c \ + --hash=sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965 \ + --hash=sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f \ + --hash=sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58 \ + --hash=sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b \ + --hash=sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f \ + --hash=sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d \ + --hash=sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821 \ + --hash=sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de \ + --hash=sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121 \ + --hash=sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855 \ + --hash=sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272 \ + --hash=sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60 \ + --hash=sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02 \ + --hash=sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1 \ + --hash=sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140 \ + --hash=sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879 \ + --hash=sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940 \ + --hash=sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364 \ + --hash=sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4 \ + --hash=sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e \ + --hash=sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420 \ + --hash=sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5 \ + --hash=sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24 \ + --hash=sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c \ + --hash=sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf \ + --hash=sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f \ + --hash=sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e \ + --hash=sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab \ + --hash=sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08 \ + --hash=sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92 \ + --hash=sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a \ + --hash=sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8 + # via jsonschema + # via referencing +ruamel-yaml==0.18.6 \ + --hash=sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 \ + --hash=sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b + # via pydantic-yaml +ruamel-yaml-clib==0.2.8 ; python_version < '3.13' and platform_python_implementation == 'CPython' \ + --hash=sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d \ + --hash=sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001 \ + --hash=sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462 \ + --hash=sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9 \ + --hash=sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe \ + --hash=sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b \ + --hash=sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b \ + --hash=sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615 \ + --hash=sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62 \ + --hash=sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15 \ + --hash=sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b \ + --hash=sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1 \ + --hash=sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9 \ + --hash=sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675 \ + --hash=sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899 \ + --hash=sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7 \ + --hash=sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7 \ + --hash=sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312 \ + --hash=sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa \ + --hash=sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91 \ + --hash=sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b \ + --hash=sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6 \ + --hash=sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3 \ + --hash=sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334 \ + --hash=sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5 \ + --hash=sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3 \ + --hash=sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe \ + --hash=sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c \ + --hash=sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed \ + --hash=sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337 \ + --hash=sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880 \ + --hash=sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f \ + --hash=sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d \ + --hash=sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248 \ + --hash=sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d \ + --hash=sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf \ + --hash=sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512 \ + --hash=sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069 \ + --hash=sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb \ + --hash=sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942 \ + --hash=sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d \ + --hash=sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31 \ + --hash=sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92 \ + --hash=sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5 \ + --hash=sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28 \ + --hash=sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d \ + --hash=sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1 \ + --hash=sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2 \ + --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ + --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 + # via ruamel-yaml +secretstorage==3.3.3 ; sys_platform == 'linux' \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring +setuptools==72.1.0 \ + --hash=sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1 \ + --hash=sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec + # via lazr-restfulclient + # via lazr-uri + # via pygit2 + # via wadllib +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via lazr-restfulclient + # via macaroonbakery + # via pymacaroons + # via python-dateutil +snap-helpers==0.4.2 \ + --hash=sha256:04d0ebd167c943849c99ec68b87829fef4a915cbe9b02d8afc3891d889327327 \ + --hash=sha256:ef3b8621e331bb71afe27e54ef742a7dd2edd9e8026afac285beb42109c8b9a9 + # via charmcraft + # via craft-application +snowballstemmer==2.2.0 \ + --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a + # via pydocstyle +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via hypothesis +tabulate==0.9.0 \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + # via charmcraft +tomli==2.0.1 ; python_full_version <= '3.11.0a6' or python_version < '3.11' \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via black + # via coverage + # via mypy + # via pytest +types-python-dateutil==2.9.0.20240316 \ + --hash=sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b + # via charmcraft +types-requests==2.31.0.6 \ + --hash=sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9 \ + --hash=sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0 + # via charmcraft +types-setuptools==71.1.0.20240806 \ + --hash=sha256:3bd8dd02039be0bb79ad880d8893b8eefcb022fabbeeb61245c61b20c9ab1ed0 \ + --hash=sha256:ae5e7b4d643ab9e99fc00ac00041804118cabe72a56183c30d524fb064897ad6 + # via charmcraft +types-tabulate==0.9.0.20240106 \ + --hash=sha256:0378b7b6fe0ccb4986299496d027a6d4c218298ecad67199bbd0e2d7e9d335a1 \ + --hash=sha256:c9b6db10dd7fcf55bd1712dd3537f86ddce72a08fd62bb1af4338c7096ce947e + # via charmcraft +types-urllib3==1.26.25.14 \ + --hash=sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f \ + --hash=sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e + # via charmcraft + # via types-requests +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 + # via black + # via craft-application + # via craft-platforms + # via mypy + # via pydantic + # via pydantic-core + # via pydantic-yaml +urllib3==1.26.19 \ + --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \ + --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429 + # via charmcraft + # via craft-parts + # via craft-providers + # via docker + # via requests + # via responses +wadllib==1.3.6 \ + --hash=sha256:acd9ad6a2c1007d34ca208e1da6341bbca1804c0e6850f954db04bdd7666c5fc + # via lazr-restfulclient +yamllint==1.35.1 \ + --hash=sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3 \ + --hash=sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd + # via charmcraft +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c + # via importlib-metadata diff --git a/requirements-dev.txt b/requirements-dev.txt index 42d99a0fe..935e540ee 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,56 +1,58 @@ +annotated-types==0.7.0 astroid==3.2.4 attrs==23.2.0 certifi==2024.7.4 cffi==1.16.0 charset-normalizer==3.3.2 -coverage==7.5.3 -craft-application==3.2.0 -craft-archives==1.2.0 +coverage==7.6.0 +craft-application==4.0.0 +craft-archives==2.0.0 craft-cli==2.6.0 -craft-grammar==1.2.0 -craft-parts==1.34.0 +craft-grammar==2.0.0 +craft-parts==2.0.0 craft-platforms==0.1.1 -craft-providers==1.25.0 -craft-store==2.6.2 -cryptography==42.0.8 +craft-providers==2.0.0 +craft-store==3.0.0 +cryptography==43.0.0 Deprecated==1.2.14 dill==0.3.8 distro==1.9.0 docker==7.1.0 -flake8==7.0.0 +flake8==7.1.0 freezegun==1.5.1 httplib2==0.22.0 -humanize==4.9.0 -hypothesis==6.100.5 +humanize==4.10.0 +hypothesis==6.108.5 idna==3.7 -importlib_metadata==7.1.0 +importlib_metadata==8.2.0 iniconfig==2.0.0 isort==5.13.2 jaraco.classes==3.4.0 jeepney==0.8.0 Jinja2==3.1.4 -jsonschema==4.22.0 +jsonschema==4.23.0 jsonschema-specifications==2023.12.1 keyring==24.3.1 -launchpadlib==1.11.0 +launchpadlib==2.0.0 lazr.restfulclient==0.14.6 lazr.uri==1.0.6 macaroonbakery==1.3.4 MarkupSafe==2.1.5 mccabe==0.7.0 -more-itertools==10.2.0 +more-itertools==10.3.0 oauthlib==3.2.2 overrides==7.7.0 -packaging==24.0 +packaging==24.1 platformdirs==4.2.2 pluggy==1.5.0 -protobuf==5.26.1 -pycodestyle==2.11.1 +protobuf==5.27.3 +pycodestyle==2.12.0 pycparser==2.22 -pydantic==1.10.15 -pydantic-yaml==0.11.2 +pydantic==2.8.2 +pydantic_core==2.20.1 +pydantic_yaml==1.3.0 pydocstyle==6.3.0 -pyfakefs==5.4.1 +pyfakefs==5.6.0 pyflakes==3.2.0 pygit2==1.14.1 pylint==3.2.6 @@ -58,11 +60,11 @@ pymacaroons==0.13.0 PyNaCl==1.5.0 pyparsing==3.1.2 pyRFC3339==1.1 -pytest==8.2.0 +pytest==8.3.2 pytest-check==2.3.1 pytest-cov==5.0.0 pytest-mock==3.14.0 -pytest-subprocess==1.5.0 +pytest-subprocess==1.5.2 python-dateutil==2.9.0.post0 pytz==2024.1 pyxdg==0.28 @@ -71,10 +73,12 @@ referencing==0.35.1 requests==2.31.0 requests-toolbelt==1.0.0 requests-unixsocket==0.3.0 -responses==0.25.0 -rpds-py==0.18.1 +responses==0.25.3 +rpds-py==0.19.1 +ruamel.yaml==0.18.6 +ruamel.yaml.clib==0.2.8 SecretStorage==3.3.3 -setuptools==70.0.0 +setuptools==72.1.0 six==1.16.0 snap-helpers==0.4.2 snowballstemmer==2.2.0 @@ -83,8 +87,7 @@ tabulate==0.9.0 tomlkit==0.13.0 types-Deprecated==1.2.9.20240311 types-PyYAML==6.0.12.20240311 -typing_extensions==4.11.0 -urllib3==1.26.18 +typing_extensions==4.12.2 +urllib3==1.26.19 wadllib==1.3.6 -wrapt==1.16.0 -zipp==3.19.1 +zipp==3.19.2 diff --git a/requirements-jammy.txt b/requirements-jammy.txt index de56fc318..6f5010229 100644 --- a/requirements-jammy.txt +++ b/requirements-jammy.txt @@ -1 +1 @@ -python-apt@https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu3/python-apt_2.4.0ubuntu3.tar.xz; sys_platform == "linux" +python-apt @ https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/python-apt/2.4.0ubuntu3/python-apt_2.4.0ubuntu3.tar.xz ; sys_platform == "linux" diff --git a/requirements.lock b/requirements.lock new file mode 100644 index 000000000..a8912be4b --- /dev/null +++ b/requirements.lock @@ -0,0 +1,931 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: ["apt"] +# all-features: false +# with-sources: false +# generate-hashes: true +# universal: true + +-e file:. +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via craft-platforms + # via pydantic +attrs==24.2.0 \ + --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ + --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 + # via jsonschema + # via referencing +boolean-py==4.0 \ + --hash=sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4 \ + --hash=sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd + # via license-expression +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 + # via requests +cffi==1.17.0 \ + --hash=sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f \ + --hash=sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab \ + --hash=sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499 \ + --hash=sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058 \ + --hash=sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693 \ + --hash=sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb \ + --hash=sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377 \ + --hash=sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885 \ + --hash=sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2 \ + --hash=sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401 \ + --hash=sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4 \ + --hash=sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b \ + --hash=sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59 \ + --hash=sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f \ + --hash=sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c \ + --hash=sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555 \ + --hash=sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa \ + --hash=sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424 \ + --hash=sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb \ + --hash=sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2 \ + --hash=sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8 \ + --hash=sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e \ + --hash=sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9 \ + --hash=sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82 \ + --hash=sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828 \ + --hash=sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759 \ + --hash=sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc \ + --hash=sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118 \ + --hash=sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf \ + --hash=sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932 \ + --hash=sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a \ + --hash=sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29 \ + --hash=sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206 \ + --hash=sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2 \ + --hash=sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c \ + --hash=sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c \ + --hash=sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0 \ + --hash=sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a \ + --hash=sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195 \ + --hash=sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6 \ + --hash=sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9 \ + --hash=sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc \ + --hash=sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb \ + --hash=sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0 \ + --hash=sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7 \ + --hash=sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb \ + --hash=sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a \ + --hash=sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492 \ + --hash=sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720 \ + --hash=sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42 \ + --hash=sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7 \ + --hash=sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d \ + --hash=sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d \ + --hash=sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb \ + --hash=sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4 \ + --hash=sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2 \ + --hash=sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b \ + --hash=sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8 \ + --hash=sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e \ + --hash=sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204 \ + --hash=sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3 \ + --hash=sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150 \ + --hash=sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4 \ + --hash=sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76 \ + --hash=sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e \ + --hash=sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb \ + --hash=sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91 + # via cryptography + # via pygit2 + # via pynacl +charset-normalizer==3.3.2 \ + --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ + --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ + --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ + --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ + --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ + --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ + --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ + --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ + --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ + --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ + --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ + --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ + --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ + --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ + --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ + --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ + --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ + --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ + --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ + --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ + --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ + --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ + --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ + --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ + --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ + --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ + --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ + --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ + --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ + --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ + --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ + --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ + --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ + --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ + --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ + --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ + --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ + --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ + --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ + --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ + --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ + --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ + --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ + --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ + --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ + --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ + --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ + --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ + --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ + --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ + --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ + --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ + --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ + --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ + --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ + --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ + --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ + --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ + --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ + --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ + --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ + --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ + --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ + --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ + --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ + --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ + --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ + --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ + --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ + --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ + --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ + --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ + --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ + --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ + --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ + --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ + --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ + --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ + --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ + --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ + --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ + --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ + --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ + --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ + --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ + --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ + --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ + --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ + --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 + # via requests +craft-application==4.0.0 \ + --hash=sha256:0ea7ae7c467f15a4bde3cc2840a96a5df9576dd2e86b5ca5b869ddf3bea440a5 \ + --hash=sha256:ea8e38e3393c05e20868bac80e817478f87d8f809aa6e5bbae1a8f98a74d67a8 + # via charmcraft +craft-archives==2.0.0 \ + --hash=sha256:3e0c8593ea0f77d32b115599fa29836fbd7a1df17e3c861739a39c80ab6363e2 \ + --hash=sha256:f0f69d4ee67dbeae3213036879510c5767205a67f0df33af8bc4b3dabc4e6e09 + # via craft-application +craft-cli==2.6.0 \ + --hash=sha256:138453abad5207ca872369496ffc7731a4124d6d36aed523c6f2f7f73924e814 \ + --hash=sha256:48208b40cad0800a633519a5c45e70c1b4801d296450d8f7cc01d1f5d548d972 + # via charmcraft + # via craft-application +craft-grammar==2.0.0 \ + --hash=sha256:3dd8c44aad6d36f4e06a56e6466903cc6996085d77901e7f895dd8da36f33cac \ + --hash=sha256:7b086496bd020e439f196cc688cdc7d847310cbfbdde06251bc5af34c9628865 + # via charmcraft + # via craft-application +craft-parts==2.0.0 \ + --hash=sha256:2c547f2b2fc9a0df8d9be7cca36506434f15df0856f9ea121b5a40061173338a \ + --hash=sha256:aa09b904c26baa0b2db2be97463a48eae091cf84500f04ff5574b55c6292d58f + # via charmcraft + # via craft-application +craft-platforms==0.1.1 \ + --hash=sha256:183d2df56bbe10225d97c6fac3e6644752233dcf5b2d010b00a5b126b8153361 \ + --hash=sha256:462da03aac2fadb656dbdeb4207de44a2208dcfbb9977f1433d59e59d6b74f42 + # via charmcraft +craft-providers==2.0.0 \ + --hash=sha256:55e9a97dbaabbad01111bbbc57c4e4cbc19a1e79127fcb559118ae7dd129e342 \ + --hash=sha256:6b49e22e5b6ee80de7d39cd4666077fab47cbed06d8fc6f3fe379d6e388f0105 + # via charmcraft + # via craft-application +craft-store==3.0.0 \ + --hash=sha256:0a0d63e5e1b36f65383aa6191b10f43ba094d3dce757c830ce162d64e6b5fe9c \ + --hash=sha256:f3644b1df09dccb26d5250fdbd91b3618abeede3958fa185c54fa6b5462863b3 + # via charmcraft +cryptography==43.0.0 ; sys_platform == 'linux' \ + --hash=sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709 \ + --hash=sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069 \ + --hash=sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2 \ + --hash=sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b \ + --hash=sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e \ + --hash=sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70 \ + --hash=sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778 \ + --hash=sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22 \ + --hash=sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895 \ + --hash=sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf \ + --hash=sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431 \ + --hash=sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f \ + --hash=sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947 \ + --hash=sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74 \ + --hash=sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc \ + --hash=sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66 \ + --hash=sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66 \ + --hash=sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf \ + --hash=sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f \ + --hash=sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5 \ + --hash=sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e \ + --hash=sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f \ + --hash=sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55 \ + --hash=sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1 \ + --hash=sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47 \ + --hash=sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5 \ + --hash=sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0 + # via secretstorage +distro==1.9.0 \ + --hash=sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 + # via charmcraft + # via craft-archives + # via craft-platforms + # via lazr-restfulclient +docker==7.1.0 \ + --hash=sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c \ + --hash=sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0 + # via charmcraft +httplib2==0.22.0 \ + --hash=sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc \ + --hash=sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81 + # via launchpadlib + # via lazr-restfulclient +humanize==4.10.0 \ + --hash=sha256:06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978 \ + --hash=sha256:39e7ccb96923e732b5c2e27aeaa3b10a8dfeeba3eb965ba7b74a3eb0e30040a6 + # via charmcraft +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 + # via requests +importlib-metadata==8.2.0 \ + --hash=sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369 \ + --hash=sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d + # via keyring + # via pydantic-yaml +jaraco-classes==3.4.0 \ + --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 + # via keyring +jeepney==0.8.0 ; sys_platform == 'linux' \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via keyring + # via secretstorage +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d + # via charmcraft +jsonschema==4.23.0 \ + --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + # via charmcraft +jsonschema-specifications==2023.12.1 \ + --hash=sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc \ + --hash=sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c + # via jsonschema +keyring==24.3.1 \ + --hash=sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db \ + --hash=sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218 + # via craft-store +launchpadlib==2.0.0 \ + --hash=sha256:5d4a9095e91773a7565d4c159594ae30eca792fd5f9b89ded459d711484a96cb \ + --hash=sha256:bd158ec67e6a3e37d16aeb06b4dca4ef0da7ff1b684c51c896b03feef9aab875 + # via craft-archives +lazr-restfulclient==0.14.6 \ + --hash=sha256:43f12a1d3948463b1462038c47b429dcb5e42e0ba7f2e16511b02ba5d2adffdb \ + --hash=sha256:97e95b1d8f0ec7fed998b48aea773baf8dcab06cf78a4deb9a046af5cca0cea2 + # via craft-archives + # via launchpadlib +lazr-uri==1.0.6 \ + --hash=sha256:5026853fcbf6f91d5a6b11ea7860a641fe27b36d4172c731f4aa16b900cf8464 + # via craft-archives + # via launchpadlib + # via wadllib +license-expression==30.3.0 \ + --hash=sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5 \ + --hash=sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41 + # via craft-application +macaroonbakery==1.3.4 \ + --hash=sha256:1e952a189f5c1e96ef82b081b2852c770d7daa20987e2088e762dd5689fb253b \ + --hash=sha256:41ca993a23e4f8ef2fe7723b5cd4a30c759735f1d5021e990770c8a0e0f33970 + # via craft-store +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 + # via jinja2 +more-itertools==10.4.0 \ + --hash=sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27 \ + --hash=sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923 + # via jaraco-classes +oauthlib==3.2.2 \ + --hash=sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca \ + --hash=sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918 + # via lazr-restfulclient +overrides==7.7.0 \ + --hash=sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 + # via craft-archives + # via craft-grammar + # via craft-parts + # via craft-store +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 + # via craft-providers +platformdirs==4.2.2 \ + --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ + --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 + # via craft-application + # via craft-cli +protobuf==5.27.3 \ + --hash=sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035 \ + --hash=sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7 \ + --hash=sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f \ + --hash=sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c \ + --hash=sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5 \ + --hash=sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25 \ + --hash=sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1 \ + --hash=sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce \ + --hash=sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e \ + --hash=sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf \ + --hash=sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b + # via macaroonbakery +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc + # via cffi +pydantic==2.8.2 \ + --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ + --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 + # via charmcraft + # via craft-application + # via craft-archives + # via craft-grammar + # via craft-parts + # via craft-providers + # via craft-store + # via pydantic-yaml +pydantic-core==2.20.1 \ + --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ + --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ + --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ + --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ + --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ + --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ + --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ + --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ + --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ + --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ + --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ + --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ + --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ + --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ + --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ + --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ + --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ + --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ + --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ + --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ + --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ + --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ + --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ + --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ + --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ + --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ + --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ + --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ + --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ + --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ + --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ + --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ + --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ + --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ + --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ + --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ + --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ + --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ + --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ + --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ + --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ + --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ + --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ + --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ + --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ + --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ + --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ + --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ + --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ + --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ + --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ + --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ + --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ + --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ + --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ + --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ + --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ + --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ + --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ + --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ + --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ + --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ + --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ + --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ + --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ + --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ + --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ + --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ + --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ + --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ + --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ + --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ + --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ + --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ + --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ + --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ + --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ + --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ + --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ + --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ + --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ + --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ + --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ + --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ + --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ + --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ + --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ + --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ + --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 + # via pydantic +pydantic-yaml==1.3.0 \ + --hash=sha256:0684255a860522c9226d4eff5c0e8ba44339683b5c5fa79fac4470c0e3821911 \ + --hash=sha256:5671c9ef1731570aa2644432ae1e2dd34c406bd4a0a393df622f6b897a88df83 + # via craft-parts +pygit2==1.14.1 \ + --hash=sha256:0fff3d1aaf1d7372757888c4620347d6ad8b1b3a637b30a3abd156da7cf9476b \ + --hash=sha256:11058be23a5d6c1308303fd450d690eada117c564154634d81676e66530056be \ + --hash=sha256:141a1b37fc431d98b3de2f4651eab8b1b1b038cd50de42bfd1c8de057ec2284e \ + --hash=sha256:15db91695259f672f8be3080eb943889f7c8bdc5fbd8b89555e0c53ba2481f15 \ + --hash=sha256:230493d43945e10365070d349da206d39cc885ae8c52fdeca93942f36661dd93 \ + --hash=sha256:404d3d9bac22ff022157de3fbfd8997c108d86814ba88cbc8709c1c2daef833a \ + --hash=sha256:46ae2149851d5da2934e27c9ac45c375d04af1e549f8c4cbb4e9e4de5f43dc42 \ + --hash=sha256:67b6e5911101dc5ecb679bf241c0b9ee2099f4d76aa0ad66b326400cb4590afa \ + --hash=sha256:760614370fcce4e9606ff675d6fc11165badb59aaedc2ea6cb2e7ec1855616c2 \ + --hash=sha256:793f49ce66640d41d977e1337ddb5dec9b3b4ff818040d78d3ded052e1ea52e6 \ + --hash=sha256:7b6d1202d6a0c21281d2697321292aff9e2e2e195d6ce553efcdf86c2de2af1a \ + --hash=sha256:8589c8c0005b5ba373b3b101f903d4451338f3dfc09f8a38c76da6584fef84d0 \ + --hash=sha256:9d96e46b94dc706e6316e6cc293c0a0692e5b0811a6f8f2738728a4a68d7a827 \ + --hash=sha256:a03de11ba5205628996d867280e5181605009c966c801dbb94781bed55b740d7 \ + --hash=sha256:acb849cea89438192e78eea91a27fb9c54c7286a82aac65a3f746ea8c498fedb \ + --hash=sha256:acc7be8a439274fc6227e33b63b9ec83cd51fa210ab898eaadffb7bf930c0087 \ + --hash=sha256:bc3326a5ce891ef26429ae6d4290acb80ea0064947b4184a4c4940b4bd6ab4a3 \ + --hash=sha256:c22027f748d125698964ed696406075dac85f114e01d50547e67053c1bb03308 \ + --hash=sha256:e4f371c4b7ee86c0a751209fac7c941d1f6a3aca6af89ac09481469dbe0ea1cc \ + --hash=sha256:ea505739af41496b1d36c99bc15e2bd5631880059514458977c8931e27063a8d \ + --hash=sha256:ec5958571b82a6351785ca645e5394c31ae45eec5384b2fa9c4e05dde3597ad6 \ + --hash=sha256:ed16f2bc8ca9c42af8adb967c73227b1de973e9c4d717bd738fb2f177890ca2c \ + --hash=sha256:f2378f9a70cea27809a2c78b823e22659691a91db9d81b1f3a58d537067815ac \ + --hash=sha256:f35152b96a31ab705cdd63aef08fb199d6c1e87fc6fd45b1945f8cd040a43b7b \ + --hash=sha256:f5a87744e6c36f03fe488b975c73d3eaef22eadce433152516a2b8dbc4015233 + # via craft-application +pymacaroons==0.13.0 \ + --hash=sha256:1e6bba42a5f66c245adf38a5a4006a99dcc06a0703786ea636098667d42903b8 \ + --hash=sha256:3e14dff6a262fdbf1a15e769ce635a8aea72e6f8f91e408f9a97166c53b91907 + # via macaroonbakery +pynacl==1.5.0 \ + --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ + --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \ + --hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \ + --hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \ + --hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \ + --hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \ + --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ + --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ + --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 + # via macaroonbakery + # via pymacaroons +pyparsing==3.1.2 \ + --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ + --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 + # via httplib2 +pyrfc3339==1.1 \ + --hash=sha256:67196cb83b470709c580bb4738b83165e67c6cc60e1f2e4f286cfcb402a926f4 \ + --hash=sha256:81b8cbe1519cdb79bed04910dd6fa4e181faf8c88dff1e1b987b5f7ab23a5b1a + # via macaroonbakery +python-apt==2.7.7+ubuntu1 ; sys_platform == 'linux' + # via charmcraft +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via charmcraft +pytz==2024.1 \ + --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \ + --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319 + # via pyrfc3339 +pywin32==306 ; sys_platform == 'win32' \ + --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \ + --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \ + --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \ + --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \ + --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \ + --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \ + --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \ + --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \ + --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \ + --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \ + --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \ + --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \ + --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \ + --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0 + # via craft-cli + # via docker +pywin32-ctypes==0.2.2 ; sys_platform == 'win32' \ + --hash=sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60 \ + --hash=sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7 + # via keyring +pyxdg==0.28 \ + --hash=sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4 \ + --hash=sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab + # via craft-parts + # via craft-store +pyyaml==6.0.2 \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 + # via charmcraft + # via craft-application + # via craft-cli + # via craft-parts + # via craft-providers + # via snap-helpers +referencing==0.35.1 \ + --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ + --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + # via jsonschema + # via jsonschema-specifications +requests==2.31.0 \ + --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ + --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 + # via charmcraft + # via craft-application + # via craft-parts + # via craft-providers + # via craft-store + # via docker + # via macaroonbakery + # via requests-toolbelt + # via requests-unixsocket +requests-toolbelt==1.0.0 \ + --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 + # via charmcraft + # via craft-store +requests-unixsocket==0.3.0 \ + --hash=sha256:28304283ea9357d45fff58ad5b11e47708cfbf5806817aa59b2a363228ee971e \ + --hash=sha256:c685c680f0809e1b2955339b1e5afc3c0022b3066f4f7eb343f43a6065fc0e5d + # via charmcraft + # via craft-parts + # via craft-providers +rpds-py==0.20.0 \ + --hash=sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c \ + --hash=sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585 \ + --hash=sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5 \ + --hash=sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6 \ + --hash=sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef \ + --hash=sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2 \ + --hash=sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29 \ + --hash=sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 \ + --hash=sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b \ + --hash=sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399 \ + --hash=sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739 \ + --hash=sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee \ + --hash=sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174 \ + --hash=sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a \ + --hash=sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344 \ + --hash=sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2 \ + --hash=sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03 \ + --hash=sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5 \ + --hash=sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22 \ + --hash=sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e \ + --hash=sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96 \ + --hash=sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91 \ + --hash=sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752 \ + --hash=sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075 \ + --hash=sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253 \ + --hash=sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee \ + --hash=sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad \ + --hash=sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5 \ + --hash=sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce \ + --hash=sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7 \ + --hash=sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b \ + --hash=sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8 \ + --hash=sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57 \ + --hash=sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3 \ + --hash=sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec \ + --hash=sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 \ + --hash=sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921 \ + --hash=sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045 \ + --hash=sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074 \ + --hash=sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580 \ + --hash=sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7 \ + --hash=sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5 \ + --hash=sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3 \ + --hash=sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0 \ + --hash=sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24 \ + --hash=sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139 \ + --hash=sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db \ + --hash=sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc \ + --hash=sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789 \ + --hash=sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f \ + --hash=sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2 \ + --hash=sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c \ + --hash=sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232 \ + --hash=sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6 \ + --hash=sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c \ + --hash=sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29 \ + --hash=sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 \ + --hash=sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94 \ + --hash=sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751 \ + --hash=sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2 \ + --hash=sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda \ + --hash=sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9 \ + --hash=sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51 \ + --hash=sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c \ + --hash=sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8 \ + --hash=sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989 \ + --hash=sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511 \ + --hash=sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1 \ + --hash=sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2 \ + --hash=sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150 \ + --hash=sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c \ + --hash=sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965 \ + --hash=sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f \ + --hash=sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58 \ + --hash=sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b \ + --hash=sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f \ + --hash=sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d \ + --hash=sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821 \ + --hash=sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de \ + --hash=sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121 \ + --hash=sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855 \ + --hash=sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272 \ + --hash=sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60 \ + --hash=sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02 \ + --hash=sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1 \ + --hash=sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140 \ + --hash=sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879 \ + --hash=sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940 \ + --hash=sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364 \ + --hash=sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4 \ + --hash=sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e \ + --hash=sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420 \ + --hash=sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5 \ + --hash=sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24 \ + --hash=sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c \ + --hash=sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf \ + --hash=sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f \ + --hash=sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e \ + --hash=sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab \ + --hash=sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08 \ + --hash=sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92 \ + --hash=sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a \ + --hash=sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8 + # via jsonschema + # via referencing +ruamel-yaml==0.18.6 \ + --hash=sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636 \ + --hash=sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b + # via pydantic-yaml +ruamel-yaml-clib==0.2.8 ; python_version < '3.13' and platform_python_implementation == 'CPython' \ + --hash=sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d \ + --hash=sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001 \ + --hash=sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462 \ + --hash=sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9 \ + --hash=sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe \ + --hash=sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b \ + --hash=sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b \ + --hash=sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615 \ + --hash=sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62 \ + --hash=sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15 \ + --hash=sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b \ + --hash=sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1 \ + --hash=sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9 \ + --hash=sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675 \ + --hash=sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899 \ + --hash=sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7 \ + --hash=sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7 \ + --hash=sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312 \ + --hash=sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa \ + --hash=sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91 \ + --hash=sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b \ + --hash=sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6 \ + --hash=sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3 \ + --hash=sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334 \ + --hash=sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5 \ + --hash=sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3 \ + --hash=sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe \ + --hash=sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c \ + --hash=sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed \ + --hash=sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337 \ + --hash=sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880 \ + --hash=sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f \ + --hash=sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d \ + --hash=sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248 \ + --hash=sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d \ + --hash=sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf \ + --hash=sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512 \ + --hash=sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069 \ + --hash=sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb \ + --hash=sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942 \ + --hash=sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d \ + --hash=sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31 \ + --hash=sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92 \ + --hash=sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5 \ + --hash=sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28 \ + --hash=sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d \ + --hash=sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1 \ + --hash=sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2 \ + --hash=sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875 \ + --hash=sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412 + # via ruamel-yaml +secretstorage==3.3.3 ; sys_platform == 'linux' \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring +setuptools==72.1.0 \ + --hash=sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1 \ + --hash=sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec + # via lazr-restfulclient + # via lazr-uri + # via pygit2 + # via wadllib +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via lazr-restfulclient + # via macaroonbakery + # via pymacaroons + # via python-dateutil +snap-helpers==0.4.2 \ + --hash=sha256:04d0ebd167c943849c99ec68b87829fef4a915cbe9b02d8afc3891d889327327 \ + --hash=sha256:ef3b8621e331bb71afe27e54ef742a7dd2edd9e8026afac285beb42109c8b9a9 + # via charmcraft + # via craft-application +tabulate==0.9.0 \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + # via charmcraft +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 + # via craft-application + # via craft-platforms + # via pydantic + # via pydantic-core + # via pydantic-yaml +urllib3==1.26.19 \ + --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \ + --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429 + # via charmcraft + # via craft-parts + # via craft-providers + # via docker + # via requests +wadllib==1.3.6 \ + --hash=sha256:acd9ad6a2c1007d34ca208e1da6341bbca1804c0e6850f954db04bdd7666c5fc + # via lazr-restfulclient +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c + # via importlib-metadata diff --git a/requirements.txt b/requirements.txt index 1db0f0a9b..cd0f697ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,43 +1,44 @@ +annotated-types==0.7.0 attrs==23.2.0 certifi==2024.7.4 cffi==1.16.0 charset-normalizer==3.3.2 -craft-application==3.2.0 -craft-archives==1.2.0 +craft-application==4.0.0 +craft-archives==2.0.0 craft-cli==2.6.0 -craft-grammar==1.2.0 -craft-parts==1.34.0 +craft-grammar==2.0.0 +craft-parts==2.0.0 craft-platforms==0.1.1 -craft-providers==1.25.0 -craft-store==2.6.2 -cryptography==42.0.8 -Deprecated==1.2.14 +craft-providers==2.0.0 +craft-store==3.0.0 +cryptography==43.0.0 distro==1.9.0 docker==7.1.0 httplib2==0.22.0 -humanize==4.9.0 +humanize==4.10.0 idna==3.7 -importlib_metadata==7.1.0 +importlib_metadata==8.2.0 jaraco.classes==3.4.0 jeepney==0.8.0 Jinja2==3.1.4 -jsonschema==4.22.0 +jsonschema==4.23.0 jsonschema-specifications==2023.12.1 keyring==24.3.1 -launchpadlib==1.11.0 +launchpadlib==2.0.0 lazr.restfulclient==0.14.6 lazr.uri==1.0.6 macaroonbakery==1.3.4 MarkupSafe==2.1.5 -more-itertools==10.2.0 +more-itertools==10.3.0 oauthlib==3.2.2 overrides==7.7.0 -packaging==24.0 +packaging==24.1 platformdirs==4.2.2 -protobuf==5.26.1 +protobuf==5.27.3 pycparser==2.22 -pydantic==1.10.15 -pydantic-yaml==0.11.2 +pydantic==2.8.2 +pydantic_core==2.20.1 +pydantic_yaml==1.3.0 pygit2==1.14.1 pymacaroons==0.13.0 PyNaCl==1.5.0 @@ -51,16 +52,15 @@ referencing==0.35.1 requests==2.31.0 requests-toolbelt==1.0.0 requests-unixsocket==0.3.0 -rpds-py==0.18.1 +rpds-py==0.19.1 +ruamel.yaml==0.18.6 +ruamel.yaml.clib==0.2.8 SecretStorage==3.3.3 -setuptools==70.0.0 +setuptools==72.1.0 six==1.16.0 snap-helpers==0.4.2 tabulate==0.9.0 -types-Deprecated==1.2.9.20240311 -types-PyYAML==6.0.12.20240311 -typing_extensions==4.11.0 -urllib3==1.26.18 +typing_extensions==4.12.2 +urllib3==1.26.19 wadllib==1.3.6 -wrapt==1.16.0 -zipp==3.19.1 +zipp==3.19.2 diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 2fcc542f7..6edca969a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,4 +1,4 @@ -# Copyright 2020-2023 Canonical Ltd. +# Copyright 2020-2024 Canonical Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -71,8 +71,6 @@ apps: confinement: classic build-packages: - - cargo - - rustc - pkg-config - python3.10-dev - libpython3.10-dev @@ -88,6 +86,8 @@ build-packages: - libxml2-dev - libxslt1-dev - libyaml-dev +build-snaps: + - rustup parts: @@ -145,6 +145,8 @@ parts: craftctl set version="${version}" [ -n "$(echo $version | grep "post")" ] && grade=devel || grade=stable craftctl set grade="${grade}" + # Set up the rust compiler + rustup default 1.79 override-build: | craftctl default cp -v completion.bash ../install diff --git a/tests/conftest.py b/tests/conftest.py index bc5160b69..3cd1591a7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -33,9 +33,8 @@ from craft_providers import bases import charmcraft.parts -from charmcraft import const, instrum, parts, services, store +from charmcraft import const, env, instrum, parts, services, store from charmcraft.application.main import APP_METADATA -from charmcraft.models import charmcraft as config_module from charmcraft.models import project @@ -165,14 +164,12 @@ def setup_parts(): @pytest.fixture() -def charmhub_config() -> config_module.CharmhubConfig: +def charmhub_config() -> env.CharmhubConfig: """Provide a charmhub config for use in tests""" - return config_module.CharmhubConfig.parse_obj( - { - "api-url": "https://api.staging.charmhub.io", - "storage-url": "https://storage.staging.snapcraftcontent.com", - "registry-url": "https://registry.staging.jujucharms.com", - } + return env.CharmhubConfig( + api_url="https://api.staging.charmhub.io", + storage_url="https://storage.staging.snapcraftcontent.com", + registry_url="https://registry.staging.jujucharms.com", ) diff --git a/tests/integration/commands/test_expand_extensions.py b/tests/integration/commands/test_expand_extensions.py index fe40bd380..4fbf54d04 100644 --- a/tests/integration/commands/test_expand_extensions.py +++ b/tests/integration/commands/test_expand_extensions.py @@ -13,6 +13,7 @@ # limitations under the License. # # For further info, check https://github.com/canonical/charmcraft +import platform import sys from textwrap import dedent from typing import Any @@ -41,6 +42,10 @@ def fake_extensions(stub_extensions): extensions.register(TestExtension.name, TestExtension) +@pytest.mark.xfail( + platform.system() == "Windows" and sys.version_info < (3, 11), + reason="'os' module doesn't have EX_OK on Windows until 3.11", +) @pytest.mark.parametrize( ("charmcraft_yaml", "expected"), [ diff --git a/tests/integration/sample-charms/actions-included/expected.yaml b/tests/integration/sample-charms/actions-included/expected.yaml index 19807f807..227757695 100644 --- a/tests/integration/sample-charms/actions-included/expected.yaml +++ b/tests/integration/sample-charms/actions-included/expected.yaml @@ -11,13 +11,8 @@ platforms: - amd64 parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm actions: pause: diff --git a/tests/integration/sample-charms/actions-separate/expected.yaml b/tests/integration/sample-charms/actions-separate/expected.yaml index 19807f807..227757695 100644 --- a/tests/integration/sample-charms/actions-separate/expected.yaml +++ b/tests/integration/sample-charms/actions-separate/expected.yaml @@ -11,13 +11,8 @@ platforms: - amd64 parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm actions: pause: diff --git a/tests/integration/sample-charms/basic-bases/expected.yaml b/tests/integration/sample-charms/basic-bases/expected.yaml index a7f02d3d6..99a5276d2 100644 --- a/tests/integration/sample-charms/basic-bases/expected.yaml +++ b/tests/integration/sample-charms/basic-bases/expected.yaml @@ -4,13 +4,8 @@ description: | A description for an example charm with bases. parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm bases: - build-on: diff --git a/tests/integration/sample-charms/basic-platforms/expected.yaml b/tests/integration/sample-charms/basic-platforms/expected.yaml index 3d2bdb7b7..e2a2c6414 100644 --- a/tests/integration/sample-charms/basic-platforms/expected.yaml +++ b/tests/integration/sample-charms/basic-platforms/expected.yaml @@ -11,11 +11,6 @@ platforms: - amd64 parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm diff --git a/tests/integration/sample-charms/config-included/expected.yaml b/tests/integration/sample-charms/config-included/expected.yaml index e662c017a..b6b4f991f 100644 --- a/tests/integration/sample-charms/config-included/expected.yaml +++ b/tests/integration/sample-charms/config-included/expected.yaml @@ -11,13 +11,8 @@ platforms: - amd64 parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm config: options: diff --git a/tests/integration/sample-charms/config-separate/expected.yaml b/tests/integration/sample-charms/config-separate/expected.yaml index e662c017a..b6b4f991f 100644 --- a/tests/integration/sample-charms/config-separate/expected.yaml +++ b/tests/integration/sample-charms/config-separate/expected.yaml @@ -11,13 +11,8 @@ platforms: - amd64 parts: charm: - source: . - charm-entrypoint: src/charm.py - charm-binary-python-packages: [] - charm-python-packages: [] - charm-requirements: [] - charm-strict-dependencies: false plugin: charm + source: . type: charm config: options: diff --git a/tests/integration/services/sample_projects/basic-reactive/prime/manifest.yaml b/tests/integration/services/sample_projects/basic-reactive/prime/manifest.yaml index cc074556f..5a5c6f944 100644 --- a/tests/integration/services/sample_projects/basic-reactive/prime/manifest.yaml +++ b/tests/integration/services/sample_projects/basic-reactive/prime/manifest.yaml @@ -1,5 +1,5 @@ charmcraft-version: 3.0-test-version -charmcraft-started-at: '2020-03-14T00:00:00' +charmcraft-started-at: '2020-03-14T00:00:00+00:00' bases: - name: ubuntu channel: '22.04' diff --git a/tests/integration/services/sample_projects/basic/prime/manifest.yaml b/tests/integration/services/sample_projects/basic/prime/manifest.yaml index cc074556f..5a5c6f944 100644 --- a/tests/integration/services/sample_projects/basic/prime/manifest.yaml +++ b/tests/integration/services/sample_projects/basic/prime/manifest.yaml @@ -1,5 +1,5 @@ charmcraft-version: 3.0-test-version -charmcraft-started-at: '2020-03-14T00:00:00' +charmcraft-started-at: '2020-03-14T00:00:00+00:00' bases: - name: ubuntu channel: '22.04' diff --git a/tests/integration/services/sample_projects/complex-legacy/prime/manifest.yaml b/tests/integration/services/sample_projects/complex-legacy/prime/manifest.yaml index c6d9192db..75a832163 100644 --- a/tests/integration/services/sample_projects/complex-legacy/prime/manifest.yaml +++ b/tests/integration/services/sample_projects/complex-legacy/prime/manifest.yaml @@ -1,5 +1,5 @@ charmcraft-version: 3.0-test-version -charmcraft-started-at: '2020-03-14T00:00:00' +charmcraft-started-at: '2020-03-14T00:00:00+00:00' bases: - name: ubuntu channel: '22.04' diff --git a/tests/integration/services/sample_projects/complex-self-contained/prime/manifest.yaml b/tests/integration/services/sample_projects/complex-self-contained/prime/manifest.yaml index a4cb0bb56..88d06861e 100644 --- a/tests/integration/services/sample_projects/complex-self-contained/prime/manifest.yaml +++ b/tests/integration/services/sample_projects/complex-self-contained/prime/manifest.yaml @@ -1,5 +1,5 @@ charmcraft-version: 3.0-test-version -charmcraft-started-at: '2020-03-14T00:00:00' +charmcraft-started-at: '2020-03-14T00:00:00+00:00' bases: - name: ubuntu channel: '22.04' diff --git a/tests/integration/services/test_package.py b/tests/integration/services/test_package.py index 9e261e852..6035e315e 100644 --- a/tests/integration/services/test_package.py +++ b/tests/integration/services/test_package.py @@ -58,7 +58,7 @@ def test_write_metadata(monkeypatch, fs, package_service, project_path): expected_prime_dir = project_path / "prime" project = models.CharmcraftProject.from_yaml_file(project_path / "project" / "charmcraft.yaml") - project._started_at = datetime.datetime.utcnow() + project._started_at = datetime.datetime.now(tz=datetime.timezone.utc) package_service._project = project package_service.write_metadata(test_prime_dir) @@ -88,7 +88,7 @@ def test_overwrite_metadata(monkeypatch, fs, package_service, project_path): expected_prime_dir = project_path / "prime" project = models.CharmcraftProject.from_yaml_file(project_path / "project" / "charmcraft.yaml") - project._started_at = datetime.datetime.utcnow() + project._started_at = datetime.datetime.now(tz=datetime.timezone.utc) package_service._project = project fs.create_file(test_prime_dir / const.METADATA_FILENAME, contents="INVALID!!") @@ -116,7 +116,7 @@ def test_no_overwrite_reactive_metadata(monkeypatch, fs, package_service): fs.create_file(test_stage_dir / const.METADATA_FILENAME, contents="INVALID!!") project = models.CharmcraftProject.from_yaml_file(project_path / "project" / "charmcraft.yaml") - project._started_at = datetime.datetime.utcnow() + project._started_at = datetime.datetime.now(tz=datetime.timezone.utc) package_service._project = project package_service.write_metadata(test_prime_dir) diff --git a/tests/integration/test_application.py b/tests/integration/test_application.py index 8e074d437..78b9304a8 100644 --- a/tests/integration/test_application.py +++ b/tests/integration/test_application.py @@ -20,7 +20,7 @@ import pytest from craft_application import util -from charmcraft import models, utils +from charmcraft import utils @pytest.mark.parametrize( @@ -36,7 +36,8 @@ def test_load_charm(app, charm_dir): project = app.get_project() with (charm_dir / "expected.yaml").open() as f: expected_data = util.safe_yaml_load(f) - expected_project = models.CharmcraftProject.unmarshal(expected_data) - assert project == expected_project - assert utils.dump_yaml(project.marshal()) == (charm_dir / "expected.yaml").read_text() + project_dict = project.marshal() + + assert project_dict == expected_data + assert utils.dump_yaml(project_dict) == (charm_dir / "expected.yaml").read_text() diff --git a/tests/test_parts.py b/tests/test_parts.py index fedc699f0..55fe754fe 100644 --- a/tests/test_parts.py +++ b/tests/test_parts.py @@ -26,21 +26,35 @@ @pytest.mark.usefixtures("new_path") -def test_partconfig_happy_validation_and_completion(): - data = { +@pytest.mark.parametrize( + "binary_packages", + [ + {}, + {"charm-binary-python-packages": ["pydantic-core"]}, + ], +) +@pytest.mark.parametrize("packages", [{}, {"charm-python-packages": ["pytest"]}]) +@pytest.mark.parametrize("reqs", [{}, {"charm-requirements": ["requirements.lock"]}]) +@pytest.mark.parametrize("strict_deps", [{}, {"charm-strict-dependencies": False}]) +@pytest.mark.parametrize("entrypoint", [{}, {"charm-entrypoint": "my_charm.py"}]) +def test_partconfig_happy_validation_and_completion( + binary_packages: dict[str, str], + packages: dict[str, str], + reqs: dict[str, str], + strict_deps: dict[str, bool], + entrypoint: dict[str, str], +): + data: dict[str, str | bool] = { "plugin": "charm", "source": ".", } + data.update(binary_packages) + data.update(packages) + data.update(strict_deps) + data.update(entrypoint) + completed = parts.process_part_config(data) - assert completed == { - "plugin": "charm", - "source": ".", - "charm-binary-python-packages": [], - "charm-entrypoint": "src/charm.py", - "charm-python-packages": [], - "charm-requirements": [], - "charm-strict-dependencies": False, - } + assert completed == data def test_partconfig_no_plugin(): @@ -63,25 +77,7 @@ def test_partconfig_bad_property(): err = raised.value.errors() assert len(err) == 1 assert err[0]["loc"] == ("color",) - assert err[0]["msg"] == "extra fields not permitted" - - -def test_partconfig_bad_type(): - data = { - "plugin": "charm", - "source": ["."], - } - with pytest.raises(pydantic.ValidationError) as raised: - parts.process_part_config(data) - err = raised.value.errors() - assert len(err) == 2 - assert err[0]["loc"] == ("source",) - assert err[0]["msg"] == "str type expected" - assert err[1]["loc"] == ("charm-requirements",) - assert ( - err[1]["msg"] - == "cannot validate 'charm-requirements' because invalid 'source' configuration" - ) + assert err[0]["msg"] == "Extra inputs are not permitted" def test_partconfig_bad_plugin_property(): @@ -95,4 +91,4 @@ def test_partconfig_bad_plugin_property(): err = raised.value.errors() assert len(err) == 1 assert err[0]["loc"] == ("charm-timeout",) - assert err[0]["msg"] == "extra fields not permitted" + assert err[0]["msg"] == "Extra inputs are not permitted" diff --git a/tests/unit/models/test_config.py b/tests/unit/models/test_config.py index 4f01ecf46..e929d848e 100644 --- a/tests/unit/models/test_config.py +++ b/tests/unit/models/test_config.py @@ -46,11 +46,11 @@ ], ) def test_valid_config(options): - assert JujuConfig.parse_obj({"options": options}) == JujuConfig(options=options) + assert JujuConfig.model_validate({"options": options}) == JujuConfig(options=options) def test_empty_config(): - JujuConfig.parse_obj({}) + JujuConfig.model_validate({}) @pytest.mark.parametrize( @@ -72,12 +72,15 @@ def test_correct_option_type(option, type_): @pytest.mark.parametrize( ("option", "match"), [ - (None, "none is not an allowed value"), - ({}, "Discriminator 'type' is missing"), - ({"type": "stargate"}, "No match for discriminator 'type' and value 'stargate'"), - ({"type": "int", "default": 3.14}, "value is not a valid integer"), - ({"type": "float", "default": "pi"}, "value is not a valid float"), - ({"type": "boolean", "default": "maybe"}, "value could not be parsed to a boolean"), + (None, "Input should be a valid dict"), + ({}, "Unable to extract tag using discriminator 'type'"), + ( + {"type": "stargate"}, + "Input tag 'stargate' found using 'type' does not match any of the expected tags:", + ), + ({"type": "int", "default": 3.14}, "Input should be a valid integer"), + ({"type": "float", "default": "pi"}, "Input should be a valid number"), + ({"type": "boolean", "default": "maybe"}, "Input should be a valid boolean"), ], ) def test_invalid_options(option, match): diff --git a/tests/unit/models/test_metadata.py b/tests/unit/models/test_metadata.py index 062622f75..2da3f3e82 100644 --- a/tests/unit/models/test_metadata.py +++ b/tests/unit/models/test_metadata.py @@ -46,8 +46,8 @@ [ (BASIC_CHARM_DICT, BASIC_CHARM_METADATA_DICT), ( - dict(**BASIC_CHARM_DICT, links={"documentation": "https://docs.url"}), - {**BASIC_CHARM_METADATA_DICT, "docs": "https://docs.url"}, + dict(**BASIC_CHARM_DICT, links={"documentation": "https://docs.url/"}), + {**BASIC_CHARM_METADATA_DICT, "docs": "https://docs.url/"}, ), ( dict(**BASIC_CHARM_DICT, links={"contact": "someone@company.com"}), diff --git a/tests/unit/models/test_project.py b/tests/unit/models/test_project.py index e64d3b756..bf9326a99 100644 --- a/tests/unit/models/test_project.py +++ b/tests/unit/models/test_project.py @@ -18,6 +18,7 @@ import itertools import json import pathlib +import textwrap from textwrap import dedent from typing import Any @@ -67,6 +68,17 @@ "run-on": [{"channel": "22.04", "name": "ubuntu"}], } BASIC_CHARM_PARTS = {"charm": {"plugin": "charm", "source": "."}} +BASIC_CHARM_PARTS_EXPANDED = { + "charm": { + "plugin": "charm", + "source": ".", + "charm-binary-python-packages": [], + "charm-entrypoint": "src/charm.py", + "charm-python-packages": [], + "charm-requirements": [], + "charm-strict-dependencies": False, + } +} MINIMAL_CHARMCRAFT_YAML = f"""\ type: charm @@ -135,12 +147,12 @@ ), ], ) -def test_platform_from_bases_backwards_compatible(bases, expected): +def test_platform_from_bases_backwards_compatible(bases: list[Base], expected: str): """Replicates the format_charm_file_name tests in test_package.py. This ensures that charm names remain consistent as we move to platforms. """ - assert project.CharmPlatform.from_bases(bases) == expected + assert project.get_charm_file_platform_str(bases) == expected @pytest.mark.parametrize("base", [*SIMPLE_BASES, *COMPLEX_BASES]) @@ -149,7 +161,7 @@ def test_platform_from_single_base(base): expected_architectures = "-".join(base.architectures) expected = f"{base.name}-{base.channel}-{expected_architectures}" - actual = project.CharmPlatform.from_bases([base]) + actual = project.get_charm_file_platform_str([base]) assert actual == expected @@ -165,7 +177,7 @@ def test_platform_from_single_base(base): ], ) def test_platform_from_multiple_bases(bases, expected): - assert project.CharmPlatform.from_bases(bases) == expected + assert project.get_charm_file_platform_str(bases) == expected # endregion @@ -178,24 +190,6 @@ def test_platform_from_multiple_bases(bases, expected): ] -@pytest.mark.parametrize("build_on", VALID_PLATFORM_ARCHITECTURES) -@pytest.mark.parametrize("build_for", [[arch] for arch in (*const.CharmArch, "all")]) -def test_platform_validation_lists(build_on, build_for): - platform = project.Platform.parse_obj({"build-on": build_on, "build-for": build_for}) - - assert platform.build_for == build_for - assert platform.build_on == build_on - - -@pytest.mark.parametrize("build_on", const.CharmArch) -@pytest.mark.parametrize("build_for", [*const.CharmArch, "all"]) -def test_platform_validation_strings(build_on, build_for): - platform = project.Platform.parse_obj({"build-on": build_on, "build-for": build_for}) - - assert platform.build_for == [build_for] - assert platform.build_on == [build_on] - - # endregion # region CharmBuildInfo tests @pytest.mark.parametrize("build_on_base", [SIMPLE_BASE, BASE_WITH_ONE_ARCH, BASE_WITH_MULTIARCH]) @@ -383,7 +377,7 @@ def test_build_info_generator(given, expected): "build-on": ["amd64", "arm64", "riscv64"], "build-for": ["s390x"], }, - "crossy": {"build-on": "s390x", "build-for": "ppc64el"}, + "crossy": {"build-on": ["s390x"], "build-for": ["ppc64el"]}, "amd64": None, "arm64": None, "riscv64": None, @@ -484,7 +478,7 @@ def test_build_info_generator(given, expected): ], ) def test_build_planner_correct(data, expected): - planner = project.CharmcraftBuildPlanner.parse_obj(data) + planner = project.CharmcraftBuildPlanner.model_validate(data) assert planner.get_build_plan() == expected @@ -623,6 +617,36 @@ def test_unmarshal_invalid_type(type_): "parts": BASIC_CHARM_PARTS, }, ), + pytest.param( + SIMPLE_CHARMCRAFT_YAML + + textwrap.dedent( + """\ + parts: + charm: {} + reactive: {} + bundle: {} + """ + ), + None, + None, + None, + { + "parts": { + "charm": { + "plugin": "charm", + "source": ".", + }, + "reactive": { + "plugin": "reactive", + }, + "bundle": { + "plugin": "bundle", + "source": ".", + }, + } + }, + id="implicit-parts-plugins", + ), ], ) def test_from_yaml_file_success( @@ -634,9 +658,8 @@ def test_from_yaml_file_success( actions_yaml: str | None, expected_diff: dict[str, Any], ): - expected_dict = simple_charm.marshal() + expected_dict = simple_charm.marshal().copy() expected_dict.update(expected_diff) - expected = project.CharmcraftProject.unmarshal(expected_dict) fs.create_file("/charmcraft.yaml", contents=charmcraft_yaml) if metadata_yaml: @@ -648,7 +671,7 @@ def test_from_yaml_file_success( actual = project.CharmcraftProject.from_yaml_file(pathlib.Path("/charmcraft.yaml")) - assert actual.marshal() == expected.marshal() + assert actual.marshal() == expected_dict @pytest.mark.parametrize( @@ -760,7 +783,7 @@ def test_instantiate_bases_charm_success(values: dict[str, Any], expected_change "description": "This charm has no bases and is thus invalid.", }, pydantic.ValidationError, - r"bases\s+field required", + r"bases\s+Field required", id="no-bases", ), pytest.param( @@ -772,7 +795,7 @@ def test_instantiate_bases_charm_success(values: dict[str, Any], expected_change "bases": [], }, pydantic.ValidationError, - r"bases\s+ensure this value has at least 1 item", + r"bases\s+List should have at least 1 item", id="empty-bases", ), ], @@ -784,7 +807,7 @@ def test_instantiate_bases_charm_error( project.BasesCharm(**values) -@pytest.mark.parametrize("base", ["ubuntu@24.04"]) +@pytest.mark.parametrize("base", ["ubuntu@18.04", "ubuntu@22.04"]) def test_devel_bases(monkeypatch, base): monkeypatch.setattr(const, "DEVEL_BASE_STRINGS", [base]) @@ -840,7 +863,7 @@ def test_read_charm_from_yaml_file_self_contained_success(tmp_path, filename: st - field 'name' required in top-level configuration - field 'summary' required in top-level configuration - field 'description' required in top-level configuration - - unexpected value; permitted: 'charm' (in field 'type') + - input should be 'charm' (in field 'type') - field 'bases' required in top-level configuration""" ), ), @@ -880,7 +903,7 @@ def test_read_charm_from_yaml_file_error(filename, errors): ], ) def test_check_legacy_bases(base, expected): - assert project.BasesCharm._check_base_is_legacy(base) == expected + assert project._check_base_is_legacy(base) == expected # endregion diff --git a/tests/unit/models/valid_charms_yaml/basic-bases.yaml b/tests/unit/models/valid_charms_yaml/basic-bases.yaml index 225fef360..bfe494e58 100644 --- a/tests/unit/models/valid_charms_yaml/basic-bases.yaml +++ b/tests/unit/models/valid_charms_yaml/basic-bases.yaml @@ -12,4 +12,7 @@ bases: - name: ubuntu channel: '22.04' -parts: {} +parts: + charm: + source: . + plugin: charm diff --git a/tests/unit/models/valid_charms_yaml/full-bases.yaml b/tests/unit/models/valid_charms_yaml/full-bases.yaml index d239bde6f..4e3663c3e 100644 --- a/tests/unit/models/valid_charms_yaml/full-bases.yaml +++ b/tests/unit/models/valid_charms_yaml/full-bases.yaml @@ -11,8 +11,8 @@ analysis: linters: - entrypoint charmhub: - api-url: https://api.staging.charmhub.io - storage-url: https://storage.staging.snapcraftcontent.com + api-url: https://api.staging.charmhub.io/ + storage-url: https://storage.staging.snapcraftcontent.com/ parts: im-not-calling-this-what-you-expect: plugin: charm @@ -20,10 +20,11 @@ parts: charm-entrypoint: src/charm.py charm-binary-python-packages: [] charm-python-packages: [] - charm-requirements: [] + charm-requirements: [requirements.txt] charm-strict-dependencies: false another-part: plugin: nil + source: charm-libs: - lib: my-charm.my_lib version: '1' diff --git a/tests/unit/models/valid_charms_yaml/full-platforms.yaml b/tests/unit/models/valid_charms_yaml/full-platforms.yaml index f4963f88c..03dca4686 100644 --- a/tests/unit/models/valid_charms_yaml/full-platforms.yaml +++ b/tests/unit/models/valid_charms_yaml/full-platforms.yaml @@ -11,8 +11,8 @@ analysis: linters: - entrypoint charmhub: - api-url: https://api.staging.charmhub.io - storage-url: https://storage.staging.snapcraftcontent.com + api-url: https://api.staging.charmhub.io/ + storage-url: https://storage.staging.snapcraftcontent.com/ parts: im-not-calling-this-what-you-expect: plugin: charm @@ -20,10 +20,11 @@ parts: charm-entrypoint: src/charm.py charm-binary-python-packages: [] charm-python-packages: [] - charm-requirements: [] + charm-requirements: [requirements.txt] charm-strict-dependencies: false another-part: plugin: nil + source: charm-libs: - lib: my-charm.my_lib version: '1' diff --git a/tests/unit/parts/test_bundle.py b/tests/unit/parts/test_bundle.py index 7a87554b6..6ea753113 100644 --- a/tests/unit/parts/test_bundle.py +++ b/tests/unit/parts/test_bundle.py @@ -15,11 +15,8 @@ # For further info, check https://github.com/canonical/charmcraft import sys -import pydantic import pytest -import charmcraft.parts - pytestmark = pytest.mark.skipif(sys.platform == "win32", reason="Windows not supported") @@ -46,14 +43,3 @@ def test_bundleplugin_get_build_commands(bundle_plugin, tmp_path): f'mkdir -p "{str(tmp_path)}/parts/foo/install"', f'cp -R -p -P {tmp_path}/parts/foo/build/* "{str(tmp_path)}/parts/foo/install"', ] - - -def test_bundleplugin_invalid_properties(): - with pytest.raises(pydantic.ValidationError) as raised: - charmcraft.parts.bundle.BundlePlugin.properties_class.unmarshal( - {"source": ".", "bundle-invalid": True} - ) - err = raised.value.errors() - assert len(err) == 1 - assert err[0]["loc"] == ("bundle-invalid",) - assert err[0]["type"] == "value_error.extra" diff --git a/tests/unit/parts/test_charm.py b/tests/unit/parts/test_charm.py index 3dc5125e7..2feab3ab8 100644 --- a/tests/unit/parts/test_charm.py +++ b/tests/unit/parts/test_charm.py @@ -14,6 +14,7 @@ # # For further info, check https://github.com/canonical/charmcraft """Unit tests for charm plugin.""" +import pathlib import sys from unittest.mock import patch @@ -206,9 +207,10 @@ def test_charmpluginproperties_invalid_properties(): with pytest.raises(pydantic.ValidationError) as raised: parts.CharmPlugin.properties_class.unmarshal(content) err = raised.value.errors() + assert len(err) == 1 assert err[0]["loc"] == ("charm-invalid",) - assert err[0]["type"] == "value_error.extra" + assert err[0]["type"] == "extra_forbidden" def test_charmpluginproperties_entrypoint_ok(): @@ -242,7 +244,10 @@ def test_charmpluginproperties_entrypoint_outside_project_absolute(tmp_path): err = raised.value.errors() assert len(err) == 1 assert err[0]["loc"] == ("charm-entrypoint",) - assert err[0]["msg"] == f"charm entry point must be inside the project: {str(outside_path)!r}" + assert ( + err[0]["msg"] + == f"Value error, charm entry point must be inside the project: {str(outside_path)!r}" + ) def test_charmpluginproperties_entrypoint_outside_project_relative(tmp_path): @@ -254,7 +259,10 @@ def test_charmpluginproperties_entrypoint_outside_project_relative(tmp_path): err = raised.value.errors() assert len(err) == 1 assert err[0]["loc"] == ("charm-entrypoint",) - assert err[0]["msg"] == f"charm entry point must be inside the project: {str(outside_path)!r}" + assert ( + err[0]["msg"] + == f"Value error, charm entry point must be inside the project: {str(outside_path)!r}" + ) def test_charmpluginproperties_requirements_default(tmp_path): @@ -264,11 +272,11 @@ def test_charmpluginproperties_requirements_default(tmp_path): assert properties.charm_requirements == [] -def test_charmpluginproperties_requirements_filepresent_ok(tmp_path): +def test_charmpluginproperties_requirements_filepresent_ok(tmp_path: pathlib.Path): """If a specific file is present in disk it's used.""" (tmp_path / "requirements.txt").write_text("somedep") content = {"source": str(tmp_path)} - properties = parts.CharmPlugin.properties_class.unmarshal(content) + properties = parts.CharmPluginProperties.unmarshal(content) assert properties.charm_requirements == ["requirements.txt"] diff --git a/tests/unit/parts/test_reactive.py b/tests/unit/parts/test_reactive.py index 2dc55f30b..080715cfc 100644 --- a/tests/unit/parts/test_reactive.py +++ b/tests/unit/parts/test_reactive.py @@ -20,7 +20,6 @@ from unittest.mock import call, patch import craft_parts -import pydantic import pytest import pytest_subprocess from craft_parts import plugins @@ -111,15 +110,6 @@ def test_get_build_commands(plugin, tmp_path): ] -def test_invalid_properties(plugin): - with pytest.raises(pydantic.ValidationError) as raised: - plugin.properties_class.unmarshal({"source": ".", "reactive-invalid": True}) - err = raised.value.errors() - assert len(err) == 1 - assert err[0]["loc"] == ("reactive-invalid",) - assert err[0]["type"] == "value_error.extra" - - def test_validate_environment(plugin, plugin_properties, charm_exe): validator = plugin.validator_class( part_name="my-part", diff --git a/tests/unit/services/test_package.py b/tests/unit/services/test_package.py index d1501775e..85968423b 100644 --- a/tests/unit/services/test_package.py +++ b/tests/unit/services/test_package.py @@ -221,7 +221,7 @@ def test_get_manifest_bases_from_bases( build_item: BuildInfo, expected: list[dict[str, Any]], ): - charm = models.BasesCharm.parse_obj( + charm = models.BasesCharm.model_validate( { "name": "my-charm", "description": "", @@ -233,7 +233,9 @@ def test_get_manifest_bases_from_bases( package_service._project = charm package_service._build_plan = [build_item] - assert package_service.get_manifest_bases() == [models.Base.parse_obj(b) for b in expected] + assert package_service.get_manifest_bases() == [ + models.Base.model_validate(b) for b in expected + ] @pytest.mark.parametrize("base", ["ubuntu@22.04", "almalinux@9"]) @@ -245,7 +247,7 @@ def test_get_manifest_bases_from_bases( { "anything": { "build-on": [*const.SUPPORTED_ARCHITECTURES], - "build-for": "all", + "build-for": ["all"], } }, "anything", @@ -255,7 +257,7 @@ def test_get_manifest_bases_from_bases( { "anything": { "build-on": [*const.SUPPORTED_ARCHITECTURES], - "build-for": "all", + "build-for": ["all"], }, "amd64": None, "riscy": { @@ -272,7 +274,7 @@ def test_get_manifest_bases_from_bases( def test_get_manifest_bases_from_platforms( package_service, base, platforms, selected_platform, expected_architectures ): - charm = models.PlatformCharm.parse_obj( + charm = models.PlatformCharm.model_validate( { "name": "my-charm", "description": "", diff --git a/tests/unit/test_parts.py b/tests/unit/test_parts.py index 33144cb97..f3195c240 100644 --- a/tests/unit/test_parts.py +++ b/tests/unit/test_parts.py @@ -19,15 +19,6 @@ from charmcraft import parts -FULLY_DEFINED_STRICT_CHARM = { - "source": ".", - "plugin": "charm", - "charm-strict-dependencies": True, - "charm-binary-python-packages": [], - "charm-python-packages": [], - "charm-requirements": [], - "charm-entrypoint": "src/charm.py", -} MINIMAL_STRICT_CHARM = { "source": ".", "plugin": "charm", @@ -38,7 +29,7 @@ @pytest.mark.parametrize( ("part_config", "expected"), [ - ({}, {"charm-requirements": ["requirements.txt"]}), + ({}, {}), ( {"charm-requirements": ["requirements.txt"]}, {"charm-requirements": ["requirements.txt"]}, @@ -55,7 +46,7 @@ def test_partconfig_strict_dependencies_success(fs: FakeFilesystem, part_config, fs.create_file(file, contents="ops~=2.5") part_config.update(MINIMAL_STRICT_CHARM) - real_expected = FULLY_DEFINED_STRICT_CHARM.copy() + real_expected = MINIMAL_STRICT_CHARM.copy() real_expected.update(expected) actual = parts.process_part_config(part_config) @@ -68,9 +59,9 @@ def test_partconfig_strict_dependencies_success(fs: FakeFilesystem, part_config, [ ( {"charm-requirements": ["req.txt"], "charm-python-packages": ["ops"]}, - "'charm-python-packages' must not be set if 'charm-strict-dependencies' is enabled", + "Value error, 'charm-python-packages' must not be set if 'charm-strict-dependencies' is enabled", ), - ({}, "'charm-strict-dependencies' requires at least one requirements file."), + ({}, "Value error, 'charm-strict-dependencies' requires at least one requirements file."), ], ) def test_partconfig_strict_dependencies_failure(fs: FakeFilesystem, part_config, message): diff --git a/tests/unit/test_preprocess.py b/tests/unit/test_preprocess.py index bd7c49f42..137d1f82a 100644 --- a/tests/unit/test_preprocess.py +++ b/tests/unit/test_preprocess.py @@ -32,8 +32,12 @@ pytest.param({}, {}, id="no-type"), pytest.param({"type": "bundle"}, BASIC_BUNDLE, id="empty-bundle"), pytest.param(BASIC_BUNDLE.copy(), BASIC_BUNDLE, id="prefilled-bundle"), - pytest.param({"type": "charm"}, {"type": "charm"}, id="empty-charm"), - pytest.param(BASIC_CHARM.copy(), BASIC_CHARM, id="empty-charm"), + pytest.param( + {"type": "charm", "bases": []}, + {"type": "charm", "bases": [], "parts": {"charm": {"plugin": "charm", "source": "."}}}, + id="empty-charm", + ), + pytest.param(BASIC_CHARM.copy(), BASIC_CHARM, id="basic-charm"), ], ) def test_add_default_parts_correct(yaml_data, expected):