diff --git a/pyproject.toml b/pyproject.toml index a85f5ebb..011c07e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ "python-magic>=0.4.27", "pytz", "pyyaml>=5.4.1", - "rapyuta-io>=2.1.1", + "rapyuta-io>=2.2.2", "requests>=2.20.0", "semver>=3.0.0", "setuptools", @@ -55,6 +55,7 @@ dependencies = [ "urllib3>=1.23", "waiting>=1.4.1", "yaspin==2.5.0", + "ansible-core>=2.13.13", ] [tool.uv] diff --git a/riocli/apply/__init__.py b/riocli/apply/__init__.py index f386c437..c8af371b 100644 --- a/riocli/apply/__init__.py +++ b/riocli/apply/__init__.py @@ -105,12 +105,15 @@ def apply( ) -> None: """Apply resource manifests. - The apply command provides the mechanism to create or update - resources on rapyuta.io. The resources are defined in YAML manifests allowing for - a declarative and repeatable process. The command can take multiple - files, paths or globs as arguments and parse the manifests to - create or update resources. It also supports Jinja templating - and secret management with sops. + The apply command provides the mechanism to create or update resources on + rapyuta.io. The resources are defined in YAML manifests allowing for a + declarative and repeatable process. The command can take multiple files, + paths or globs as arguments and parse the manifests to create or update + resources. + + The manifest files can optionally be templated using Jinja2 syntax. All the + Ansible filters are supported. The secret management with sops is also + supported. You can provide value files with the ``--values`` option and sops encrypted secret files with ``--secret`` option. @@ -146,6 +149,7 @@ def apply( Apply manifests with multiple value files. $ rio apply -v values1.yaml -v values2.yaml templates/** + """ glob_files, abs_values, abs_secrets = process_files_values_secrets( files, values, secrets @@ -257,8 +261,11 @@ def delete( The delete command provides the mechanism to remove resources on rapyuta.io defined in YAML manifests making the process declarative and repeatable. The command can take multiple files, paths or globs - as arguments and parse the manifests to remove resources. It also - supports Jinja templating and secret management with sops. + as arguments and parse the manifests to remove resources. + + The manifest files can optionally be templated using Jinja2 syntax. All the + Ansible filters are supported. The secret management with sops is also + supported. You can provide value files with the ``--values`` option and sops encrypted secret files with ``--secret`` option. @@ -291,6 +298,7 @@ def delete( Delete manifests with multiple value files. $ rio delete -v values1.yaml -v values2.yaml templates/** + """ glob_files, abs_values, abs_secrets = process_files_values_secrets( files, values, secrets diff --git a/riocli/apply/filters.py b/riocli/apply/filters.py index c44cc0bc..145468a1 100644 --- a/riocli/apply/filters.py +++ b/riocli/apply/filters.py @@ -14,6 +14,7 @@ """ Filters to use in the manifests. """ + import os from riocli.config import new_client diff --git a/riocli/apply/manifests/deployment-nonros-device.yaml b/riocli/apply/manifests/deployment-nonros-device.yaml index f7a4e581..3241bdb4 100644 --- a/riocli/apply/manifests/deployment-nonros-device.yaml +++ b/riocli/apply/manifests/deployment-nonros-device.yaml @@ -16,6 +16,13 @@ spec: kind: device nameOrGUID: device-docker restart: always # Options: [always, onfailure, never] + features: + params: + enabled: true + trees: + - config01 + - config02 + blockUntilSynced: true # Optional [true, false]. Default is false. envArgs: - name: TEST_KEY value: test_value diff --git a/riocli/apply/manifests/deployment.yaml b/riocli/apply/manifests/deployment.yaml index d4d21f26..5f0c43f3 100644 --- a/riocli/apply/manifests/deployment.yaml +++ b/riocli/apply/manifests/deployment.yaml @@ -287,6 +287,13 @@ spec: kind: device nameOrGUID: device-docker restart: always # Options: [always, onfailure, never] + features: + params: + enabled: true + trees: + - config01 + - config02 + blockUntilSynced: true # Optional [true, false]. Default is false. envArgs: - name: TEST_KEY value: test_value diff --git a/riocli/apply/manifests/device.yaml b/riocli/apply/manifests/device.yaml index d9ab273d..40c3eca8 100644 --- a/riocli/apply/manifests/device.yaml +++ b/riocli/apply/manifests/device.yaml @@ -64,10 +64,10 @@ spec: rosDistro: "melodic" # Options: ["kinetic", "melodic" (default), "noetic"] virtual: enabled: True # Required - product: "sootballs" # Required Options: ["sootballs", "flaptter", "oks", "platform"] + product: "sootballs" # Optional: ["sootballs", "flaptter", "oks"] arch: "amd64" # Options: ["amd64" (default), "arm64" ] os: "ubuntu" # Options: ["ubuntu" (default), "debian" ] - codename: "focal" # Options: ["bionic", "focal" (default), "jammy", "bullseye"] + codename: "focal" # Options: ["bionic", "focal" (default), "jammy", "noble", "bullseye"] highperf: False # Optional [True, False (default)] wait: True # Optional [True, False (default)] Wait until the device is ready. expireAfter: '12h' # Optional ["s", "m", "h", "d"] Expire after set duration. diff --git a/riocli/apply/util.py b/riocli/apply/util.py index fb969099..669fab34 100644 --- a/riocli/apply/util.py +++ b/riocli/apply/util.py @@ -22,6 +22,11 @@ import click import jinja2 from yaspin.api import Yaspin +from ansible.plugins.filter.core import FilterModule as CoreFilterModule +from ansible.plugins.filter.urls import FilterModule as URLFilterModule +from ansible.plugins.filter.urlsplit import FilterModule as URLSplitFilterModule +from ansible.plugins.filter.mathstuff import FilterModule as MathFilterModule +from ansible.plugins.filter.encryption import FilterModule as EncryptionFilterModule from riocli.apply.filters import FILTERS from riocli.constants import Colors @@ -149,4 +154,19 @@ def init_jinja_environment(): for name, func in FILTERS.items(): environment.filters[name] = func + for name, func in CoreFilterModule().filters().items(): + environment.filters[name] = func + + for name, func in URLFilterModule().filters().items(): + environment.filters[name] = func + + for name, func in URLSplitFilterModule().filters().items(): + environment.filters[name] = func + + for name, func in MathFilterModule().filters().items(): + environment.filters[name] = func + + for name, func in EncryptionFilterModule().filters().items(): + environment.filters[name] = func + return environment diff --git a/riocli/deployment/execute.py b/riocli/deployment/execute.py index b149a325..5ec81629 100644 --- a/riocli/deployment/execute.py +++ b/riocli/deployment/execute.py @@ -36,6 +36,14 @@ ) @click.option("--user", default="root") @click.option("--shell", default="/bin/bash") +@click.option("--timeout", default=300) +@click.option( + "--async", + "run_async", + is_flag=True, + default=False, + help="Run the command asynchronously.", +) @click.option( "--exec", "exec_name", default=None, help="Name of a executable in the component" ) @@ -44,7 +52,9 @@ def execute_command( user: str, shell: str, + timeout: int, exec_name: str, + run_async: bool, deployment_name: str, command: typing.List[str], ) -> None: @@ -61,6 +71,12 @@ def execute_command( shell is ``/bin/bash``. You can also specify the user using the ``--user`` option. The default user is ``root``. + To run the command asynchronously, set the --async flag to true. + The default value is false. + + To specify the timeout, use the --timeout + flag, providing the duration in seconds. The default value is 300. + Please ensure that you enclose the command in quotes to avoid any issues with the command parsing. @@ -112,10 +128,11 @@ def execute_command( user=user, shell=shell, command=command, - background=False, + background=run_async, deployment=deployment, exec_name=exec_name, device_name=deployment.spec.device.depends.nameOrGUID, + timeout=timeout, ) click.echo(response) except Exception as e: diff --git a/riocli/device/execute.py b/riocli/device/execute.py index 1768fd71..97ad1a19 100644 --- a/riocli/device/execute.py +++ b/riocli/device/execute.py @@ -28,19 +28,36 @@ help_options_color=Colors.GREEN, ) @click.option("--user", default="root") +@click.option("--timeout", default=300) @click.option("--shell", default="/bin/bash") +@click.option( + "--async", + "run_async", + is_flag=True, + default=False, + help="Run the command asynchronously.", +) @click.argument("device-name", type=str) @click.argument("command", nargs=-1) @name_to_guid def execute_command( - device_name: str, device_guid: str, user: str, shell: str, command: typing.List[str] + device_name: str, + device_guid: str, + user: str, + timeout: int, + shell: str, + run_async: bool, + command: typing.List[str], ) -> None: """Execute commands on a device. - You can specify the user and shell to run the command in. - To specify the user, use the --user flag. The default is - root. To specify the shell, use the --shell flag. The default - shell is /bin/bash. + You can specify the user, shell, run-async, and timeout options to customize + the command execution. To specify the user, use the --user flag. + The default is 'root'. To specify the shell, use the --shell flag. + The default shell is '/bin/bash'. To run the command asynchronously, + set the --async flag to true. The default value is false. To + specify the timeout, use the --timeout flag, providing the duration + in seconds. The default value is 300. Make sure you put your command in quotes to avoid any issues. @@ -54,7 +71,8 @@ def execute_command( user=user, shell=shell, command=command, - background=False, + background=run_async, + timeout=timeout, ) click.secho(response) diff --git a/riocli/device/model.py b/riocli/device/model.py index ed077f86..7734b845 100644 --- a/riocli/device/model.py +++ b/riocli/device/model.py @@ -62,7 +62,7 @@ def apply(self, *args, **kwargs) -> ApplyResult: # Create the HWIL (virtual) device and then generate the labels # to store HWIL metadata in rapyuta.io device. - hwil_response = create_hwil_device(self.spec, self.metadata) + hwil_response = create_hwil_device(virtual, self.metadata) labels = make_device_labels_from_hwil_device(hwil_response) # Create the rapyuta.io device with labels if the @@ -100,10 +100,15 @@ def delete(self, *args, **kwargs) -> None: try: device = find_device_by_name(client, self.metadata.name) except DeviceNotFound: + # If it was a virtual device, try deleting the HWIL + # resource if it is present and raise ResourceNotFound. + if self.spec.get("virtual", {}).get("enabled", False): + delete_hwil_device(self.spec.virtual, self.metadata) + raise ResourceNotFound if self.spec.get("virtual", {}).get("enabled", False): - delete_hwil_device(device) + delete_hwil_device(self.spec.virtual, self.metadata) device.delete() diff --git a/riocli/device/util.py b/riocli/device/util.py index 70e4f2be..b19713ff 100644 --- a/riocli/device/util.py +++ b/riocli/device/util.py @@ -226,26 +226,67 @@ def is_remote_path(src, devices=None): return None, src +def sanitize_hwil_device_name(name: str) -> str: + if len(name) == 0: + return name + + name = name[0:50] + name = trim_suffix(name) + name = trim_prefix(name) + + r = "" + for c in name: + if c.isalnum() or c in ["-", "_"]: + r = r + c + + return r + + +def generate_hwil_device_name( + name: str, + product: str, + user: str, + project_id: str, +) -> str: + """Generates a valid hardware-in-the-loop device name.""" + project = project_id.split("project-")[1] + device_name = f"{name}-{product}-{user}-{project}" + if not product: + device_name = f"{name}-{user}-{project}" + + return sanitize_hwil_device_name(device_name) + + def create_hwil_device(spec: dict, metadata: dict) -> Munch: """Create a new hardware-in-the-loop device.""" - virtual = spec["virtual"] - os = virtual["os"] - codename = virtual["codename"] - arch = virtual["arch"] - product = virtual["product"] + os = spec["os"] + codename = spec["codename"] + arch = spec["arch"] + product = spec.get("product") name = metadata["name"] - labels = make_hwil_labels(virtual, name) - device_name = sanitize_hwil_device_name(f"{name}-{product}-{labels['user']}") + labels = make_hwil_labels(spec, name) + device_name = generate_hwil_device_name( + name, product, labels["user"], labels["project"] + ) client = new_hwil_client() + device = None try: device_id = find_device_id(client, device_name) - return client.get_device(device_id) + device = client.get_device(device_id) + if device and device.status != "FAILED": + return device except DeviceNotFound: pass # Do nothing and proceed. + if device and device.status == "FAILED": + try: + client.delete_device(device.id) + except Exception: + raise Exception("cannot delete previously failed device") + response = client.create_device(device_name, arch, os, codename, labels) client.poll_till_device_ready(response.id, sleep_interval=5, retry_limit=12) @@ -255,28 +296,21 @@ def create_hwil_device(spec: dict, metadata: dict) -> Munch: return response -def delete_hwil_device(device: Device) -> None: - """Delete a hardware-in-the-loop device. - - This is a helper method that deletes a HWIL device - associated with the rapyuta.io device. - """ - labels = device.get("labels", {}) - if not labels: - raise DeviceNotFound(message="hwil device not found") - - device_id = None - - for label in labels: - if label["key"] == "hwil_device_id": - device_id = label["value"] - break - - if device_id is None: - raise DeviceNotFound(message="hwil device not found") +def delete_hwil_device(spec: dict, metadata: dict) -> None: + """Delete a hardware-in-the-loop device by name.""" + product = spec.get("product") + name = metadata["name"] + labels = make_hwil_labels(spec, name) + device_name = generate_hwil_device_name( + name, product, labels["user"], labels["project"] + ) client = new_hwil_client() - client.delete_device(device_id) + devices = client.list_devices(query={"name": device_name}) + if not devices: + return + + client.delete_device(devices[0].id) def execute_onboard_command(device_id: int, onboard_command: str) -> None: @@ -299,43 +333,26 @@ def make_hwil_labels(spec: dict, device_name: str) -> typing.Dict: "user": user_email, "organization": data["organization_id"], "project": data["project_id"], - "product": spec["product"], "rapyuta_device_name": device_name, "expiry_after": spec["expireAfter"], } - if spec.get("highperf", False): - labels["highperf"] = "" + if "product" in spec: + labels["product"] = spec["product"] return labels def make_device_labels_from_hwil_device(d: Munch) -> dict: return { - "hwil_device_id": str(d.id), - "hwil_device_name": d.name, "arch": d.architecture, "flavor": d.flavor, + "hwil_device_id": str(d.id), + "hwil_device_name": d.name, "hwil_device_username": d.username, } -def sanitize_hwil_device_name(name): - if len(name) == 0: - return name - - name = name[0:50] - name = trim_suffix(name) - name = trim_prefix(name) - - r = "" - for c in name: - if c.isalnum() or c in ["-", "_"]: - r = r + c - - return r - - def wait_until_online(device: Device, timeout: int = 600) -> None: """Wait until the device is online. diff --git a/riocli/hwil/create.py b/riocli/hwil/create.py index fa3dd489..2f6be1cf 100644 --- a/riocli/hwil/create.py +++ b/riocli/hwil/create.py @@ -46,7 +46,7 @@ "--codename", "codename", help="Code name of the OS", - type=click.Choice(["bionic", "focal", "jammy", "bullseye"]), + type=click.Choice(["bionic", "focal", "jammy", "noble", "bullseye"]), default="focal", ) @click.option( diff --git a/riocli/hwilclient/client.py b/riocli/hwilclient/client.py index eba5982e..81f56560 100644 --- a/riocli/hwilclient/client.py +++ b/riocli/hwilclient/client.py @@ -63,14 +63,15 @@ class Client(object): ARCH_OS_DICT = { "amd64": { "ubuntu": { - "bionic": "ubuntu-bionic-ros-melodic-py3", - "focal": "ubuntu-focal-ros-noetic-py3", - "jammy": "ubuntu-jammy-plain-py3", + "bionic": "bionic", + "focal": "focal", + "jammy": "jammy", + "noble": "noble", } }, "arm64": { - "ubuntu": {"focal": "ubuntu-focal-ros-noetic-py3"}, - "debian": {"bullseye": "debian-bullseye-docker"}, + "ubuntu": {"focal": "focal"}, + "debian": {"bullseye": "bullseye"}, }, } @@ -211,11 +212,17 @@ def poll_till_device_ready( msg = f"Retries exhausted: Tried {retry_limit} times with {sleep_interval}s interval." raise RetriesExhausted(msg) - def list_devices(self: Client): + def list_devices(self: Client, query: dict = None) -> Munch: """Fetch all HWIL devices""" url = f"{self._host}/device/" headers = self._get_auth_header() - response = RestClient(url).method(HttpMethod.GET).headers(headers).execute() + response = ( + RestClient(url) + .method(HttpMethod.GET) + .headers(headers) + .query_param(query or {}) + .execute() + ) handle_server_errors(response) data = json.loads(response.text) diff --git a/riocli/jsonschema/schemas/deployment-schema.yaml b/riocli/jsonschema/schemas/deployment-schema.yaml index a0659565..0d580801 100755 --- a/riocli/jsonschema/schemas/deployment-schema.yaml +++ b/riocli/jsonschema/schemas/deployment-schema.yaml @@ -174,8 +174,12 @@ definitions: type: string disableSync: type: boolean + blockUntilSynced: + type: boolean + default: false required: - enabled + - trees type: object additionalProperties: false @@ -211,6 +215,7 @@ definitions: type: boolean required: - enabled + - trees envArgs: type: array items: diff --git a/riocli/jsonschema/schemas/device-schema.yaml b/riocli/jsonschema/schemas/device-schema.yaml index 45f9433a..2c82d8df 100644 --- a/riocli/jsonschema/schemas/device-schema.yaml +++ b/riocli/jsonschema/schemas/device-schema.yaml @@ -76,7 +76,6 @@ definitions: - sootballs - flaptter - oks - - platform arch: type: string enum: @@ -106,7 +105,6 @@ definitions: default: 12h required: - enabled - - product dependencies: docker: oneOf: diff --git a/riocli/utils/execute.py b/riocli/utils/execute.py index 099cfc1f..e6409552 100644 --- a/riocli/utils/execute.py +++ b/riocli/utils/execute.py @@ -30,6 +30,7 @@ def run_on_device( deployment: str = None, exec_name: str = None, device_name: str = None, + timeout: int = 300, ) -> str: client = new_client() @@ -58,7 +59,9 @@ def run_on_device( if deployment: cmd = 'script -q -c "dectl exec {} -- {}"'.format(exec_name, cmd) - return device.execute_command(Command(cmd, shell=shell, bg=background, runas=user)) + return device.execute_command( + Command(cmd, shell=shell, bg=background, runas=user, timeout=timeout) + ) def apply_func( diff --git a/uv.lock b/uv.lock index 020e1060..4159ed62 100644 --- a/uv.lock +++ b/uv.lock @@ -10,6 +10,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", size = 13857 }, ] +[[package]] +name = "ansible-core" +version = "2.13.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "resolvelib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/ae/6a63fffda71543858ea0e0d78698d86e7cbdbd91b00b5335fa3f10031246/ansible-core-2.13.13.tar.gz", hash = "sha256:7ad2d8c0a5fa4a59de1809a5f96d2dbf511189c834116f5c72aec9730b51074b", size = 3146514 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/c6/c5b0da259e583dbeaefdccdfe0a1e4fd7a342dba00e263183856290c7fc9/ansible_core-2.13.13-py3-none-any.whl", hash = "sha256:f50220254b8e13a79b68e68e759f5bf89f3f3584c907737985a017c699b1c3b6", size = 2115491 }, +] + [[package]] name = "argparse" version = "1.4.0" @@ -61,6 +77,83 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, + { url = "https://files.pythonhosted.org/packages/48/08/15bf6b43ae9bd06f6b00ad8a91f5a8fe1069d4c9fab550a866755402724e/cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", size = 182457 }, + { url = "https://files.pythonhosted.org/packages/c2/5b/f1523dd545f92f7df468e5f653ffa4df30ac222f3c884e51e139878f1cb5/cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", size = 425932 }, + { url = "https://files.pythonhosted.org/packages/53/93/7e547ab4105969cc8c93b38a667b82a835dd2cc78f3a7dad6130cfd41e1d/cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", size = 448585 }, + { url = "https://files.pythonhosted.org/packages/56/c4/a308f2c332006206bb511de219efeff090e9d63529ba0a77aae72e82248b/cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", size = 456268 }, + { url = "https://files.pythonhosted.org/packages/ca/5b/b63681518265f2f4060d2b60755c1c77ec89e5e045fc3773b72735ddaad5/cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", size = 436592 }, + { url = "https://files.pythonhosted.org/packages/bb/19/b51af9f4a4faa4a8ac5a0e5d5c2522dcd9703d07fac69da34a36c4d960d3/cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", size = 446512 }, + { url = "https://files.pythonhosted.org/packages/e2/63/2bed8323890cb613bbecda807688a31ed11a7fe7afe31f8faaae0206a9a3/cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", size = 171576 }, + { url = "https://files.pythonhosted.org/packages/2f/70/80c33b044ebc79527447fd4fbc5455d514c3bb840dede4455de97da39b4d/cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", size = 181229 }, + { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220 }, + { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605 }, + { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910 }, + { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200 }, + { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565 }, + { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635 }, + { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218 }, + { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486 }, + { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911 }, + { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632 }, + { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820 }, + { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290 }, +] + [[package]] name = "charset-normalizer" version = "3.4.0" @@ -239,6 +332,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "cryptography" +version = "44.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 }, + { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 }, + { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 }, + { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 }, + { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 }, + { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 }, + { url = "https://files.pythonhosted.org/packages/4e/d5/9cc182bf24c86f542129565976c21301d4ac397e74bf5a16e48241aab8a6/cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385", size = 4164756 }, + { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 }, + { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 }, + { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 }, + { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 }, + { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 }, + { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 }, + { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 }, + { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 }, + { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 }, + { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 }, + { url = "https://files.pythonhosted.org/packages/31/d9/90409720277f88eb3ab72f9a32bfa54acdd97e94225df699e7713e850bd4/cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba", size = 4165207 }, + { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 }, + { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 }, + { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 }, + { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 }, + { url = "https://files.pythonhosted.org/packages/77/d4/fea74422326388bbac0c37b7489a0fcb1681a698c3b875959430ba550daa/cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731", size = 3338857 }, + { url = "https://files.pythonhosted.org/packages/1a/aa/ba8a7467c206cb7b62f09b4168da541b5109838627f582843bbbe0235e8e/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4", size = 3850615 }, + { url = "https://files.pythonhosted.org/packages/89/fa/b160e10a64cc395d090105be14f399b94e617c879efd401188ce0fea39ee/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756", size = 4081622 }, + { url = "https://files.pythonhosted.org/packages/47/8f/20ff0656bb0cf7af26ec1d01f780c5cfbaa7666736063378c5f48558b515/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c", size = 3867546 }, + { url = "https://files.pythonhosted.org/packages/38/d9/28edf32ee2fcdca587146bcde90102a7319b2f2c690edfa627e46d586050/cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa", size = 4090937 }, + { url = "https://files.pythonhosted.org/packages/cc/9d/37e5da7519de7b0b070a3fedd4230fe76d50d2a21403e0f2153d70ac4163/cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", size = 3128774 }, +] + [[package]] name = "dictdiffer" version = "0.9.0" @@ -546,6 +678,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + [[package]] name = "pygments" version = "2.18.0" @@ -703,7 +844,7 @@ wheels = [ [[package]] name = "rapyuta-io" -version = "2.1.1" +version = "2.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, @@ -714,16 +855,17 @@ dependencies = [ { name = "six" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/ab/dee990947ba02dbeaf8abf1b051ce7db0a9a5d2f846b7ab4512b3014ab1f/rapyuta_io-2.1.1.tar.gz", hash = "sha256:ddb1b60f6982f2628f6ec37f3a5e15b0cad6b0f9a0b461c3425c529da34e5c19", size = 51811 } +sdist = { url = "https://files.pythonhosted.org/packages/e6/51/c497160a29357ecbbb521bc3803b76867a833571109609334a5425ee27a7/rapyuta_io-2.2.2.tar.gz", hash = "sha256:2d569516b10baa83734a036223cb9599ad7a41a01021157b2e92450eb44a21c8", size = 52407 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/b3/c58a2f7f161495891ccabf2fc872e72a53b7637efc07066e6690cc93476d/rapyuta_io-2.1.1-py3-none-any.whl", hash = "sha256:1f9b6fa067efd4ff1801eaa2b65c36f5ddeabef722f8c3b2d4b0b428dca1a708", size = 60304 }, + { url = "https://files.pythonhosted.org/packages/1e/7b/9feb722161bbd9abebe6f7fbfa48c408023384b17b8b6c6b5caa62153c51/rapyuta_io-2.2.2-py3-none-any.whl", hash = "sha256:31faa0cfe150ef44fe21e730d35275ff81f0a268ca71b55b38bf8dfc68517b0c", size = 60873 }, ] [[package]] name = "rapyuta-io-cli" -version = "9.0.4" +version = "9.4.0" source = { editable = "." } dependencies = [ + { name = "ansible-core" }, { name = "argparse" }, { name = "click" }, { name = "click-completion" }, @@ -768,6 +910,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "ansible-core", specifier = ">=2.13.13" }, { name = "argparse", specifier = ">=1.4.0" }, { name = "click", specifier = ">=8.0.1" }, { name = "click-completion", specifier = ">=0.5.2" }, @@ -792,7 +935,7 @@ requires-dist = [ { name = "python-magic", specifier = ">=0.4.27" }, { name = "pytz" }, { name = "pyyaml", specifier = ">=5.4.1" }, - { name = "rapyuta-io", specifier = ">=2.1.1" }, + { name = "rapyuta-io", specifier = ">=2.2.2" }, { name = "requests", specifier = ">=2.20.0" }, { name = "semver", specifier = ">=3.0.0" }, { name = "setuptools" }, @@ -838,6 +981,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "resolvelib" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/20/9541749d77aebf66dd92e2b803f38a50e3a5c76e7876f45eb2b37e758d82/resolvelib-0.8.1.tar.gz", hash = "sha256:c6ea56732e9fb6fca1b2acc2ccc68a0b6b8c566d8f3e78e0443310ede61dbd37", size = 17308 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/c0/46cfa3f56e43033b705965120058c018375600fa8fdb44c4e53d75820673/resolvelib-0.8.1-py2.py3-none-any.whl", hash = "sha256:d9b7907f055c3b3a2cfc56c914ffd940122915826ff5fb5b1de0c99778f4de98", size = 16113 }, +] + [[package]] name = "rpds-py" version = "0.20.0"