annotate genshi/compat.py @ 938:8d0f693081b5 trunk

Refactor string cache creation to remove repeated code in preparation for fixing issue #429. This is patch t429-refactor-r1038.2.patch from ticket (from cboos).
author hodgestar
date Sun, 12 Jun 2011 00:30:56 +0000
parents 3f8fb83045b9
children 500573200533
rev   line source
931
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
1 # -*- coding: utf-8 -*-
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
2 #
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
3 # Copyright (C) 2006-2009 Edgewall Software
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
4 # All rights reserved.
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
5 #
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
8 # are also available at http://genshi.edgewall.org/wiki/License.
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
9 #
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
12 # history and logs, available at http://genshi.edgewall.org/log/.
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
13
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
14 """Various Python version compatibility classes and functions."""
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
15
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
16 import sys
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
17 from types import CodeType
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
18
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
19
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
20 IS_PYTHON2 = (sys.version_info[0] == 2)
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
21
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
22
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
23 # This function should only be called in Python 2, and will fail in Python 3
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
24
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
25 if IS_PYTHON2:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
26 def stringrepr(string):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
27 ascii = string.encode('ascii', 'backslashreplace')
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
28 quoted = "'" + ascii.replace("'", "\\'") + "'"
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
29 if len(ascii) > len(string):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
30 return 'u' + quoted
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
31 return quoted
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
32 else:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
33 def stringrepr(string):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
34 raise RuntimeError(
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
35 'Python 2 compatibility function. Not usable in Python 3.')
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
36
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
37
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
38 # We need to differentiate between StringIO and BytesIO in places
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
39
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
40 if IS_PYTHON2:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
41 from StringIO import StringIO
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
42 try:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
43 from cStringIO import StringIO as BytesIO
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
44 except ImportError:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
45 BytesIO = StringIO
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
46 else:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
47 from io import StringIO, BytesIO
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
48
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
49
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
50 # We want to test bytestring input to some stuff.
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
51
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
52 if IS_PYTHON2:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
53 def wrapped_bytes(bstr):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
54 assert bstr.startswith('b')
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
55 return bstr[1:]
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
56 else:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
57 def wrapped_bytes(bstr):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
58 assert bstr.startswith('b')
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
59 return bstr
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
60
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
61
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
62 # We do some scary stuff with CodeType() in template/eval.py
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
63
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
64 if IS_PYTHON2:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
65 def get_code_params(code):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
66 return (code.co_nlocals, code.co_stacksize, code.co_flags,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
67 code.co_code, code.co_consts, code.co_names, code.co_varnames,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
68 code.co_filename, code.co_name, code.co_firstlineno,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
69 code.co_lnotab, (), ())
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
70
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
71 def build_code_chunk(code, filename, name, lineno):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
72 return CodeType(0, code.co_nlocals, code.co_stacksize,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
73 code.co_flags | 0x0040, code.co_code, code.co_consts,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
74 code.co_names, code.co_varnames, filename, name,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
75 lineno, code.co_lnotab, (), ())
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
76 else:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
77 def get_code_params(code):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
78 return (code.co_nlocals, code.co_kwonlyargcount, code.co_stacksize,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
79 code.co_flags, code.co_code, code.co_consts, code.co_names,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
80 code.co_varnames, code.co_filename, code.co_name,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
81 code.co_firstlineno, code.co_lnotab, (), ())
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
82
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
83 def build_code_chunk(code, filename, name, lineno):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
84 return CodeType(0, code.co_nlocals, code.co_kwonlyargcount,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
85 code.co_stacksize, code.co_flags | 0x0040,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
86 code.co_code, code.co_consts, code.co_names,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
87 code.co_varnames, filename, name, lineno,
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
88 code.co_lnotab, (), ())
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
89
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
90 # Compatibility fallback implementations for Python < 2.6
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
91
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
92 try:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
93 next = next
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
94 except NameError:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
95 def next(iterator):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
96 return iterator.next()
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
97
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
98 # Compatibility fallback implementations for Python < 2.5
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
99
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
100 try:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
101 all = all
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
102 any = any
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
103 except NameError:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
104 def any(S):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
105 for x in S:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
106 if x:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
107 return True
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
108 return False
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
109
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
110 def all(S):
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
111 for x in S:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
112 if not x:
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
113 return False
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
114 return True
3f8fb83045b9 Merge r1139 from py3k: add compatibility functions for dealing with python 3; factor existing compatibility functions out from genshi utils.
hodgestar
parents:
diff changeset
115
Copyright (C) 2012-2017 Edgewall Software