D: [iurt_root_command] chroot
Building target platforms: noarch
Building for target noarch
Installing /home/pterjan/rpmbuild/SRPMS/python-webunit-1.3.10-8.mga10.src.rpm
Executing(%mkbuilddir): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.3LZBzV
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ test -d /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ /usr/bin/rm -rf /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ /usr/bin/mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ /usr/bin/mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/SPECPARTS
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%prep): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.TUw2fm
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ rm -rf webunit-1.3.10
+ /usr/lib/rpm/rpmuncompress -x /home/pterjan/rpmbuild/SOURCES/webunit-1.3.10.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd webunit-1.3.10
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ chmod 644 CHANGES.txt README.txt
+ 2to3 -w .
/usr/bin/2to3:3: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  from lib2to3.main import main
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: No changes to ./setup.py
RefactoringTool: No changes to ./demo/__init__.py
RefactoringTool: No changes to ./demo/google.py
RefactoringTool: No changes to ./demo/python_org.py
RefactoringTool: Refactored ./webunit/HTMLParser.py
RefactoringTool: Refactored ./webunit/IMGSucker.py
RefactoringTool: Refactored ./webunit/SimpleDOM.py
RefactoringTool: No changes to ./webunit/__init__.py
RefactoringTool: Refactored ./webunit/config.py
RefactoringTool: Refactored ./webunit/cookie.py
--- ./webunit/HTMLParser.py	(original)
+++ ./webunit/HTMLParser.py	(refactored)
@@ -183,7 +183,7 @@
                 else:
                     if i < n-1:
                         raise HTMLParseError(
-                            "invalid '<' construct: %s" % `rawdata[i:i+2]`,
+                            "invalid '<' construct: %s" % repr(rawdata[i:i+2]),
                             self.getpos())
                     k = -1
                 if k < 0:
@@ -274,7 +274,7 @@
                 j = m.end()
             else:
                 raise HTMLParseError(
-                    "unexpected char in declaration: %s" % `rawdata[j]`,
+                    "unexpected char in declaration: %s" % repr(rawdata[j]),
                     self.getpos())
         return -1 # incomplete
 
@@ -330,7 +330,7 @@
             else:
                 offset = offset + len(self.__starttag_text)
             raise HTMLParseError("junk characters in start tag: %s"
-                                 % `rawdata[k:endpos][:20]`,
+                                 % repr(rawdata[k:endpos][:20]),
                                  (lineno, offset))
         if end[-2:] == '/>':
             # XHTML-style empty tag: <span attr="value" />
@@ -384,7 +384,7 @@
         j = match.end()
         match = endtagfind.match(rawdata, i) # </ + tag + >
         if not match:
-            raise HTMLParseError("bad end tag: %s" % `rawdata[i:j]`,
+            raise HTMLParseError("bad end tag: %s" % repr(rawdata[i:j]),
                                  self.getpos())
         tag = match.group(1)
         self.handle_endtag(string.lower(tag))
--- ./webunit/IMGSucker.py	(original)
+++ ./webunit/IMGSucker.py	(refactored)
@@ -7,7 +7,7 @@
 # 
 # $Id$
 
-import htmllib, formatter, urlparse
+import htmllib, formatter, urllib.parse
 
 class IMGSucker(htmllib.HTMLParser):
     '''Suck in all the images and linked stylesheets for an HTML page.
@@ -67,10 +67,10 @@
         newattributes = []
         for name, value in attributes:
             if name == 'src':
-                url = urlparse.urljoin(self.base, value)
+                url = urllib.parse.urljoin(self.base, value)
                 # TODO: figure the re-write path
                 # newattributes.append((name, path))
-                if not self.session.images.has_key(url):
+                if url not in self.session.images:
                     self.session.images[url] = self.session.fetch(url)
             else:
                 newattributes.append((name, value))
@@ -81,7 +81,7 @@
         newattributes = [('rel', 'stylesheet'), ('type', 'text/css')]
         for name, value in attributes:
             if name == 'href':
-                url = urlparse.urljoin(self.base, value)
+                url = urllib.parse.urljoin(self.base, value)
                 # TODO: figure the re-write path
                 # newattributes.append((name, path))
                 self.session.fetch(url)
--- ./webunit/SimpleDOM.py	(original)
+++ ./webunit/SimpleDOM.py	(refactored)
@@ -35,8 +35,8 @@
 import sys, string
 
 # NOTE this is using a modified HTMLParser
-from HTMLParser import HTMLParser, HTMLParseError
-from utility import Upload
+from .HTMLParser import HTMLParser, HTMLParseError
+from .utility import Upload
 
 BOOLEAN_HTML_ATTRS = [
     # List of Boolean attributes in HTML that may be given in
@@ -139,7 +139,7 @@
         for entry in l:
             if hasattr(entry, 'id') and entry.id == id:
                 return entry
-        raise ValueError, 'No %r with id %r'%(name, id)
+        raise ValueError('No %r with id %r'%(name, id))
 
     def getByNameFlat(self, name):
         '''Return all nodes of type "name" from the contents of this node.
@@ -182,21 +182,21 @@
         return self.getContents()[item]
 
     def hasattr(self, attr):
-        return self.__dict__['__attributes'].has_key(attr)
+        return attr in self.__dict__['__attributes']
 
     def getattr(self, attr, default=_marker):
-        if self.__dict__['__attributes'].has_key(attr):
+        if attr in self.__dict__['__attributes']:
             return self.__dict__['__attributes'][attr]
         if default is _marker:
-            raise AttributeError, attr
+            raise AttributeError(attr)
         return default
 
     def __getattr__(self, attr):
-        if self.__dict__['__attributes'].has_key(attr):
+        if attr in self.__dict__['__attributes']:
             return self.__dict__['__attributes'][attr]
-        if self.__dict__.has_key(attr):
+        if attr in self.__dict__:
             return self.__dict__[attr]
-        raise AttributeError, attr
+        raise AttributeError(attr)
     
     def __len__(self):
         return len(self.getContents())
@@ -209,7 +209,7 @@
 
     def __str__(self):
         attrs = []
-        for attr in self.__dict__['__attributes'].items():
+        for attr in list(self.__dict__['__attributes'].items()):
             if attr[0] in BOOLEAN_HTML_ATTRS:
                 attrs.append(attr[0])
             else:
@@ -339,8 +339,8 @@
 
     def handle_starttag(self, tag, attrs):
         if self.__debug:
-            print '\n>handle_starttag', tag
-            print self.tagstack
+            print('\n>handle_starttag', tag)
+            print(self.tagstack)
         self.close_para_tags(tag)
         self.tagstack.append(tag)
         d = {}
@@ -352,8 +352,8 @@
 
     def handle_startendtag(self, tag, attrs):
         if self.__debug:
-            print '><handle_startendtag', tag
-            print self.tagstack
+            print('><handle_startendtag', tag)
+            print(self.tagstack)
         self.close_para_tags(tag)
         d = {}
         for k, v in attrs:
@@ -362,8 +362,8 @@
 
     def handle_endtag(self, tag):
         if self.__debug:
-            print '<handle_endtag', tag
-            print self.tagstack
+            print('<handle_endtag', tag)
+            print(self.tagstack)
         if tag in EMPTY_HTML_TAGS:
             # </img> etc. in the source is an error
             raise EmptyTagError(tag, self.getpos())
@@ -375,7 +375,7 @@
         if tag in EMPTY_HTML_TAGS:
             return
         close_to = -1
-        if BLOCK_CLOSING_TAG_MAP.has_key(tag):
+        if tag in BLOCK_CLOSING_TAG_MAP:
             blocks_to_close = BLOCK_CLOSING_TAG_MAP[tag]
             for i in range(len(self.tagstack)):
                 t = self.tagstack[i]
@@ -404,8 +404,8 @@
 
     def implied_endtag(self, tag, implied):
         if self.__debug:
-            print '<implied_endtag', tag, implied
-            print self.tagstack
+            print('<implied_endtag', tag, implied)
+            print(self.tagstack)
         assert tag == self.tagstack[-1]
         assert implied in (-1, 1, 2)
         isend = (implied < 0)
@@ -432,18 +432,18 @@
 
     def emitStartTag(self, name, attrlist, isend=0):
         if isend:
-            if self.__debug: print '*** content'
+            if self.__debug: print('*** content')
             self.content.append(SimpleDOMNode(name, attrlist, []))
         else:
             # generate a new scope and push the current one on the stack
-            if self.__debug: print '*** push'
+            if self.__debug: print('*** push')
             newcontent = []
             self.stack.append(self.content)
             self.content.append(SimpleDOMNode(name, attrlist, newcontent))
             self.content = newcontent
 
     def emitEndTag(self, name):
-        if self.__debug: print '*** pop'
+        if self.__debug: print('*** pop')
         self.content = self.stack.pop()
 
     def emitText(self, text):
--- ./webunit/config.py	(original)
+++ ./webunit/config.py	(refactored)
@@ -23,9 +23,9 @@
 Then set the environment var "TEST_CONFIG" to the config to use.
 
 '''
-import ConfigParser, os
+import configparser, os
 
-cfg = ConfigParser.ConfigParser()
+cfg = configparser.ConfigParser()
 cfg.read('test/config.cfg')
 
 # figure the active config
--- ./webunit/cookie.py	(original)
+++ ./webunit/cookie.py	(refactored)
@@ -1,4 +1,4 @@
-import re, urlparse, Cookie
+import re, urllib.parse, http.cookies
 
 class Error:
     '''Handles a specific cookie error.
@@ -33,7 +33,7 @@RefactoringTool: Refactored ./webunit/utility.py
RefactoringTool: Refactored ./webunit/webunittest.py

             # We'll simply bail without raising an error
             # if the cookie is invalid.
             return result
-        if not result.has_key(name):
+        if name not in result:
             result[name]=value
     return result
 
@@ -45,13 +45,12 @@
     http://www.ietf.org/rfc/rfc2965.txt
     '''
     # the path of the request URL up to, but not including, the right-most /
-    request_path = urlparse.urlparse(url)[2]
+    request_path = urllib.parse.urlparse(url)[2]
     if len(request_path) > 1 and request_path[-1] == '/':
         request_path = request_path[:-1]
 
-    hdrcookies = Cookie.SimpleCookie("\n".join(map(lambda x: x.strip(), 
-        headers.getallmatchingheaders('set-cookie'))))
-    for cookie in hdrcookies.values():
+    hdrcookies = http.cookies.SimpleCookie("\n".join([x.strip() for x in headers.getallmatchingheaders('set-cookie')]))
+    for cookie in list(hdrcookies.values()):
         # XXX: there doesn't seem to be a way to determine if the
         # cookie was set or defaulted to an empty string :(
         if cookie['domain']:
@@ -60,7 +59,7 @@
             # reject if The value for the Domain attribute contains no
             # embedded dots or does not start with a dot.
             if '.' not in domain:
-                raise Error, 'Cookie domain "%s" has no "."'%domain
+                raise Error('Cookie domain "%s" has no "."'%domain)
             if domain[0] != '.':
                 # per RFC2965 cookie domains with no leading '.' will have
                 # one added
@@ -73,16 +72,16 @@
             # but not:
             #  - someexample.com
             if not server.endswith(domain) and domain[1:] != server:
-                raise Error, 'Cookie domain "%s" doesn\'t match '\
-                    'request host "%s"'%(domain, server)
+                raise Error('Cookie domain "%s" doesn\'t match '\
+                    'request host "%s"'%(domain, server))
             # reject if the request-host is a FQDN (not IP address) and
             # has the form HD, where D is the value of the Domain
             # attribute, and H is a string that contains one or more dots.
             if re.search(r'[a-zA-Z]', server):
                 H = server[:-len(domain)]
                 if '.' in H:
-                    raise Error, 'Cookie domain "%s" too short '\
-                    'for request host "%s"'%(domain, server)
+                    raise Error('Cookie domain "%s" too short '\
+                    'for request host "%s"'%(domain, server))
         else:
             domain = server
 
@@ -92,8 +91,8 @@
         # (noting that empty request path and '/' are often synonymous, yay)
         if not (request_path.startswith(path) or (request_path == '' and
                 cookie['path'] == '/')):
-            raise Error, 'Cookie path "%s" doesn\'t match '\
-                'request url "%s"'%(path, request_path)
+            raise Error('Cookie path "%s" doesn\'t match '\
+                'request url "%s"'%(path, request_path))
 
         bydom = cookies.setdefault(domain, {})
         bypath = bydom.setdefault(path, {})
--- ./webunit/utility.py	(original)
+++ ./webunit/utility.py	(refactored)
@@ -7,7 +7,7 @@
 # 
 # $Id$
 
-import cStringIO
+import io
 import os.path
 
 class Upload:
@@ -27,8 +27,8 @@
     '''Take the mapping of data and construct the body of a
     multipart/form-data message with it using the indicated boundaries.
     '''
-    ret = cStringIO.StringIO()
-    for key, value in data.items():
+    ret = io.StringIO()
+    for key, value in list(data.items()):
         if not key:
             continue
         # handle multiple entries for the same name
--- ./webunit/webunittest.py	(original)
+++ ./webunit/webunittest.py	(refactored)
@@ -7,18 +7,18 @@
 # 
 # $Id: webunittest.py,v 1.13 2004/08/26 02:50:19 richard Exp $
 
-import os, base64, urllib, urlparse, unittest, cStringIO, time, re, sys
-import httplib
+import os, base64, urllib.request, urllib.parse, urllib.error, urllib.parse, unittest, io, time, re, sys
+import http.client
 
 #try:
 #    from M2Crypto import httpslib
 #except ImportError:
 #    httpslib = None
 
-from SimpleDOM import SimpleDOMParser
-from IMGSucker import IMGSucker
-from utility import Upload, mimeEncode, boundary, log
-import cookie
+from .SimpleDOM import SimpleDOMParser
+from .IMGSucker import IMGSucker
+from .utility import Upload, mimeEncode, boundary, log
+from . import cookie
 
 VERBOSE = os.environ.get('VERBOSE', '')
 
@@ -155,9 +155,9 @@
         WebTestCase.result_count = WebTestCase.result_count + 1
         try:
             response = self.fetch(url, params, ok_codes=code, **kw)
-        except HTTPError, error:
-            self.log('post'+`(url, params)`, error.response.body)
-            raise self.failureException, str(error.response)
+        except HTTPError as error:
+            self.log('post'+repr((url, params)), error.response.body)
+            raise self.failureException(str(error.response))
         return response
 
     def postAssertCode(self, url, params, code=None, **kw):
@@ -170,10 +170,10 @@
             code = [code]
         try:
             response = self.fetch(url, params, ok_codes = code, **kw)
-        except HTTPError, error:
-            self.log('postAssertCode'+`(url, params, code)`,
+        except HTTPError as error:
+            self.log('postAssertCode'+repr((url, params, code)),
                 error.response.body)
-            raise self.failureException, str(error.response)
+            raise self.failureException(str(error.response))
         return response
 
     def postAssertContent(self, url, params, content, code=None, **kw):
@@ -186,14 +186,14 @@
             code = [code]
         try:
             response = self.fetch(url, params, ok_codes = code, **kw)
-        except HTTPError, error:
-            self.log('postAssertContent'+`(url, params, code)`,
+        except HTTPError as error:
+            self.log('postAssertContent'+repr((url, params, code)),
                 error.response.body)
-            raise self.failureException, str(error)
+            raise self.failureException(str(error))
         if response.body.find(content) == -1:
-            self.log('postAssertContent'+`(url, params, content)`,
+            self.log('postAssertContent'+repr((url, params, content)),
                 response.body)
-            raise self.failureException, 'Expected content not in response'
+            raise self.failureException('Expected content not in response')
         return response
 
     def postAssertNotContent(self, url, params, content, code=None, **kw):
@@ -206,14 +206,14 @@
             code = [code]
         try:
             response = self.fetch(url, params, ok_codes = code, **kw)
-        except HTTPError, error:
-            self.log('postAssertNotContent'+`(url, params, code)`,
+        except HTTPError as error:
+            self.log('postAssertNotContent'+repr((url, params, code)),
                 error.response.body)
-            raise self.failureException, str(error)
+            raise self.failureException(str(error))
         if response.body.find(content) != -1:
-            self.log('postAssertNotContent'+`(url, params, content)`,
+            self.log('postAssertNotContent'+repr((url, params, content)),
                 response.body)
-            raise self.failureException, 'Expected content was in response'
+            raise self.failureException('Expected content was in response')
         return response
 
     def postPage(self, url, params, code=None, **kw):
@@ -225,20 +225,20 @@
         WebTestCase.result_count = WebTestCase.result_count + 1
         try:
             response = self.fetch(url, params, ok_codes=code, **kw)
-        except HTTPError, error:
+        except HTTPError as error:
             self.log('postPage %r'%((url, params),), error.response.body)
-            raise self.failureException, str(error)
+            raise self.failureException(str(error))
 
         # Check return code for redirect
         while response.code in (301, 302):
             try:
                 # Figure the location - which may be relativeRefactoringTool: Files that were modified:
RefactoringTool: ./setup.py
RefactoringTool: ./demo/__init__.py
RefactoringTool: ./demo/google.py
RefactoringTool: ./demo/python_org.py
RefactoringTool: ./webunit/HTMLParser.py
RefactoringTool: ./webunit/IMGSucker.py
RefactoringTool: ./webunit/SimpleDOM.py
RefactoringTool: ./webunit/__init__.py
RefactoringTool: ./webunit/config.py
RefactoringTool: ./webunit/cookie.py
RefactoringTool: ./webunit/utility.py
RefactoringTool: ./webunit/webunittest.py

                 newurl = response.headers['Location']
-                url = urlparse.urljoin(url, newurl)
+                url = urllib.parse.urljoin(url, newurl)
                 response = self.fetch(url, ok_codes=code)
-            except HTTPError, error:
+            except HTTPError as error:
                 self.log('postPage %r'%url, error.response.body)
-                raise self.failureException, str(error)
+                raise self.failureException(str(error))
 
         # read and parse the content
         page = response.body
@@ -246,8 +246,8 @@
             self.writeResult(url, page)
         try:
             self.pageImages(url, page)
-        except HTTPError, error:
-            raise self.failureException, str(error)
+        except HTTPError as error:
+            raise self.failureException(str(error))
         return response
 
     #
@@ -310,7 +310,7 @@
         Returns a HTTPReponse object wrapping the response from the server.
         '''
         # see if the url is fully-qualified (not just a path)
-        t_protocol, t_server, t_url, x, t_args, x = urlparse.urlparse(url)
+        t_protocol, t_server, t_url, x, t_args, x = urllib.parse.urlparse(url)
         if t_server:
             protocol = t_protocol
             if ':' in t_server:
@@ -332,13 +332,13 @@
             # see if there's a base URL to use.
             base = self.get_base_url()
             if base:
-                t_protocol, t_server, t_url, x, x, x = urlparse.urlparse(base)
+                t_protocol, t_server, t_url, x, x, x = urllib.parse.urlparse(base)
                 if t_protocol:
                     protocol = t_protocol
                 if t_server:
                     server = t_server
                 if t_url:
-                    url = urlparse.urljoin(t_url, url)
+                    url = urllib.parse.urljoin(t_url, url)
 
         # TODO: allow override of the server and port from the URL!
         if server is None: server = self.server
@@ -347,7 +347,7 @@
         if ok_codes is None: ok_codes = self.expect_codes
 
         if protocol == 'http':
-            h = httplib.HTTP(server, int(port))
+            h = http.client.HTTP(server, int(port))
             if int(port) == 80:
                host_header = server
             else: 
@@ -355,21 +355,21 @@
         elif protocol == 'https':
             #if httpslib is None:
                 #raise ValueError, "Can't fetch HTTPS: M2Crypto not installed"
-            h = httplib.HTTPS(server, int(port))
+            h = http.client.HTTPS(server, int(port))
             if int(port) == 443:
                host_header = server
             else: 
                host_header = '%s:%s'%(server, port)
         else:
-            raise ValueError, protocol
+            raise ValueError(protocol)
 
         headers = []
         params = None
         if postdata:
-            for field,value in postdata.items():
+            for field,value in list(postdata.items()):
                 if type(value) == type({}):
                     postdata[field] = []
-                    for k,selected in value.items():
+                    for k,selected in list(value.items()):
                         if selected: postdata[field].append(k)
 
             # Do a post with the data file
@@ -392,17 +392,17 @@
         #    (http://www.ietf.org/rfc/rfc2109.txt)
         cookies_used = []
         cookie_list = []
-        for domain, cookies in self.cookies.items():
+        for domain, cookies in list(self.cookies.items()):
             # check cookie domain
             if not server.endswith(domain):
                 continue
-            for path, cookies in cookies.items():
+            for path, cookies in list(cookies.items()):
                 # check that the path matches
-                urlpath = urlparse.urlparse(url)[2]
+                urlpath = urllib.parse.urlparse(url)[2]
                 if not urlpath.startswith(path) and not (path == '/' and
                         urlpath == ''):
                     continue
-                for sendcookie in cookies.values():
+                for sendcookie in list(cookies.values()):
                     # and that the cookie is or isn't secure
                     if sendcookie['secure'] and protocol != 'https':
                         continue
@@ -436,7 +436,7 @@
 
         # get the body and save it
         f = h.getfile()
-        g = cStringIO.StringIO()
+        g = io.StringIO()
         d = f.read()
         while d:
             g.write(d)
@@ -467,15 +467,15 @@
             data = response.body
             for content in self.error_content:
                 if data.find(content) != -1:
-                    url = urlparse.urlunparse((protocol, server, url, '','',''))
+                    url = urllib.parse.urlunparse((protocol, server, url, '','',''))
                     msg = "URL %r matched error: %s"%(url, content)
                     if hasattr(self, 'results') and self.results:
                         self.writeError(url, msg)
-                    self.log('Matched error'+`(url, content)`, data)
+                    self.log('Matched error'+repr((url, content)), data)
                     if VERBOSE:
                         sys.stdout.write('c')
                         sys.stdout.flush()
-                    raise self.failureException, msg
+                    raise self.failureException(msg)
 
         if VERBOSE:
             sys.stdout.write('_')
@@ -541,8 +541,8 @@
             try:
                 parser.parseString(self.body)
             except:
-                log('HTTPResponse.getDOM'+`(self.url, self.code, self.message,
-                    self.headers)`, self.body)
+                log('HTTPResponse.getDOM'+repr((self.url, self.code, self.message,
+                    self.headers)), self.body)
                 raise
             self.dom = parser.getDOM()
         return self.dom
@@ -589,14 +589,14 @@
 
         # whack on the url params
         l = []
-        for k, v in formData.items():
+        for k, v in list(formData.items()):
             if isinstance(v, type([])):
                 for item in v:
-                    l.append('%s=%s'%(urllib.quote(k), 
-                        urllib.quote_plus(item, safe='')))
+                    l.append('%s=%s'%(urllib.parse.quote(k), 
+                        urllib.parse.quote_plus(item, safe='')))
             else:
-                l.append('%s=%s'%(urllib.quote(k),
-                    urllib.quote_plus(v, safe='')))
+                l.append('%s=%s'%(urllib.parse.quote(k),
+                    urllib.parse.quote_plus(v, safe='')))
         if l:
             url = url + '?' + '&'.join(l)
 
@@ -645,16 +645,16 @@
 #            assert formData.has_key(k), (formData, k)
 
         formData.update(postargs)
-        for k,v in postargs.items():
+        for k,v in list(postargs.items()):
             if v is None:
                 del formData[k]
 
         # transmogrify select/checkbox/radio select options from dicts
         # (key:'selected') to lists of values
-        for k,v in formData.items():
+        for k,v in list(formData.items()):
             if isinstance(v, type({})):
                 l = []
-                for kk,vv in v.items():
+                for kk,vv in list(v.items()):
                     if vv in ('selected', 'checked'):
                         l.append(kk)
                 formData[k] = l
@@ -673,7 +673,7 @@
                     url = '/%s/' % '/'.join(self.url.split('/')[:-1])
 
             elif not (url.startswith('/') or url.startswith('http')):
-                url = urlparse.urljoin(base, url)
+                url = urllib.parse.urljoin(base, url)
         else:
             url = self.url
 
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%generate_buildrequires): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.0JRb73
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ cd webunit-1.3.10
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ :
+ echo pyproject-rpm-macros
+ echo python3-devel
+ echo 'python3dist(pip) >= 19'
+ echo 'python3dist(packaging)'
+ '[' -f pyproject.toml ']'
+ '[' -f setup.py ']'
+ echo 'python3dist(setuptools) >= 40.8'
+ echo 'python3dist(wheel)'
+ for f in pyproject.toml setup.py setup.cfg
+ '[' -f pyproject.toml ']'
+ for f in pyproject.toml setup.py setup.cfg
+ '[' -f setup.py ']'
+ sed -i -E -e '/^requires/s/(['\''"]\s*flit_core\s*>=\s*[0-9]+(\.[0-9]+)+)\s*,\s*<\s*[0-9]+(\.[0-9]+)*(\s*['\''"])/\1\4/' setup.py
+ sed -i -E -e '/python_requires/s/(['\''"]?\s*\S*\s*>=\s*[0-9]+(\.[0-9]+)*)\s*(,\s*(<|!=)\s*[0-9]+(\.[0-9]+)*(\.\*)*)+(\s*['\''"]?)/\1\7/' setup.py
+ sed -i -E -e 's/(['\''"]?\s*\S*\s*>=\s*[0-9]+(\.[0-9a-z]+)*)\s*,\s*(<|!=|<=)\s*[0-9]+(\.[0-9a-z]+)*(-?dev[0-9]*)?(\.\*)*(\s*['\''"]?)/\1\7/g' setup.py
+ sed -i -E -e 's/(['\''"]\w+\s*)!=(\s*([0-9])+(\.[0-9]+)*\s*['\''"])/\1>\2/g' setup.py
+ sed -i -E -e 's/(['\''"]\s*>=\s*[0-9]+(\.[0-9]+)*)\s*,\s*(<|!=)\s*[0-9]+(\.[0-9]+)*(\s*['\''"])/\1\5/g' setup.py
+ sed -i -E -e 's/(['\''"]?\s*\S*\s*>=\s*[0-9]+(\.[0-9]+)*)\s*(,\s*(<|!=)\s*[0-9]+(\.[0-9]+)*(\.\*)*)+(\s*['\''"]?)/\1\7/g' setup.py
+ sed -i -E -e 's/(['\''"]\s*)\^(\s*[0-9]+(\.[0-9]+)*\s*['\''"])/\1>=\2/g' setup.py
+ sed -i -e 's/~=/>=/g' setup.py
+ sed -i -E -e 's/(['\''"]\s*\S*\s*)==(\s*[0-9]+(\.[0-9]+)*)\.\*(\s*['\''"])/\1>=\2\4/g' setup.py
+ sed -i -E -e 's/(['\''"]?\w*\s*>=\s*[0-9]+(\.[0-9]+)*)\s*,\s*(<|!=)[0-9]+(\.[0-9]+)*\s*(['\''"]?)/\1\5/g' setup.py
+ for f in pyproject.toml setup.py setup.cfg
+ '[' -f setup.cfg ']'
+ rm -rfv '*.dist-info/'
+ '[' -f /usr/bin/python3 ']'
+ mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/.pyproject-builddir
+ echo -n
+ CFLAGS='-O2 -g -pipe -Wformat -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -m64 -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full'
+ LDFLAGS='-Wl,--as-needed -Wl,--no-undefined -Wl,-z,relro -Wl,-z,now -Wl,-O1 -Wl,--build-id=sha1 -Wl,--enable-new-dtags -specs=/usr/lib/rpm/redhat/redhat-hardened-ld'
+ TMPDIR=/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/.pyproject-builddir
+ RPM_TOXENV=py312
+ HOSTNAME=rpmbuild
+ /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/pyproject-wheeldir --output /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-buildrequires
Handling setuptools >= 40.8 from default build backend
Requirement satisfied: setuptools >= 40.8
   (installed: setuptools 75.6.0)
Handling wheel from default build backend
Requirement satisfied: wheel
   (installed: wheel 0.43.0)
+ cat /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-buildrequires
+ rm -rfv webunit-1.3.10.dist-info/
removed 'webunit-1.3.10.dist-info/top_level.txt'
removed 'webunit-1.3.10.dist-info/METADATA'
removed directory 'webunit-1.3.10.dist-info/'
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%build): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.VA3NFd
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ cd webunit-1.3.10
+ '[' 1 -eq 1 ']'
+ '[' 1 -eq 1 ']'
+ mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/.pyproject-builddir
+ CFLAGS='-O2 -g -pipe -Wformat -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -m64 -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full'
+ LDFLAGS='-Wl,--as-needed -Wl,--no-undefined -Wl,-z,relro -Wl,-z,now -Wl,-O1 -Wl,--build-id=sha1 -Wl,--enable-new-dtags -specs=/usr/lib/rpm/redhat/redhat-hardened-ld'
+ TMPDIR=/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/.pyproject-builddir
+ /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/pyproject-wheeldir
Processing /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10
  Preparing metadata (pyproject.toml): started
  Running command Preparing metadata (pyproject.toml)
  Preparing metadata (pyproject.toml): finished with status 'done'
Building wheels for collected packages: webunit
  Building wheel for webunit (pyproject.toml): started
  Running command Building wheel for webunit (pyproject.toml)
  Building wheel for webunit (pyproject.toml): finished with status 'done'
  Created wheel for webunit: filename=webunit-1.3.10-py3-none-any.whl size=23334 sha256=e93392cef9378a50b8e0537b428300858bb009ff41f4d2b79c42d01ced676699
  Stored in directory: /home/pterjan/.cache/pip/wheels/c3/70/7b/8645d4a8503c15d82f467781f0f7d4c10c65d0225bf82a9260
Successfully built webunit
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.0dSllV
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ '[' 1 -eq 1 ']'
+ '[' /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT '!=' / ']'
+ rm -rf /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT
++ dirname /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT
+ mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ mkdir /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT
+ cd webunit-1.3.10
+ '[' 1 -eq 1 ']'
++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/'
++ ls /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/pyproject-wheeldir/webunit-1.3.10-py3-none-any.whl
++ xargs basename --multiple
+ specifier=webunit==1.3.10
+ '[' -z webunit==1.3.10 ']'
+ TMPDIR=/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/.pyproject-builddir
+ /usr/bin/python3 -m pip install --root /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/pyproject-wheeldir webunit==1.3.10
Using pip 24.3.1 from /usr/lib/python3.12/site-packages/pip (python 3.12)
Looking in links: /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/pyproject-wheeldir
Processing ./pyproject-wheeldir/webunit-1.3.10-py3-none-any.whl
Installing collected packages: webunit
Successfully installed webunit-1.3.10
+ '[' -d /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/bin ']'
+ rm -f /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-ghost-distinfo
+ site_dirs=()
+ '[' -d /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages ']'
+ site_dirs+=("/usr/lib/python3.12/site-packages")
+ '[' /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib64/python3.12/site-packages '!=' /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages ']'
+ '[' -d /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib64/python3.12/site-packages ']'
+ for site_dir in ${site_dirs[@]}
+ for distinfo in /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT$site_dir/*.dist-info
+ echo '%ghost /usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info'
+ sed -i s/pip/rpm/ /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/INSTALLER
+ PYTHONPATH=/usr/lib/rpm/redhat
+ /usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py --buildroot /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT --record /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/RECORD --output /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-record
+ rm -fv /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/RECORD
removed '/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/RECORD'
+ rm -fv /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/REQUESTED
removed '/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/webunit-1.3.10.dist-info/REQUESTED'
++ wc -l /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-ghost-distinfo
++ cut -f1 '-d '
+ lines=1
+ '[' 1 -ne 1 ']'
+ RPM_FILES_ESCAPE=4.19
+ /usr/bin/python3 /usr/lib/rpm/redhat/pyproject_save_files.py --output-files /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-files --output-modules /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-modules --buildroot /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT --sitelib /usr/lib/python3.12/site-packages --sitearch /usr/lib64/python3.12/site-packages --python-version 3.12 --pyproject-record /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/python-webunit-1.3.10-8.mga10.noarch-pyproject-record --prefix /usr webunit
+ rm -rf /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12/site-packages/demo
+ /usr/lib/rpm/check-buildroot
+ '[' -n '' ']'
+ /usr/share/spec-helper/clean_files
+ '[' -n '' ']'
+ /usr/share/spec-helper/compress_files .xz
+ '[' -n '' ']'
+ /usr/share/spec-helper/relink_symlinks
+ '[' -n '' ']'
+ /usr/share/spec-helper/clean_perl
+ '[' -n '' ']'
+ /usr/share/spec-helper/lib_symlinks
+ '[' -n '' ']'
+ /usr/share/spec-helper/gprintify
+ '[' -n '' ']'
+ /usr/share/spec-helper/fix_mo
+ '[' -n '' ']'
+ /usr/share/spec-helper/fix_pamd
+ '[' -n '' ']'
+ /usr/share/spec-helper/remove_info_dir
+ '[' -n '' ']'
+ /usr/share/spec-helper/fix_eol
+ '[' -n '' ']'
+ /usr/share/spec-helper/check_desktop_files
+ '[' -n '' ']'
+ /usr/share/spec-helper/check_elf_files
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/brp-remove-la-files
+ /usr/lib/rpm/redhat/brp-mangle-shebangs
+ env -u SOURCE_DATE_EPOCH /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j16
Bytecompiling .py files below /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/lib/python3.12 using python3.12
Not clamping source mtimes, $SOURCE_DATE_EPOCH not set
/usr/lib/python3.12/site-packages/webunit/HTMLParser.py:52: SyntaxWarning: invalid escape sequence '\s'
/usr/lib/python3.12/site-packages/webunit/HTMLParser.py:52: SyntaxWarning: invalid escape sequence '\s'
+ /usr/lib/rpm/redhat/brp-python-hardlink
Processing files: python3-webunit-1.3.10-8.mga10.noarch
Executing(%doc): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.6cPjiN
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ cd webunit-1.3.10
+ DOCDIR=/home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/share/doc/python3-webunit
+ export LC_ALL=C
+ LC_ALL=C
+ export DOCDIR
+ /usr/bin/mkdir -p /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/share/doc/python3-webunit
+ cp -pr /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/CHANGES.txt /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/share/doc/python3-webunit
+ cp -pr /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/webunit-1.3.10/README.txt /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT/usr/share/doc/python3-webunit
+ RPM_EC=0
++ jobs -p
+ exit 0
Provides: python-webunit = 1.3.10-8.mga10 python3-webunit = 1.3.10-8.mga10 python3.12-webunit = 1.3.10-8.mga10 python3.12dist(webunit) = 1.3.10 python3dist(webunit) = 1.3.10
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PartialHardlinkSets) <= 4.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: python(abi) = 3.12
Obsoletes: python-webunit < 1.3.10-8.mga10
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build/BUILDROOT
Wrote: /home/pterjan/rpmbuild/RPMS/noarch/python3-webunit-1.3.10-8.mga10.noarch.rpm
Executing(rmbuild): /bin/sh -e /home/pterjan/rpmbuild/tmp/rpm-tmp.J5AE8l
+ umask 022
+ cd /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ test -d /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ rm -rf /home/pterjan/rpmbuild/BUILD/python-webunit-1.3.10-build
+ RPM_EC=0
++ jobs -p
+ exit 0
D: [iurt_root_command] Success!