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
 

Reply via email to