Mercurial > genshi > mirror
view genshi/compat.py @ 933:1e8c33345e52 trunk
Merge r1141 from py3k:
add support for python 3 to genshi.filters:
* minor changes to track encoding=None API change in core genshi modules.
* renamed genshi/filters/tests/html.py to test_html.py to avoid clashes with Python 3 top-level html module when running tests subset.
* did not rename genshi/filters/html.py.
* i18n filters:
* ugettext and friends are gone in Python 3 (and only gettext and friends exist and they now handle unicode)
* Some \ line continuations inside doctests confused 2to3 and so were removed them.
* Testing picked up a problem (already present in trunk) where Translator.__call__ could end up defining gettext as an endlessly recursive function. Noted with a TODO.
author | hodgestar |
---|---|
date | Fri, 18 Mar 2011 09:11:53 +0000 |
parents | 3f8fb83045b9 |
children | 500573200533 |
line wrap: on
line source
# -*- coding: utf-8 -*- # # Copyright (C) 2006-2009 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://genshi.edgewall.org/log/. """Various Python version compatibility classes and functions.""" import sys from types import CodeType IS_PYTHON2 = (sys.version_info[0] == 2) # This function should only be called in Python 2, and will fail in Python 3 if IS_PYTHON2: def stringrepr(string): ascii = string.encode('ascii', 'backslashreplace') quoted = "'" + ascii.replace("'", "\\'") + "'" if len(ascii) > len(string): return 'u' + quoted return quoted else: def stringrepr(string): raise RuntimeError( 'Python 2 compatibility function. Not usable in Python 3.') # We need to differentiate between StringIO and BytesIO in places if IS_PYTHON2: from StringIO import StringIO try: from cStringIO import StringIO as BytesIO except ImportError: BytesIO = StringIO else: from io import StringIO, BytesIO # We want to test bytestring input to some stuff. if IS_PYTHON2: def wrapped_bytes(bstr): assert bstr.startswith('b') return bstr[1:] else: def wrapped_bytes(bstr): assert bstr.startswith('b') return bstr # We do some scary stuff with CodeType() in template/eval.py if IS_PYTHON2: def get_code_params(code): return (code.co_nlocals, code.co_stacksize, code.co_flags, code.co_code, code.co_consts, code.co_names, code.co_varnames, code.co_filename, code.co_name, code.co_firstlineno, code.co_lnotab, (), ()) def build_code_chunk(code, filename, name, lineno): return CodeType(0, code.co_nlocals, code.co_stacksize, code.co_flags | 0x0040, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, name, lineno, code.co_lnotab, (), ()) else: def get_code_params(code): return (code.co_nlocals, code.co_kwonlyargcount, code.co_stacksize, code.co_flags, code.co_code, code.co_consts, code.co_names, code.co_varnames, code.co_filename, code.co_name, code.co_firstlineno, code.co_lnotab, (), ()) def build_code_chunk(code, filename, name, lineno): return CodeType(0, code.co_nlocals, code.co_kwonlyargcount, code.co_stacksize, code.co_flags | 0x0040, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, name, lineno, code.co_lnotab, (), ()) # Compatibility fallback implementations for Python < 2.6 try: next = next except NameError: def next(iterator): return iterator.next() # Compatibility fallback implementations for Python < 2.5 try: all = all any = any except NameError: def any(S): for x in S: if x: return True return False def all(S): for x in S: if not x: return False return True