From 35b2194b233ae6e38e68d74e9ed48bc91dfe2fa1 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Mon, 10 Feb 2025 16:18:39 -0500 Subject: [PATCH 1/6] chore: pr feedback, shorten command docstring --- snapcraft/commands/remote.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/snapcraft/commands/remote.py b/snapcraft/commands/remote.py index e9fefa44ed..74b4b818ab 100644 --- a/snapcraft/commands/remote.py +++ b/snapcraft/commands/remote.py @@ -62,10 +62,7 @@ class RemoteBuildCommand(RemoteBuild): architecture of the local machine. Interrupted remote builds can be resumed using the --recover - option, followed by the build number informed when the remote - build was originally dispatched. The current state of the - remote build for each architecture can be checked using the - --status option. + option. To set a timeout on the remote-build command, use the option ``--launchpad-timeout=``. The timeout is local, so the build on From 0136ac713617620cb33156a4e9eca07d94470378 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Mon, 10 Feb 2025 16:45:15 -0500 Subject: [PATCH 2/6] docs: update remote-build docs --- docs/explanation/remote-build.rst | 38 +- tests/unit/commands/test_remote.py | 968 +++-------------------------- 2 files changed, 128 insertions(+), 878 deletions(-) diff --git a/docs/explanation/remote-build.rst b/docs/explanation/remote-build.rst index 35aaf5c606..28cb8cd722 100644 --- a/docs/explanation/remote-build.rst +++ b/docs/explanation/remote-build.rst @@ -8,19 +8,18 @@ different architectures. Architectures supported by Launchpad can be found :ref:`here`. -Open vs closed source ---------------------- +Public vs. Private projects +--------------------------- -By default, prospective snaps must be open source because the build will be -publicly available. +By default, prospective snaps will be publicly uploaded to `Launchpad`_. Developers are reminded of this by confirming that their project will be publicly available when starting a remote build. This prompt can be automatically agreed to by passing ``--launchpad-accept-public-upload``. -Closed-source projects can be built using the remote builder. This requires +Private projects can still be built using the remote builder. This requires the user to create a private `Launchpad project`_ and pass the project with the -``--project `` command line argument. An ``ssh`` key must be +``--project `` command line argument. An SSH key must be registered in Launchpad because source code is uploaded using SSH. Git repository @@ -85,6 +84,8 @@ Current ``--build-for`` *************** +**Type**: Comma-separated list of strings +**Default**: The architectures specified in your project file .. note:: ``--build-for`` behaves differently for ``remote-build`` than it does for @@ -108,6 +109,31 @@ The second mode of operation is when there isn't a ``platforms`` or ``architectures`` key in the project file. In this scenario, ``--build-for`` defines the architectures to build for. +``--launchpad-accept-public-upload`` +************************************ + +Used to bypass the interactive prompt for confirming the public upload of data. It is +not necessary to use this flag if using ``--project`` to specify a private project. + +``--project`` +************* +**Type**: String + +Explicitly specify a project to upload to. + +``--launchpad-timeout`` +*********************** +**Type**: Integer +**Default**: 0 + +Time, in seconds, to wait for Launchpad to complete a build. A time of 0 seconds will +wait indefinitely. + +``--recover`` +************* + +Attempt to recover previously interrupted builds. + Project platforms and architectures *********************************** diff --git a/tests/unit/commands/test_remote.py b/tests/unit/commands/test_remote.py index 3e1856cacb..580d54a309 100644 --- a/tests/unit/commands/test_remote.py +++ b/tests/unit/commands/test_remote.py @@ -20,49 +20,28 @@ import shutil import subprocess import sys -import time from pathlib import Path -from unittest.mock import ANY, Mock, call +from unittest.mock import ANY import pytest -from craft_application import launchpad -from craft_application.errors import RemoteBuildError from craft_application.git import GitRepo -from craft_application.launchpad.models import BuildState -from craft_application.remote.utils import get_build_id from craft_platforms import DebianArchitecture from snapcraft import application, const # remote-build control logic may check if the working dir is a git repo, # so execute all tests inside a test directory -# The service also emits -pytestmark = pytest.mark.usefixtures("new_dir", "emitter") +pytestmark = pytest.mark.usefixtures("new_dir") @pytest.fixture() -def create_snapcraft_yaml(request, snapcraft_yaml): - """Create a snapcraft.yaml file with a particular base.""" - snapcraft_yaml(base=request.param) - - -@pytest.fixture() -def fake_sudo(monkeypatch): - monkeypatch.setenv("SUDO_USER", "fake") - monkeypatch.setattr("os.geteuid", lambda: 0) - - -@pytest.fixture() -def mock_argv(mocker): +def mock_argv(mocker, request): """Mock `snapcraft remote-build` cli.""" - return mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - - -@pytest.fixture() -def mock_confirm(mocker): - return mocker.patch( - "snapcraft.commands.remote.confirm_with_user", return_value=True - ) + args = ["snapcraft", "remote-build", "--launchpad-accept-public-upload"] + # Append build-fors if set through parametrization + if getattr(request, "param", None) is not None: + args.extend(["--build-for", str(request.param)]) + return mocker.patch.object(sys, "argv", args) @pytest.fixture() @@ -74,218 +53,25 @@ def mock_remote_build_run(mocker): @pytest.fixture() -def mock_remote_builder(mocker): - _mock_remote_builder = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService" - ) - _mock_remote_builder._is_setup = True - return _mock_remote_builder - - -@pytest.fixture() -def mock_remote_builder_start_builds(mocker): +def mock_remote_start_builds(mocker): _mock_start_builds = mocker.patch( "snapcraft.services.remotebuild.RemoteBuild.start_builds" ) return _mock_start_builds -@pytest.fixture() -def mock_remote_builder_fake_build_process(mocker): - mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds" - ) - - mocker.patch("snapcraft.services.remotebuild.RemoteBuild.fetch_logs") - - mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.fetch_artifacts", - return_value=[Path("test.snap")], - ) - - mocker.patch("craft_application.services.remotebuild.RemoteBuildService.cleanup") - - -@pytest.fixture() -def mock_run_remote_build(mocker): - return mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - @pytest.fixture() def mock_run_legacy(mocker): return mocker.patch("snapcraft_legacy.cli.legacy.legacy_run") -############# -# CLI tests # -############# - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.parametrize("project_name", ["something", "something-else"]) -def test_set_project( - mocker, snapcraft_yaml, base, mock_confirm, fake_services, project_name -): - """Check that a project name gets set if the user provides a project.""" - mocker.patch("sys.argv", ["snapcraft", "remote-build", "--project", project_name]) - - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - app = application.create_app() - remote_build = app.services.remote_build - remote_build.is_project_private = lambda: False - - app.run() - - assert remote_build._project_name == project_name - mock_confirm.assert_called_once() - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.parametrize("project_name", ["something", "something_else"]) -def test_no_confirmation_for_private_project( - mocker, snapcraft_yaml, base, mock_confirm, fake_services, project_name -): - """If a user uploads to a private project, we don't need a confirmation prompt.""" - mocker.patch("sys.argv", ["snapcraft", "remote-build", "--project", project_name]) - - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - app = application.create_app() - remote_build = app.services.remote_build - remote_build.is_project_private = lambda: True - - app.run() - - assert remote_build._project_name == project_name - mock_confirm.assert_not_called() - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "emitter") -def test_command_user_confirms_upload( - snapcraft_yaml, base, mock_confirm, fake_services -): - """Check if the confirmation prompt is shown.""" - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - fake_services.remote_build.is_project_private = lambda: False - app = application.create_app() - - app.run() - - mock_confirm.assert_called_once_with( - "All data sent to remote builders will be publicly available. " - "Are you sure you want to continue?", - default=False, - ) - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "emitter", "fake_services") -def test_command_user_denies_upload( - capsys, - snapcraft_yaml, - base, - mock_confirm, -): - """Raise an error if the user denies the upload prompt.""" - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - mock_confirm.return_value = False - app = application.create_app() - app.run() - - _, err = capsys.readouterr() - - assert ( - "Remote build needs explicit acknowledgement that data sent to build " - "servers is public." - ) in err - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "emitter", "fake_services") -def test_command_accept_upload( - mocker, snapcraft_yaml, base, mock_confirm, mock_run_remote_build -): - """Do not prompt user if `--launchpad-accept-public-upload` is provided.""" - mocker.patch.object( - sys, "argv", ["snapcraft", "remote-build", "--launchpad-accept-public-upload"] - ) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - app = application.create_app() - app.run() - - mock_confirm.assert_not_called() - mock_run_remote_build.assert_called_once() - - -@pytest.mark.slow -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures( - "mock_argv", "mock_confirm", "emitter", "fake_services", "fake_sudo" -) -def test_remote_build_sudo_warns(emitter, snapcraft_yaml, base, mock_run_remote_build): - "Check if a warning is shown when snapcraft is run with sudo." - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - app = application.create_app() - app.run() - - emitter.assert_progress( - "Running with 'sudo' may cause permission errors and is discouraged.", - permanent=True, - ) - mock_run_remote_build.assert_called_once() - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "mock_confirm", "emitter", "fake_services") -def test_launchpad_timeout_default(mocker, snapcraft_yaml, base): - """Check if no timeout is set by default.""" - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - mock_start_builds = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.start_builds" - ) - app = application.create_app() - app.run() - - mock_start_builds.assert_called_once() - assert app.services.remote_build._deadline is None - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "mock_confirm", "emitter", "fake_services") -def test_launchpad_timeout(mocker, snapcraft_yaml, base): - """Set the timeout for the remote builder.""" - mocker.patch.object( - sys, "argv", ["snapcraft", "remote-build", "--launchpad-timeout", "100"] - ) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - mock_start_builds = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.start_builds" - ) - app = application.create_app() - app.run() - - mock_start_builds.assert_called_once() - assert app.services.remote_build._deadline is not None - assert app.services.remote_build._deadline > time.monotonic_ns() + 90 * 10**9 - - ####################### # Control logic tests # ####################### @pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_argv", "mock_confirm", "emitter", "fake_services") +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") def test_run_core22_and_later(snapcraft_yaml, base, mock_remote_build_run): """Bases that are core22 and later will use craft-application remote-build.""" snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} @@ -296,7 +82,7 @@ def test_run_core22_and_later(snapcraft_yaml, base, mock_remote_build_run): @pytest.mark.parametrize("base", const.LEGACY_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_argv") +@pytest.mark.usefixtures("mock_argv") def test_run_core20( snapcraft_yaml, base, @@ -313,26 +99,24 @@ def test_run_core20( @pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_argv", "emitter", "fake_services") -def test_run_in_repo_newer_than_core22(mocker, snapcraft_yaml, base, new_dir): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_run_in_repo_newer_than_core22( + snapcraft_yaml, base, new_dir, mock_remote_start_builds +): """Bases newer than core22 run craft-application remote-build regardless of being in a repo.""" # initialize a git repo GitRepo(new_dir) snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} snapcraft_yaml(**snapcraft_yaml_dict) - mock_start_builds = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.start_builds" - ) application.main() - mock_start_builds.assert_called_once() + mock_remote_start_builds.assert_called_once() @pytest.mark.xfail(reason="not implemented in craft-application") @pytest.mark.parametrize("base", const.CURRENT_BASES) @pytest.mark.usefixtures( - "mock_confirm", "mock_argv", "mock_remote_builder_start_builds", "fake_services", @@ -393,38 +177,29 @@ def test_run_in_shallow_repo_unsupported(capsys, new_dir, snapcraft_yaml, base): @pytest.mark.parametrize("base", const.CURRENT_BASES - {"devel"}) -def test_default_architecture( - mocker, - snapcraft_yaml, - base, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, -): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_default_architecture(snapcraft_yaml, base, mock_remote_start_builds): """Default to the host architecture if not defined elsewhere.""" snapcraft_yaml(base=base) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once_with( + mock_remote_start_builds.assert_called_once_with( ANY, architectures=[str(DebianArchitecture.from_host())] ) -@pytest.mark.parametrize("args", [[], ["--build-for", "all"]]) @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) +@pytest.mark.parametrize( + "mock_argv", + [pytest.param(None, id="implicit"), pytest.param("all", id="explicit")], + indirect=True, +) +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") def test_platform_build_for_all( - mocker, snapcraft_yaml, - args, base, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, + mock_remote_start_builds, ): """Use 'build-for: all' from the project metadata with the platforms keyword.""" snapcraft_yaml_dict = { @@ -434,26 +209,20 @@ def test_platform_build_for_all( }, } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", *args]) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once() - assert mock_start_builds.call_args[1]["architectures"] == ["all"] + mock_remote_start_builds.assert_called_once() + assert mock_remote_start_builds.call_args[1]["architectures"] == ["all"] -@pytest.mark.parametrize("args", [[], ["--build-for", "all"]]) -def test_platform_build_for_all_core22( - args, - mocker, - snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, -): +@pytest.mark.parametrize( + "mock_argv", + [pytest.param(None, id="implicit"), pytest.param("all", id="explicit")], + indirect=True, +) +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_platform_build_for_all_core22(snapcraft_yaml, mock_remote_start_builds): """Use 'build-for: all' from the project metadata with the architectures keyword.""" snapcraft_yaml_dict = { "base": "core22", @@ -462,26 +231,16 @@ def test_platform_build_for_all_core22( ], } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", *args]) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once() - assert mock_start_builds.call_args[1]["architectures"] == ["all"] + mock_remote_start_builds.assert_called_once() + assert mock_remote_start_builds.call_args[1]["architectures"] == ["all"] @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) -def test_platform_in_project_metadata( - mocker, - snapcraft_yaml, - base, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, -): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_platform_in_project_metadata(snapcraft_yaml, base, mock_remote_start_builds): """Use the platform's build-for architectures from the project metadata.""" snapcraft_yaml_dict = { "base": base, @@ -492,29 +251,20 @@ def test_platform_in_project_metadata( }, } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build"], - ) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once() - assert const.SnapArch.arm64 in mock_start_builds.call_args[1]["architectures"] - assert const.SnapArch.amd64 in mock_start_builds.call_args[1]["architectures"] + mock_remote_start_builds.assert_called_once() + assert ( + const.SnapArch.arm64 in mock_remote_start_builds.call_args[1]["architectures"] + ) + assert ( + const.SnapArch.amd64 in mock_remote_start_builds.call_args[1]["architectures"] + ) -def test_architecture_in_project_metadata( - mocker, - snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, -): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_architecture_in_project_metadata(snapcraft_yaml, mock_remote_start_builds): """Use the build-for architectures from the project metadata.""" snapcraft_yaml_dict = { "base": "core22", @@ -524,30 +274,29 @@ def test_architecture_in_project_metadata( ], } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build"], - ) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once() - assert sorted(mock_start_builds.call_args[1]["architectures"]) == sorted( + mock_remote_start_builds.assert_called_once() + assert sorted(mock_remote_start_builds.call_args[1]["architectures"]) == sorted( ["arm64", "riscv64"] ) @pytest.mark.parametrize("base", const.CURRENT_BASES - {"devel"}) @pytest.mark.parametrize( - ("build_fors", "expected_build_fors"), + ("mock_argv", "expected_build_fors"), [ - *zip(const.SnapArch, [[arch] for arch in const.SnapArch]), - ("amd64,riscv64", ["amd64", "riscv64"]), - ("amd64,riscv64,s390x", ["amd64", "riscv64", "s390x"]), + *( + pytest.param(*arch_and_list, id=f"zipped-{arch_and_list[0]}") + for arch_and_list in zip( + const.SnapArch, [[arch] for arch in const.SnapArch] + ) + ), + pytest.param("amd64,riscv64", ["amd64", "riscv64"], id="two-arch"), + pytest.param( + "amd64,riscv64,s390x", ["amd64", "riscv64", "s390x"], id="three-arch" + ), pytest.param(" amd64 , riscv64 ", ["amd64", "riscv64"], id="with-whitespace"), pytest.param( "amd64,amd64,riscv64", @@ -555,50 +304,33 @@ def test_architecture_in_project_metadata( id="duplicates-passthrough-to-launchpad", ), ], + indirect=["mock_argv"], ) +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") def test_build_for_argument( - mocker, - snapcraft_yaml, - base, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, - build_fors, - expected_build_fors, + snapcraft_yaml, base, expected_build_fors, mock_remote_start_builds ): """Use architectures provided by the `--build-for` argument.""" snapcraft_yaml(base=base) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", build_fors], - ) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once_with(ANY, architectures=expected_build_fors) + mock_remote_start_builds.assert_called_once_with( + ANY, architectures=expected_build_fors + ) @pytest.mark.parametrize( - ("archs", "expected_archs"), + ("mock_argv", "expected_archs"), [ - ("amd64", ["amd64"]), - ("riscv64", ["riscv64"]), - ("amd64,riscv64", ["amd64", "riscv64"]), + pytest.param("amd64", ["amd64"], id="amd64"), + pytest.param("riscv64", ["riscv64"], id="riscv64"), + pytest.param("amd64,riscv64", ["amd64", "riscv64"], id="both"), ], + indirect=["mock_argv"], ) -def test_architectures_filter( - mocker, - snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, - archs, - expected_archs, -): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_architectures_filter(snapcraft_yaml, expected_archs, mock_remote_start_builds): """Filter an 'architectures' key with '--build-for'.""" snapcraft_yaml_dict = { "base": "core22", @@ -608,26 +340,17 @@ def test_architectures_filter( ], } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", archs], - ) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once_with(ANY, architectures=expected_archs) + mock_remote_start_builds.assert_called_once_with(ANY, architectures=expected_archs) +@pytest.mark.parametrize("mock_argv", ["amd64"], indirect=True) +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") def test_architectures_filter_error( capsys, - mocker, snapcraft_yaml, - fake_services, - mock_confirm, ): """Error if '--build-for' entirely filters the build plan.""" snapcraft_yaml_dict = { @@ -635,11 +358,6 @@ def test_architectures_filter_error( "architectures": [{"build-on": ["riscv64"], "build-for": ["riscv64"]}], } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", "arm64"], - ) app = application.create_app() app.run() @@ -653,22 +371,16 @@ def test_architectures_filter_error( @pytest.mark.parametrize( - ("archs", "expected_archs"), + ("mock_argv", "expected_archs"), [ - ("amd64", ["amd64"]), - ("riscv64", ["riscv64"]), - ("amd64,riscv64", ["amd64", "riscv64"]), + pytest.param("amd64", ["amd64"], id="amd64"), + pytest.param("riscv64", ["riscv64"], id="riscv64"), + pytest.param("amd64,riscv64", ["amd64", "riscv64"], id="both"), ], + indirect=["mock_argv"], ) -def test_platforms_filter( - mocker, - snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, - archs, - expected_archs, -): +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") +def test_platforms_filter(snapcraft_yaml, expected_archs, mock_remote_start_builds): """Filter a 'platforms' key with '--build-for'.""" snapcraft_yaml_dict = { "base": "core24", @@ -678,26 +390,17 @@ def test_platforms_filter( }, } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", archs], - ) - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() app.run() - mock_start_builds.assert_called_once_with(ANY, architectures=expected_archs) + mock_remote_start_builds.assert_called_once_with(ANY, architectures=expected_archs) +@pytest.mark.parametrize("mock_argv", ["arm64"], indirect=True) +@pytest.mark.usefixtures("emitter", "mock_argv", "fake_services") def test_platforms_filter_error( capsys, - mocker, snapcraft_yaml, - fake_services, - mock_confirm, ): """Error if '--build-for' entirely filters the build plan.""" snapcraft_yaml_dict = { @@ -707,11 +410,6 @@ def test_platforms_filter_error( }, } snapcraft_yaml(**snapcraft_yaml_dict) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", "arm64"], - ) app = application.create_app() app.run() @@ -725,35 +423,26 @@ def test_platforms_filter_error( @pytest.mark.parametrize( - "build_fors", + "mock_argv", [ "nonexistent", "nonexistent,riscv64", "riscv64,nonexistent", "riscv64,nonexistent,amd64", ], + indirect=True, ) @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22", "devel"}) +@pytest.mark.usefixtures( + "emitter", "mock_argv", "fake_services", "mock_remote_start_builds" +) def test_unknown_build_for_error( capsys, - mocker, snapcraft_yaml, - build_fors, base, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, ): """Error if `--build-for` is not a valid debian architecture.""" snapcraft_yaml(base=base) - mocker.patch.object( - sys, - "argv", - ["snapcraft", "remote-build", "--build-for", build_fors], - ) - mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() assert app.run() == os.EX_CONFIG @@ -761,7 +450,7 @@ def test_unknown_build_for_error( assert "Unsupported build-for architecture 'nonexistent'" in err assert ( - "Recommended resolution: Use a supported debian architecture. " + "Recommended resolution: Use a supported Debian architecture. " "Supported architectures are:" ) in err @@ -854,24 +543,19 @@ def test_unknown_build_for_error( ), ], ) +@pytest.mark.usefixtures( + "emitter", "mock_argv", "fake_services", "mock_remote_start_builds" +) def test_multiple_artifacts_per_build_on( check, base, build_info, error_messages, capsys, - mocker, snapcraft_yaml, - fake_services, - mock_confirm, - mock_remote_builder_fake_build_process, ): """Error when multiple artifacts will be produced on one build-on architecture.""" snapcraft_yaml(**{"base": base, **build_info}) - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) app = application.create_app() assert app.run() == os.EX_CONFIG @@ -883,463 +567,3 @@ def test_multiple_artifacts_per_build_on( ) for message in error_messages: check.is_in(message, err) - - -######################## -# Remote builder tests # -######################## - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build(mocker, emitter, snapcraft_yaml, base, fake_services): - """Test the monitor_build method and the progress emitter.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - side_effect=[ - [ - {"amd64": launchpad.models.BuildState.PENDING}, - {"amd64": launchpad.models.BuildState.BUILDING}, - {"amd64": launchpad.models.BuildState.UPLOADING}, - {"amd64": launchpad.models.BuildState.SUPERSEDED}, - {"amd64": launchpad.models.BuildState.SUCCESS}, - ] - ], - ) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_fetch_artifacts = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.fetch_artifacts", - return_value=[Path("test.snap")], - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - app.run() - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_artifacts.assert_called_once() - mock_cleanup.assert_called_once() - - emitter.assert_progress("Pending: amd64") - emitter.assert_progress("Building: amd64") - emitter.assert_progress("Uploading: amd64") - emitter.assert_progress("Stopped: amd64") - emitter.assert_progress("Succeeded: amd64") - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build_error(mocker, emitter, snapcraft_yaml, base, fake_services): - """Test the monitor_build cleanup when an error occurs.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - side_effect=Exception(), - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - - assert app.run() == 1 - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_not_called() - mock_cleanup.assert_called_once() - - emitter.assert_progress("Cleaning up") - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.parametrize("cleanup", [True, False]) -def test_monitor_build_interrupt( - cleanup, mock_confirm, mocker, emitter, snapcraft_yaml, base, fake_services -): - """Test the monitor_build cleanup when a keyboard interrupt occurs.""" - # first prompt is for public upload, second is to cancel builds - mock_confirm.side_effect = [True, cleanup] - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - side_effect=KeyboardInterrupt(), - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - mock_cancel_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cancel_builds" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - - assert app.run() == os.EX_OK - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_not_called() - - cancel_emitted = call("progress", "Cancelling builds.") in emitter.interactions - clean_emitted = call("progress", "Cleaning up.") in emitter.interactions - if cleanup: - mock_cancel_builds.assert_called_once() - assert cancel_emitted - mock_cleanup.assert_called_once() - assert clean_emitted - else: - mock_cancel_builds.assert_not_called() - assert not cancel_emitted - mock_cleanup.assert_not_called() - assert not clean_emitted - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build_timeout(mocker, emitter, snapcraft_yaml, base, fake_services): - """Test the monitor_build timeout.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - side_effect=TimeoutError(), - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - - assert app.run() == os.EX_TEMPFAIL - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_not_called() - mock_cleanup.assert_not_called() - - emitter.assert_message( - "Timed out waiting for build.\nTo resume, run " - f"'{app.services.app.name} remote-build --recover " - f"--build-id={app.services.remote_build._name}'" - ) - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build_failure(mocker, emitter, snapcraft_yaml, base, fake_services): - """Test the monitor_build cleanup when a build fails.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - return_value=[ - {"amd64": BuildState.PENDING}, - {"amd64": BuildState.FAILED}, - ], - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - - assert app.run() == 1 - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_called_once() - mock_cleanup.assert_called_once() - - emitter.assert_progress("Cleaning up") - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build_success_no_artifacts( - mocker, emitter, snapcraft_yaml, base, fake_services -): - """Test the cleanup when a build succeeds but doesn't generate artifacts.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - return_value=[ - {"amd64": BuildState.PENDING}, - {"amd64": BuildState.SUCCESS}, - ], - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs", - ) - mock_fetch_artifacts = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_artifacts", return_value=[] - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - - assert app.run() == 1 - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_called_once() - mock_fetch_artifacts.assert_called_once() - mock_cleanup.assert_called_once() - - emitter.assert_progress( - "No build artifacts downloaded from Launchpad.", permanent=True - ) - emitter.assert_progress("Cleaning up") - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_monitor_build_success_no_logs( - mocker, emitter, snapcraft_yaml, base, fake_services -): - """Test the cleanup when a build succeeds but doesn't generate logs.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds", - return_value=[ - {"amd64": BuildState.PENDING}, - {"amd64": BuildState.SUCCESS}, - ], - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs", return_value=[] - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.services.remote_build._name = get_build_id( - app.services.app.name, app.project.name, app.project_dir - ) - app.services.remote_build._is_setup = True - app.services.remote_build.request.download_files_with_progress = Mock() - - assert app.run() == 1 - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_called_once() - mock_cleanup.assert_called_once() - - emitter.assert_progress("No log files downloaded from Launchpad.", permanent=True) - emitter.assert_progress("Cleaning up") - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm") -def test_recover_build(mocker, snapcraft_yaml, base, fake_services): - """Recover a build when `--recover` is provided.""" - mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", "--recover"]) - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_resume_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.resume_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds" - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_fetch_artifacts = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.fetch_artifacts", - return_value=[Path("test.snap")], - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.run() - - mock_resume_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_called_once() - mock_fetch_artifacts.assert_called_once() - mock_cleanup.assert_called_once() - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_argv") -def test_remote_build(mocker, snapcraft_yaml, base, fake_services): - """Test the remote-build command.""" - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds" - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds" - ) - - mock_fetch_logs = mocker.patch( - "snapcraft.services.remotebuild.RemoteBuild.fetch_logs" - ) - - mock_fetch_artifacts = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.fetch_artifacts", - return_value=[Path("test.snap")], - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - app.run() - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_called_once() - mock_fetch_logs.assert_called_once() - mock_fetch_artifacts.assert_called_once() - mock_cleanup.assert_called_once() - - -@pytest.mark.parametrize("base", const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_argv") -def test_remote_build_error(emitter, mocker, snapcraft_yaml, base, fake_services): - """Test the remote-build command when an error occurs.""" - snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} - snapcraft_yaml(**snapcraft_yaml_dict) - - mock_start_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.start_builds", - side_effect=RemoteBuildError("test error"), - ) - - mock_monitor_builds = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.monitor_builds" - ) - - mock_cleanup = mocker.patch( - "craft_application.services.remotebuild.RemoteBuildService.cleanup" - ) - - app = application.create_app() - assert app.run() == 1 - - mock_start_builds.assert_called_once() - mock_monitor_builds.assert_not_called() - mock_cleanup.assert_called_once() - - emitter.assert_progress("Starting build failed.", permanent=True) - emitter.assert_progress("Cleaning up") From b1f1e80fe0a11de22814c5c23cdf6e8a0f892003 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Tue, 11 Feb 2025 10:49:16 -0500 Subject: [PATCH 3/6] chore: clean up unused variable --- snapcraft/commands/remote.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/snapcraft/commands/remote.py b/snapcraft/commands/remote.py index 74b4b818ab..1901a6ab80 100644 --- a/snapcraft/commands/remote.py +++ b/snapcraft/commands/remote.py @@ -33,10 +33,6 @@ from snapcraft import models from snapcraft.const import SUPPORTED_ARCHS -_CONFIRMATION_PROMPT = ( - "All data sent to remote builders will be publicly available. " - "Are you sure you want to continue?" -) class RemoteBuildCommand(RemoteBuild): """Command passthrough for the remote-build command.""" From 19e62279e464149154bc6dc8df59ddbc0ac6c487 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Wed, 12 Feb 2025 13:41:31 -0500 Subject: [PATCH 4/6] test: clean up tests --- tests/unit/models/test_projects.py | 4 ++-- tests/unit/test_application.py | 26 ++++++++------------------ 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/tests/unit/models/test_projects.py b/tests/unit/models/test_projects.py index f5aa7f8cea..597a60c52d 100644 --- a/tests/unit/models/test_projects.py +++ b/tests/unit/models/test_projects.py @@ -2561,7 +2561,7 @@ def test_project_platform_mismatch(): def test_project_platform_unknown_name(): """Raise an error if an empty platform is not a valid architecture.""" - with pytest.raises(CraftValidationError) as raised: + with pytest.raises(pydantic.ValidationError) as raised: snapcraft.models.project.SnapcraftBuildPlanner.model_validate( { "name": "test-snap", @@ -2573,7 +2573,7 @@ def test_project_platform_unknown_name(): ) assert ( - "Invalid architecture: 'unknown' must be a valid debian architecture." + "'unknown' is not a valid Debian architecture." in str(raised.value) ) diff --git a/tests/unit/test_application.py b/tests/unit/test_application.py index 0dbd984f22..7786177a55 100644 --- a/tests/unit/test_application.py +++ b/tests/unit/test_application.py @@ -51,13 +51,6 @@ def architectures(request): return request.param -@pytest.fixture() -def mock_confirm(mocker): - return mocker.patch( - "snapcraft.commands.remote.confirm_with_user", return_value=True - ) - - @pytest.fixture() def mock_remote_build_run(mocker): _mock_remote_build_run = mocker.patch( @@ -74,7 +67,7 @@ def mock_run_legacy(mocker): @pytest.fixture() def mock_remote_build_argv(mocker): """Mock `snapcraft remote-build` cli.""" - return mocker.patch.object(sys, "argv", ["snapcraft", "remote-build"]) + return mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", "--launchpad-accept-public-upload"]) @pytest.mark.parametrize("env_vars", application.MAPPED_ENV_VARS.items()) @@ -421,7 +414,7 @@ def test_esm_pass(mocker, snapcraft_yaml, base): @pytest.mark.parametrize("envvar", ["disable-fallback", None]) @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22"}) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_remote_build_core24( monkeypatch, snapcraft_yaml, @@ -446,13 +439,12 @@ def test_run_remote_build_core24( @pytest.mark.parametrize("base", const.CURRENT_BASES - {"core22"}) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_remote_build_core24_error(monkeypatch, snapcraft_yaml, base, capsys): """Error if using force-fallback for core24 or newer.""" snapcraft_yaml_dict = {"base": base, "build-base": "devel", "grade": "devel"} snapcraft_yaml(**snapcraft_yaml_dict) monkeypatch.setenv("SNAPCRAFT_REMOTE_BUILD_STRATEGY", "force-fallback") - monkeypatch.setattr("sys.argv", ["snapcraft", "remote-build"]) application.main() @@ -466,11 +458,10 @@ def test_run_remote_build_core24_error(monkeypatch, snapcraft_yaml, base, capsys @pytest.mark.parametrize("base", const.LEGACY_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_envvar_disable_fallback_core20(snapcraft_yaml, base, monkeypatch, capsys): """core20 bases cannot use the new remote-build.""" monkeypatch.setenv("SNAPCRAFT_REMOTE_BUILD_STRATEGY", "disable-fallback") - monkeypatch.setattr("sys.argv", ["snapcraft", "remote-build"]) snapcraft_yaml_dict = {"base": base} snapcraft_yaml(**snapcraft_yaml_dict) @@ -486,7 +477,7 @@ def test_run_envvar_disable_fallback_core20(snapcraft_yaml, base, monkeypatch, c @pytest.mark.parametrize("base", const.LEGACY_BASES | {"core22"}) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_envvar_force_fallback_core22( snapcraft_yaml, base, mock_remote_build_run, mock_run_legacy, monkeypatch ): @@ -502,7 +493,7 @@ def test_run_envvar_force_fallback_core22( @pytest.mark.parametrize("base", const.LEGACY_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_envvar_force_fallback_unset_core20( snapcraft_yaml, base, mock_remote_build_run, mock_run_legacy, monkeypatch ): @@ -518,7 +509,7 @@ def test_run_envvar_force_fallback_unset_core20( @pytest.mark.parametrize("base", {"core22"}) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_envvar_force_fallback_empty_core22( snapcraft_yaml, base, mock_remote_build_run, mock_run_legacy, monkeypatch ): @@ -534,11 +525,10 @@ def test_run_envvar_force_fallback_empty_core22( @pytest.mark.parametrize("base", const.LEGACY_BASES | const.CURRENT_BASES) -@pytest.mark.usefixtures("mock_confirm", "mock_remote_build_argv") +@pytest.mark.usefixtures("mock_remote_build_argv") def test_run_envvar_invalid(snapcraft_yaml, base, monkeypatch, capsys): """core20 and core22 bases raise an error if the envvar is invalid.""" monkeypatch.setenv("SNAPCRAFT_REMOTE_BUILD_STRATEGY", "badvalue") - monkeypatch.setattr("sys.argv", ["snapcraft", "remote-build"]) snapcraft_yaml_dict = {"base": base} snapcraft_yaml(**snapcraft_yaml_dict) From f4df68ed5bfc3e22c0fdbf80186260591bae441b Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Wed, 12 Feb 2025 15:56:17 -0500 Subject: [PATCH 5/6] style: run formatter --- docs/explanation/remote-build.rst | 10 +- snapcraft/commands/remote.py | 8 +- tests/unit/models/test_projects.py | 5 +- tests/unit/test_application.py | 4 +- uv.lock | 405 +++++++++++++++-------------- 5 files changed, 224 insertions(+), 208 deletions(-) diff --git a/docs/explanation/remote-build.rst b/docs/explanation/remote-build.rst index 28cb8cd722..46f4dd2c48 100644 --- a/docs/explanation/remote-build.rst +++ b/docs/explanation/remote-build.rst @@ -8,10 +8,10 @@ different architectures. Architectures supported by Launchpad can be found :ref:`here`. -Public vs. Private projects +Public and private projects --------------------------- -By default, prospective snaps will be publicly uploaded to `Launchpad`_. +By default, prospective snaps are publicly uploaded to `Launchpad`_. Developers are reminded of this by confirming that their project will be publicly available when starting a remote build. This prompt can be @@ -85,7 +85,7 @@ Current ``--build-for`` *************** **Type**: Comma-separated list of strings -**Default**: The architectures specified in your project file +**Default**: The architectures specified in your project file or your host architecture .. note:: ``--build-for`` behaves differently for ``remote-build`` than it does for @@ -112,8 +112,8 @@ defines the architectures to build for. ``--launchpad-accept-public-upload`` ************************************ -Used to bypass the interactive prompt for confirming the public upload of data. It is -not necessary to use this flag if using ``--project`` to specify a private project. +Bypasses the prompt that confirms whether you want to upload data to the public. It's +not necessary to use this flag if you used ``--project`` to specify a private project. ``--project`` ************* diff --git a/snapcraft/commands/remote.py b/snapcraft/commands/remote.py index 1901a6ab80..88c56446e4 100644 --- a/snapcraft/commands/remote.py +++ b/snapcraft/commands/remote.py @@ -105,7 +105,9 @@ def _pre_build(self, parsed_args: argparse.Namespace): ) project = cast(models.Project, self._services.project) - build_plan = self._app.BuildPlannerClass.unmarshal(project.marshal()).get_build_plan() + build_plan = self._app.BuildPlannerClass.unmarshal( + project.marshal() + ).get_build_plan() # mapping of `build-on` to `build-for` architectures build_map: dict[str, list[str]] = {} @@ -138,7 +140,9 @@ def _pre_build(self, parsed_args: argparse.Namespace): @override def _get_build_args(self, parsed_args: argparse.Namespace) -> dict[str, Any]: project = cast(models.Project, self._services.project) - build_plan = self._app.BuildPlannerClass.unmarshal(project.marshal()).get_build_plan() + build_plan = self._app.BuildPlannerClass.unmarshal( + project.marshal() + ).get_build_plan() build_fors = cast(list[str], parsed_args.remote_build_build_fors) archs: list[str] = [] if project.platforms or project._architectures_in_yaml: diff --git a/tests/unit/models/test_projects.py b/tests/unit/models/test_projects.py index 597a60c52d..bc6abe9efd 100644 --- a/tests/unit/models/test_projects.py +++ b/tests/unit/models/test_projects.py @@ -2572,10 +2572,7 @@ def test_project_platform_unknown_name(): } ) - assert ( - "'unknown' is not a valid Debian architecture." - in str(raised.value) - ) + assert "'unknown' is not a valid Debian architecture." in str(raised.value) @pytest.mark.parametrize("project", [ComponentProject, Project]) diff --git a/tests/unit/test_application.py b/tests/unit/test_application.py index 7786177a55..ddb5a204a1 100644 --- a/tests/unit/test_application.py +++ b/tests/unit/test_application.py @@ -67,7 +67,9 @@ def mock_run_legacy(mocker): @pytest.fixture() def mock_remote_build_argv(mocker): """Mock `snapcraft remote-build` cli.""" - return mocker.patch.object(sys, "argv", ["snapcraft", "remote-build", "--launchpad-accept-public-upload"]) + return mocker.patch.object( + sys, "argv", ["snapcraft", "remote-build", "--launchpad-accept-public-upload"] + ) @pytest.mark.parametrize("env_vars", application.MAPPED_ENV_VARS.items()) diff --git a/uv.lock b/uv.lock index 98aa3471ec..6a697a660c 100644 --- a/uv.lock +++ b/uv.lock @@ -91,11 +91,11 @@ wheels = [ [[package]] name = "attrs" -version = "24.2.0" +version = "25.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678 } +sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, + { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, ] [[package]] @@ -112,23 +112,24 @@ wheels = [ [[package]] name = "babel" -version = "2.16.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] [[package]] name = "beautifulsoup4" -version = "4.12.3" +version = "4.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, + { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] [[package]] @@ -228,11 +229,11 @@ wheels = [ [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] [[package]] @@ -344,47 +345,49 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, - { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, - { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, - { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, - { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, - { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, - { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, - { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, - { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, - { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, - { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, - { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, - { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, - { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, - { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, - { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, - { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, - { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, - { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, - { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, - { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, - { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, - { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, - { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, - { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, - { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, - { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, - { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, - { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, +version = "7.6.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/d6/2b53ab3ee99f2262e6f0b8369a43f6d66658eab45510331c0b3d5c8c4272/coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2", size = 805941 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/7f/4af2ed1d06ce6bee7eafc03b2ef748b14132b0bdae04388e451e4b2c529b/coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad", size = 208645 }, + { url = "https://files.pythonhosted.org/packages/dc/60/d19df912989117caa95123524d26fc973f56dc14aecdec5ccd7d0084e131/coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3", size = 208898 }, + { url = "https://files.pythonhosted.org/packages/bd/10/fecabcf438ba676f706bf90186ccf6ff9f6158cc494286965c76e58742fa/coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574", size = 242987 }, + { url = "https://files.pythonhosted.org/packages/4c/53/4e208440389e8ea936f5f2b0762dcd4cb03281a7722def8e2bf9dc9c3d68/coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985", size = 239881 }, + { url = "https://files.pythonhosted.org/packages/c4/47/2ba744af8d2f0caa1f17e7746147e34dfc5f811fb65fc153153722d58835/coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750", size = 242142 }, + { url = "https://files.pythonhosted.org/packages/e9/90/df726af8ee74d92ee7e3bf113bf101ea4315d71508952bd21abc3fae471e/coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea", size = 241437 }, + { url = "https://files.pythonhosted.org/packages/f6/af/995263fd04ae5f9cf12521150295bf03b6ba940d0aea97953bb4a6db3e2b/coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3", size = 239724 }, + { url = "https://files.pythonhosted.org/packages/1c/8e/5bb04f0318805e190984c6ce106b4c3968a9562a400180e549855d8211bd/coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a", size = 241329 }, + { url = "https://files.pythonhosted.org/packages/9e/9d/fa04d9e6c3f6459f4e0b231925277cfc33d72dfab7fa19c312c03e59da99/coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95", size = 211289 }, + { url = "https://files.pythonhosted.org/packages/53/40/53c7ffe3c0c3fff4d708bc99e65f3d78c129110d6629736faf2dbd60ad57/coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288", size = 212079 }, + { url = "https://files.pythonhosted.org/packages/76/89/1adf3e634753c0de3dad2f02aac1e73dba58bc5a3a914ac94a25b2ef418f/coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1", size = 208673 }, + { url = "https://files.pythonhosted.org/packages/ce/64/92a4e239d64d798535c5b45baac6b891c205a8a2e7c9cc8590ad386693dc/coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd", size = 208945 }, + { url = "https://files.pythonhosted.org/packages/b4/d0/4596a3ef3bca20a94539c9b1e10fd250225d1dec57ea78b0867a1cf9742e/coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9", size = 242484 }, + { url = "https://files.pythonhosted.org/packages/1c/ef/6fd0d344695af6718a38d0861408af48a709327335486a7ad7e85936dc6e/coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e", size = 239525 }, + { url = "https://files.pythonhosted.org/packages/0c/4b/373be2be7dd42f2bcd6964059fd8fa307d265a29d2b9bcf1d044bcc156ed/coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4", size = 241545 }, + { url = "https://files.pythonhosted.org/packages/a6/7d/0e83cc2673a7790650851ee92f72a343827ecaaea07960587c8f442b5cd3/coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6", size = 241179 }, + { url = "https://files.pythonhosted.org/packages/ff/8c/566ea92ce2bb7627b0900124e24a99f9244b6c8c92d09ff9f7633eb7c3c8/coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3", size = 239288 }, + { url = "https://files.pythonhosted.org/packages/7d/e4/869a138e50b622f796782d642c15fb5f25a5870c6d0059a663667a201638/coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc", size = 241032 }, + { url = "https://files.pythonhosted.org/packages/ae/28/a52ff5d62a9f9e9fe9c4f17759b98632edd3a3489fce70154c7d66054dd3/coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3", size = 211315 }, + { url = "https://files.pythonhosted.org/packages/bc/17/ab849b7429a639f9722fa5628364c28d675c7ff37ebc3268fe9840dda13c/coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef", size = 212099 }, + { url = "https://files.pythonhosted.org/packages/d2/1c/b9965bf23e171d98505eb5eb4fb4d05c44efd256f2e0f19ad1ba8c3f54b0/coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e", size = 209511 }, + { url = "https://files.pythonhosted.org/packages/57/b3/119c201d3b692d5e17784fee876a9a78e1b3051327de2709392962877ca8/coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703", size = 209729 }, + { url = "https://files.pythonhosted.org/packages/52/4e/a7feb5a56b266304bc59f872ea07b728e14d5a64f1ad3a2cc01a3259c965/coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0", size = 253988 }, + { url = "https://files.pythonhosted.org/packages/65/19/069fec4d6908d0dae98126aa7ad08ce5130a6decc8509da7740d36e8e8d2/coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924", size = 249697 }, + { url = "https://files.pythonhosted.org/packages/1c/da/5b19f09ba39df7c55f77820736bf17bbe2416bbf5216a3100ac019e15839/coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b", size = 252033 }, + { url = "https://files.pythonhosted.org/packages/1e/89/4c2750df7f80a7872267f7c5fe497c69d45f688f7b3afe1297e52e33f791/coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d", size = 251535 }, + { url = "https://files.pythonhosted.org/packages/78/3b/6d3ae3c1cc05f1b0460c51e6f6dcf567598cbd7c6121e5ad06643974703c/coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827", size = 249192 }, + { url = "https://files.pythonhosted.org/packages/6e/8e/c14a79f535ce41af7d436bbad0d3d90c43d9e38ec409b4770c894031422e/coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9", size = 250627 }, + { url = "https://files.pythonhosted.org/packages/cb/79/b7cee656cfb17a7f2c1b9c3cee03dd5d8000ca299ad4038ba64b61a9b044/coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3", size = 212033 }, + { url = "https://files.pythonhosted.org/packages/b6/c3/f7aaa3813f1fa9a4228175a7bd368199659d392897e184435a3b66408dd3/coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f", size = 213240 }, + { url = "https://files.pythonhosted.org/packages/fb/b2/f655700e1024dec98b10ebaafd0cedbc25e40e4abe62a3c8e2ceef4f8f0a/coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953", size = 200552 }, ] [[package]] name = "craft-application" -version = "4.4.1" +version = "4.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-types" }, { name = "craft-archives" }, { name = "craft-cli" }, { name = "craft-grammar" }, @@ -401,9 +404,14 @@ dependencies = [ { name = "snap-helpers" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/62/f25c8814bfcbc361f2fb424a7e2d2ab20bd84543e41f9411ab2edb0b5dfe/craft_application-4.4.1.tar.gz", hash = "sha256:16627b3a57010bb6ada1dd5fea0565590e77d2092108cab5e3afc2b8bcfc15e8", size = 209220 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/c5/0e7e7f712e5024c106641ef7b0b77e40964a3f79747ea0d5308e0e97d3f2/craft_application-4.9.1.tar.gz", hash = "sha256:71e674c89cb492e16011741ee9d423dde9d851aa895c8073a2925c583a2d505b", size = 314097 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/dd/d5baa0157652eb2ff6a17da1d2d50efc00df43c2a99ab1d911d03ebcf464/craft_application-4.4.1-py3-none-any.whl", hash = "sha256:4eb61a319e26946ff02ec6c1467084a7bb212600380dd651b75cdd4a2fbb3cd8", size = 135798 }, + { url = "https://files.pythonhosted.org/packages/c9/4d/811a0a81a8e7f24797ce478a81262156ccae79c3583af996a77ea08c54ce/craft_application-4.9.1-py3-none-any.whl", hash = "sha256:e59e21a2ab4c3d91cba98a6a53e635b267946d4abbe8af45e99b32e8a2c38339", size = 146733 }, +] + +[package.optional-dependencies] +remote = [ + { name = "launchpadlib" }, ] [[package]] @@ -473,16 +481,16 @@ wheels = [ [[package]] name = "craft-platforms" -version = "0.5.0" +version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "distro" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/cb/898d65cfdde700565dc6339e09d919a6e0ac65e27486427ba4d7eb7f6434/craft_platforms-0.5.0.tar.gz", hash = "sha256:f41226163ca111517abd30fd3d1e8c16f08819eb3623b36e5a58d1db3ea8da21", size = 150900 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/7e/a9a54ac2025f5399689027fd317273f477c7c15478b2c59791aa48f34262/craft_platforms-0.6.0.tar.gz", hash = "sha256:7aa153bfff5a28cf4f8c8a7b3da29c259da3a9d9a2f9a2e7c52e118e5735a927", size = 173964 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/d5/a1231182a3012239940ca84bc3b289d54eba7b5841a140439b03226bbd7a/craft_platforms-0.5.0-py3-none-any.whl", hash = "sha256:f80e0eee22174ddc888a938206716dcb7abf66d1161479206e47127091fdfec1", size = 22332 }, + { url = "https://files.pythonhosted.org/packages/fc/a8/8a11759a28f90b8461ffb0651e21f2b677b4b0547d475a605772858449c4/craft_platforms-0.6.0-py3-none-any.whl", hash = "sha256:ebb1dc6bd1d8c4cbcdab573b9966b20844a9c32aea755ca51de64d4b2a1e646e", size = 24476 }, ] [[package]] @@ -503,7 +511,7 @@ wheels = [ [[package]] name = "craft-store" -version = "3.2.0" +version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -518,9 +526,9 @@ dependencies = [ { name = "requests-toolbelt" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/51/8135945f2e2bad6a30c70fcfb6009194821818a730d306ee28c11e6a0273/craft_store-3.2.0.tar.gz", hash = "sha256:60bbe6b1e65b0b2691d0fe42df88ce0853df312507d2b853d2b508d7e5f80910", size = 200904 } +sdist = { url = "https://files.pythonhosted.org/packages/78/80/edc3cf128f1e3302f0c591539a278b4bd6a09ad23e959f620494ce8cb285/craft_store-3.2.1.tar.gz", hash = "sha256:0c8ae8870362e6e670c0766026849683f6f4563d108a7acca800d4db024a3a21", size = 201049 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/d7/39d43ec8a7df9082bce03f3fc82980501a5152c8a8f057a0caa97743cc36/craft_store-3.2.0-py3-none-any.whl", hash = "sha256:fb2feff7d4bebd0eba9f6b01916d6cad7c6cc69c10da5be3f2238856fd61294a", size = 53112 }, + { url = "https://files.pythonhosted.org/packages/da/41/12e8b8d5e6336556579151b67fa673343e7368ea4e07f7afbd6a5c5f40d8/craft_store-3.2.1-py3-none-any.whl", hash = "sha256:e87b222d848051063e576c21679073bcd0c07ad6d116740033f0c7e50b6bfa76", size = 53143 }, ] [[package]] @@ -606,15 +614,15 @@ wheels = [ [[package]] name = "domdf-python-tools" -version = "3.9.0" +version = "3.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "natsort" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/78/974e10c583ba9d2302e748c9585313a7f2c7ba00e4f600324f432e38fe68/domdf_python_tools-3.9.0.tar.gz", hash = "sha256:1f8a96971178333a55e083e35610d7688cd7620ad2b99790164e1fc1a3614c18", size = 103792 } +sdist = { url = "https://files.pythonhosted.org/packages/36/8b/ab2d8a292bba8fe3135cacc8bfd3576710a14b8f2d0a8cde19130d5c9d21/domdf_python_tools-3.10.0.tar.gz", hash = "sha256:2ae308d2f4f1e9145f5f4ba57f840fbfd1c2983ee26e4824347789649d3ae298", size = 100458 } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/e9/7447a88b217650a74927d3444a89507986479a69b83741900eddd34167fe/domdf_python_tools-3.9.0-py3-none-any.whl", hash = "sha256:4e1ef365cbc24627d6d1e90cf7d46d8ab8df967e1237f4a26885f6986c78872e", size = 127106 }, + { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860 }, ] [[package]] @@ -628,14 +636,11 @@ wheels = [ [[package]] name = "fixtures" -version = "4.2.2" +version = "4.2.4.post1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pbr" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/79/a63e71f7663b380e0fe74c1673bca12e114884dc7c1a61408e9fcde3db28/fixtures-4.2.2.tar.gz", hash = "sha256:af9368737fad6fd501638ca99c78000c3f3fb03fa40a60f9e9d39aa64f342bc1", size = 59199 } +sdist = { url = "https://files.pythonhosted.org/packages/c8/93/5f8713c22bfdd03c1f018483f8ce473a51b1b90219a70cf41730364fb30f/fixtures-4.2.4.post1.tar.gz", hash = "sha256:034c4bd1deaa60a5bfcb608ce53d99e8392bf47c91a653605aebdd6a05248f2e", size = 35345 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/9e/ab77b2e316b2960b64277d8927ded0dc6f95c9cf8b4dba29fabd7680832f/fixtures-4.2.2-py3-none-any.whl", hash = "sha256:5cf7668cb1c0152c2cddeae32e898e83b93d07be78e481a2e786db87354fd0f0", size = 64537 }, + { url = "https://files.pythonhosted.org/packages/75/d5/2757cabc34758fac81039d4fbcde11c91d3952d91e33f8d5c69ea8c74e0f/fixtures-4.2.4.post1-py3-none-any.whl", hash = "sha256:fb4050adebfb08e15c6c812ec2c7f879ccb399186c375c72ffee241b65ca2cba", size = 64077 }, ] [[package]] @@ -965,44 +970,44 @@ wheels = [ [[package]] name = "lxml" -version = "5.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, - { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, - { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, - { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, - { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, - { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, - { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, - { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, - { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, - { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, - { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, - { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, - { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, - { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, - { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, - { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, - { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, - { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, - { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, - { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, - { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, - { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, - { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, - { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, - { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, - { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, - { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, - { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, - { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, - { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, - { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, - { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, - { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, - { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/f6/c15ca8e5646e937c148e147244817672cf920b56ac0bf2cc1512ae674be8/lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8", size = 3678591 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/f4/5121aa9ee8e09b8b8a28cf3709552efe3d206ca51a20d6fa471b60bb3447/lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c", size = 8191889 }, + { url = "https://files.pythonhosted.org/packages/0a/ca/8e9aa01edddc74878f4aea85aa9ab64372f46aa804d1c36dda861bf9eabf/lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe", size = 4450685 }, + { url = "https://files.pythonhosted.org/packages/b2/b3/ea40a5c98619fbd7e9349df7007994506d396b97620ced34e4e5053d3734/lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9", size = 5051722 }, + { url = "https://files.pythonhosted.org/packages/3a/5e/375418be35f8a695cadfe7e7412f16520e62e24952ed93c64c9554755464/lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a", size = 4786661 }, + { url = "https://files.pythonhosted.org/packages/79/7c/d258eaaa9560f6664f9b426a5165103015bee6512d8931e17342278bad0a/lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0", size = 5311766 }, + { url = "https://files.pythonhosted.org/packages/03/bc/a041415be4135a1b3fdf017a5d873244cc16689456166fbdec4b27fba153/lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7", size = 4836014 }, + { url = "https://files.pythonhosted.org/packages/32/88/047f24967d5e3fc97848ea2c207eeef0f16239cdc47368c8b95a8dc93a33/lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae", size = 4961064 }, + { url = "https://files.pythonhosted.org/packages/3d/b5/ecf5a20937ecd21af02c5374020f4e3a3538e10a32379a7553fca3d77094/lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519", size = 4778341 }, + { url = "https://files.pythonhosted.org/packages/a4/05/56c359e07275911ed5f35ab1d63c8cd3360d395fb91e43927a2ae90b0322/lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322", size = 5345450 }, + { url = "https://files.pythonhosted.org/packages/b7/f4/f95e3ae12e9f32fbcde00f9affa6b0df07f495117f62dbb796a9a31c84d6/lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468", size = 4908336 }, + { url = "https://files.pythonhosted.org/packages/c5/f8/309546aec092434166a6e11c7dcecb5c2d0a787c18c072d61e18da9eba57/lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367", size = 4986049 }, + { url = "https://files.pythonhosted.org/packages/71/1c/b951817cb5058ca7c332d012dfe8bc59dabd0f0a8911ddd7b7ea8e41cfbd/lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd", size = 4860351 }, + { url = "https://files.pythonhosted.org/packages/31/23/45feba8dae1d35fcca1e51b051f59dc4223cbd23e071a31e25f3f73938a8/lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c", size = 5421580 }, + { url = "https://files.pythonhosted.org/packages/61/69/be245d7b2dbef81c542af59c97fcd641fbf45accf2dc1c325bae7d0d014c/lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f", size = 5285778 }, + { url = "https://files.pythonhosted.org/packages/69/06/128af2ed04bac99b8f83becfb74c480f1aa18407b5c329fad457e08a1bf4/lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645", size = 5054455 }, + { url = "https://files.pythonhosted.org/packages/8a/2d/f03a21cf6cc75cdd083563e509c7b6b159d761115c4142abb5481094ed8c/lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5", size = 3486315 }, + { url = "https://files.pythonhosted.org/packages/2b/9c/8abe21585d20ef70ad9cec7562da4332b764ed69ec29b7389d23dfabcea0/lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf", size = 3816925 }, + { url = "https://files.pythonhosted.org/packages/94/1c/724931daa1ace168e0237b929e44062545bf1551974102a5762c349c668d/lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e", size = 8171881 }, + { url = "https://files.pythonhosted.org/packages/67/0c/857b8fb6010c4246e66abeebb8639eaabba60a6d9b7c606554ecc5cbf1ee/lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd", size = 4440394 }, + { url = "https://files.pythonhosted.org/packages/61/72/c9e81de6a000f9682ccdd13503db26e973b24c68ac45a7029173237e3eed/lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7", size = 5037860 }, + { url = "https://files.pythonhosted.org/packages/24/26/942048c4b14835711b583b48cd7209bd2b5f0b6939ceed2381a494138b14/lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414", size = 4782513 }, + { url = "https://files.pythonhosted.org/packages/e2/65/27792339caf00f610cc5be32b940ba1e3009b7054feb0c4527cebac228d4/lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e", size = 5305227 }, + { url = "https://files.pythonhosted.org/packages/18/e1/25f7aa434a4d0d8e8420580af05ea49c3e12db6d297cf5435ac0a054df56/lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1", size = 4829846 }, + { url = "https://files.pythonhosted.org/packages/fe/ed/faf235e0792547d24f61ee1448159325448a7e4f2ab706503049d8e5df19/lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5", size = 4949495 }, + { url = "https://files.pythonhosted.org/packages/e5/e1/8f572ad9ed6039ba30f26dd4c2c58fb90f79362d2ee35ca3820284767672/lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423", size = 4773415 }, + { url = "https://files.pythonhosted.org/packages/a3/75/6b57166b9d1983dac8f28f354e38bff8d6bcab013a241989c4d54c72701b/lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20", size = 5337710 }, + { url = "https://files.pythonhosted.org/packages/cc/71/4aa56e2daa83bbcc66ca27b5155be2f900d996f5d0c51078eaaac8df9547/lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8", size = 4897362 }, + { url = "https://files.pythonhosted.org/packages/65/10/3fa2da152cd9b49332fd23356ed7643c9b74cad636ddd5b2400a9730d12b/lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9", size = 4977795 }, + { url = "https://files.pythonhosted.org/packages/de/d2/e1da0f7b20827e7b0ce934963cb6334c1b02cf1bb4aecd218c4496880cb3/lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c", size = 4858104 }, + { url = "https://files.pythonhosted.org/packages/a5/35/063420e1b33d3308f5aa7fcbdd19ef6c036f741c9a7a4bd5dc8032486b27/lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b", size = 5416531 }, + { url = "https://files.pythonhosted.org/packages/c3/83/93a6457d291d1e37adfb54df23498101a4701834258c840381dd2f6a030e/lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5", size = 5273040 }, + { url = "https://files.pythonhosted.org/packages/39/25/ad4ac8fac488505a2702656550e63c2a8db3a4fd63db82a20dad5689cecb/lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252", size = 5050951 }, + { url = "https://files.pythonhosted.org/packages/82/74/f7d223c704c87e44b3d27b5e0dde173a2fcf2e89c0524c8015c2b3554876/lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78", size = 3485357 }, + { url = "https://files.pythonhosted.org/packages/80/83/8c54533b3576f4391eebea88454738978669a6cad0d8e23266224007939d/lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332", size = 3814484 }, ] [[package]] @@ -1164,27 +1169,27 @@ wheels = [ [[package]] name = "mypy" -version = "1.14.1" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, - { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, - { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, - { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, - { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, - { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, - { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, - { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, - { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, - { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, - { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, - { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, - { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, ] [[package]] @@ -1198,7 +1203,7 @@ wheels = [ [[package]] name = "myst-parser" -version = "4.0.0" +version = "4.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -1208,9 +1213,9 @@ dependencies = [ { name = "pyyaml" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 }, ] [[package]] @@ -1269,11 +1274,14 @@ wheels = [ [[package]] name = "pbr" -version = "6.1.0" +version = "6.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/35/80cf8f6a4f34017a7fe28242dc45161a1baa55c41563c354d8147e8358b2/pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24", size = 124032 } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/44/6a65ecd630393d47ad3e7d5354768cb7f9a10b3a0eb2cd8c6f52b28211ee/pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a", size = 108529 }, + { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 }, ] [[package]] @@ -1299,11 +1307,11 @@ wheels = [ [[package]] name = "pip" -version = "25.0" +version = "25.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/3e/68beeeeb306ea20ffd30b3ed993f531d16cd884ec4f60c9b1e238f69f2af/pip-25.0.tar.gz", hash = "sha256:8e0a97f7b4c47ae4a494560da84775e9e2f671d415d8d828e052efefb206b30b", size = 1950328 } +sdist = { url = "https://files.pythonhosted.org/packages/70/53/b309b4a497b09655cb7e07088966881a57d082f48ac3cb54ea729fd2c6cf/pip-25.0.1.tar.gz", hash = "sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea", size = 1950850 } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/8a/1ddf40be20103bcc605db840e9ade09c8e8c9f920a03e9cfe88eae97a058/pip-25.0-py3-none-any.whl", hash = "sha256:b6eb97a803356a52b2dd4bb73ba9e65b2ba16caa6bcb25a7497350a4e5859b65", size = 1841506 }, + { url = "https://files.pythonhosted.org/packages/c9/bc/b7db44f5f39f9d0494071bddae6880eb645970366d0a200022a1a93d57f5/pip-25.0.1-py3-none-any.whl", hash = "sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f", size = 1841526 }, ] [[package]] @@ -1377,17 +1385,17 @@ wheels = [ [[package]] name = "psutil" -version = "6.1.1" +version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, - { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, - { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, - { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, - { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, - { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, - { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] [[package]] @@ -1440,50 +1448,55 @@ wheels = [ [[package]] name = "pydantic" -version = "2.8.0" +version = "2.10.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/7b/23dc30fba5793d7be3307f33bebb36e08f78f8af9c03fce608833f01bebd/pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141", size = 738772 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/07/bbfddb7b532b727a5769a8468a67ab388e74c029d4940e5de6b25231aba2/pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e", size = 423079 }, + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, ] [[package]] name = "pydantic-core" -version = "2.20.0" +version = "2.27.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/9802d053f33dbcf110d46e3f28667b06cd764b164f1e3f4189848cdd6e78/pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877", size = 388463 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/d7/b748dc1e92f019d0bf49dd62762425a1d4c713250b5dfac82616648a0e8c/pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17", size = 1839193 }, - { url = "https://files.pythonhosted.org/packages/df/20/e1a1a03a9c116bd63d68dabd51250e76e45e3a849456b32dd8fb5148c817/pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb", size = 1767120 }, - { url = "https://files.pythonhosted.org/packages/51/05/b903f4fd7f34d8548534b1e21f972664f9a5d03b884781b86d3f422997ca/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d", size = 1789229 }, - { url = "https://files.pythonhosted.org/packages/dc/d0/0686c898da81a339701fca5669bd8496c5923755d84dacb65c4d71dd2ab0/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce", size = 1773878 }, - { url = "https://files.pythonhosted.org/packages/be/c3/3510274ee06bc18c7c43923be40a0fcd7510daf6df5fab41a70463302130/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad", size = 1975737 }, - { url = "https://files.pythonhosted.org/packages/7c/23/f8a75d2f766f9fbe4a080c1ca2e00e2eb61f237b9d930976d0aba95cd691/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b", size = 2592099 }, - { url = "https://files.pythonhosted.org/packages/99/6a/8c9e41bd2848e6f2a970f93f4cf0f2f62ce5248ab2b23b85dd7247069f1a/pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8", size = 2100808 }, - { url = "https://files.pythonhosted.org/packages/34/a9/33f27da3de0dfff881beca6c2e19b05f928f24ff3346c1ff6faae85f6cf4/pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608", size = 1900858 }, - { url = "https://files.pythonhosted.org/packages/0c/00/fde56cd48a4ebb9d7dfe9e38aa14737be7349dd8d30de162955182e38e16/pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1", size = 1966902 }, - { url = "https://files.pythonhosted.org/packages/de/dc/bc741bf0a400f983cab9e5d4feac936040c0fc7665a65da5bc6c8db275a2/pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af", size = 2119825 }, - { url = "https://files.pythonhosted.org/packages/a8/51/0d66a7a600f0e33eaeafb65ce5693a90130d00072eaecb184881dd5bd37a/pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918", size = 1717259 }, - { url = "https://files.pythonhosted.org/packages/4a/d4/ec35826073e92b0b37c2df2075b0aa7abecc2d8217480a90e864f7f3e39f/pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d", size = 1898028 }, - { url = "https://files.pythonhosted.org/packages/82/0d/25e4087d8380fa696cbde556fa2694947038872d50cb01f86909d59fc4b4/pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c", size = 1838761 }, - { url = "https://files.pythonhosted.org/packages/cb/ac/42aa7ee25d816c9fed9fe1bf4ee11472ba8057814262c8f713fa010ed4d7/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b", size = 1789150 }, - { url = "https://files.pythonhosted.org/packages/0b/3e/d93ae7810b35d44d8777768b561001eff279040580aebf71ce9c8e9a613f/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243", size = 1773533 }, - { url = "https://files.pythonhosted.org/packages/f5/fd/a07dc6fcdf9e0b2f5e4c016dd74a188fc19311aceac89cee1fd2471e3b06/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38", size = 1975497 }, - { url = "https://files.pythonhosted.org/packages/b8/d1/9148ea8c18212a297c6b256e0197268523f30e02057474157784c9f5835e/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc", size = 2591911 }, - { url = "https://files.pythonhosted.org/packages/2a/fb/379309fab9af69d30c523978a971f8050d96bd3e36fb317b2c57bfd65548/pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392", size = 2100735 }, - { url = "https://files.pythonhosted.org/packages/6f/23/f100db088bb343a4a9e8d3085cb84d349bcf6004b101eebb5c8812226e23/pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c", size = 1900739 }, - { url = "https://files.pythonhosted.org/packages/10/4e/a4808cc751651329b7f0372454bbe486e79e7189b974748fba361abadecc/pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997", size = 1966597 }, - { url = "https://files.pythonhosted.org/packages/10/a8/1ce3a2af38c87890ad27d97f405cadab56aecdbf7e8e88dc39f45eeb63ab/pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e", size = 2119457 }, - { url = "https://files.pythonhosted.org/packages/60/8c/1da883ec849c75256210db8370906a151898e5dce5be85ced7881e980a44/pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d", size = 1717499 }, - { url = "https://files.pythonhosted.org/packages/59/04/475e9c2013aeb8d130d40818466b1f8eee017d2e3a5ecc3324211fe69c8f/pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c", size = 1923306 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, ] [[package]] @@ -1542,7 +1555,7 @@ wheels = [ [[package]] name = "pyinstaller" -version = "6.11.1" +version = "6.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "altgraph" }, @@ -1553,32 +1566,32 @@ dependencies = [ { name = "pywin32-ctypes", marker = "sys_platform == 'win32' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/d4/54f5f5c73b803e6256ea97ffc6ba8a305d9a5f57f85f9b00b282512bf18a/pyinstaller-6.11.1.tar.gz", hash = "sha256:491dfb4d9d5d1d9650d9507daec1ff6829527a254d8e396badd60a0affcb72ef", size = 4249772 } +sdist = { url = "https://files.pythonhosted.org/packages/10/c0/001e86a13f9f6104613f198721c72d377fa1fc2a09550cfe1ac9a1d12406/pyinstaller-6.12.0.tar.gz", hash = "sha256:1834797be48ce1b26015af68bdeb3c61a6c7500136f04e0fc65e468115dec777", size = 4267132 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/15/b0f1c0985ee32fcd2f6ad9a486ef94e4db3fef9af025a3655e76cb708009/pyinstaller-6.11.1-py3-none-macosx_10_13_universal2.whl", hash = "sha256:44e36172de326af6d4e7663b12f71dbd34e2e3e02233e181e457394423daaf03", size = 991780 }, - { url = "https://files.pythonhosted.org/packages/fd/0f/9f54cb18abe2b1d89051bc9214c0cb40d7b5f4049c151c315dacc067f4a2/pyinstaller-6.11.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6d12c45a29add78039066a53fb05967afaa09a672426072b13816fe7676abfc4", size = 711739 }, - { url = "https://files.pythonhosted.org/packages/32/f7/79d10830780eff8339bfa793eece1df4b2459e35a712fc81983e8536cc29/pyinstaller-6.11.1-py3-none-manylinux2014_i686.whl", hash = "sha256:ddc0fddd75f07f7e423da1f0822e389a42af011f9589e0269b87e0d89aa48c1f", size = 714053 }, - { url = "https://files.pythonhosted.org/packages/25/f7/9961ef02cdbd2dbb1b1a215292656bd0ea72a83aafd8fb6373513849711e/pyinstaller-6.11.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0d6475559c4939f0735122989611d7f739ed3bf02f666ce31022928f7a7e4fda", size = 719133 }, - { url = "https://files.pythonhosted.org/packages/6f/4d/7f854842a1ce798de762a0b0bc5d5a4fc26ad06164a98575dc3c54abed1f/pyinstaller-6.11.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:e21c7806e34f40181e7606926a14579f848bfb1dc52cbca7eea66eccccbfe977", size = 709591 }, - { url = "https://files.pythonhosted.org/packages/7f/e0/00d29fc90c3ba50620c61554e26ebb4d764569507be7cd1c8794aa696f9a/pyinstaller-6.11.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:32c742a24fe65d0702958fadf4040f76de85859c26bec0008766e5dbabc5b68f", size = 710068 }, - { url = "https://files.pythonhosted.org/packages/3e/57/d14b44a69f068d2caaee49d15e45f9fa0f37c6a2d2ad778c953c1722a1ca/pyinstaller-6.11.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:208c0ef6dab0837a0a273ea32d1a3619a208e3d1fe3fec3785eea71a77fd00ce", size = 714439 }, - { url = "https://files.pythonhosted.org/packages/88/01/256824bb57ca208099c86c2fb289f888ca7732580e91ced48fa14e5903b2/pyinstaller-6.11.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ad84abf465bcda363c1d54eafa76745d77b6a8a713778348377dc98d12a452f7", size = 710457 }, - { url = "https://files.pythonhosted.org/packages/7c/f0/98c9138f5f0ff17462f1ad6d712dcfa643b9a283d6238d464d8145bc139d/pyinstaller-6.11.1-py3-none-win32.whl", hash = "sha256:2e8365276c5131c9bef98e358fbc305e4022db8bedc9df479629d6414021956a", size = 1280261 }, - { url = "https://files.pythonhosted.org/packages/7d/08/f43080614b3e8bce481d4dfd580e579497c7dcdaf87656d9d2ad912e5796/pyinstaller-6.11.1-py3-none-win_amd64.whl", hash = "sha256:7ac83c0dc0e04357dab98c487e74ad2adb30e7eb186b58157a8faf46f1fa796f", size = 1340482 }, - { url = "https://files.pythonhosted.org/packages/ed/56/953c6594cb66e249563854c9cc04ac5a055c6c99d1614298feeaeaa9b87e/pyinstaller-6.11.1-py3-none-win_arm64.whl", hash = "sha256:35e6b8077d240600bb309ed68bb0b1453fd2b7ab740b66d000db7abae6244423", size = 1267519 }, + { url = "https://files.pythonhosted.org/packages/b2/73/b897a3fda99a14130111abdb978d63da14cbc9932497b5e5064c5fe28187/pyinstaller-6.12.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:68f1e4cecf88a6272063977fa2a2c69ad37cf568e5901769d7206d0314c74f47", size = 997954 }, + { url = "https://files.pythonhosted.org/packages/4a/bc/0929ed6aca3c5ff3f20f8cfd4f2f7e90f18c9465440e0d151d56d8170851/pyinstaller-6.12.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fea76fc9b55ffa730fcf90beb897cce4399938460b0b6f40507fbebfc752c753", size = 714097 }, + { url = "https://files.pythonhosted.org/packages/e1/9a/422d5eb04132e4a4735ca9099a53511324ff7d387b80231fe8dbd67bf322/pyinstaller-6.12.0-py3-none-manylinux2014_i686.whl", hash = "sha256:dac8a27988dbc33cdc34f2046803258bc3f6829de24de52745a5daa22bdba0f1", size = 724471 }, + { url = "https://files.pythonhosted.org/packages/64/1c/5028ba2e09f5b57f6792e9d88e888725224f8f016a07666e48664f6a9fcf/pyinstaller-6.12.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:83c7f3bde9871b4a6aa71c66a96e8ba5c21668ce711ed97f510b9382d10aac6c", size = 722753 }, + { url = "https://files.pythonhosted.org/packages/6f/d9/e7742caf4c4dc07d13e355ad2c14c7844c9bb2e66dea4f3386b4644bd106/pyinstaller-6.12.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:a69818815c6e0711c727edc30680cb1f81c691b59de35db81a2d9e0ae26a9ef1", size = 720906 }, + { url = "https://files.pythonhosted.org/packages/80/2b/14404f2dc95d1ec94d08879c62a76d5f26a176fab99fb023c2c70d2ff500/pyinstaller-6.12.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a2abf5fde31a8b38b6df7939bcef8ac1d0c51e97e25317ce3555cd675259750f", size = 716959 }, + { url = "https://files.pythonhosted.org/packages/11/a6/5c3a233cf19aa6d4caacf62f7ee1c728486cc20b73f5817be17485d7b7ff/pyinstaller-6.12.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:8e92e9873a616547bbabbb5a3a9843d5f2ab40c3d8b26810acdf0fe257bee4cf", size = 719414 }, + { url = "https://files.pythonhosted.org/packages/24/57/069d35236806b281a3331ef00ff94e43f3b91e4b36350de8b40b4baf9fd3/pyinstaller-6.12.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:aefe502d55c9cf6aeaed7feba80b5f8491ce43f8f2b5fe2d9aadca3ee5a05bc4", size = 715903 }, + { url = "https://files.pythonhosted.org/packages/4d/5f/857de8798836f9d16a620bd0a7c8899bba05b5fda7b3b4432762f148a86d/pyinstaller-6.12.0-py3-none-win32.whl", hash = "sha256:138856a5a503bb69c066377e0a22671b0db063e9cc14d5cf5c798a53561200d3", size = 1290980 }, + { url = "https://files.pythonhosted.org/packages/99/6e/d7d76d4d15f6351f1f942256633b795eec3d6c691d985869df1bf319cd9d/pyinstaller-6.12.0-py3-none-win_amd64.whl", hash = "sha256:0e62d3906309248409f215b386f33afec845214e69cc0f296b93222b26a88f43", size = 1348786 }, + { url = "https://files.pythonhosted.org/packages/47/c2/298ad6a3aa2cacb55cbc1f845068dc1e4a6c966082ffa0e19c69084cbc42/pyinstaller-6.12.0-py3-none-win_arm64.whl", hash = "sha256:0c271896a3a168f4f91827145702543db9c5427f4c7372a6df8c75925a3ac18a", size = 1289617 }, ] [[package]] name = "pyinstaller-hooks-contrib" -version = "2025.0" +version = "2025.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/2e/eb876675aa5338f6ebb2d86dd91cc530542e054e9b6bce1ee938c14fdc07/pyinstaller_hooks_contrib-2025.0.tar.gz", hash = "sha256:6dc0b55a1acaab2ffee36ed4a05b073aa0a22e46f25fb5c66a31e217454135ed", size = 146002 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/1b/dc256d42f4217db99b50d6d32dbbf841a41b9615506cde77d2345d94f4a5/pyinstaller_hooks_contrib-2025.1.tar.gz", hash = "sha256:130818f9e9a0a7f2261f1fd66054966a3a50c99d000981c5d1db11d3ad0c6ab2", size = 147043 } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/46/f0654c01d3e16ee652e62dd59c8e80b67842d83d9c103d69d0654507954a/pyinstaller_hooks_contrib-2025.0-py3-none-any.whl", hash = "sha256:3c0623799c3f81a37293127f485d65894c20fd718f722cb588785a3e52581ad1", size = 344671 }, + { url = "https://files.pythonhosted.org/packages/b7/48/833d67a585275e395f351e5787b4b7a8d462d87bca22a8c038f6ffdc2b3c/pyinstaller_hooks_contrib-2025.1-py3-none-any.whl", hash = "sha256:d3c799470cbc0bda60dcc8e6b4ab976777532b77621337f2037f558905e3a8e9", size = 346409 }, ] [[package]] @@ -1724,14 +1737,14 @@ wheels = [ [[package]] name = "pytest-check" -version = "2.4.1" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/15/d3/178a723f0420cf4e06fb6ddf43fc1ec68c1d0d4ea3db1ecf8f6df21b345f/pytest_check-2.4.1.tar.gz", hash = "sha256:5224efcef059bf7f0cda253f8d0f62704b4819ff48c93f51c675aea6a014f650", size = 28933 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/d7/32de906d890e3ccdad421b6db2a67ff94ebecb1f933e5f1038b69f007c30/pytest_check-2.5.0.tar.gz", hash = "sha256:3a6be8431c7720287958436d97a6b823eed5ae5ceb7da5572a0e4a9462feaf88", size = 26844 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/25/465756acbb66db47ad40e0be6b457d8644c7b9f882b2ff7f5e92dde07915/pytest_check-2.4.1-py3-none-any.whl", hash = "sha256:74f38938183880d9921aeb85662437d2b13e1e053e1bed7d186d54613d3068c7", size = 13789 }, + { url = "https://files.pythonhosted.org/packages/27/32/0a60070d720f15823348d0faf431c5851d299ec7d969a62ef0e75f5543bc/pytest_check-2.5.0-py3-none-any.whl", hash = "sha256:5c90dfe92e5e5870b34c1ed7a648aef5c2dfb2273acfba77f35ca648219a33f3", size = 15967 }, ] [[package]] @@ -1856,11 +1869,11 @@ wheels = [ [[package]] name = "pytz" -version = "2024.2" +version = "2025.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/31/3c70bf7603cc2dca0f19bdc53b4537a797747a58875b552c8c413d963a3f/pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", size = 319692 } +sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, + { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, ] [[package]] @@ -2139,7 +2152,7 @@ dependencies = [ { name = "attrs" }, { name = "catkin-pkg", marker = "sys_platform == 'linux' or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-noble') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-jammy' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-oracular') or (extra == 'group-9-snapcraft-dev-noble' and extra == 'group-9-snapcraft-dev-plucky') or (extra == 'group-9-snapcraft-dev-oracular' and extra == 'group-9-snapcraft-dev-plucky')" }, { name = "click" }, - { name = "craft-application" }, + { name = "craft-application", extra = ["remote"] }, { name = "craft-archives" }, { name = "craft-cli" }, { name = "craft-grammar" }, @@ -2249,13 +2262,13 @@ requires-dist = [ { name = "attrs" }, { name = "catkin-pkg", marker = "sys_platform == 'linux'", specifier = "==1.0.0" }, { name = "click", specifier = "==8.1.7" }, - { name = "craft-application", specifier = "==4.4.1" }, + { name = "craft-application", extras = ["remote"], specifier = "~=4.9" }, { name = "craft-archives", specifier = "~=2.0" }, { name = "craft-cli", specifier = "~=2.15.0" }, { name = "craft-grammar", specifier = ">=2.0.1,<3.0.0" }, { name = "craft-parts", specifier = "==2.4.1" }, - { name = "craft-platforms", specifier = "~=0.4" }, - { name = "craft-providers", specifier = ">=2.2.0,<3.0.0" }, + { name = "craft-platforms", specifier = "~=0.6" }, + { name = "craft-providers", specifier = "~=2.1" }, { name = "craft-store", specifier = ">=3.0.2,<4.0.0" }, { name = "cryptography", specifier = "==43.0.3" }, { name = "gnupg" }, @@ -2546,7 +2559,7 @@ wheels = [ [[package]] name = "sphinx-toolbox" -version = "3.8.1" +version = "3.8.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "apeye" }, @@ -2567,9 +2580,9 @@ dependencies = [ { name = "tabulate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/80/f837e85c8c216cdeef9b60393e4b00c9092a1e3d734106e0021abbf5930c/sphinx_toolbox-3.8.1.tar.gz", hash = "sha256:a4b39a6ea24fc8f10e24f052199bda17837a0bf4c54163a56f521552395f5e1a", size = 111977 } +sdist = { url = "https://files.pythonhosted.org/packages/39/91/61445ccb49f653f706230daf874f0fb4385c748f8e221f44881717c80c1d/sphinx_toolbox-3.8.2.tar.gz", hash = "sha256:2d65b9cee1d313c84cdb01317764791b1bdfbd6a1e6aa056e464137d18a6b9eb", size = 111998 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/d6/2a28ee4cbc158ae65afb2cfcb6895ef54d972ce1e167f8a63c135b14b080/sphinx_toolbox-3.8.1-py3-none-any.whl", hash = "sha256:53d8e77dd79e807d9ef18590c4b2960a5aa3c147415054b04c31a91afed8b88b", size = 194621 }, + { url = "https://files.pythonhosted.org/packages/e3/c4/be739b65467ff53bef26fc36478dbb0e01e289375983338d2247a8c2f87e/sphinx_toolbox-3.8.2-py3-none-any.whl", hash = "sha256:c65d03274f07a6bfb3f56123ae40e1e003a49709b7cda9b75d9e53e569d34581", size = 194693 }, ] [[package]] @@ -2788,11 +2801,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "75.8.0.20250110" +version = "75.8.0.20250210" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/42/5713e90d4f9683f2301d900f33e4fc2405ad8ac224dda30f6cb7f4cd215b/types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271", size = 48185 } +sdist = { url = "https://files.pythonhosted.org/packages/c3/20/794589df23b1e7d3c1a1f86285e749f2a83ef845d90f2461bc2912b8f989/types_setuptools-75.8.0.20250210.tar.gz", hash = "sha256:c1547361b2441f07c94e25dce8a068e18c611593ad4b6fdd727b1a8f5d1fda33", size = 48240 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/a3/dbfd106751b11c728cec21cc62cbfe7ff7391b935c4b6e8f0bdc2e6fd541/types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480", size = 71521 }, + { url = "https://files.pythonhosted.org/packages/2d/b4/5978a63dac80d9a653fdb73f58e08b208486d303f9a3ee481f0c807630de/types_setuptools-75.8.0.20250210-py3-none-any.whl", hash = "sha256:a217d7b4d59be04c29e23d142c959a0f85e71292fd3fc4313f016ca11f0b56dc", size = 71535 }, ] [[package]] From fafe3ab174e0d5f05e8ff460c16cc7665cf8d4c3 Mon Sep 17 00:00:00 2001 From: Imani Pelton Date: Fri, 14 Feb 2025 14:10:22 -0500 Subject: [PATCH 6/6] docs: pr feedback, fix rst spacing --- docs/explanation/remote-build.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/explanation/remote-build.rst b/docs/explanation/remote-build.rst index 46f4dd2c48..ce94a75a59 100644 --- a/docs/explanation/remote-build.rst +++ b/docs/explanation/remote-build.rst @@ -85,6 +85,7 @@ Current ``--build-for`` *************** **Type**: Comma-separated list of strings + **Default**: The architectures specified in your project file or your host architecture .. note:: @@ -124,6 +125,7 @@ Explicitly specify a project to upload to. ``--launchpad-timeout`` *********************** **Type**: Integer + **Default**: 0 Time, in seconds, to wait for Launchpad to complete a build. A time of 0 seconds will