diff --git a/ci_jobs_trigger/libs/addons_webhook_trigger/addons_webhook_trigger.py b/ci_jobs_trigger/libs/addons_webhook_trigger/addons_webhook_trigger.py index efcde9e..0d13aeb 100644 --- a/ci_jobs_trigger/libs/addons_webhook_trigger/addons_webhook_trigger.py +++ b/ci_jobs_trigger/libs/addons_webhook_trigger/addons_webhook_trigger.py @@ -1,9 +1,7 @@ import re -import gitlab - from ci_jobs_trigger.libs.utils.general import trigger_ci_job -from ci_jobs_trigger.utils.general import get_config, AddonsWebhookTriggerError +from ci_jobs_trigger.utils.general import get_config, get_gitlab_api, AddonsWebhookTriggerError ADDONS_WEBHOOK_JOBS_TRIGGER_CONFIG_STR = "ADDONS_WEBHOOK_JOBS_TRIGGER_CONFIG" @@ -12,12 +10,6 @@ class RepositoryNotFoundError(Exception): pass -def get_gitlab_api(url, token): - gitlab_api = gitlab.Gitlab(url=url, private_token=token, ssl_verify=False) - gitlab_api.auth() - return gitlab_api - - def repo_data_from_config(repository_name, config_data): data = config_data["repositories"].get(repository_name) if not data: diff --git a/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/README.md b/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/README.md index 6ba911c..2497dae 100644 --- a/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/README.md +++ b/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/README.md @@ -12,6 +12,8 @@ Processed versions will be stored in `processed_versions_file_path` ### Configuration - Create a yaml file [example](../../../../config-examples/zstream-trigger-config.example.yaml) and update the relevant fields. - Export `OPENSHIFT_CI_ZSTREAM_TRIGGER_CONFIG` environment variable which points to the configuration yaml file +- Z-stream supports triggering jobs for both OCP and ROSA versions. See [config file](../../../../config-examples/zstream-trigger-config.example.yaml) for examples on how to provide these versions. + ```bash export OPENSHIFT_CI_ZSTREAM_TRIGGER_CONFIG="" diff --git a/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/zstream_trigger.py b/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/zstream_trigger.py index 3b0de3d..a12f375 100644 --- a/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/zstream_trigger.py +++ b/ci_jobs_trigger/libs/openshift_ci/zstream_trigger/zstream_trigger.py @@ -3,17 +3,20 @@ import logging import time import datetime +import yaml from croniter import CroniterBadCronError, croniter from pyhelper_utils.general import stt, tts from typing import Dict, List from ocp_utilities.cluster_versions import get_accepted_cluster_versions +from ocm_python_wrapper.ocm_client import OCMPythonClient +from rosa.rosa_versions import get_rosa_versions from semver import Version import packaging.version from ci_jobs_trigger.utils.constant import DAYS_TO_SECONDS -from ci_jobs_trigger.utils.general import get_config, send_slack_message +from ci_jobs_trigger.utils.general import get_config, get_gitlab_api, send_slack_message from ci_jobs_trigger.libs.openshift_ci.utils.general import openshift_ci_trigger_job @@ -55,6 +58,64 @@ def already_processed_version( return False +def get_gitlab_project_file(config: Dict, ocm_env: str) -> Dict: + api = get_gitlab_api(url=config["gitlab_url"], token=config["gitlab_token"]) + project = api.projects.get(config["gitlab_project"]) + project_file_content = project.files.get( + file_path=f"config/{'prod' if ocm_env == 'production' else ocm_env}.yaml", ref="master" + ) + return yaml.safe_load(project_file_content.decode().decode("utf-8")) + + +def is_rosa_version_enabled(config: Dict, version: str, channel: str, ocm_env: str, logger: logging.Logger) -> bool: + processed_versions_file_path = config["processed_versions_file_path"] + processed_versions_file_content = processed_versions_file( + processed_versions_file_path=processed_versions_file_path, logger=logger + ) + channel_version = f"{channel}-{version}" + enable_channel_version_key = f"{channel_version}-{ocm_env}-enable" + if processed_versions_file_content.get(enable_channel_version_key): + return True + + project_file_content = get_gitlab_project_file(config=config, ocm_env=ocm_env) + for channel_groups in project_file_content.get("channel_groups", []): + if channel_version in channel_groups.get("channels", []): + processed_versions_file_content[enable_channel_version_key] = True + with open(processed_versions_file_path, "w") as fd: + json.dump(processed_versions_file_content, fd) + return True + + return False + + +def filter_rosa_versions_by_channel(all_rosa_versions: Dict, rosa_channel: str, version_channel: str) -> Dict: + filtered_rosa_dict: Dict[str, Dict[str, List[str]]] = {version_channel: {}} + for version_key, versions in all_rosa_versions[rosa_channel].items(): + filtered_rosa_dict[version_channel][version_key] = [ver for ver in versions if version_channel in ver] + + return filtered_rosa_dict + + +def get_all_rosa_versions( + ocm_token: str, ocm_env: str, rosa_channel: str, version_channel: str, aws_region: str +) -> Dict[str, Dict[str, List[str]]]: + ocm_client = OCMPythonClient( + token=ocm_token, + endpoint="https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token", + api_host=ocm_env, + discard_unknown_keys=True, + ).client + _all_rosa_versions = get_rosa_versions(ocm_client=ocm_client, aws_region=aws_region, channel_group=rosa_channel) + + # To filter 'rc' and 'ec' versions from 'candidate' channel-group versions + if not rosa_channel == version_channel: + return filter_rosa_versions_by_channel( + all_rosa_versions=_all_rosa_versions, rosa_channel=rosa_channel, version_channel=version_channel + ) + + return _all_rosa_versions + + def trigger_jobs(config: Dict, jobs: List, logger: logging.Logger, zstream_version: str) -> bool: failed_triggers_jobs: List = [] successful_triggers_jobs: List = [] @@ -141,37 +202,75 @@ def process_and_trigger_jobs(logger: logging.Logger, version: str | None = None) trigger_res[_version] = "No jobs found" continue + _rosa_env: str = "" + + # If '___' found in any version, it will be considered as ROSA version + if "___" in _version: + _version, _rosa_env = _version.split("___")[:2] + if "-" in _version: _wanted_version, _version_channel = _version.split("-") else: _wanted_version = _version _version_channel = "stable" - _all_versions = get_accepted_cluster_versions() - _latest_version = _all_versions.get(_version_channel)[_wanted_version][0] + _base_version = f"{_version}-{_rosa_env}" if _rosa_env else _version + _rosa_channel = "candidate" if _rosa_env and _version_channel in ["rc", "ec"] else _version_channel + + if _rosa_env and config.get("gitlab_project"): + if not is_rosa_version_enabled( + config=config, version=_wanted_version, channel=_rosa_channel, ocm_env=_rosa_env, logger=logger + ): + logger.info( + f"{LOG_PREFIX} Version {_wanted_version}:{_version_channel} not enabled for ROSA {_rosa_env}, skipping" + ) + trigger_res[_base_version] = "Not enabled for ROSA" + continue + + _all_versions = ( + get_all_rosa_versions( + ocm_env=_rosa_env, + ocm_token=config["ocm_token"], + rosa_channel=_rosa_channel, + version_channel=_version_channel, + aws_region=config["aws_region"], + ) + if _rosa_env + else get_accepted_cluster_versions() + ) + + if not (wanted_version_list := _all_versions.get(_version_channel, {}).get(_wanted_version)): + logger.info( + f"{LOG_PREFIX} Version {_wanted_version}:{_version_channel} {_rosa_env} not yet released, skipping" + ) + trigger_res[_base_version] = "Not released" + continue + + _latest_version = wanted_version_list[0] if already_processed_version( - base_version=_version, + base_version=_base_version, new_version=_latest_version, processed_versions_file_path=_processed_versions_file_path, logger=logger, ): - logger.info(f"{LOG_PREFIX} Version {_wanted_version}:{_version_channel} already processed, skipping") - trigger_res[_version] = "Already processed" + logger.info( + f"{LOG_PREFIX} Version {_wanted_version}:{_version_channel} {_rosa_env} already processed, skipping" + ) + trigger_res[_base_version] = "Already processed" continue logger.info( - f"{LOG_PREFIX} New Z-stream version {_latest_version}:{_version_channel} found, triggering jobs: {_jobs}" + f"{LOG_PREFIX} New Z-stream version {_latest_version}:{_version_channel} {_rosa_env} found, triggering jobs: {_jobs}" ) if trigger_jobs(config=config, jobs=_jobs, logger=logger, zstream_version=_latest_version): update_processed_version( - base_version=_version, + base_version=_base_version, version=str(_latest_version), processed_versions_file_path=_processed_versions_file_path, logger=logger, ) - trigger_res[_version] = "Triggered" + trigger_res[_base_version] = "Triggered" continue - return trigger_res diff --git a/ci_jobs_trigger/tests/zstream_trigger/manifests/versions.py b/ci_jobs_trigger/tests/zstream_trigger/manifests/ocp_versions.py similarity index 99% rename from ci_jobs_trigger/tests/zstream_trigger/manifests/versions.py rename to ci_jobs_trigger/tests/zstream_trigger/manifests/ocp_versions.py index 1f563bf..5d0929c 100644 --- a/ci_jobs_trigger/tests/zstream_trigger/manifests/versions.py +++ b/ci_jobs_trigger/tests/zstream_trigger/manifests/ocp_versions.py @@ -1,4 +1,4 @@ -VERSIONS = { +OCP_VERSIONS = { "ec": {"4.16": ["4.16.0-ec.2", "4.16.0-ec.1", "4.16.0-ec.0"]}, "rc": { "4.15": [ diff --git a/ci_jobs_trigger/tests/zstream_trigger/manifests/rosa_versions.py b/ci_jobs_trigger/tests/zstream_trigger/manifests/rosa_versions.py new file mode 100644 index 0000000..86c7dfb --- /dev/null +++ b/ci_jobs_trigger/tests/zstream_trigger/manifests/rosa_versions.py @@ -0,0 +1,202 @@ +ROSA_VERSIONS = { + "candidate": { + "4.17": [ + "4.17.0-rc.2", + "4.17.0-rc.1", + "4.17.0-rc.0", + "4.17.0-ec.3", + "4.17.0-ec.2", + "4.17.0-ec.1", + "4.17.0-ec.0", + ], + "4.16": [ + "4.16.12", + "4.16.11", + "4.16.10", + "4.16.9", + "4.16.8", + "4.16.7", + "4.16.6", + "4.16.5", + "4.16.4", + "4.16.3", + "4.16.2", + "4.16.1", + "4.16.0", + "4.16.0-rc.9", + "4.16.0-rc.6", + "4.16.0-rc.5", + "4.16.0-rc.4", + "4.16.0-rc.3", + "4.16.0-rc.2", + "4.16.0-rc.1", + "4.16.0-rc.0", + "4.16.0-ec.6", + "4.16.0-ec.5", + "4.16.0-ec.4", + "4.16.0-ec.3", + "4.16.0-ec.2", + "4.16.0-ec.1", + "4.16.0-ec.0", + ], + "4.15": [ + "4.15.32", + "4.15.31", + "4.15.30", + "4.15.29", + "4.15.28", + "4.15.27", + "4.15.26", + "4.15.25", + "4.15.24", + "4.15.23", + "4.15.22", + "4.15.21", + "4.15.20", + "4.15.19", + "4.15.18", + "4.15.17", + "4.15.16", + "4.15.15", + "4.15.14", + "4.15.13", + "4.15.12", + "4.15.11", + "4.15.10", + "4.15.9", + "4.15.8", + "4.15.7", + "4.15.6", + "4.15.5", + "4.15.3", + "4.15.2", + "4.15.0", + "4.15.0-rc.8", + "4.15.0-rc.7", + "4.15.0-rc.5", + "4.15.0-rc.4", + "4.15.0-rc.3", + "4.15.0-rc.2", + "4.15.0-rc.1", + "4.15.0-rc.0", + "4.15.0-ec.3", + "4.15.0-ec.2", + "4.15.0-ec.1", + "4.15.0-ec.0", + ], + "4.14": [ + "4.14.36", + "4.14.35", + "4.14.34", + "4.14.33", + "4.14.32", + "4.14.31", + "4.14.30", + "4.14.29", + "4.14.28", + "4.14.27", + "4.14.26", + "4.14.25", + "4.14.24", + "4.14.23", + "4.14.22", + "4.14.21", + "4.14.20", + "4.14.19", + "4.14.18", + "4.14.17", + "4.14.16", + "4.14.15", + "4.14.14", + "4.14.13", + "4.14.12", + "4.14.11", + "4.14.10", + "4.14.9", + "4.14.8", + "4.14.7", + "4.14.6", + "4.14.5", + "4.14.4", + "4.14.3", + "4.14.2", + "4.14.1", + "4.14.0", + "4.14.0-rc.7", + "4.14.0-rc.6", + "4.14.0-rc.5", + "4.14.0-rc.4", + "4.14.0-rc.3", + "4.14.0-rc.2", + "4.14.0-rc.1", + "4.14.0-rc.0", + "4.14.0-ec.4", + "4.14.0-ec.3", + "4.14.0-ec.2", + "4.14.0-ec.1", + "4.14.0-ec.0", + ], + "4.13": [ + "4.13.49", + "4.13.48", + "4.13.46", + "4.13.45", + "4.13.44", + "4.13.43", + "4.13.42", + "4.13.41", + "4.13.40", + "4.13.39", + "4.13.38", + "4.13.37", + "4.13.36", + "4.13.35", + "4.13.34", + "4.13.33", + "4.13.32", + "4.13.31", + "4.13.30", + "4.13.29", + "4.13.28", + "4.13.27", + "4.13.26", + "4.13.25", + "4.13.24", + "4.13.23", + "4.13.22", + "4.13.21", + "4.13.19", + "4.13.18", + "4.13.17", + "4.13.16", + "4.13.15", + "4.13.14", + "4.13.13", + "4.13.12", + "4.13.11", + "4.13.10", + "4.13.9", + "4.13.8", + "4.13.7", + "4.13.6", + "4.13.5", + "4.13.4", + "4.13.3", + "4.13.2", + "4.13.1", + "4.13.0", + "4.13.0-rc.8", + "4.13.0-rc.7", + "4.13.0-rc.6", + "4.13.0-rc.5", + "4.13.0-rc.4", + "4.13.0-rc.3", + "4.13.0-rc.2", + "4.13.0-rc.0", + "4.13.0-ec.4", + "4.13.0-ec.3", + "4.13.0-ec.2", + "4.13.0-ec.1", + ], + } +} diff --git a/ci_jobs_trigger/tests/zstream_trigger/test_zstream_trigger.py b/ci_jobs_trigger/tests/zstream_trigger/test_zstream_trigger.py index 595381e..a4cfbe1 100644 --- a/ci_jobs_trigger/tests/zstream_trigger/test_zstream_trigger.py +++ b/ci_jobs_trigger/tests/zstream_trigger/test_zstream_trigger.py @@ -7,12 +7,14 @@ OPENSHIFT_CI_ZSTREAM_TRIGGER_CONFIG_OS_ENV_STR, process_and_trigger_jobs, ) -from ci_jobs_trigger.tests.zstream_trigger.manifests.versions import VERSIONS +from ci_jobs_trigger.tests.zstream_trigger.manifests.ocp_versions import OCP_VERSIONS +from ci_jobs_trigger.tests.zstream_trigger.manifests.rosa_versions import ROSA_VERSIONS LOGGER = get_logger("test_zstream_trigger") LIBS_ZSTREAM_TRIGGER_PATH = "ci_jobs_trigger.libs.openshift_ci.zstream_trigger.zstream_trigger" GET_ACCEPTED_CLUSTER_VERSIONS_PATH = f"{LIBS_ZSTREAM_TRIGGER_PATH}.get_accepted_cluster_versions" +GET_ALL_ROSA_VERSIONS_PATH = f"{LIBS_ZSTREAM_TRIGGER_PATH}.get_rosa_versions" TRIGGER_JOBS_PATH = f"{LIBS_ZSTREAM_TRIGGER_PATH}.openshift_ci_trigger_job" @@ -23,8 +25,9 @@ def job_trigger_and_get_versions_mocker(mocker): mocker.patch( GET_ACCEPTED_CLUSTER_VERSIONS_PATH, - return_value=VERSIONS, + return_value=OCP_VERSIONS, ) + mocker.patch(GET_ALL_ROSA_VERSIONS_PATH, return_value=ROSA_VERSIONS) openshift_ci_trigger_job_mocker = mocker.patch(TRIGGER_JOBS_PATH) openshift_ci_trigger_job_mocker.ok = True @@ -38,6 +41,8 @@ def send_slack_message_mock(mocker): def base_config_dict(tmp_path_factory): return { "trigger_token": "123456", + "ocm_token": "abcdef", + "aws_region": "us-east-1", "slack_webhook_url": "https://webhook", "slack_errors_webhook_url": "https://webhook-error", "processed_versions_file_path": tmp_path_factory.getbasetemp() / "processed_versions.json", @@ -49,11 +54,18 @@ def get_config_mocker(mocker): return mocker.patch(f"{LIBS_ZSTREAM_TRIGGER_PATH}.get_config") +@pytest.fixture +def ocm_client_mocker(mocker): + mock_ocm_client = mocker.patch(f"{LIBS_ZSTREAM_TRIGGER_PATH}.OCMPythonClient") + return mock_ocm_client.client + + @pytest.fixture() def config_dict(get_config_mocker, base_config_dict): base_config_dict["versions"] = { "4.13": [""], "4.13-rc": [""], + "4.13-rc___stage___": [""], } get_config_mocker.return_value = base_config_dict @@ -85,17 +97,27 @@ def test_process_and_trigger_jobs_config_with_empty_version(config_dict_empty_ve assert process_and_trigger_jobs(logger=LOGGER) == {"4.15": "No jobs found"} -def test_process_and_trigger_jobs(config_dict, job_trigger_and_get_versions_mocker): - assert process_and_trigger_jobs(logger=LOGGER) == {"4.13": "Triggered", "4.13-rc": "Triggered"} +def test_process_and_trigger_jobs(config_dict, job_trigger_and_get_versions_mocker, ocm_client_mocker): + assert process_and_trigger_jobs(logger=LOGGER) == { + "4.13": "Triggered", + "4.13-rc": "Triggered", + "4.13-rc-stage": "Triggered", + } -def test_process_and_trigger_jobs_already_triggered(mocker, config_dict, job_trigger_and_get_versions_mocker): +def test_process_and_trigger_jobs_already_triggered( + mocker, config_dict, job_trigger_and_get_versions_mocker, ocm_client_mocker +): mocker.patch( f"{LIBS_ZSTREAM_TRIGGER_PATH}.processed_versions_file", return_value={"4.13": ["4.13.34", "4.13.33"]}, ) - assert process_and_trigger_jobs(logger=LOGGER) == {"4.13": "Already processed", "4.13-rc": "Triggered"} + assert process_and_trigger_jobs(logger=LOGGER) == { + "4.13": "Already processed", + "4.13-rc": "Triggered", + "4.13-rc-stage": "Triggered", + } def test_process_and_trigger_jobs_set_version(config_dict, job_trigger_and_get_versions_mocker): diff --git a/ci_jobs_trigger/utils/general.py b/ci_jobs_trigger/utils/general.py index 5d1ba71..28b12f4 100644 --- a/ci_jobs_trigger/utils/general.py +++ b/ci_jobs_trigger/utils/general.py @@ -3,6 +3,7 @@ from multiprocessing import Process import requests +import gitlab from pyaml_env import parse_config @@ -63,3 +64,9 @@ def process_webhook_exception(logger, ex, route, slack_errors_webhook_url=None): send_slack_message(message=err_msg, webhook_url=slack_errors_webhook_url, logger=logger) return "Process failed" + + +def get_gitlab_api(url, token): + gitlab_api = gitlab.Gitlab(url=url, private_token=token, ssl_verify=False) + gitlab_api.auth() + return gitlab_api diff --git a/config-examples/zstream-trigger-config.example.yaml b/config-examples/zstream-trigger-config.example.yaml index 6e28005..95f3cf4 100644 --- a/config-examples/zstream-trigger-config.example.yaml +++ b/config-examples/zstream-trigger-config.example.yaml @@ -2,12 +2,22 @@ trigger_token: processed_versions_file_path: +# Mandatory - If triggering jobs for rosa versions +ocm_token: !ENV "${OCM_TOKEN}" +aws_region: + # Optional slack_webhook_url: slack_errors_webhook_url: run_interval: 24h # can be s/m/h cron_schedule: "0 0 * * *" # cron schedule for the trigger +# Optional, Required if you also want to check if rosa channel-version is enabled for OCM or not +gitlab_project: +gitlab_url: +gitlab_token: + +# For providing ROSA version, it is mandatory to add ocm_env '______' to version versions: "4.14-rc": # Will take latest 4.14 RC version - @@ -22,3 +32,13 @@ versions: - - - + + "4.16-rc___stage___": # Will take latest 4.16 ROSA version for RC (candidate) channel-group in OCM stage + - + - + - + + "4.16___production___": # Will take latest 4.16 ROSA version for stable channel-group in OCM production + - + - + - diff --git a/poetry.lock b/poetry.lock index 4a616a7..f0cddb3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "appnope" @@ -522,63 +522,83 @@ testing = ["pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "py [[package]] name = "coverage" -version = "7.5.0" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, - {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, - {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, - {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, - {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, - {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, - {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, - {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, - {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, - {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, - {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, - {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, - {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, - {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -948,6 +968,16 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "importlib" +version = "1.0.4" +description = "Backport of importlib.import_module() from Python 2.7" +optional = false +python-versions = "*" +files = [ + {file = "importlib-1.0.4.zip", hash = "sha256:b6ee7066fea66e35f8d0acee24d98006de1a0a8a94a8ce6efe73a9a23c8d9826"}, +] + [[package]] name = "importlib-metadata" version = "7.1.0" @@ -1349,6 +1379,44 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "openshift-cluster-management-python-client" +version = "1.0.24" +description = "A python client for https://api.openshift.com/api/ APIs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "openshift_cluster_management_python_client-1.0.24.tar.gz", hash = "sha256:9cc0575a242ec1fc03a13675d9506d19721278980c552381a3b73d3e725270db"}, +] + +[package.dependencies] +python-dateutil = "*" +urllib3 = ">=1.25.3" + +[[package]] +name = "openshift-cluster-management-python-wrapper" +version = "1.0.133" +description = "Wrapper around https://github.com/openshift/openshift-cluster-management-python-client" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "openshift_cluster_management_python_wrapper-1.0.133.tar.gz", hash = "sha256:3ba5b0d7abae49570ad0d26b4e62a15188b39d62d9fd5bb8779d75f73a8361fa"}, +] + +[package.dependencies] +colorlog = ">=6.7.0,<7.0.0" +importlib = ">=1.0.4,<2.0.0" +openshift-cluster-management-python-client = ">=1.0.23" +openshift-python-utilities = ">=5.0.0" +openshift-python-wrapper = ">=10.0.0" +python-benedict = "0.33.2" +python-simple-logger = ">=1.0.5" +pyyaml = ">=6.0.1,<7.0.0" +redhat-qe-cloud-tools = ">=1.0.10" +requests = ">=2.31.0,<3.0.0" +rosa-python-client = ">=1.0.28" +timeout-sampler = ">=0.0.2" + [[package]] name = "openshift-python-utilities" version = "5.0.41" @@ -2148,6 +2216,25 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rosa-python-client" +version = "1.0.115" +description = "Wrapper for rosa cli" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "rosa_python_client-1.0.115.tar.gz", hash = "sha256:c03266262a443ebb3a5032625fb0bd6acc95e1673d184d10fe11194deffb26e9"}, +] + +[package.dependencies] +coverage = ">=7.6.0,<8.0.0" +openshift-cluster-management-python-wrapper = ">=1.0.86,<2.0.0" +pytest-cov = ">=5.0.0,<6.0.0" +pytest-mock = ">=3.14.0,<4.0.0" +python-benedict = ">=0.33.0,<0.34.0" +python-simple-logger = ">=1.0.5" +redhat-qe-cloud-tools = ">=1.0.19" + [[package]] name = "rsa" version = "4.9" @@ -2499,4 +2586,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5c24841e2347ee0cab8a62e8f22f08b9002ffc1e5048997ad14376055199ce7c" +content-hash = "666c9380a9211983c401541982b75b60751b23cfb3c48046521265cd7238119f" diff --git a/pyproject.toml b/pyproject.toml index 299e0e1..548a05c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,8 @@ redhat-qe-cloud-tools = "^1.0.47" pyaml-env = "^1.2.1" croniter = "^2.0.5" pyhelper-utils = "^0.0.15" +openshift-cluster-management-python-wrapper = "^1.0.133" +rosa-python-client = "^1.0.115" [tool.poetry.group.dev.dependencies]