diff --git a/.github/workflows/jira_script.yml b/.github/workflows/jira_script.yml new file mode 100644 index 0000000..7bfcff2 --- /dev/null +++ b/.github/workflows/jira_script.yml @@ -0,0 +1,29 @@ +name: Jira validation + +on: + push: + + +jobs: + verify-jira: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Add Config File to current folder + run: | + echo "$CONFIG_CONTENT" > jira.cfg + env: + CONFIG_CONTENT: ${{ secrets.JIRA_CFG }} + + - name: Install Python + uses: actions/setup-python@v3 + with: + python-version: '3.8' + + - name: Install tox + run: pip install tox + + - name: Run Tox with Environment Variables + run: tox -e verify-bugs-are-open diff --git a/ci_scripts/__init__.py b/ci_scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ci_scripts/jira_scripts/__init__.py b/ci_scripts/jira_scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ci_scripts/jira_scripts/check_jira_status.py b/ci_scripts/jira_scripts/check_jira_status.py new file mode 100644 index 0000000..c9f6215 --- /dev/null +++ b/ci_scripts/jira_scripts/check_jira_status.py @@ -0,0 +1,145 @@ +import re + +from jira import JIRA, JIRAError + +from ci_scripts.utils import get_all_python_files, get_connection_params, print_status + + +# Needs to be update based on the branch. +EXPECTED_TARGET_VERSIONS = ["vfuture", "4.16", "4.15.1"] + + +def get_jira_connection(): + connection_params = get_connection_params() + jira_connection = JIRA( + token_auth=connection_params.get("token"), + options={"server": connection_params.get("url")}, + ) + return jira_connection + + +def get_jira_metadata(jira_id, jira_connection): + retries = 0 + max_retry = 3 + while retries < max_retry: + try: + return jira_connection.issue( + id=jira_id, fields="status, issuetype, fixVersions" + ).fields + except JIRAError as jira_exception: + # Check for inactivity error (adjust based on your library) + if "Unauthorized" in str(jira_exception) or "Session timed out" in str( + jira_exception + ): + retries += 1 + print( + f"Failed to get issue due to inactivity, retrying ({retries}/{max_retry})" + ) + if retries < max_retry: + jira_connection = get_jira_connection() # Attempt reconnection + else: + raise # Re-raise the error after exceeding retries + else: + raise + + +def get_jira_fix_version(jira_metadata): + fix_version = ( + re.search(r"([\d.]+)", jira_metadata.fixVersions[0].name) + if jira_metadata.fixVersions + else None + ) + return fix_version.group(1) if fix_version else "vfuture" + + +def get_all_jiras_from_file(file_content): + """ + Try to find all jira tickets in the file. + Looking for the following patterns: + - jira_id=> # call in is_jira_open + - jira_id = # when jira is constant + - https://issues.redhat.com/browse/ # when jira is in a link in comments + - pytest.mark.jira(id) # when jira is in a marker + + Args: + file_content (str): The content of the file. + + Returns: + list: A list of jira tickets. + """ + issue_pattern = r"([A-Z]+-[0-9]+)" + _pytest_jira_marker_bugs = re.findall( + rf"pytest.mark.jira.*?{issue_pattern}.*", file_content, re.DOTALL + ) + _is_jira_open = re.findall(rf"jira_id\s*=[\s*\"\']*{issue_pattern}.*", file_content) + _jira_url_jiras = re.findall( + rf"https://issues.redhat.com/browse/{issue_pattern}.*", + file_content, + ) + return set(_pytest_jira_marker_bugs + _is_jira_open + _jira_url_jiras) + + +def get_jiras_from_all_python_files(): + jira_found = {} + for filename in get_all_python_files(): + filename_for_key = re.findall(r"openshift-virtualization-tests/.*", filename)[0] + with open(filename) as fd: + if unique_jiras := get_all_jiras_from_file(file_content=fd.read()): + jira_found[filename_for_key] = unique_jiras + return jira_found + + +def main(): + closed_statuses = get_connection_params().get("resolved_statuses") + closed_jiras = {} + mismatch_bugs_version = {} + jira_ids_with_errors = {} + jira_ids_dict = get_jiras_from_all_python_files() + jira_connection = get_jira_connection() + for filename in jira_ids_dict: + for jira_id in jira_ids_dict[filename]: + try: + jira_metadata = get_jira_metadata( + jira_id=jira_id, jira_connection=jira_connection + ) + current_jira_status = jira_metadata.status.name.lower() + if current_jira_status in closed_statuses: + closed_jiras.setdefault(filename, []).append( + f"{jira_id} [{current_jira_status}]" + ) + jira_target_release_version = get_jira_fix_version( + jira_metadata=jira_metadata + ) + if not jira_target_release_version.startswith( + tuple(EXPECTED_TARGET_VERSIONS) + ): + mismatch_bugs_version.setdefault(filename, []).append( + f"{jira_id} [{jira_target_release_version}]" + ) + except JIRAError as exp: + jira_ids_with_errors.setdefault(filename, []).append( + f"{jira_id} [{exp.text}]" + ) + continue + + if closed_jiras: + print(f"{len(closed_jiras)} Jira tickets are closed and need to be removed:") + print_status(status_dict=closed_jiras) + + if mismatch_bugs_version: + print( + f"{len(mismatch_bugs_version)} Jira bugs are not matched to the current branch's expected version list:" + f" '{EXPECTED_TARGET_VERSIONS}' and need to be removed:" + ) + print_status(status_dict=mismatch_bugs_version) + + if jira_ids_with_errors: + print(f"{len(jira_ids_with_errors)} Jira ids had errors:") + print_status(status_dict=jira_ids_with_errors) + + if closed_jiras or mismatch_bugs_version or jira_ids_with_errors: + exit(1) + + +if __name__ == "__main__": + main() diff --git a/ci_scripts/polarion/__init__.py b/ci_scripts/polarion/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ci_scripts/polarion/polarion_set_automated.py b/ci_scripts/polarion/polarion_set_automated.py new file mode 100644 index 0000000..6851b5b --- /dev/null +++ b/ci_scripts/polarion/polarion_set_automated.py @@ -0,0 +1,58 @@ +import logging + +from pylero.exceptions import PyleroLibException + +from ci_scripts.polarion.polarion_utils import ( + PROJECT, + get_polarion_ids_from_diff, + git_diff_added_removed_lines, +) + + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) +AUTOMATED = "automated" +NOT_AUTOMATED = "notautomated" +APPROVED = "approved" + + +def approve_tc(tc): + tc.status = APPROVED + tc.update() + LOGGER.info(f"{tc.work_item_id} {APPROVED}") + + +def automate_and_approve_tc(): + git_diff = git_diff_added_removed_lines() + added_ids, removed_ids = get_polarion_ids_from_diff(diff=git_diff) + if added_ids or removed_ids: + from pylero.work_item import TestCase + + for _id in removed_ids: + if _id in added_ids: + continue + + tc = TestCase(project_id=PROJECT, work_item_id=_id) + if tc.caseautomation == AUTOMATED: + LOGGER.info(f"{_id}: Mark as {AUTOMATED}, Setting '{NOT_AUTOMATED}'") + tc.caseautomation = NOT_AUTOMATED + approve_tc(tc=tc) + + for _id in added_ids: + try: + tc = TestCase(project_id=PROJECT, work_item_id=_id) + if tc.caseautomation != AUTOMATED: + LOGGER.info(f"{_id}: Not mark as {AUTOMATED}, Setting '{AUTOMATED}'") + tc.caseautomation = AUTOMATED + approve_tc(tc=tc) + + if tc.caseautomation == AUTOMATED and tc.status != APPROVED: + LOGGER.info(f"{_id} already {AUTOMATED}") + approve_tc(tc=tc) + + except PyleroLibException as ex: + LOGGER.warning(f"{_id}: {ex}") + + +if __name__ == "__main__": + automate_and_approve_tc() diff --git a/ci_scripts/polarion/polarion_utils.py b/ci_scripts/polarion/polarion_utils.py new file mode 100644 index 0000000..10cd2f6 --- /dev/null +++ b/ci_scripts/polarion/polarion_utils.py @@ -0,0 +1,45 @@ +import logging +import re +import shlex +import subprocess + + +logging.basicConfig(level=logging.INFO) + +LOGGER = logging.getLogger(__name__) +PROJECT = "CNV" + + +def find_polarion_ids(data): + match_ids = set() + for item in data: + match = re.findall(rf"pytest.mark.polarion.*{PROJECT}-[0-9]+", item) + if match: + match_id = re.findall(rf"{PROJECT}-[0-9]+", match[0]) + match_ids.add(match_id[0]) + + return match_ids + + +def git_diff(): + data = subprocess.check_output(shlex.split("git diff HEAD^-1")) + data = data.decode("utf-8") + return data + + +def git_diff_added_removed_lines(): + diff = {} + for line in git_diff().splitlines(): + if line.startswith("+"): + diff.setdefault("added", []).append(line) + + if line.startswith("-"): + diff.setdefault("removed", []).append(line) + + return diff + + +def get_polarion_ids_from_diff(diff): + added_ids = find_polarion_ids(data=diff.get("added", [])) + removed_ids = find_polarion_ids(data=diff.get("removed", [])) + return added_ids, removed_ids diff --git a/ci_scripts/polarion/polarion_verify_tc_requirement.py b/ci_scripts/polarion/polarion_verify_tc_requirement.py new file mode 100644 index 0000000..015f538 --- /dev/null +++ b/ci_scripts/polarion/polarion_verify_tc_requirement.py @@ -0,0 +1,47 @@ +import logging +import sys + +from pylero.exceptions import PyleroLibException + +from ci_scripts.polarion.polarion_utils import ( + PROJECT, + get_polarion_ids_from_diff, + git_diff_added_removed_lines, +) + + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + + +def has_verify(): + git_diff = git_diff_added_removed_lines() + added_ids, _ = get_polarion_ids_from_diff(diff=git_diff) + missing = [] + if added_ids: + from pylero.work_item import Requirement, TestCase + + for _id in added_ids: + has_req = False + LOGGER.info(f"Checking if {_id} verifies any requirement") + tc = TestCase(project_id=PROJECT, work_item_id=_id) + for link in tc.linked_work_items: + try: + Requirement(project_id=PROJECT, work_item_id=link.work_item_id) + has_req = True + break + except PyleroLibException: + continue + + if not has_req: + LOGGER.error(f"{_id}: Is missing requirement") + missing.append(_id) + + if missing: + missing_str = "\n".join(missing) + LOGGER.error(f"Cases with missing requirement: {missing_str}") + sys.exit(1) + + +if __name__ == "__main__": + has_verify() diff --git a/ci_scripts/utils.py b/ci_scripts/utils.py new file mode 100644 index 0000000..8171946 --- /dev/null +++ b/ci_scripts/utils.py @@ -0,0 +1,32 @@ +import os +from configparser import ConfigParser +from pathlib import Path + + +def get_connection_params(): + conf_file = os.path.join(Path(".").resolve(), "jira.cfg") + parser = ConfigParser() + # Open the file with the correct encoding + parser.read(conf_file, encoding="utf-8") + params_dict = {} + for params in parser.items("DEFAULT"): + params_dict[params[0]] = params[1] + return params_dict + + +def print_status(status_dict): + for key, value in status_dict.items(): + print(f" {key}: {' '.join(list(set(value)))}") + print("\n") + + +def get_all_python_files(): + exclude_dirs = [".tox", "venv", ".pytest_cache", "site-packages", ".git"] + for root, _, files in os.walk(os.path.abspath(os.curdir)): + if [_dir for _dir in exclude_dirs if _dir in root]: + continue + + for filename in files: + file_path = os.path.join(root, filename) + if filename.endswith(".py") and file_path != os.path.abspath(__file__): + yield file_path diff --git a/poetry.lock b/poetry.lock index 18f083d..8c67fdd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,26 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "cachetools" version = "5.3.2" @@ -121,6 +142,20 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -149,6 +184,31 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] development = ["black", "flake8", "mypy", "pytest", "types-colorama"] +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "google-auth" version = "2.26.1" @@ -183,6 +243,17 @@ files = [ {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "jinja2" version = "3.1.2" @@ -200,15 +271,42 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jira" +version = "3.6.0" +description = "Python library for interacting with JIRA via REST APIs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jira-3.6.0-py3-none-any.whl", hash = "sha256:08b28388ee498542ebb6b05db87e6c46c37535c268717ccc23c84b377ea309fb"}, + {file = "jira-3.6.0.tar.gz", hash = "sha256:4c67497fe8dc2f60f1c4f7b33479f059c928bec3db9dcb5cd7b6a09b6ecc0942"}, +] + +[package.dependencies] +defusedxml = "*" +packaging = "*" +Pillow = ">=2.1.0" +requests = ">=2.10.0" +requests-oauthlib = ">=1.1.0" +requests-toolbelt = "*" +typing-extensions = ">=3.7.4.2" + +[package.extras] +async = ["requests-futures (>=0.9.7)"] +cli = ["ipython (>=4.0.0)", "keyring"] +docs = ["furo", "sphinx (>=5.0.0)", "sphinx-copybutton"] +opt = ["PyJWT", "filemagic (>=1.6)", "requests-jwt", "requests-kerberos"] +test = ["MarkupSafe (>=0.23)", "PyYAML (>=5.1)", "docutils (>=0.12)", "flaky", "oauthlib", "parameterized (>=0.8.1)", "pytest (>=6.0.0)", "pytest-cache", "pytest-cov", "pytest-instafail", "pytest-sugar", "pytest-timeout (>=1.3.1)", "pytest-xdist (>=2.2)", "requests-mock", "requires.io", "tenacity", "wheel (>=0.24.0)", "yanc (>=0.3.3)"] + [[package]] name = "kubernetes" -version = "28.1.0" +version = "29.0.0" description = "Kubernetes python client" optional = false python-versions = ">=3.6" files = [ - {file = "kubernetes-28.1.0-py2.py3-none-any.whl", hash = "sha256:10f56f8160dcb73647f15fafda268e7f60cf7dbc9f8e46d52fcd46d3beb0c18d"}, - {file = "kubernetes-28.1.0.tar.gz", hash = "sha256:1468069a573430fb1cb5ad22876868f57977930f80a6749405da31cd6086a7e9"}, + {file = "kubernetes-29.0.0-py2.py3-none-any.whl", hash = "sha256:ab8cb0e0576ccdfb71886366efb102c6a20f268d817be065ce7f9909c631e43e"}, + {file = "kubernetes-29.0.0.tar.gz", hash = "sha256:c4812e227ae74d07d53c88293e564e54b850452715a59a927e7e1bc6b9a60459"}, ] [package.dependencies] @@ -220,7 +318,7 @@ pyyaml = ">=5.4.1" requests = "*" requests-oauthlib = "*" six = ">=1.9.0" -urllib3 = ">=1.24.2,<2.0" +urllib3 = ">=1.24.2" websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" [package.extras] @@ -303,37 +401,77 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openshift-operator-utilities" -version = "1.0.0" +version = "1.0.5" description = "Utilities to interact with openshift operators" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "openshift_operator_utilities-1.0.0.tar.gz", hash = "sha256:6eb7c5eadf0f27f3c4c11cb4bb60198184df8b5530d25aa95ef2bc0b1f4934a6"}, + {file = "openshift_operator_utilities-1.0.5.tar.gz", hash = "sha256:b13bfc735017e9609410fa85d314e1ef28f45a3b08df987dcabfbb552d53dd60"}, ] [package.dependencies] -kubernetes = ">=28.1.0,<29.0.0" -openshift-python-wrapper = ">=4.15.11,<5.0.0" +kubernetes = ">=29.0.0,<30.0.0" +openshift-python-utilities = ">=5.0.16,<6.0.0" +openshift-python-wrapper = ">=10.0.0,<11.0.0" + +[[package]] +name = "openshift-python-utilities" +version = "5.0.27" +description = "A utilities repository for https://github.com/RedHatQE/openshift-python-wrapper" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "openshift_python_utilities-5.0.27.tar.gz", hash = "sha256:a7fc4aeb48962ca7117fbdee59d22dbb917808be355bf863f7208378478b920b"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.12.3,<5.0.0" +colorlog = ">=6.7.0,<7.0.0" +openshift-python-wrapper = ">=10.0.4" +openshift-python-wrapper-data-collector = ">=1.0.4" +pytest = ">=8.0.0,<9.0.0" +python-simple-logger = ">=1.0.5" +pyyaml = ">=6.0.1,<7.0.0" +requests = ">=2.31.0,<3.0.0" +semver = ">=3.0.2,<4.0.0" +timeout-sampler = ">=0.0.1" [[package]] name = "openshift-python-wrapper" -version = "4.15.14" +version = "10.0.18" description = "Wrapper around https://github.com/kubernetes-client/python" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "openshift_python_wrapper-4.15.14.tar.gz", hash = "sha256:4c5e25cc64ae05e48afbea327d4ff8150fe4e07952df314821fb0fa01d017cf4"}, + {file = "openshift_python_wrapper-10.0.18.tar.gz", hash = "sha256:00549fc2a216fc8bdd4410e750eb5ebb903b789805e75c36d46fbb38b7c354bd"}, ] [package.dependencies] colorlog = ">=6.7.0,<7.0.0" jinja2 = ">=3.1.2,<4.0.0" -kubernetes = ">=28.1.0b1,<29.0.0" +kubernetes = ">=29.0.0,<30.0.0" packaging = ">=23.1,<24.0" -python-benedict = ">=0.32.0,<0.33.0" -python-simple-logger = ">=1.0.6,<2.0.0" +python-benedict = ">=0.33.0,<0.34.0" +python-simple-logger = ">=1.0.6" +timeout-sampler = ">=0.0.2" xmltodict = ">=0.13.0,<0.14.0" +[[package]] +name = "openshift-python-wrapper-data-collector" +version = "1.0.24" +description = "Data collector for https://github.com/openshift/openshift-python-wrapper when running with PyTest" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "openshift_python_wrapper_data_collector-1.0.24.tar.gz", hash = "sha256:da498a3daa61dc68d723e407980ca67f5e33abb4da3f71ad7c99d2eb0123578e"}, +] + +[package.dependencies] +openshift-python-wrapper = ">=10.0.0" +pytest = ">=8.0.0,<9.0.0" +pytest-testconfig = ">=0.2.0,<0.3.0" +pyyaml = ">=6.0.1,<7.0.0" + [[package]] name = "packaging" version = "23.2" @@ -345,6 +483,106 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "pillow" +version = "10.2.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "pyasn1" version = "0.5.1" @@ -370,15 +608,66 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.6.0" +[[package]] +name = "pylero" +version = "0.0.9" +description = "Python SDK for Polarion" +optional = false +python-versions = "*" +files = [ + {file = "pylero-0.0.9.tar.gz", hash = "sha256:e0efaeed55088aee0f982dbf4f97349d50baee44704bc29c5a8176b701c7b139"}, +] + +[package.dependencies] +click = "*" +suds = "*" + +[[package]] +name = "pytest" +version = "8.0.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, + {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.3.0,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-testconfig" +version = "0.2.0" +description = "Test configuration plugin for pytest." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pytest-testconfig-0.2.0.tar.gz", hash = "sha256:0fa9e210bc2dd83d7408470cea8fb6e607576551bb3b1f9524cb51d8554a3da6"}, + {file = "pytest_testconfig-0.2.0-py3-none-any.whl", hash = "sha256:0cfaaf4f47e0cf84358ec8dd2294df0358da2bc29730069aad2b4a2094c1a295"}, +] + +[package.dependencies] +pytest = ">=3.5.0" +pyyaml = "*" + [[package]] name = "python-benedict" -version = "0.32.1" +version = "0.33.2" description = "python-benedict is a dict subclass with keylist/keypath/keyattr support, normalized I/O operations (base64, csv, ini, json, pickle, plist, query-string, toml, xls, xml, yaml) and many utilities... for humans, obviously." optional = false python-versions = "*" files = [ - {file = "python-benedict-0.32.1.tar.gz", hash = "sha256:d669cbd0ca4e6cd9fbdc10b8f68ae57ac3224b49f7f55e9b2c13622c0434a148"}, - {file = "python_benedict-0.32.1-py3-none-any.whl", hash = "sha256:61272f128ea5046399d261047b33d53e0836c951d9697b23a02d0723f9322e1d"}, + {file = "python-benedict-0.33.2.tar.gz", hash = "sha256:662de43bffb4e127da2056447f8ddd7f6f5c89b72dd66d289cf9abd1cc2720c8"}, + {file = "python_benedict-0.33.2-py3-none-any.whl", hash = "sha256:50a69b601b34d4ad7b67fe94e3266ec05046bc547a4132fe43fd8fbd41aeefaa"}, ] [package.dependencies] @@ -388,8 +677,9 @@ requests = ">=2.26.0,<3.0.0" [package.extras] all = ["python-benedict[io,parse,s3]"] -io = ["python-benedict[toml,xls,xml,yaml]"] -parse = ["ftfy (>=6.0.0,<7.0.0)", "mailchecker (>=4.1.0,<6.0.0)", "phonenumbers (>=8.12.0,<9.0.0)", "python-dateutil (>=2.8.0,<3.0.0)"] +html = ["beautifulsoup4 (>=4.12.0,<5.0.0)", "python-benedict[xml]"] +io = ["python-benedict[html,toml,xls,xml,yaml]"] +parse = ["ftfy (>=6.0.0,<7.0.0)", "mailchecker (>=4.1.0,<7.0.0)", "phonenumbers (>=8.12.0,<9.0.0)", "python-dateutil (>=2.8.0,<3.0.0)"] s3 = ["boto3 (>=1.24.89,<2.0.0)"] toml = ["toml (>=0.10.2,<1.0.0)"] xls = ["openpyxl (>=3.0.0,<4.0.0)", "xlrd (>=2.0.0,<3.0.0)"] @@ -549,6 +839,20 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "rsa" version = "4.9" @@ -563,6 +867,17 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "semver" +version = "3.0.2" +description = "Python helper for Semantic Versioning (https://semver.org)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"}, + {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, +] + [[package]] name = "six" version = "1.16.0" @@ -574,6 +889,28 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "suds" +version = "1.1.2" +description = "Lightweight SOAP client (community fork)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "suds-1.1.2-py3-none-any.whl", hash = "sha256:e421744c393d876127f1996be4d7c6154476c0b0f543f9cb436f4add5b916c9d"}, + {file = "suds-1.1.2.tar.gz", hash = "sha256:1d5cfa74117193b244a4233f246c483d9f41198b448c5f14a8bad11c4f649f2b"}, +] + [[package]] name = "text-unidecode" version = "1.3" @@ -585,6 +922,41 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +[[package]] +name = "timeout-sampler" +version = "0.0.13" +description = "Timeout utility class to wait for any function output and interact with it in given time" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "timeout_sampler-0.0.13.tar.gz", hash = "sha256:30ac6f1c7d42eefb91e8ee1ed188bddc54ab53c42dfbddc490caf306573796c1"}, +] + +[package.dependencies] +python-simple-logger = ">=1.0.8" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.10.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, +] + [[package]] name = "urllib3" version = "1.26.18" @@ -631,4 +1003,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "eeb3f7d7ad8c5346fc9b82ba12d57cfb0c940a1f171c2cb752e15b5dde209792" +content-hash = "5d645d60034f228e01c0b1a913243950ace7ca5ed5c44950a3ddae7481539389" diff --git a/pyproject.toml b/pyproject.toml index 24c762d..0a2d0e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,8 +8,10 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8" -openshift-python-wrapper = "^4.15.14" +openshift-python-wrapper = "^10.0.12" openshift-operator-utilities = "^1.0.0" +jira = "^3.6.0" +pylero = "^0.0.9" [build-system] diff --git a/tox.ini b/tox.ini index a10ed83..4589046 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,42 @@ [tox] -skipsdist = True +envlist=None +skipsdist=True -[testenv] -setenv = PYTHONPATH = {toxinidir} -deps = - pre-commit +# Polarion +# Should run on every commit. +[testenv:verify-tc-requirement-polarion] +basepython = python3 +recreate=True +setenv = + PYTHONPATH = {toxinidir} commands = - pre-commit run --all-files -allowlist_externals = - git + pip install pip --upgrade + pip install tox --upgrade + pip install git+https://github.com/RedHatQE/pylero.git + python3 ci_scripts/polarion/polarion_verify_tc_requirement.py + +# Should run only after merged. +[testenv:mark-automated-polarion] +basepython = python3 +recreate=True +setenv = + PYTHONPATH = {toxinidir} +commands = + pip install pip --upgrade + pip install tox --upgrade + pip install git+https://github.com/RedHatQE/pylero.git + python3 ci_scripts/polarion/polarion_set_automated.py + +[testenv:verify-bugs-are-open] +basepython = python3 +recreate=True +setenv = + PYTHONPATH = {toxinidir} +deps: + GitPython + jira + +commands = + pip install pip --upgrade + pip install tox --upgrade + python3 ci_scripts/jira_scripts/check_jira_status.py