Accepting request 486532 from devel:languages:python

- always build as arch-dependent
- build docs as a single noarch package

- 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

- Update singlespec build
- Use pypi download url

- update for multipython build

OBS-URL: https://build.opensuse.org/request/show/486532
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-Genshi?expand=0&rev=12
This commit is contained in:
Dominique Leuenberger 2017-04-19 16:08:34 +00:00 committed by Git OBS Bridge
commit 97887502f5
8 changed files with 439 additions and 20 deletions

View File

@ -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
===================================================================
--- 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

@ -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
===================================================================
--- 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

@ -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
===================================================================
--- 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

@ -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
===================================================================
--- 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

@ -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:

View File

@ -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

View File

@ -1,3 +1,31 @@
-------------------------------------------------------------------
Tue Apr 6 17:08:45 UTC 2017 - jmatejek@suse.com
- always build as arch-dependent
- build docs as a single noarch package
-------------------------------------------------------------------
Tue Apr 6 17:08:35 UTC 2017 - aloisio@gmx.com
- 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 - toddrme2178@gmail.com
- Update singlespec build
- Use pypi download url
-------------------------------------------------------------------
Mon Dec 19 17:34:46 UTC 2016 - jmatejek@suse.com
- update for multipython build
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Jul 24 20:36:31 UTC 2015 - seife+obs@b1-systems.com Fri Jul 24 20:36:31 UTC 2015 - seife+obs@b1-systems.com

View File

@ -1,7 +1,7 @@
# #
# spec file for package python-Genshi # 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 # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -16,6 +16,7 @@
# #
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-Genshi Name: python-Genshi
Version: 0.7 Version: 0.7
Release: 0 Release: 0
@ -23,22 +24,37 @@ Url: http://genshi.edgewall.org/
Summary: A toolkit for generation of output for the web Summary: A toolkit for generation of output for the web
License: BSD-3-Clause License: BSD-3-Clause
Group: Development/Languages/Python Group: Development/Languages/Python
Source: http://ftp.edgewall.com/pub/genshi/Genshi-%{version}.tar.gz Source: https://files.pythonhosted.org/packages/source/G/Genshi/Genshi-%{version}.tar.gz
# FIX-UPSTREAM http://genshi.edgewall.org/ticket/566 # PATCH-FIX-UPSTREAM http://genshi.edgewall.org/ticket/566
Patch1: changeset_r1242.diff Patch1: changeset_r1242.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build # PATCH-FIX-UPSTREAM python-Genshi-0.7-sanitizer-test-fixes.patch https://genshi.edgewall.org/ticket/500
BuildRequires: python-Babel Patch2: %{name}-0.7-sanitizer-test-fixes.patch
BuildRequires: python-devel # PATCH-FIX-UPSTREAM python-Genshi-0.7-disable-speedups-for-python34.patch https://genshi.edgewall.org/ticket/555
BuildRequires: python-setuptools Patch3: %{name}-0.7-disable-speedups-for-python34.patch
BuildRequires: python-xml # 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-Babel
Requires: python-xml Requires: python-xml
Provides: python-genshi = %{version} %define oldpython python
Obsoletes: python-genshi < %{version} %ifpython2
%if 0%{?suse_version} && 0%{?suse_version} <= 1110 Obsoletes: %{oldpython}-genshi < %{version}
%{!?python_sitearch: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True)")} Provides: %{oldpython}-genshi = %{version}
%{py_requires}
%endif %endif
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%python_subpackages
%description %description
Genshi is a Python library that provides an integrated set of Genshi is a Python library that provides an integrated set of
@ -46,13 +62,15 @@ components for parsing, generating, and processing HTML, XML or
other textual content for output generation on the web. The major other textual content for output generation on the web. The major
feature is a template language, which is heavily inspired by Kid. 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 Summary: A toolkit for generation of output for the web - Documentation
Group: Development/Libraries/Python Group: Development/Libraries/Python
Requires: %{name} = %{version} 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 Genshi is a Python library that provides an integrated set of
components for parsing, generating, and processing HTML, XML or components for parsing, generating, and processing HTML, XML or
other textual content for output generation on the web. The major other textual content for output generation on the web. The major
@ -63,21 +81,40 @@ This package contains documentation and examples.
%prep %prep
%setup -q -n Genshi-%{version} %setup -q -n Genshi-%{version}
%patch1 -p2 %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 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 %build
python setup.py build %python_build
%install %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}
}
%files %check
%python_exec setup.py test
%files %{python_files}
%defattr(-,root,root,-) %defattr(-,root,root,-)
%doc COPYING ChangeLog README.txt %doc COPYING ChangeLog README.txt
%{python_sitearch}/genshi/ %{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,-) %defattr(-,root,root,-)
%doc doc examples %doc doc examples