commit 15b34fe938443d8c09a62c51505bfcda60ca057d Author: tubalu Date: Tue Nov 26 11:24:03 2019 +0800 package init diff --git a/Genshi-0.7.tar.gz b/Genshi-0.7.tar.gz new file mode 100644 index 0000000..19128bb Binary files /dev/null and b/Genshi-0.7.tar.gz differ diff --git a/python-genshi-0.7-disable-speedups-for-python34.patch b/python-genshi-0.7-disable-speedups-for-python34.patch new file mode 100644 index 0000000..9377f69 --- /dev/null +++ b/python-genshi-0.7-disable-speedups-for-python34.patch @@ -0,0 +1,24 @@ +------------------------------------------------------------------------ +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 +=================================================================== +--- a/setup.py (Revision 1246) ++++ b/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']), + ], diff --git a/python-genshi-0.7-isstring-helper.patch b/python-genshi-0.7-isstring-helper.patch new file mode 100644 index 0000000..32bc63e --- /dev/null +++ b/python-genshi-0.7-isstring-helper.patch @@ -0,0 +1,30 @@ +------------------------------------------------------------------------ +r1248 | hodgestar | 2014-02-16 19:43:20 +0100 (So, 16. Feb 2014) | 1 Zeile + +Add isstring helper. +------------------------------------------------------------------------ +Index: genshi/compat.py +=================================================================== +--- a/genshi/compat.py (Revision 1247) ++++ b/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 +- diff --git a/python-genshi-0.7-python34-ast-support.patch b/python-genshi-0.7-python34-ast-support.patch new file mode 100644 index 0000000..719dbb4 --- /dev/null +++ b/python-genshi-0.7-python34-ast-support.patch @@ -0,0 +1,142 @@ +------------------------------------------------------------------------ +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 +=================================================================== +--- a/genshi/template/astutil.py (Revision 1248) ++++ b/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 +=================================================================== +--- a/genshi/template/eval.py (Revision 1248) ++++ b/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): diff --git a/python-genshi-0.7-sanitizer-test-fixes.patch b/python-genshi-0.7-sanitizer-test-fixes.patch new file mode 100644 index 0000000..9e93334 --- /dev/null +++ b/python-genshi-0.7-sanitizer-test-fixes.patch @@ -0,0 +1,43 @@ +------------------------------------------------------------------------ +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 +=================================================================== +--- a/genshi/filters/tests/test_html.py (Revision 1245) ++++ b/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'fo
o
') +@@ -416,10 +420,12 @@ + html = HTML(u'') + self.assertEquals('', (html | HTMLSanitizer()).render()) + src = u'alert("foo")' +- self.assert_parse_error_or_equal('<SCR\x00IPT>alert("foo")', src) ++ self.assert_parse_error_or_equal('<SCR\x00IPT>alert("foo")', src, ++ allow_strip=True) + src = u'' + self.assert_parse_error_or_equal('<SCRIPT&XYZ; ' +- 'SRC="http://example.com/">', src) ++ 'SRC="http://example.com/">', src, ++ allow_strip=True) + + def test_sanitize_remove_onclick_attr(self): + html = HTML(u'
') diff --git a/python-genshi-bug-602-python35-support-python27-fix.patch b/python-genshi-bug-602-python35-support-python27-fix.patch new file mode 100644 index 0000000..a1009fc --- /dev/null +++ b/python-genshi-bug-602-python35-support-python27-fix.patch @@ -0,0 +1,15 @@ +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: diff --git a/python-genshi-bug-602-python35-support.patch b/python-genshi-bug-602-python35-support.patch new file mode 100644 index 0000000..b5b7517 --- /dev/null +++ b/python-genshi-bug-602-python35-support.patch @@ -0,0 +1,100 @@ +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 diff --git a/python-genshi-py3-escape-sequence-doctest.patch b/python-genshi-py3-escape-sequence-doctest.patch new file mode 100644 index 0000000..8b5e27d --- /dev/null +++ b/python-genshi-py3-escape-sequence-doctest.patch @@ -0,0 +1,32 @@ +From 7891f1dc0a35a1c790a20b73c8d4c84ed12c1077 Mon Sep 17 00:00:00 2001 +From: Felix Schwarz +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 ... :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 + diff --git a/python-genshi-py37-stopiteration.patch b/python-genshi-py37-stopiteration.patch new file mode 100644 index 0000000..23d2019 --- /dev/null +++ b/python-genshi-py37-stopiteration.patch @@ -0,0 +1,47 @@ +From 6fed7cdbf1b9f35fa085e22fc0d87d0614625313 Mon Sep 17 00:00:00 2001 +From: Felix Schwarz +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 + diff --git a/python-genshi.spec b/python-genshi.spec new file mode 100644 index 0000000..0bacbe5 --- /dev/null +++ b/python-genshi.spec @@ -0,0 +1,85 @@ +Name: python-genshi +Version: 0.7 +Release: 23 +Summary: Python toolkit for generation of output for the web +License: BSD +URL: http://genshi.edgewall.org/ +Source0: http://ftp.edgewall.com/pub/genshi/Genshi-%{version}.tar.gz +Patch0000: python-genshi-0.7-sanitizer-test-fixes.patch +Patch0001: python-genshi-0.7-disable-speedups-for-python34.patch +Patch0002: python-genshi-0.7-isstring-helper.patch +Patch0003: python-genshi-0.7-python34-ast-support.patch +Patch0004: python-genshi-bug-602-python35-support.patch +Patch0005: python-genshi-bug-602-python35-support-python27-fix.patch +Patch0006: python-genshi-py37-stopiteration.patch +Patch0007: python-genshi-py3-escape-sequence-doctest.patch + +BuildRequires: gcc python2-devel python2-setuptools python3-devel python3-setuptools +Requires: python2-babel >= 0.8 + +%description +Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML +or other textual content for output generation on the web. + +%package -n python2-genshi +Summary: Python toolkit for generation of output for the web +%{?python_provide:%python_provide python2-genshi} + +%description -n python2-genshi +Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML +or other textual content for output generation on the web. + +%package -n python3-genshi +Summary: Python toolkit for generation of output for the web +%{?python_provide:%python_provide python3-genshi} +BuildArch: noarch +Requires: python3-babel >= 0.8 + +%description -n python3-genshi +Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML +or other textual content for output generation on the web. + +%prep +%autosetup -n Genshi-%{version} -p1 + +rm -rf %{modname}.egg-info +rm -rf %{py3dir} +cp -a . %{py3dir} + +chmod a-x examples/* + +%build +%{__python2} setup.py build + +cd %{py3dir} +%{__python3} setup.py build +cd - + +%install +%{__python2} setup.py install -O1 --skip-build --root %{buildroot} +cd %{py3dir} +%{__python3} setup.py install -O1 --skip-build --root %{buildroot} +cd - + +%check +%{__python2} setup.py test +cd %{py3dir} +%{__python3} setup.py test +cd - + +%files -n python2-genshi +%doc ChangeLog doc examples README.txt COPYING +%{python2_sitearch}/Genshi-%{version}-py*.egg-info +%{python2_sitearch}/genshi + +%files -n python3-genshi +%doc ChangeLog doc examples README.txt COPYING +%{python3_sitelib}/Genshi-%{version}-py*.egg-info +%{python3_sitelib}/genshi + +%changelog +* Mon Nov 18 2019 openEuler Buildteam - 0.7-23 +- Package init