From nobody Mon Sep 26 15:44:56 2022 X-Original-To: dev-commits-ports-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4MbnBc75Brz4XN3Q; Mon, 26 Sep 2022 15:44:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4MbnBc6mwJz44k8; Mon, 26 Sep 2022 15:44:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664207096; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=FNzOGkTLzAqmXpab9nQb8/CzAgGl8/uyla6LGbb9F1A=; b=yoHhJYtvQJwiY5Q2fgmkIofBSfnjGuREqbI6Ca95/5gKRCy9HPJSeHvC3Fks8ANF/v9tgX nIFfj8JSg9EEgoLDTdMRmf6nLw+sOl8nkWWfA2dYdNdEwOHk5RQaKxuGO7si5kyi+mXWdz hUfi0dz1etjmTOaVYHDw+2uJwBJzT4v3QDmAFlZqgmH0Euby0mZZGSaD6zTyrfl5fbbEuh MEnELPs+MHJw56NM41GKTkPprSJFUc2gALeIEWzri2ni/T7VSilMWMQVRpXEextuRuy5QA ehATneDPeLtX+mfu7ig1TCEm2fszI6u7wVwRl4F05lFhTcCrObhOKw5SjKhNzg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4MbnBc5ZRZzptY; Mon, 26 Sep 2022 15:44:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28QFiua5060909; Mon, 26 Sep 2022 15:44:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28QFiuRR060908; Mon, 26 Sep 2022 15:44:56 GMT (envelope-from git) Date: Mon, 26 Sep 2022 15:44:56 GMT Message-Id: <202209261544.28QFiuRR060908@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Nicola Vitale Subject: git: 7084790175b0 - main - textproc/py-genshi: update to 0.7.7 List-Id: Commits to the main branch of the FreeBSD ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-main@freebsd.org X-BeenThere: dev-commits-ports-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: nivit X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7084790175b0cf0578c35f8080153f8280ee191e Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664207096; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=FNzOGkTLzAqmXpab9nQb8/CzAgGl8/uyla6LGbb9F1A=; b=OVt91BNjPsJgIXc3S2JfDdLvaoVHSeTzANSc49xeyFRjRVJNN1Og3P0xy5TKX05BLW1H7F oD/nDd0+5euYN3TGk5EsKHnm8GBPBfZW6HWDSSwrtEkLY5hnlyTvtOeG5OBVLobIyiFfT1 IkwNYY9XN/nwjAbCf1mgUqFtCthR6qOaQA5gnWUp0Sj7K35GyGVp/YlzjeS6ua8iMvokys Vlo46Xzzsfj0QlHbUi76iwRbPAeaDmMLMcnwb45DL66hmBRXY3pdGyZssyn4hw+GUEEl/V 90NB+IXNCxe1qgZJOC8LF3fe/Sc1ziSgT/dmlPnw5oLOqiIVy9m3qghHEhw/3g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1664207096; a=rsa-sha256; cv=none; b=UbHKkgEwc9sV166YS3hT3f8Ur4Wi38exiV1gyGPBQG8NcmBR4dci1GHwWhjyvARc2loBDl 14dtWq3BrjtI+JzThtx1k6Ey5QDgjm/Zh2IcO+q3URh2YRTqMGzpPH8sYDp7YcedA/7Lhf dC1CnF25k0gmSoIMBlJiWoe2d1Bv5xnWbKMCTdciRmFCzf8TmnMrIY0ns4sPOeEz2RXpi6 R3Ra6CD6DwWDyflWQKwZJfcJvHWsdGibh2Z7Ti6RhTa9rUNSy6kqHDAxAmvGzCNOSBkSmP tIWMcJn3QQcCvIsB1WFRaU9ItitPsl2oHfaEXFqjLSJL24Pe456+hNVc88EbQQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by nivit: URL: https://cgit.FreeBSD.org/ports/commit/?id=7084790175b0cf0578c35f8080153f8280ee191e commit 7084790175b0cf0578c35f8080153f8280ee191e Author: Nicola Vitale AuthorDate: 2022-09-26 15:41:21 +0000 Commit: Nicola Vitale CommitDate: 2022-09-26 15:44:13 +0000 textproc/py-genshi: update to 0.7.7 - Remove files/patch-2to3 because the module supports Python 3 now - Remove NO_ARCH because the module install a shared library - Add a post-install target to strip such library --- textproc/py-genshi/Makefile | 9 +- textproc/py-genshi/distinfo | 6 +- textproc/py-genshi/files/patch-2to3 | 5818 ----------------------------------- 3 files changed, 8 insertions(+), 5825 deletions(-) diff --git a/textproc/py-genshi/Makefile b/textproc/py-genshi/Makefile index 6d4b0e44f90f..fba3d0399c41 100644 --- a/textproc/py-genshi/Makefile +++ b/textproc/py-genshi/Makefile @@ -1,5 +1,5 @@ PORTNAME= Genshi -PORTVERSION= 0.7.3 +PORTVERSION= 0.7.7 CATEGORIES= textproc www python MASTER_SITES= CHEESESHOP PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} @@ -12,16 +12,17 @@ LICENSE= BSD3CLAUSE LICENSE_FILE= ${WRKSRC}/COPYING USES= python:3.6+ -USE_PYTHON= distutils autoplist +USE_PYTHON= autoplist distutils OPTIONS_DEFINE= BABEL BABEL_DESC= I18n support through the Babel plugin BABEL_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}Babel>=0.8:devel/py-babel@${PY_FLAVOR} +post-install: + @${STRIP_CMD} ${STAGEDIR}${PYTHON_SITELIBDIR}/genshi/_speedups${PYTHON_EXT_SUFFIX}.so + do-test: @cd ${WRKSRC} && ${PYTHON_CMD} ${PYDISTUTILS_SETUP} test -NO_ARCH= yes - .include diff --git a/textproc/py-genshi/distinfo b/textproc/py-genshi/distinfo index 468327f873ab..9de867152159 100644 --- a/textproc/py-genshi/distinfo +++ b/textproc/py-genshi/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1576467154 -SHA256 (Genshi-0.7.3.tar.gz) = 7933c95151d7dd2124a2b4c8dd85bb6aec881ca17c0556da0b40e56434b313a0 -SIZE (Genshi-0.7.3.tar.gz) = 271238 +TIMESTAMP = 1664204725 +SHA256 (Genshi-0.7.7.tar.gz) = c100520862cd69085d10ee1a87e91289e7f59f6b3d9bd622bf58b2804e6b9aab +SIZE (Genshi-0.7.7.tar.gz) = 267206 diff --git a/textproc/py-genshi/files/patch-2to3 b/textproc/py-genshi/files/patch-2to3 deleted file mode 100644 index 1764fbffbda4..000000000000 --- a/textproc/py-genshi/files/patch-2to3 +++ /dev/null @@ -1,5818 +0,0 @@ ---- examples/basic/kidrun.py.orig 2019-05-27 21:03:08 UTC -+++ examples/basic/kidrun.py -@@ -17,11 +17,11 @@ def test(): - - start = time.clock() - template = kid.Template(file='test.kid', **ctxt) -- print ' --> parse stage: %.4f ms' % ((time.clock() - start) * 1000) -+ print(' --> parse stage: %.4f ms' % ((time.clock() - start) * 1000)) - - for output in template.generate(): - sys.stdout.write(output) -- print -+ print() - - times = [] - for i in range(1000): -@@ -30,10 +30,10 @@ def test(): - times.append(time.clock() - start) - sys.stdout.write('.') - sys.stdout.flush() -- print -+ print() - -- print ' --> render stage: %s ms (average)' % ( -- (sum(times) / len(times) * 1000)) -+ print(' --> render stage: %s ms (average)' % ( -+ (sum(times) / len(times) * 1000))) - - if __name__ == '__main__': - if '-p' in sys.argv: ---- examples/basic/run.py.orig 2019-05-27 21:03:08 UTC -+++ examples/basic/run.py -@@ -13,13 +13,13 @@ def test(): - - start = time.clock() - tmpl = loader.load('test.html') -- print ' --> parse stage: %.4f ms' % ((time.clock() - start) * 1000) -+ print(' --> parse stage: %.4f ms' % ((time.clock() - start) * 1000)) - - data = dict(hello='', skin='default', hey='ZYX', bozz=None, - items=['Number %d' % num for num in range(1, 15)], - prefix='#') - -- print tmpl.generate(**data).render(method='html') -+ print(tmpl.generate(**data).render(method='html')) - - times = [] - for i in range(1000): -@@ -28,10 +28,10 @@ def test(): - times.append(time.clock() - start) - sys.stdout.write('.') - sys.stdout.flush() -- print -+ print() - -- print ' --> render stage: %s ms (average)' % ( -- (sum(times) / len(times) * 1000)) -+ print(' --> render stage: %s ms (average)' % ( -+ (sum(times) / len(times) * 1000))) - - if __name__ == '__main__': - if '-p' in sys.argv: ---- examples/bench/basic.py.orig 2019-05-27 21:03:08 UTC -+++ examples/bench/basic.py -@@ -5,7 +5,7 @@ - - from cgi import escape - import os --from StringIO import StringIO -+from io import StringIO - import sys - import timeit - -@@ -22,7 +22,7 @@ def genshi(dirname, verbose=False): - return template.generate(**data).render('xhtml') - - if verbose: -- print render() -+ print(render()) - return render - - def genshi_text(dirname, verbose=False): -@@ -36,14 +36,14 @@ def genshi_text(dirname, verbose=False): - return template.generate(**data).render('text') - - if verbose: -- print render() -+ print(render()) - return render - - def mako(dirname, verbose=False): - try: - from mako.lookup import TemplateLookup - except ImportError: -- print>>sys.stderr, 'Mako not installed, skipping' -+ print('Mako not installed, skipping', file=sys.stderr) - return lambda: None - lookup = TemplateLookup(directories=[dirname], filesystem_checks=False) - template = lookup.get_template('template.html') -@@ -52,7 +52,7 @@ def mako(dirname, verbose=False): - list_items=['Number %d' % num for num in range(1, 15)]) - return template.render(**data) - if verbose: -- print render() -+ print(render()) - return render - - def cheetah(dirname, verbose=False): -@@ -60,7 +60,7 @@ def cheetah(dirname, verbose=False): - try: - from Cheetah.Template import Template - except ImportError: -- print>>sys.stderr, 'Cheetah not installed, skipping' -+ print('Cheetah not installed, skipping', file=sys.stderr) - return lambda: None - class MyTemplate(Template): - def serverSidePath(self, path): return os.path.join(dirname, path) -@@ -70,18 +70,18 @@ def cheetah(dirname, verbose=False): - def render(): - template = MyTemplate(file=filename, - searchList=[{'title': 'Just a test', 'user': 'joe', -- 'items': [u'Number %d' % num for num in range(1, 15)]}]) -+ 'items': ['Number %d' % num for num in range(1, 15)]}]) - return template.respond() - - if verbose: -- print render() -+ print(render()) - return render - - def clearsilver(dirname, verbose=False): - try: - import neo_cgi - except ImportError: -- print>>sys.stderr, 'ClearSilver not installed, skipping' -+ print('ClearSilver not installed, skipping', file=sys.stderr) - return lambda: None - neo_cgi.update() - import neo_util -@@ -98,7 +98,7 @@ def clearsilver(dirname, verbose=False): - return cs.render() - - if verbose: -- print render() -+ print(render()) - return render - - def django(dirname, verbose=False): -@@ -106,7 +106,7 @@ def django(dirname, verbose=False): - from django.conf import settings - settings.configure(TEMPLATE_DIRS=[os.path.join(dirname, 'templates')]) - except ImportError: -- print>>sys.stderr, 'Django not installed, skipping' -+ print('Django not installed, skipping', file=sys.stderr) - return lambda: None - from django import template, templatetags - from django.template import loader -@@ -119,14 +119,14 @@ def django(dirname, verbose=False): - return tmpl.render(template.Context(data)) - - if verbose: -- print render() -+ print(render()) - return render - - def kid(dirname, verbose=False): - try: - import kid - except ImportError: -- print>>sys.stderr, "Kid not installed, skipping" -+ print("Kid not installed, skipping", file=sys.stderr) - return lambda: None - kid.path = kid.TemplatePath([dirname]) - template = kid.load_template('template.kid').Template -@@ -137,14 +137,14 @@ def kid(dirname, verbose=False): - ).serialize(output='xhtml') - - if verbose: -- print render() -+ print(render()) - return render - - def simpletal(dirname, verbose=False): - try: - from simpletal import simpleTAL, simpleTALES - except ImportError: -- print>>sys.stderr, "SimpleTAL not installed, skipping" -+ print("SimpleTAL not installed, skipping", file=sys.stderr) - return lambda: None - fileobj = open(os.path.join(dirname, 'base.html')) - base = simpleTAL.compileHTMLTemplate(fileobj) -@@ -163,7 +163,7 @@ def simpletal(dirname, verbose=False): - return buf.getvalue() - - if verbose: -- print render() -+ print(render()) - return render - - def run(engines, number=2000, verbose=False): -@@ -171,19 +171,19 @@ def run(engines, number=2000, verbose=False): - for engine in engines: - dirname = os.path.join(basepath, engine) - if verbose: -- print '%s:' % engine.capitalize() -- print '--------------------------------------------------------' -+ print('%s:' % engine.capitalize()) -+ print('--------------------------------------------------------') - else: -- print '%s:' % engine.capitalize(), -+ print('%s:' % engine.capitalize(), end=' ') - t = timeit.Timer(setup='from __main__ import %s; render = %s(r"%s", %s)' - % (engine, engine, dirname, verbose), - stmt='render()') - time = t.timeit(number=number) / number - if verbose: -- print '--------------------------------------------------------' -- print '%.2f ms' % (1000 * time) -+ print('--------------------------------------------------------') -+ print('%.2f ms' % (1000 * time)) - if verbose: -- print '--------------------------------------------------------' -+ print('--------------------------------------------------------') - - - if __name__ == '__main__': ---- examples/bench/bigtable.py.orig 2019-05-27 21:03:08 UTC -+++ examples/bench/bigtable.py -@@ -8,7 +8,7 @@ - import cgi - import sys - import timeit --from StringIO import StringIO -+from io import StringIO - from genshi.builder import tag - from genshi.template import MarkupTemplate, NewTextTemplate - -@@ -111,7 +111,7 @@ def test_genshi_text(): - def test_genshi_builder(): - """Genshi template + tag builder""" - stream = tag.TABLE([ -- tag.tr([tag.td(c) for c in row.values()]) -+ tag.tr([tag.td(c) for c in list(row.values())]) - for row in table - ]).generate() - stream = genshi_tmpl2.generate(table=stream) -@@ -121,7 +121,7 @@ def test_builder(): - """Genshi tag builder""" - stream = tag.TABLE([ - tag.tr([ -- tag.td(c) for c in row.values() -+ tag.td(c) for c in list(row.values()) - ]) - for row in table - ]).generate() -@@ -151,7 +151,7 @@ if kid: - _table = cet.Element('table') - for row in table: - td = cet.SubElement(_table, 'tr') -- for c in row.values(): -+ for c in list(row.values()): - cet.SubElement(td, 'td').text=str(c) - kid_tmpl2.table = _table - kid_tmpl2.serialize(output='html') -@@ -162,7 +162,7 @@ if et: - _table = et.Element('table') - for row in table: - tr = et.SubElement(_table, 'tr') -- for c in row.values(): -+ for c in list(row.values()): - et.SubElement(tr, 'td').text=str(c) - et.tostring(_table) - -@@ -172,7 +172,7 @@ if cet: - _table = cet.Element('table') - for row in table: - tr = cet.SubElement(_table, 'tr') -- for c in row.values(): -+ for c in list(row.values()): - cet.SubElement(tr, 'td').text=str(c) - cet.tostring(_table) - -@@ -201,7 +201,7 @@ def run(which=None, number=10): - 'test_et', 'test_cet', 'test_clearsilver', 'test_django'] - - if which: -- tests = filter(lambda n: n[5:] in which, tests) -+ tests = [n for n in tests if n[5:] in which] - - for test in [t for t in tests if hasattr(sys.modules[__name__], t)]: - t = timeit.Timer(setup='from __main__ import %s;' % test, -@@ -212,7 +212,7 @@ def run(which=None, number=10): - result = ' (not installed?)' - else: - result = '%16.2f ms' % (1000 * time) -- print '%-35s %s' % (getattr(sys.modules[__name__], test).__doc__, result) -+ print('%-35s %s' % (getattr(sys.modules[__name__], test).__doc__, result)) - - - if __name__ == '__main__': ---- examples/bench/xpath.py.orig 2019-05-27 21:03:08 UTC -+++ examples/bench/xpath.py -@@ -32,7 +32,7 @@ def benchmark(f, acurate_time=1): - runs = 1 - while True: - start_time = time_func() -- for _ in xrange(runs): -+ for _ in range(runs): - f() - dt = time_func() - start_time - if dt >= acurate_time: -@@ -61,23 +61,23 @@ def spell(t): - - def test_paths_in_streams(exprs, streams, test_strategies=False): - for expr in exprs: -- print "Testing path %r" % expr -+ print("Testing path %r" % expr) - for stream, sname in streams: -- print '\tRunning on "%s" example:' % sname -+ print('\tRunning on "%s" example:' % sname) - - path = Path(expr) - def f(): - for e in path.select(stream): - pass - t = spell(benchmark(f)) -- print "\t\tselect:\t\t%s" % t -+ print("\t\tselect:\t\t%s" % t) - - def f(): - path = Path(expr) - for e in path.select(stream): - pass - t = spell(benchmark(f)) -- print "\t\tinit + select:\t%s" % t -+ print("\t\tinit + select:\t%s" % t) - - if test_strategies and len(path.paths) == 1: - from genshi.path import GenericStrategy, SingleStepStrategy, \ -@@ -88,13 +88,13 @@ def test_paths_in_streams(exprs, streams, test_strateg - for strategy in strategies: - if not strategy.supports(path.paths[0]): - continue -- print "\t\t%s Strategy"%strategy.__name__ -+ print("\t\t%s Strategy"%strategy.__name__) - fp = FakePath(strategy(path.paths[0])) - def f(): - for e in fp.select(stream): - pass - t = spell(benchmark(f)) -- print "\t\t\tselect:\t\t%s"%t -+ print("\t\t\tselect:\t\t%s"%t) - - - def test_documents(test_strategies=False): ---- examples/tutorial/geddit/controller.py.orig 2019-05-27 21:03:08 UTC -+++ examples/tutorial/geddit/controller.py -@@ -20,7 +20,7 @@ class Root(object): - @cherrypy.expose - @template.output('index.html') - def index(self): -- links = sorted(self.data.values(), key=operator.attrgetter('time')) -+ links = sorted(list(self.data.values()), key=operator.attrgetter('time')) - return template.render(links=links) - - @cherrypy.expose -@@ -35,7 +35,7 @@ class Root(object): - link = Link(**data) - self.data[link.id] = link - raise cherrypy.HTTPRedirect('/') -- except Invalid, e: -+ except Invalid as e: - errors = e.unpack_errors() - else: - errors = {} -@@ -69,7 +69,7 @@ class Root(object): - raise cherrypy.HTTPRedirect('/info/%s' % link.id) - return template.render('_comment.html', comment=comment, - num=len(link.comments)) -- except Invalid, e: -+ except Invalid as e: - errors = e.unpack_errors() - else: - errors = {} -@@ -89,7 +89,7 @@ class Root(object): - raise cherrypy.NotFound() - return template.render('info.xml', link=link) - else: -- links = sorted(self.data.values(), key=operator.attrgetter('time')) -+ links = sorted(list(self.data.values()), key=operator.attrgetter('time')) - return template.render(links=links) - - ---- genshi/builder.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/builder.py -@@ -107,7 +107,7 @@ class Fragment(object): - return str(self.generate()) - - def __unicode__(self): -- return unicode(self.generate()) -+ return str(self.generate()) - - def __html__(self): - return Markup(self.generate()) -@@ -118,7 +118,7 @@ class Fragment(object): - :param node: the node to append; can be an `Element`, `Fragment`, or a - `Stream`, or a Python string or number - """ -- if isinstance(node, (Stream, Element, basestring, int, float, long)): -+ if isinstance(node, (Stream, Element, str, int, float)): - # For objects of a known/primitive type, we avoid the check for - # whether it is iterable for better performance - self.children.append(node) -@@ -140,8 +140,8 @@ class Fragment(object): - for event in child: - yield event - else: -- if not isinstance(child, basestring): -- child = unicode(child) -+ if not isinstance(child, str): -+ child = str(child) - yield TEXT, child, (None, -1, -1) - - def generate(self): -@@ -155,10 +155,10 @@ class Fragment(object): - def _kwargs_to_attrs(kwargs): - attrs = [] - names = set() -- for name, value in kwargs.items(): -+ for name, value in list(kwargs.items()): - name = name.rstrip('_').replace('_', '-') - if value is not None and name not in names: -- attrs.append((QName(name), unicode(value))) -+ attrs.append((QName(name), str(value))) - names.add(name) - return Attrs(attrs) - ---- genshi/compat.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/compat.py -@@ -40,7 +40,7 @@ else: - - if IS_PYTHON2: - def isstring(obj): -- return isinstance(obj, basestring) -+ return isinstance(obj, str) - else: - def isstring(obj): - return isinstance(obj, str) -@@ -48,9 +48,9 @@ else: - # We need to differentiate between StringIO and BytesIO in places - - if IS_PYTHON2: -- from StringIO import StringIO -+ from io import StringIO - try: -- from cStringIO import StringIO as BytesIO -+ from io import StringIO as BytesIO - except ImportError: - BytesIO = StringIO - else: -@@ -124,7 +124,7 @@ try: - next = next - except NameError: - def next(iterator): -- return iterator.next() -+ return iterator.__next__() - - # Compatibility fallback implementations for Python < 2.5 - ---- genshi/core.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/core.py -@@ -271,7 +271,7 @@ def _ensure(stream): - """Ensure that every item on the stream is actually a markup event.""" - stream = iter(stream) - try: -- event = stream.next() -+ event = next(stream) - except StopIteration: - return - -@@ -282,7 +282,7 @@ def _ensure(stream): - if hasattr(event, 'totuple'): - event = event.totuple() - else: -- event = TEXT, unicode(event), (None, -1, -1) -+ event = TEXT, str(event), (None, -1, -1) - yield event - return - -@@ -411,7 +411,7 @@ class Attrs(tuple): - :return: a new instance with the attribute removed - :rtype: `Attrs` - """ -- if isinstance(names, basestring): -+ if isinstance(names, str): - names = (names,) - return Attrs([(name, val) for name, val in self if name not in names]) - -@@ -445,33 +445,33 @@ class Attrs(tuple): - return TEXT, ''.join([x[1] for x in self]), (None, -1, -1) - - --class Markup(unicode): -+class Markup(str): - """Marks a string as being safe for inclusion in HTML/XML output without - needing to be escaped. - """ - __slots__ = [] - - def __add__(self, other): -- return Markup(unicode.__add__(self, escape(other))) -+ return Markup(str.__add__(self, escape(other))) - - def __radd__(self, other): -- return Markup(unicode.__add__(escape(other), self)) -+ return Markup(str.__add__(escape(other), self)) - - def __mod__(self, args): - if isinstance(args, dict): -- args = dict(zip(args.keys(), map(escape, args.values()))) -+ args = dict(list(zip(list(args.keys()), list(map(escape, list(args.values())))))) - elif isinstance(args, (list, tuple)): - args = tuple(map(escape, args)) - else: - args = escape(args) -- return Markup(unicode.__mod__(self, args)) -+ return Markup(str.__mod__(self, args)) - - def __mul__(self, num): -- return Markup(unicode.__mul__(self, num)) -+ return Markup(str.__mul__(self, num)) - __rmul__ = __mul__ - - def __repr__(self): -- return "<%s %s>" % (type(self).__name__, unicode.__repr__(self)) -+ return "<%s %s>" % (type(self).__name__, str.__repr__(self)) - - def join(self, seq, escape_quotes=True): - """Return a `Markup` object which is the concatenation of the strings -@@ -488,7 +488,7 @@ class Markup(unicode): - :rtype: `Markup` - :see: `escape` - """ -- return Markup(unicode.join(self, [escape(item, quotes=escape_quotes) -+ return Markup(str.join(self, [escape(item, quotes=escape_quotes) - for item in seq])) - - @classmethod -@@ -538,7 +538,7 @@ class Markup(unicode): - """ - if not self: - return '' -- return unicode(self).replace('"', '"') \ -+ return str(self).replace('"', '"') \ - .replace('>', '>') \ - .replace('<', '<') \ - .replace('&', '&') -@@ -652,7 +652,7 @@ class Namespace(object): - self.uri = uri - - def __init__(self, uri): -- self.uri = unicode(uri) -+ self.uri = str(uri) - - def __contains__(self, qname): - return qname.namespace == self.uri -@@ -691,7 +691,7 @@ class Namespace(object): - XML_NAMESPACE = Namespace('http://www.w3.org/XML/1998/namespace') - - --class QName(unicode): -+class QName(str): - """A qualified element or attribute name. - - The unicode value of instances of this class contains the qualified name of -@@ -729,11 +729,11 @@ class QName(unicode): - qname = qname.lstrip('{') - parts = qname.split('}', 1) - if len(parts) > 1: -- self = unicode.__new__(cls, '{%s' % qname) -- self.namespace, self.localname = map(unicode, parts) -+ self = str.__new__(cls, '{%s' % qname) -+ self.namespace, self.localname = list(map(str, parts)) - else: -- self = unicode.__new__(cls, qname) -- self.namespace, self.localname = None, unicode(qname) -+ self = str.__new__(cls, qname) -+ self.namespace, self.localname = None, str(qname) - return self - - def __getnewargs__(self): ---- genshi/filters/html.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/filters/html.py -@@ -101,13 +101,13 @@ class HTMLFormFiller(object): - checked = False - if isinstance(value, (list, tuple)): - if declval is not None: -- checked = declval in [unicode(v) for v -+ checked = declval in [str(v) for v - in value] - else: - checked = any(value) - else: - if declval is not None: -- checked = declval == unicode(value) -+ checked = declval == str(value) - elif type == 'checkbox': - checked = bool(value) - if checked: -@@ -123,7 +123,7 @@ class HTMLFormFiller(object): - value = value[0] - if value is not None: - attrs |= [ -- (QName('value'), unicode(value)) -+ (QName('value'), str(value)) - ] - elif tagname == 'select': - name = attrs.get('name') -@@ -166,10 +166,10 @@ class HTMLFormFiller(object): - select_value = None - elif in_select and tagname == 'option': - if isinstance(select_value, (tuple, list)): -- selected = option_value in [unicode(v) for v -+ selected = option_value in [str(v) for v - in select_value] - else: -- selected = option_value == unicode(select_value) -+ selected = option_value == str(select_value) - okind, (tag, attrs), opos = option_start - if selected: - attrs |= [(QName('selected'), 'selected')] -@@ -185,7 +185,7 @@ class HTMLFormFiller(object): - option_text = [] - elif in_textarea and tagname == 'textarea': - if textarea_value: -- yield TEXT, unicode(textarea_value), pos -+ yield TEXT, str(textarea_value), pos - textarea_value = None - in_textarea = False - yield kind, data, pos -@@ -311,7 +311,7 @@ class HTMLSanitizer(object): - # The set of URI schemes that are considered safe. - - # IE6 -- _EXPRESSION_SEARCH = re.compile(u""" -+ _EXPRESSION_SEARCH = re.compile(""" - [eE - \uFF25 # FULLWIDTH LATIN CAPITAL LETTER E - \uFF45 # FULLWIDTH LATIN SMALL LETTER E -@@ -356,7 +356,7 @@ class HTMLSanitizer(object): - # IE6 - # 7) Particular bit of Unicode characters - _URL_FINDITER = re.compile( -- u'[Uu][Rr\u0280][Ll\u029F]\s*\(([^)]+)').finditer -+ '[Uu][Rr\u0280][Ll\u029F]\s*\(([^)]+)').finditer - - def __call__(self, stream): - """Apply the filter to the given stream. -@@ -528,7 +528,7 @@ class HTMLSanitizer(object): - def _repl(match): - t = match.group(1) - if t: -- return unichr(int(t, 16)) -+ return chr(int(t, 16)) - t = match.group(2) - if t == '\\': - return r'\\' ---- genshi/filters/i18n.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/filters/i18n.py -@@ -163,12 +163,12 @@ class MsgDirective(ExtractableI18NDirective): - - def _generate(): - msgbuf = MessageBuffer(self) -- previous = stream.next() -+ previous = next(stream) - if previous[0] is START: - yield previous - else: - msgbuf.append(*previous) -- previous = stream.next() -+ previous = next(stream) - for kind, data, pos in stream: - msgbuf.append(*previous) - previous = kind, data, pos -@@ -188,13 +188,13 @@ class MsgDirective(ExtractableI18NDirective): - strip = False - - stream = iter(stream) -- previous = stream.next() -+ previous = next(stream) - if previous[0] is START: - for message in translator._extract_attrs(previous, - gettext_functions, - search_text=search_text): - yield message -- previous = stream.next() -+ previous = next(stream) - strip = True - for event in stream: - if event[0] is START: -@@ -218,14 +218,14 @@ class ChooseBranchDirective(I18NDirective): - msgbuf = MessageBuffer(self) - stream = _apply_directives(stream, directives, ctxt, vars) - -- previous = stream.next() -+ previous = next(stream) - if previous[0] is START: - yield previous - else: - msgbuf.append(*previous) - - try: -- previous = stream.next() -+ previous = next(stream) - except StopIteration: - # For example or directives - yield MSGBUF, (), -1 # the place holder for msgbuf output -@@ -246,7 +246,7 @@ class ChooseBranchDirective(I18NDirective): - def extract(self, translator, stream, gettext_functions=GETTEXT_FUNCTIONS, - search_text=True, comment_stack=None, msgbuf=None): - stream = iter(stream) -- previous = stream.next() -+ previous = next(stream) - - if previous[0] is START: - # skip the enclosing element -@@ -254,7 +254,7 @@ class ChooseBranchDirective(I18NDirective): - gettext_functions, - search_text=search_text): - yield message -- previous = stream.next() -+ previous = next(stream) - - for event in stream: - if previous[0] is START: -@@ -427,7 +427,7 @@ class ChooseDirective(ExtractableI18NDirective): - search_text=True, comment_stack=None): - strip = False - stream = iter(stream) -- previous = stream.next() -+ previous = next(stream) - - if previous[0] is START: - # skip the enclosing element -@@ -435,7 +435,7 @@ class ChooseDirective(ExtractableI18NDirective): - gettext_functions, - search_text=search_text): - yield message -- previous = stream.next() -+ previous = next(stream) - strip = True - - singular_msgbuf = MessageBuffer(self) -@@ -480,8 +480,8 @@ class ChooseDirective(ExtractableI18NDirective): - # XXX: should we test which form was chosen like this!?!?!? - # There should be no match in any catalogue for these singular and - # plural test strings -- singular = u'O\x85\xbe\xa9\xa8az\xc3?\xe6\xa1\x02n\x84\x93' -- plural = u'\xcc\xfb+\xd3Pn\x9d\tT\xec\x1d\xda\x1a\x88\x00' -+ singular = 'O\x85\xbe\xa9\xa8az\xc3?\xe6\xa1\x02n\x84\x93' -+ plural = '\xcc\xfb+\xd3Pn\x9d\tT\xec\x1d\xda\x1a\x88\x00' - return ngettext(singular, plural, numeral) == plural - - -@@ -703,7 +703,7 @@ class Translator(DirectiveFactory): - if kind is START: - tag, attrs = data - if tag in self.ignore_tags or \ -- isinstance(attrs.get(xml_lang), basestring): -+ isinstance(attrs.get(xml_lang), str): - skip += 1 - yield kind, data, pos - continue -@@ -713,7 +713,7 @@ class Translator(DirectiveFactory): - - for name, value in attrs: - newval = value -- if isinstance(value, basestring): -+ if isinstance(value, str): - if translate_attrs and name in include_attrs: - newval = gettext(value) - else: -@@ -732,7 +732,7 @@ class Translator(DirectiveFactory): - elif translate_text and kind is TEXT: - text = data.strip() - if text: -- data = data.replace(text, unicode(gettext(text))) -+ data = data.replace(text, str(gettext(text))) - yield kind, data, pos - - elif kind is SUB: -@@ -830,7 +830,7 @@ class Translator(DirectiveFactory): - if kind is START and not skip: - tag, attrs = data - if tag in self.ignore_tags or \ -- isinstance(attrs.get(xml_lang), basestring): -+ isinstance(attrs.get(xml_lang), str): - skip += 1 - continue - -@@ -917,7 +917,7 @@ class Translator(DirectiveFactory): - - def _extract_attrs(self, event, gettext_functions, search_text): - for name, value in event[1][1]: -- if search_text and isinstance(value, basestring): -+ if search_text and isinstance(value, str): - if name in self.include_attrs: - text = value.strip() - if text: -@@ -1188,10 +1188,10 @@ def extract_from_code(code, gettext_functions): - strings = [] - def _add(arg): - if isinstance(arg, _ast_Str) \ -- and isinstance(_ast_Str_value(arg), unicode): -+ and isinstance(_ast_Str_value(arg), str): - strings.append(_ast_Str_value(arg)) - elif isinstance(arg, _ast_Str): -- strings.append(unicode(_ast_Str_value(arg), 'utf-8')) -+ strings.append(str(_ast_Str_value(arg), 'utf-8')) - elif arg: - strings.append(None) - [_add(arg) for arg in node.args] -@@ -1232,22 +1232,22 @@ def extract(fileobj, keywords, comment_tags, options): - :rtype: ``iterator`` - """ - template_class = options.get('template_class', MarkupTemplate) -- if isinstance(template_class, basestring): -+ if isinstance(template_class, str): - module, clsname = template_class.split(':', 1) - template_class = getattr(__import__(module, {}, {}, [clsname]), clsname) - encoding = options.get('encoding', None) - - extract_text = options.get('extract_text', True) -- if isinstance(extract_text, basestring): -+ if isinstance(extract_text, str): - extract_text = extract_text.lower() in ('1', 'on', 'yes', 'true') - - ignore_tags = options.get('ignore_tags', Translator.IGNORE_TAGS) -- if isinstance(ignore_tags, basestring): -+ if isinstance(ignore_tags, str): - ignore_tags = ignore_tags.split() - ignore_tags = [QName(tag) for tag in ignore_tags] - - include_attrs = options.get('include_attrs', Translator.INCLUDE_ATTRS) -- if isinstance(include_attrs, basestring): -+ if isinstance(include_attrs, str): - include_attrs = include_attrs.split() - include_attrs = [QName(attr) for attr in include_attrs] - ---- genshi/filters/tests/i18n.py.orig 2019-05-27 21:03:08 UTC -+++ genshi/filters/tests/i18n.py -@@ -46,7 +46,7 @@ class DummyTranslations(NullTranslations): - if tmsg is missing: - if self._fallback: - return self._fallback.ugettext(message) -- return unicode(message) -+ return str(message) - return tmsg - else: - def gettext(self, message): -@@ -55,7 +55,7 @@ class DummyTranslations(NullTranslations): - if tmsg is missing: - if self._fallback: - return self._fallback.gettext(message) -- return unicode(message) -+ return str(message) - return tmsg - - if IS_PYTHON2: -@@ -94,10 +94,10 @@ class TranslatorTestCase(unittest.TestCase): - """ - Verify that translated attributes end up in a proper `Attrs` instance. - """ -- html = HTML(u""" -+ html = HTML(""" - - """) -- translator = Translator(lambda s: u"Voh") -+ translator = Translator(lambda s: "Voh") - stream = list(html.filter(translator)) - kind, data, pos = stream[2] - assert isinstance(data[1], Attrs) -@@ -139,7 +139,7 @@ class TranslatorTestCase(unittest.TestCase): - translator = Translator() - messages = list(translator.extract(tmpl.stream)) - self.assertEqual(1, len(messages)) -- self.assertEqual((2, 'gettext', u'Gr\xfc\xdfe', []), messages[0]) -+ self.assertEqual((2, 'gettext', 'Gr\xfc\xdfe', []), messages[0]) - - def test_extract_included_attribute_text(self): - tmpl = MarkupTemplate(""" -@@ -237,10 +237,10 @@ class MsgDirectiveTestCase(unittest.TestCase): - Please see Help for details. -

- """) -- gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]." -+ gettext = lambda s: "Für Details siehe bitte [1:Hilfe]." - translator = Translator(gettext) - translator.setup(tmpl) -- self.assertEqual(u""" -+ self.assertEqual(""" -

Für Details siehe bitte Hilfe.

- """.encode('utf-8'), tmpl.generate().render(encoding='utf-8')) - -@@ -260,10 +260,10 @@ class MsgDirectiveTestCase(unittest.TestCase): - xmlns:i18n="http://genshi.edgewall.org/i18n"> -

Please see Help

- """) -- gettext = lambda s: u"Für Details siehe bitte [1:Hilfe]" -+ gettext = lambda s: "Für Details siehe bitte [1:Hilfe]" - translator = Translator(gettext) - translator.setup(tmpl) -- self.assertEqual(u""" -+ self.assertEqual(""" -

Für Details siehe bitte Hilfe

- """, tmpl.generate().render()) - *** 4901 LINES SKIPPED ***