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 - [email protected]
+
+- 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