Hello community, here is the log from the commit of package python-Genshi for openSUSE:Factory checked in at 2017-04-19 18:08:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Genshi (Old) and /work/SRC/openSUSE:Factory/.python-Genshi.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Genshi" Wed Apr 19 18:08:34 2017 rev:12 rq:486532 version:0.7 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Genshi/python-Genshi.changes 2015-07-28 11:41:23.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-Genshi.new/python-Genshi.changes 2017-04-19 18:08:37.120574044 +0200 @@ -1,0 +2,28 @@ +Tue Apr 6 17:08:45 UTC 2017 - [email protected] + +- always build as arch-dependent +- build docs as a single noarch package + +------------------------------------------------------------------- +Tue Apr 6 17:08:35 UTC 2017 - [email protected] + +- Added 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, + python-Genshi-bug-602-python35-support.patch, + python-Genshi-bug-602-python35-support-python27-fix.patch +- Enabled tests + +------------------------------------------------------------------- +Thu Apr 6 15:53:52 UTC 2017 - [email protected] + +- Update singlespec build +- Use pypi download url + +------------------------------------------------------------------- +Mon Dec 19 17:34:46 UTC 2016 - [email protected] + +- update for multipython build + +------------------------------------------------------------------- New: ---- 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 python-Genshi-bug-602-python35-support-python27-fix.patch python-Genshi-bug-602-python35-support.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Genshi.spec ++++++ --- /var/tmp/diff_new_pack.NEDwLq/_old 2017-04-19 18:08:39.184282123 +0200 +++ /var/tmp/diff_new_pack.NEDwLq/_new 2017-04-19 18:08:39.188281556 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-Genshi # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 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 @@ -16,6 +16,7 @@ # +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Genshi Version: 0.7 Release: 0 @@ -23,22 +24,37 @@ Summary: A toolkit for generation of output for the web License: BSD-3-Clause Group: Development/Languages/Python -Source: http://ftp.edgewall.com/pub/genshi/Genshi-%{version}.tar.gz -# FIX-UPSTREAM http://genshi.edgewall.org/ticket/566 +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 -BuildRoot: %{_tmppath}/%{name}-%{version}-build -BuildRequires: python-Babel -BuildRequires: python-devel -BuildRequires: python-setuptools -BuildRequires: python-xml +# 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 +BuildRequires: %{python_module Babel} +BuildRequires: %{python_module devel} +BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module xml} +BuildRequires: fdupes +BuildRequires: gcc +BuildRequires: python-rpm-macros Requires: python-Babel Requires: python-xml -Provides: python-genshi = %{version} -Obsoletes: python-genshi < %{version} -%if 0%{?suse_version} && 0%{?suse_version} <= 1110 -%{!?python_sitearch: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True)")} -%{py_requires} +%define oldpython python +%ifpython2 +Obsoletes: %{oldpython}-genshi < %{version} +Provides: %{oldpython}-genshi = %{version} %endif +BuildRoot: %{_tmppath}/%{name}-%{version}-build +%python_subpackages %description Genshi is a Python library that provides an integrated set of @@ -46,13 +62,15 @@ other textual content for output generation on the web. The major feature is a template language, which is heavily inspired by Kid. -%package doc +%package -n %{name}-doc Summary: A toolkit for generation of output for the web - Documentation Group: Development/Libraries/Python Requires: %{name} = %{version} +Provides: %{python_module Genshi-doc = %{version}} +BuildArch: noarch -%description doc +%description -n %{name}-doc 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. The major @@ -63,21 +81,40 @@ %prep %setup -q -n Genshi-%{version} %patch1 -p2 +%patch2 +%patch3 +%patch4 +%patch5 +%patch6 -p1 +%patch7 -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 setup.py build +%python_build %install -python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%{python_expand %$python_install --install-lib=%{$python_sitearch} +rm -f %{buildroot}%{$python_sitearch}/genshi/_speedups.c +%fdupes -s %{buildroot}%{$python_sitearch} +} + +%check +%python_exec setup.py test -%files +%files %{python_files} %defattr(-,root,root,-) %doc COPYING ChangeLog README.txt %{python_sitearch}/genshi/ -%{python_sitearch}/Genshi-%{version}-py*.egg-info +%{python_sitearch}/Genshi-%{version}-py%{python_version}.egg-info -%files doc +%files -n %{name}-doc %defattr(-,root,root,-) %doc doc examples ++++++ python-Genshi-0.7-disable-speedups-for-python34.patch ++++++ ------------------------------------------------------------------------ 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']), ], ++++++ python-Genshi-0.7-isstring-helper.patch ++++++ ------------------------------------------------------------------------ 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 - ++++++ python-Genshi-0.7-python34-ast-support.patch ++++++ ------------------------------------------------------------------------ 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): ++++++ python-Genshi-0.7-sanitizer-test-fixes.patch ++++++ ------------------------------------------------------------------------ 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('<SCR\x00IPT>alert("foo")', src) + self.assert_parse_error_or_equal('<SCR\x00IPT>alert("foo")', src, + allow_strip=True) src = u'<SCRIPT&XYZ SRC="http://example.com/"></SCRIPT>' 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'<div onclick=\'alert("foo")\' />') ++++++ python-Genshi-bug-602-python35-support-python27-fix.patch ++++++ 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: ++++++ python-Genshi-bug-602-python35-support.patch ++++++ 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
