Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-openqa_review for openSUSE:Factory checked in at 2021-06-26 21:25:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-openqa_review (Old) and /work/SRC/openSUSE:Factory/.python-openqa_review.new.2625 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-openqa_review" Sat Jun 26 21:25:30 2021 rev:40 rq:902424 version:1.24.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-openqa_review/python-openqa_review.changes 2021-06-24 18:23:16.804963201 +0200 +++ /work/SRC/openSUSE:Factory/.python-openqa_review.new.2625/python-openqa_review.changes 2021-06-26 21:25:57.435382458 +0200 @@ -1,0 +2,13 @@ +Fri Jun 25 18:51:37 UTC 2021 - ok...@suse.com + +- Update to version 1.24.0: + * doc: Add CURL_CA_BUNDLE + * Improve handling of --filter + * Add User-Agent header to HTTP requests + * Fix relative import path for directly called testsuite + * Remove futurize from tests + * Update setup.py - remove python2 compactibility stuff + * Remove 'futurize' usage, isnt needed with drop of python2 suppport + * Use correct shebang for rpm based distributions + +------------------------------------------------------------------- Old: ---- python-openqa_review-1.23.0.obscpio New: ---- python-openqa_review-1.24.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-openqa_review.spec ++++++ --- /var/tmp/diff_new_pack.y1T6nb/_old 2021-06-26 21:25:57.831382981 +0200 +++ /var/tmp/diff_new_pack.y1T6nb/_new 2021-06-26 21:25:57.835382987 +0200 @@ -26,12 +26,14 @@ %define name_ext -test %endif +%define pythons python3 + %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define short_name openqa_review %define binaries openqa-review openqa-review-daily-email openqa-review-sles-ha tumblesle-release openqa-review-functional_yast_concise %define oldpython python Name: python-%{short_name}%{?name_ext} -Version: 1.23.0 +Version: 1.24.0 Release: 0 Summary: A review helper script for openQA License: MIT ++++++ python-openqa_review-1.23.0.obscpio -> python-openqa_review-1.24.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/README.md new/python-openqa_review-1.24.0/README.md --- old/python-openqa_review-1.23.0/README.md 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/README.md 2021-06-25 19:01:38.000000000 +0200 @@ -37,6 +37,11 @@ REQUESTS_CA_BUNDLE="/my/custom/ca-bundle.pem" openqa-review ``` +If that doesn't work, you can try the following setting: +``` +CURL_CA_BUNDLE="" +``` + ## Communication If you have questions, visit me on irc.freenode.net in #opensuse-factory diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/openqa_review/browser.py new/python-openqa_review-1.24.0/openqa_review/browser.py --- old/python-openqa_review-1.23.0/openqa_review/browser.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/openqa_review/browser.py 2021-06-25 19:01:38.000000000 +0200 @@ -1,9 +1,3 @@ -# Python 2 and 3: easiest option -# see http://python-future.org/compatible_idioms.html -from future.standard_library import install_aliases # isort:skip to keep 'install_aliases()' - -install_aliases() - import codecs import json import logging @@ -116,11 +110,12 @@ def _get(self, url, as_json=False): # pragma: no cover retries = Retry(total=7, backoff_factor=2, status_forcelist=[429, 500, 502, 503, 504]) http = requests.Session() + headers = {"User-Agent": "openqa-review (https://os-autoinst.github.io/openqa_review)"} parsed_url = urlparse(url) http.mount("{}://".format(parsed_url.scheme), HTTPAdapter(max_retries=retries)) try: - r = http.get(url, auth=self.auth, timeout=2.5) + r = http.get(url, auth=self.auth, timeout=2.5, headers=headers) except requests.exceptions.SSLError as e: try: import OpenSSL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/openqa_review/openqa_review.py new/python-openqa_review-1.24.0/openqa_review/openqa_review.py --- old/python-openqa_review-1.23.0/openqa_review/openqa_review.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/openqa_review/openqa_review.py 2021-06-25 19:01:38.000000000 +0200 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python3 """ Review helper script for openQA. @@ -87,15 +87,6 @@ """ -# Python 2 and 3: easiest option -# see http://python-future.org/compatible_idioms.html -from __future__ import absolute_import, unicode_literals - -from future.standard_library import install_aliases # isort:skip to keep 'install_aliases()' - -install_aliases() -from future.utils import iteritems - import argparse import codecs import datetime @@ -321,18 +312,16 @@ skipped = get_skipped_dict(arch, current_details) test_results_previous_dict = {i["id"]: i for i in test_results_previous if i["id"] in test_results_dict.keys()} - states = SortedDict(get_state(v, test_results_previous_dict) for k, v in iteritems(test_results_dict)) + states = SortedDict(get_state(v, test_results_previous_dict) for k, v in test_results_dict.items()) # intermediate step: # - print report of differences - interesting_states = SortedDict({k.split(arch + "_")[1]: v for k, v in iteritems(states) if v["state"] != "STABLE"}) + interesting_states = SortedDict({k.split(arch + "_")[1]: v for k, v in states.items() if v["state"] != "STABLE"}) if output_state_results: print("arch: %s" % arch) for state in interesting_states_names: - print( - "\n%s:\n\t%s\n" % (state, ", ".join(k for k, v in iteritems(interesting_states) if v["state"] == state)) - ) + print("\n%s:\n\t%s\n" % (state, ", ".join(k for k, v in interesting_states.items() if v["state"] == state))) interesting_states.update({"skipped": skipped}) return interesting_states @@ -406,7 +395,7 @@ # plain for-loop with append is most efficient: # https://stackoverflow.com/questions/11276473/append-to-a-dict-of-lists-with-a-dict-comprehension results_by_bugref = defaultdict(list) - for k, v in iteritems(results): + for k, v in results.items(): if not re.match("(" + "|".join(include_tags) + ")", v["state"]): continue key = v["bugref"] if (args.bugrefs and "bugref" in v and v["bugref"]) else "todo" @@ -433,10 +422,10 @@ def non_empty(r): return r["total"] != 0 and r["total"] > r["skipped"] and not ("build" in r.keys() and r["build"] is None) - builds = {build: result for build, result in iteritems(builds) if non_empty(result)} + builds = {build: result for build, result in builds.items() if non_empty(result)} finished = { build: result - for build, result in iteritems(builds) + for build, result in builds.items() if not result["unfinished"] or (100 * float(result["unfinished"]) / result["total"]) <= threshold } @@ -630,7 +619,7 @@ component_config_section = "product_issues:%s:component_mapping" % root_url.rstrip("/") try: components_config_dict = dict(config.items(component_config_section)) - component = [v for k, v in iteritems(components_config_dict) if re.match(k, complete_module)][0] + component = [v for k, v in components_config_dict.items() if re.match(k, complete_module)][0] except (NoSectionError, IndexError) as e: # pragma: no cover log.info( "No matching component found for module_folder '%s' and module name '%s' in config section '%s'" @@ -907,7 +896,7 @@ # them outside results_by_bugref = SortedDict(get_results_by_bugref(results, self.args)) self.issues = defaultdict(lambda: defaultdict(list)) - for bugref, result_list in iteritems(results_by_bugref): + for bugref, result_list in results_by_bugref.items(): if re.match("todo", bugref): log.info("Skipping \"todo\" bugref '%s' in '%s'" % (bugref, result_list)) continue @@ -940,7 +929,7 @@ self.issues["existing"]["product"].append(IssueEntry(self.args, self.root_url, existing_soft_fails)) def _search_for_bugrefs_for_softfailures(self, results): - for k, v in iteritems(results): + for k, v in results.items(): if v["state"] in soft_fail_states: try: module_url = self._get_url_to_softfailed_module(v["href"]) @@ -977,8 +966,8 @@ def total_issues(self): """Return Number of issue entries for this arch.""" total = 0 - for issue_status, issue_types in iteritems(self.issues): - for issue_type, ies in iteritems(issue_types): + for issue_status, issue_types in self.issues.items(): + for issue_type, ies in issue_types.items(): total += len(ies) return total @@ -1112,10 +1101,10 @@ current_summary = parse_summary(current_details) previous_summary = parse_summary(previous_details) - changes = SortedDict({k: v - previous_summary.get(k, 0) for k, v in iteritems(current_summary)}) + changes = SortedDict({k: v - previous_summary.get(k, 0) for k, v in current_summary.items()}) self.changes_str = ( "***Changes since reference build***\n\n* " - + "\n* ".join("%s: %s" % (k, v) for k, v in iteritems(changes)) + + "\n* ".join("%s: %s" % (k, v) for k, v in changes.items()) + "\n" ) log.info("%s" % self.changes_str) @@ -1386,11 +1375,11 @@ job_groups[_pgroup_prefix(job_group)] = urljoin(root_url, "/group_overview/%i" % job_group["id"]) if args.job_groups: job_pattern = re.compile("(%s)" % "|".join(args.job_groups.split(","))) - job_groups = {k: v for k, v in iteritems(job_groups) if job_pattern.search(k)} + job_groups = {k: v for k, v in job_groups.items() if job_pattern.search(k)} log.info("Job group URL for %s: %s" % (args.job_groups, job_groups)) if args.exclude_job_groups: job_pattern = re.compile("(%s)" % "|".join(args.exclude_job_groups.split(","))) - job_groups = {k: v for k, v in iteritems(job_groups) if not job_pattern.search(k)} + job_groups = {k: v for k, v in job_groups.items() if not job_pattern.search(k)} log.info("Job group URL excluding %s: %s" % (args.exclude_job_groups, job_groups)) return SortedDict(job_groups) @@ -1410,7 +1399,7 @@ self._progress = 0 self.report = SortedDict() - for k, v in iteritems(job_groups): + for k, v in job_groups.items(): log.info("Processing '%s'" % v) if args.no_progress or not humanfriendly_available: self.report[k] = self._one_report(v) @@ -1435,7 +1424,7 @@ def __str__(self): """Generate markdown.""" report_str = "" - for k, v in iteritems(self.report): + for k, v in self.report.items(): if not self.args.skip_passed or type(v) is not ProductReport or not v.is_passed(): report_str += "# %s\n\n%s\n---\n" % (k, v) return report_str @@ -1477,14 +1466,14 @@ def filter_report(report, iefilter): - report.report = SortedDict({p: pr for p, pr in iteritems(report.report) if isinstance(pr, ProductReport)}) - for product, pr in iteritems(report.report): - for arch, ar in iteritems(pr.reports): - for issue_status, issue_types in iteritems(ar.issues): - for issue_type, ies in iteritems(issue_types): + report.report = SortedDict({p: pr for p, pr in report.report.items() if isinstance(pr, ProductReport)}) + for product, pr in report.report.items(): + for arch, ar in pr.reports.items(): + for issue_status, issue_types in ar.issues.items(): + for issue_type, ies in issue_types.items(): issue_types[issue_type] = [ie for ie in ies if iefilter(ie)] - pr.reports = SortedDict({a: ar for a, ar in iteritems(pr.reports) if ar.total_issues > 0}) - report.report = SortedDict({p: pr for p, pr in iteritems(report.report) if pr.reports}) + pr.reports = SortedDict({a: ar for a, ar in pr.reports.items() if ar.total_issues > 0}) + report.report = SortedDict({p: pr for p, pr in report.report.items() if pr.reports}) def reminder_comment_on_issue(ie, min_days_unchanged=MIN_DAYS_UNCHANGED): @@ -1501,11 +1490,11 @@ def reminder_comment_on_issues(report, min_days_unchanged=MIN_DAYS_UNCHANGED): processed_issues = set() - report.report = SortedDict({p: pr for p, pr in iteritems(report.report) if isinstance(pr, ProductReport)}) - for product, pr in iteritems(report.report): - for arch, ar in iteritems(pr.reports): - for issue_status, issue_types in iteritems(ar.issues): - for issue_type, ies in iteritems(issue_types): + report.report = SortedDict({p: pr for p, pr in report.report.items() if isinstance(pr, ProductReport)}) + for product, pr in report.report.items(): + for arch, ar in pr.reports.items(): + for issue_status, issue_types in ar.issues.items(): + for issue_type, ies in issue_types.items(): for ie in ies: issue = ie.bug if issue: @@ -1532,12 +1521,11 @@ reminder_comment_on_issues(report) if args.filter: - try: - filter_report(report, ie_filters[args.filter]) - except KeyError: + if args.filter not in ie_filters: print("No such filter '%s'" % args.filter) print("Available filters: %s" % ", ".join(ie_filters.keys())) sys.exit(1) + filter_report(report, ie_filters[args.filter]) try: print(report) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/openqa_review/tumblesle_release.py new/python-openqa_review-1.24.0/openqa_review/tumblesle_release.py --- old/python-openqa_review-1.23.0/openqa_review/tumblesle_release.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/openqa_review/tumblesle_release.py 2021-06-25 19:01:38.000000000 +0200 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python3 """ TumbleSLE release script. @@ -22,14 +22,6 @@ notifications are serialized in JSON strings. """ -# Python 2 and 3: easiest option -# see http://python-future.org/compatible_idioms.html -from __future__ import absolute_import -from future.standard_library import install_aliases # isort:skip to keep 'install_aliases()' - -install_aliases() -from future.utils import iteritems - import argparse import fnmatch import glob @@ -269,7 +261,7 @@ } # count passed, failed for both released/new passed["released"] = len(jobs_by_result["released"]["passed"]) + len(jobs_by_result["released"]["softfailed"]) - hard_failed = {k: len(v) for k, v in iteritems(hard_failed_jobs)} + hard_failed = {k: len(v) for k, v in hard_failed_jobs.items()} whitelisted = {"last": failed["last"] - hard_failed["last"]} passed["last"] += whitelisted["last"] assert ( @@ -295,8 +287,8 @@ self.release_build = build["last"] # TODO auto-remove entries from whitelist which are passed now else: - hard_failed_jobs_by_scenario = {k: {scenario(j): j for j in v} for k, v in iteritems(hard_failed_jobs)} - sets = {k: set(v) for k, v in iteritems(hard_failed_jobs_by_scenario)} + hard_failed_jobs_by_scenario = {k: {scenario(j): j for j in v} for k, v in hard_failed_jobs.items()} + sets = {k: set(v) for k, v in hard_failed_jobs_by_scenario.items()} new_failures = sets["last"].difference(sets["released"]) new_fixed = sets["released"].difference(sets["last"]) log.info("Regression in new build %s, new failures: %s" % (build["last"], ", ".join(new_failures))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/setup.py new/python-openqa_review-1.24.0/setup.py --- old/python-openqa_review-1.23.0/setup.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/setup.py 2021-06-25 19:01:38.000000000 +0200 @@ -1,5 +1,4 @@ import os -import sys from subprocess import check_output, CalledProcessError from setuptools import setup @@ -9,11 +8,6 @@ # Also, when git is not available (PyPi package), use stored version.py. version_py = os.path.join(os.path.dirname(__file__), "version.py") -# python2 backwards craft -try: - FileNotFoundError -except NameError: - FileNotFoundError = IOError try: # This will not generate PEP440 compliant version strings for any commit @@ -32,7 +26,6 @@ install_requires = [ "beautifulsoup4", - "future", "sortedcontainers", "humanfriendly", "requests", @@ -41,11 +34,6 @@ "certifi", ] -# there is also a new version 'configparser2' to resolve the name ambuigity but that package might not be available -# everywhere -if sys.version_info < (3, 0): - install_requires += ["configparser"] - setup( name="openqa_review", version="{ver}".format(ver=version_git), @@ -66,6 +54,7 @@ "Development Status :: 5 - Production/Stable", "Topic :: Utilities", "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", ], entry_points={ "console_scripts": [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/tests/test_openqa_review.py new/python-openqa_review-1.24.0/tests/test_openqa_review.py --- old/python-openqa_review-1.23.0/tests/test_openqa_review.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/tests/test_openqa_review.py 2021-06-25 19:01:38.000000000 +0200 @@ -6,12 +6,6 @@ isort:skip_file """ -# see http://python-future.org/compatible_idioms.html -from __future__ import unicode_literals -from future.standard_library import install_aliases # isort:skip to keep 'install_aliases()' -from future.utils import iteritems - -install_aliases() import codecs import contextlib import os.path @@ -21,12 +15,14 @@ import tempfile from argparse import Namespace from builtins import str -from openqa_review.browser import filename_to_url from urllib.parse import urljoin, urlparse from configparser import ConfigParser # isort:skip can not make isort happy here import pytest +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +from openqa_review.browser import filename_to_url from openqa_review import openqa_review # SUT @@ -521,7 +517,7 @@ report = openqa_review.generate_report(args) # test double comment prevention code - p, pr = list(iteritems(report.report))[0] + p, pr = list(report.report.items())[0] report.report[p + 237] = pr openqa_review.reminder_comment_on_issues(report) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-openqa_review-1.23.0/tests/test_tumblesle_release.py new/python-openqa_review-1.24.0/tests/test_tumblesle_release.py --- old/python-openqa_review-1.23.0/tests/test_tumblesle_release.py 2021-06-24 15:05:31.000000000 +0200 +++ new/python-openqa_review-1.24.0/tests/test_tumblesle_release.py 2021-06-25 19:01:38.000000000 +0200 @@ -1,7 +1,3 @@ -# see http://python-future.org/compatible_idioms.html -from future.standard_library import install_aliases # isort:skip to keep 'install_aliases()' - -install_aliases() import contextlib import os import os.path ++++++ python-openqa_review.obsinfo ++++++ --- /var/tmp/diff_new_pack.y1T6nb/_old 2021-06-26 21:25:58.183383446 +0200 +++ /var/tmp/diff_new_pack.y1T6nb/_new 2021-06-26 21:25:58.183383446 +0200 @@ -1,5 +1,5 @@ name: python-openqa_review -version: 1.23.0 -mtime: 1624539931 -commit: bbeba7956e219beb48d19059607a2d157351663b +version: 1.24.0 +mtime: 1624640498 +commit: a9f2c8ab55c6a42338acbbef284cab30f01e1814