- Update to 0.7.1:

* many bugfixes all around and support for new pythons
- Merged all our patches:
  * python-Genshi-bug-602-python35-support.patch
  * python-Genshi-bug-602-python35-support-python27-fix.patch
  * python-genshi-py3-escape-sequence-doctest.patch
  * python-genshi-py37-stopiteration.patch
  * python-Genshi-0.7-disable-speedups-for-python34.patch
  * python-Genshi-0.7-isstring-helper.patch
  * python-Genshi-0.7-python34-ast-support.patch
  * python-Genshi-0.7-sanitizer-test-fixes.patch
  * changeset_r1242.diff

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-Genshi?expand=0&rev=17
This commit is contained in:
Tomáš Chvátal 2019-03-04 16:57:12 +00:00 committed by Git OBS Bridge
parent ed2f5d80a5
commit 8cb75f93b8
13 changed files with 25 additions and 514 deletions

3
Genshi-0.7.1.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0d87ae62cf2ed92133f35725da51e02d09f79bb4cb986f0d948408a0279dd3f8
size 270362

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1d154402e68bc444a55bcac101f96cb4e59373100cc7a2da07fbf3e5cc5d7352
size 491579

View File

@ -1,38 +0,0 @@
Index: /trunk/genshi/filters/tests/i18n.py
===================================================================
--- /trunk/genshi/filters/tests/i18n.py (revision 1177)
+++ /trunk/genshi/filters/tests/i18n.py (revision 1242)
@@ -928,4 +928,16 @@
"""</p></html>""",
tmpl.generate(first="FIRST", second="SECOND").render())
+
+ def test_translate_i18n_msg_ticket_404_regression(self):
+ tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/"
+ xmlns:i18n="http://genshi.edgewall.org/i18n">
+ <h1 i18n:msg="name">text <a>$name</a></h1>
+ </html>""")
+ gettext = lambda s: u'head [1:%(name)s] tail'
+ translator = Translator(gettext)
+ translator.setup(tmpl)
+ self.assertEqual("""<html>
+ <h1>head <a>NAME</a> tail</h1>
+ </html>""", tmpl.generate(name='NAME').render())
Index: /trunk/genshi/filters/i18n.py
===================================================================
--- /trunk/genshi/filters/i18n.py (revision 1177)
+++ /trunk/genshi/filters/i18n.py (revision 1242)
@@ -1049,5 +1049,11 @@
while parts:
order, string = parts.pop(0)
- events = self.events[order].pop(0)
+ events = self.events[order]
+ if events:
+ events = events.pop(0)
+ else:
+ # create a dummy empty text event so any remaining
+ # part of the translation can be processed.
+ events = [(TEXT, "", (None, -1, -1))]
parts_counter[order].pop()

View File

@ -1,24 +0,0 @@
------------------------------------------------------------------------
r1247 | hodgestar | 2014-02-16 19:32:21 +0100 (So, 16. Feb 2014) | 1 Zeile
Disable the speedups C extension on CPython >= 3.3 since Genshi doesn't support the new Unicode C API yet.
------------------------------------------------------------------------
Index: setup.py
===================================================================
--- setup.py (Revision 1246)
+++ setup.py (Revision 1247)
@@ -65,9 +65,13 @@
if Feature:
+ # Optional C extension module for speeding up Genshi:
+ # Not activated by default on:
+ # - PyPy (where it harms performance)
+ # - CPython >= 3.3 (the new Unicode C API is not supported yet)
speedups = Feature(
"optional C speed-enhancements",
- standard = not is_pypy,
+ standard = not is_pypy and sys.version_info < (3, 3),
ext_modules = [
Extension('genshi._speedups', ['genshi/_speedups.c']),
],

View File

@ -1,30 +0,0 @@
------------------------------------------------------------------------
r1248 | hodgestar | 2014-02-16 19:43:20 +0100 (So, 16. Feb 2014) | 1 Zeile
Add isstring helper.
------------------------------------------------------------------------
Index: genshi/compat.py
===================================================================
--- genshi/compat.py (Revision 1247)
+++ genshi/compat.py (Revision 1248)
@@ -35,6 +35,15 @@
'Python 2 compatibility function. Not usable in Python 3.')
+# We need to test if an object is an instance of a string type in places
+
+if IS_PYTHON2:
+ def isstring(obj):
+ return isinstance(obj, basestring)
+else:
+ def isstring(obj):
+ return isinstance(obj, str)
+
# We need to differentiate between StringIO and BytesIO in places
if IS_PYTHON2:
@@ -112,4 +121,3 @@
if not x:
return False
return True
-

View File

@ -1,142 +0,0 @@
------------------------------------------------------------------------
r1249 | hodgestar | 2014-02-16 19:46:15 +0100 (So, 16. Feb 2014) | 1 Zeile
Add support for Python 3.4 AST (support for NameConstants and changes to existing to arguments node attributes).
------------------------------------------------------------------------
Index: genshi/template/astutil.py
===================================================================
--- genshi/template/astutil.py (Revision 1248)
+++ genshi/template/astutil.py (Revision 1249)
@@ -21,7 +21,7 @@
def parse(source, mode):
return compile(source, '', mode, _ast.PyCF_ONLY_AST)
-from genshi.compat import IS_PYTHON2
+from genshi.compat import IS_PYTHON2, isstring
__docformat__ = 'restructuredtext en'
@@ -103,8 +103,13 @@
self._new_line()
return self.visit(node.body)
+ # Python < 3.4
# arguments = (expr* args, identifier? vararg,
# identifier? kwarg, expr* defaults)
+ #
+ # Python >= 3.4
+ # arguments = (arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults,
+ # arg? kwarg, expr* defaults)
def visit_arguments(self, node):
first = True
no_default_count = len(node.args) - len(node.defaults)
@@ -122,13 +127,21 @@
self._write(', ')
else:
first = False
- self._write('*' + node.vararg)
+ self._write('*')
+ if isstring(node.vararg):
+ self._write(node.vararg)
+ else:
+ self.visit(node.vararg)
if getattr(node, 'kwarg', None):
if not first:
self._write(', ')
else:
first = False
- self._write('**' + node.kwarg)
+ self._write('**')
+ if isstring(node.kwarg):
+ self._write(node.kwarg)
+ else:
+ self.visit(node.kwarg)
if not IS_PYTHON2:
# In Python 3 arguments get a special node
@@ -724,6 +737,17 @@
def visit_Name(self, node):
self._write(node.id)
+ # NameConstant(singleton value)
+ def visit_NameConstant(self, node):
+ if node.value is None:
+ self._write('None')
+ elif node.value is True:
+ self._write('True')
+ elif node.value is False:
+ self._write('False')
+ else:
+ raise Exception("Unknown NameConstant %r" % (node.value,))
+
# List(expr* elts, expr_context ctx)
def visit_List(self, node):
self._write('[')
@@ -829,6 +853,7 @@
visit_Attribute = _clone
visit_Subscript = _clone
visit_Name = _clone
+ visit_NameConstant = _clone
visit_List = _clone
visit_Tuple = _clone
Index: genshi/template/eval.py
===================================================================
--- genshi/template/eval.py (Revision 1248)
+++ genshi/template/eval.py (Revision 1249)
@@ -24,7 +24,8 @@
from genshi.template.base import TemplateRuntimeError
from genshi.util import flatten
-from genshi.compat import get_code_params, build_code_chunk, IS_PYTHON2
+from genshi.compat import get_code_params, build_code_chunk, isstring, \
+ IS_PYTHON2
__all__ = ['Code', 'Expression', 'Suite', 'LenientLookup', 'StrictLookup',
'Undefined', 'UndefinedError']
@@ -495,28 +496,31 @@
def __init__(self):
self.locals = [CONSTANTS]
+ def _process(self, names, node):
+ if not IS_PYTHON2 and isinstance(node, _ast.arg):
+ names.add(node.arg)
+ elif isstring(node):
+ names.add(node)
+ elif isinstance(node, _ast.Name):
+ names.add(node.id)
+ elif isinstance(node, _ast.alias):
+ names.add(node.asname or node.name)
+ elif isinstance(node, _ast.Tuple):
+ for elt in node.elts:
+ self._process(names, elt)
+
def _extract_names(self, node):
names = set()
- def _process(node):
- if not IS_PYTHON2 and isinstance(node, _ast.arg):
- names.add(node.arg)
- if isinstance(node, _ast.Name):
- names.add(node.id)
- elif isinstance(node, _ast.alias):
- names.add(node.asname or node.name)
- elif isinstance(node, _ast.Tuple):
- for elt in node.elts:
- _process(elt)
if hasattr(node, 'args'):
for arg in node.args:
- _process(arg)
+ self._process(names, arg)
if hasattr(node, 'vararg'):
- names.add(node.vararg)
+ self._process(names, node.vararg)
if hasattr(node, 'kwarg'):
- names.add(node.kwarg)
+ self._process(names, node.kwarg)
elif hasattr(node, 'names'):
for elt in node.names:
- _process(elt)
+ self._process(names, elt)
return names
def visit_Str(self, node):

View File

@ -1,43 +0,0 @@
------------------------------------------------------------------------
r1246 | hodgestar | 2014-02-16 19:25:17 +0100 (So, 16. Feb 2014) | 1 Zeile
Also allow stripping of unsafe script tags (Python 3.4 parses the second example as a tag whose name is script&xyz).
------------------------------------------------------------------------
Index: genshi/filters/tests/test_html.py
===================================================================
--- genshi/filters/tests/test_html.py (Revision 1245)
+++ genshi/filters/tests/test_html.py (Revision 1246)
@@ -368,12 +368,16 @@
class HTMLSanitizerTestCase(unittest.TestCase):
- def assert_parse_error_or_equal(self, expected, exploit):
+ def assert_parse_error_or_equal(self, expected, exploit,
+ allow_strip=False):
try:
html = HTML(exploit)
except ParseError:
return
- self.assertEquals(expected, (html | HTMLSanitizer()).render())
+ sanitized_html = (html | HTMLSanitizer()).render()
+ if not sanitized_html and allow_strip:
+ return
+ self.assertEquals(expected, sanitized_html)
def test_sanitize_unchanged(self):
html = HTML(u'<a href="#">fo<br />o</a>')
@@ -416,10 +420,12 @@
html = HTML(u'<SCRIPT SRC="http://example.com/"></SCRIPT>')
self.assertEquals('', (html | HTMLSanitizer()).render())
src = u'<SCR\0IPT>alert("foo")</SCR\0IPT>'
- self.assert_parse_error_or_equal('&lt;SCR\x00IPT&gt;alert("foo")', src)
+ self.assert_parse_error_or_equal('&lt;SCR\x00IPT&gt;alert("foo")', src,
+ allow_strip=True)
src = u'<SCRIPT&XYZ SRC="http://example.com/"></SCRIPT>'
self.assert_parse_error_or_equal('&lt;SCRIPT&amp;XYZ; '
- 'SRC="http://example.com/"&gt;', src)
+ 'SRC="http://example.com/"&gt;', src,
+ allow_strip=True)
def test_sanitize_remove_onclick_attr(self):
html = HTML(u'<div onclick=\'alert("foo")\' />')

View File

@ -1,15 +0,0 @@
http://genshi.edgewall.org/ticket/602#comment:2
diff --git a/genshi/template/directives.py b/genshi/template/directives.py
index 6fd0f28..1f70ef6 100644
--- a/genshi/template/directives.py
+++ b/genshi/template/directives.py
@@ -266,7 +266,7 @@ class DefDirective(Directive):
if isinstance(ast, _ast.Call):
self.name = ast.func.id
for arg in ast.args:
- if isinstance(arg, _ast.Starred):
+ if hasattr(_ast, 'Starred') and isinstance(arg, _ast.Starred):
# Python 3.5+
self.star_args = arg.value.id
else:

View File

@ -1,100 +0,0 @@
Patch from Tim Hatch
http://genshi.edgewall.org/ticket/602
diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py
index b724956..dfb52b8 100644
--- a/genshi/filters/i18n.py
+++ b/genshi/filters/i18n.py
@@ -1187,8 +1187,10 @@ def extract_from_code(code, gettext_functions):
elif arg:
strings.append(None)
[_add(arg) for arg in node.args]
- _add(node.starargs)
- _add(node.kwargs)
+ if hasattr(node, 'starargs'):
+ _add(node.starargs)
+ if hasattr(node, 'kwargs'):
+ _add(node.kwargs)
if len(strings) == 1:
strings = strings[0]
else:
diff --git a/genshi/template/astutil.py b/genshi/template/astutil.py
index a3946b4..07edc92 100644
--- a/genshi/template/astutil.py
+++ b/genshi/template/astutil.py
@@ -148,6 +148,10 @@ class ASTCodeGenerator(object):
def visit_arg(self, node):
self._write(node.arg)
+ def visit_Starred(self, node):
+ self._write('*')
+ self.visit(node.value)
+
# FunctionDef(identifier name, arguments args,
# stmt* body, expr* decorator_list)
def visit_FunctionDef(self, node):
@@ -661,9 +665,13 @@ class ASTCodeGenerator(object):
if not first:
self._write(', ')
first = False
- # keyword = (identifier arg, expr value)
- self._write(keyword.arg)
- self._write('=')
+ if not keyword.arg:
+ # Python 3.5+ star-star args
+ self._write('**')
+ else:
+ # keyword = (identifier arg, expr value)
+ self._write(keyword.arg)
+ self._write('=')
self.visit(keyword.value)
if getattr(node, 'starargs', None):
if not first:
diff --git a/genshi/template/directives.py b/genshi/template/directives.py
index 7301c2d..6fd0f28 100644
--- a/genshi/template/directives.py
+++ b/genshi/template/directives.py
@@ -266,13 +266,21 @@ class DefDirective(Directive):
if isinstance(ast, _ast.Call):
self.name = ast.func.id
for arg in ast.args:
- # only names
- self.args.append(arg.id)
+ if isinstance(arg, _ast.Starred):
+ # Python 3.5+
+ self.star_args = arg.value.id
+ else:
+ # only names
+ self.args.append(arg.id)
for kwd in ast.keywords:
- self.args.append(kwd.arg)
- exp = Expression(kwd.value, template.filepath,
- lineno, lookup=template.lookup)
- self.defaults[kwd.arg] = exp
+ if kwd.arg is None:
+ # Python 3.5+
+ self.dstar_args = kwd.value.id
+ else:
+ self.args.append(kwd.arg)
+ exp = Expression(kwd.value, template.filepath,
+ lineno, lookup=template.lookup)
+ self.defaults[kwd.arg] = exp
if getattr(ast, 'starargs', None):
self.star_args = ast.starargs.id
if getattr(ast, 'kwargs', None):
diff --git a/genshi/template/eval.py b/genshi/template/eval.py
index de4bc86..065c0c7 100644
--- a/genshi/template/eval.py
+++ b/genshi/template/eval.py
@@ -597,6 +597,11 @@ class TemplateASTTransformer(ASTTransformer):
finally:
self.locals.pop()
+ # Only used in Python 3.5+
+ def visit_Starred(self, node):
+ node.value = self.visit(node.value)
+ return node
+
def visit_Name(self, node):
# If the name refers to a local inside a lambda, list comprehension, or
# generator expression, leave it alone

View File

@ -1,3 +1,19 @@
-------------------------------------------------------------------
Mon Mar 4 16:51:54 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>
- Update to 0.7.1:
* many bugfixes all around and support for new pythons
- Merged all our patches:
* python-Genshi-bug-602-python35-support.patch
* python-Genshi-bug-602-python35-support-python27-fix.patch
* python-genshi-py3-escape-sequence-doctest.patch
* python-genshi-py37-stopiteration.patch
* python-Genshi-0.7-disable-speedups-for-python34.patch
* python-Genshi-0.7-isstring-helper.patch
* python-Genshi-0.7-python34-ast-support.patch
* python-Genshi-0.7-sanitizer-test-fixes.patch
* changeset_r1242.diff
-------------------------------------------------------------------
Tue Dec 4 12:48:24 UTC 2018 - Matej Cepl <mcepl@suse.com>

View File

@ -1,7 +1,7 @@
#
# spec file for package python-Genshi
#
# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -19,31 +19,15 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define oldpython python
Name: python-Genshi
Version: 0.7
Version: 0.7.1
Release: 0
Summary: A toolkit for generation of output for the web
License: BSD-3-Clause
Group: Development/Languages/Python
URL: http://genshi.edgewall.org/
Source: https://files.pythonhosted.org/packages/source/G/Genshi/Genshi-%{version}.tar.gz
# PATCH-FIX-UPSTREAM http://genshi.edgewall.org/ticket/566
Patch1: changeset_r1242.diff
# PATCH-FIX-UPSTREAM python-Genshi-0.7-sanitizer-test-fixes.patch https://genshi.edgewall.org/ticket/500
Patch2: %{name}-0.7-sanitizer-test-fixes.patch
# PATCH-FIX-UPSTREAM python-Genshi-0.7-disable-speedups-for-python34.patch https://genshi.edgewall.org/ticket/555
Patch3: %{name}-0.7-disable-speedups-for-python34.patch
# PATCH-FIX-UPSTREAM python-Genshi-0.7-isstring-helper.patch https://genshi.edgewall.org/ticket/582
Patch4: %{name}-0.7-isstring-helper.patch
# PATCH-FIX-UPSTREAM python-Genshi-python34-ast-support.patch https://genshi.edgewall.org/ticket/582
Patch5: %{name}-0.7-python34-ast-support.patch
# PATCH-FIX-UPSTREAM python-Genshi-python35-support.patch http://genshi.edgewall.org/ticket/602
Patch6: %{name}-bug-602-python35-support.patch
# PATCH-FIX-UPSTREAM python-Genshi-python35-support-python27-fix.patch http://genshi.edgewall.org/ticket/602
Patch7: %{name}-bug-602-python35-support-python27-fix.patch
# PATCH-FIX-UPSTREAM build for python3.7
Patch8: python-genshi-py3-escape-sequence-doctest.patch
Patch9: python-genshi-py37-stopiteration.patch
BuildRequires: %{python_module Babel}
BuildRequires: %{python_module devel}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module xml}
BuildRequires: fdupes
@ -80,32 +64,14 @@ This package contains documentation and examples.
%prep
%setup -q -n Genshi-%{version}
%patch1 -p2
%patch2
%patch3
%patch4
%patch5
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
sed -i "1d" examples/{basic/run,basic/kidrun,tutorial/geddit/controller}.py # Fix non-excutable bits
%fdupes -s doc
pushd examples/bench/clearsilver
ln -s -f ../mako/footer.html footer.cs
popd
pushd examples/bench/cheetah
ln -s -f ../mako/footer.html footer.tmpl
popd
%build
%python_build
%install
%{python_expand %$python_install --install-lib=%{$python_sitearch}
rm -f %{buildroot}%{$python_sitearch}/genshi/_speedups.c
%fdupes -s %{buildroot}%{$python_sitearch}
}
# python3 is noarch but to keep it sane
%python_expand %{$python_install} --install-lib=%{$python_sitearch}
%python_expand %fdupes %{buildroot}%{$python_sitearch}
%check
%python_exec setup.py test

View File

@ -1,32 +0,0 @@
From 7891f1dc0a35a1c790a20b73c8d4c84ed12c1077 Mon Sep 17 00:00:00 2001
From: Felix Schwarz <felix.schwarz@oss.schwarz.eu>
Date: Fri, 29 Jun 2018 09:01:09 +0200
Subject: [PATCH] prevent deprecation warning due to invalid escape sequence in
NewTextTemplate doc test
Previously the running the test suite triggered a deprecation warning:
NewTextTemplate (genshi.template.text)
Doctest: genshi.template.text.NewTextTemplate ... <doctest genshi.template.text.NewTextTemplate[4]>:8: DeprecationWarning: invalid escape sequence \{
''')
ok
---
genshi/template/text.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/genshi/template/text.py b/genshi/template/text.py
index e2342c7..15e3bbd 100644
--- a/genshi/template/text.py
+++ b/genshi/template/text.py
@@ -100,7 +100,7 @@ class NewTextTemplate(Template):
>>> tmpl = NewTextTemplate('''Dear $name,
...
- ... \{# This is a comment #}
+ ... \\{# This is a comment #}
... We have the following items for you:
... {% for item in items %}\
... * $item
--
2.17.1

View File

@ -1,47 +0,0 @@
From 6fed7cdbf1b9f35fa085e22fc0d87d0614625313 Mon Sep 17 00:00:00 2001
From: Felix Schwarz <felix.schwarz@oss.schwarz.eu>
Date: Fri, 29 Jun 2018 08:58:18 +0200
Subject: [PATCH 1/2] catch StopIteration and use plain "return" (Python 3.7
compatibility)
In Python 3.7 StopIteration exceptions are transformed to RuntimeErrors (PEP 479).
Probably we need to do this in more places but this gets the test suite passing
at least.
---
genshi/core.py | 5 ++++-
genshi/filters/transform.py | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/genshi/core.py b/genshi/core.py
index 8c4c93d..d0e8ff6 100644
--- a/genshi/core.py
+++ b/genshi/core.py
@@ -270,7 +270,10 @@ COMMENT = Stream.COMMENT
def _ensure(stream):
"""Ensure that every item on the stream is actually a markup event."""
stream = iter(stream)
- event = stream.next()
+ try:
+ event = stream.next()
+ except StopIteration:
+ return
# Check whether the iterable is a real markup event stream by examining the
# first item it yields; if it's not we'll need to do some conversion
diff --git a/genshi/filters/transform.py b/genshi/filters/transform.py
index 569fc05..d7475db 100644
--- a/genshi/filters/transform.py
+++ b/genshi/filters/transform.py
@@ -119,7 +119,7 @@ class PushBackStream(object):
yield event
except StopIteration:
if self.peek is None:
- raise
+ return
class Transformer(object):
--
2.17.1