add python3 suppport based on 2to3 script

This commit is contained in:
Stefan Klug 2015-10-27 21:10:24 +01:00
parent caef0e85d0
commit 4f91a30fec
68 changed files with 597 additions and 576 deletions

View file

@ -50,12 +50,12 @@ class UnicodeBuffer:
self.buffer = []
def write(self, s):
if s == None: return
if isinstance(s, unicode):
if isinstance(s, str):
self.buffer.append(s)
elif isinstance(s, str):
self.buffer.append(s.decode('utf-8'))
else:
self.buffer.append(unicode(s))
self.buffer.append(str(s))
def getValue(self):
return u''.join(self.buffer)
return ''.join(self.buffer)
# ------------------------------------------------------------------------------

View file

@ -109,18 +109,18 @@ class CsvParser:
def convertValue(self, value, basicType):
'''Converts the atomic p_value which is a string into some other atomic
Python type specified in p_basicType (int, float, ...).'''
if (basicType != str) and (basicType != unicode):
if (basicType != str) and (basicType != str):
try:
exec 'res = %s' % str(value)
except SyntaxError, se:
exec('res = %s' % str(value))
except SyntaxError as se:
res = None
else:
try:
exec 'res = """%s"""' % str(value)
except SyntaxError, se:
exec('res = """%s"""' % str(value))
except SyntaxError as se:
try:
exec "res = '''%s'''" % str(value)
except SyntaxError, se:
exec("res = '''%s'''" % str(value))
except SyntaxError as se:
res = None
return res
@ -183,7 +183,7 @@ class CsvParser:
self.res.append(lineObject)
f.close()
# The second pass resolves the p_references if any
for attrName, refInfo in self.references.iteritems():
for attrName, refInfo in self.references.items():
if attrName in self.attributes:
# Replace ID with real object from p_references
for obj in self.res:
@ -228,7 +228,7 @@ class CsvMarshaller:
def marshallValue(self, field, value):
'''Produces a version of p_value that can be dumped in a CSV file.'''
if isinstance(value, basestring):
if isinstance(value, str):
# Format the string as a one-line CSV-ready value
res = self.marshallString(value)
elif type(value) in sequenceTypes:

View file

@ -1,6 +1,6 @@
# ------------------------------------------------------------------------------
import os, re, httplib, sys, stat, urlparse, time, socket, xml.sax
import urllib
import os, re, http.client, sys, stat, urllib.parse, time, socket, xml.sax
from urllib.parse import quote
from StringIO import StringIO
from mimetypes import guess_type
from base64 import encodestring
@ -19,12 +19,12 @@ class FormDataEncoder:
def marshalValue(self, name, value):
if isinstance(value, basestring):
return '%s=%s' % (name, urllib.quote(str(value)))
return '%s=%s' % (name, quote(str(value)))
elif isinstance(value, float):
return '%s:float=%s' % (name, value)
elif isinstance(value, int):
return '%s:int=%s' % (name, value)
elif isinstance(value, long):
elif isinstance(value, int):
res = '%s:long=%s' % (name, value)
if res[-1] == 'L':
res = res[:-1]
@ -101,8 +101,8 @@ class HttpResponse:
redirect the user to if self.code is 302, or will unmarshall XML
data into Python objects.'''
if self.code == 302:
return urlparse.urlparse(self.headers['location'])[2]
elif self.headers.has_key('content-type'):
return urllib.parse.urlparse(self.headers['location'])[2]
elif 'content-type' in self.headers:
contentType = self.extractContentType(self.headers['content-type'])
for xmlHeader in self.xmlHeaders:
if contentType.startswith(xmlHeader):
@ -116,7 +116,7 @@ class HttpResponse:
raise ResourceError('Distant server exception: ' \
'%s' % res)
return res
except xml.sax.SAXParseException, se:
except xml.sax.SAXParseException as se:
raise ResourceError('Invalid XML response (%s)'%str(se))
# ------------------------------------------------------------------------------
@ -158,7 +158,7 @@ class Resource:
def updateHeaders(self, headers):
# Add credentials if present
if not (self.username and self.password): return
if headers.has_key('Authorization'): return
if 'Authorization' in headers: return
credentials = '%s:%s' % (self.username, self.password)
credentials = credentials.replace('\012', '')
headers['Authorization'] = "Basic %s" % encodestring(credentials)
@ -170,19 +170,19 @@ class Resource:
def send(self, method, uri, body=None, headers={}, bodyType=None):
'''Sends a HTTP request with p_method, for p_uri.'''
conn = httplib.HTTPConnection(self.host, self.port)
conn = http.client.HTTPConnection(self.host, self.port)
try:
conn.connect()
except socket.gaierror, sge:
except socket.gaierror as sge:
raise ResourceError('Check your Internet connection (%s)'% str(sge))
except socket.error, se:
except socket.error as se:
raise ResourceError('Connection error (%s)' % str(se))
# Tell what kind of HTTP request it will be.
conn.putrequest(method, uri, skip_host=True)
# Add HTTP headers
self.updateHeaders(headers)
if self.headers: headers.update(self.headers)
for n, v in headers.items(): conn.putheader(n, v)
for n, v in list(headers.items()): conn.putheader(n, v)
conn.endheaders()
# Add HTTP body
if body:

View file

@ -250,7 +250,7 @@ class HtmlDiff:
deleteStyle = 'color: red; text-decoration: line-through; cursor: help'
def __init__(self, old, new,
insertMsg=u'Inserted text', deleteMsg=u'Deleted text',
insertMsg='Inserted text', deleteMsg='Deleted text',
insertCss=None, deleteCss=None, insertName='insert',
deleteName='delete', diffRatio=0.7):
# p_old and p_new are strings containing chunks of HTML. If they are not
@ -306,24 +306,24 @@ class HtmlDiff:
else: tag = 'span'
# What message will it show in its 'title' attribute?
if not msg:
exec 'msg = self.%sMsg' % type
exec('msg = self.%sMsg' % type)
# What CSS class (or, if none, tag-specific style) will be used ?
exec 'cssClass = self.%sCss' % type
exec('cssClass = self.%sCss' % type)
if cssClass:
style = 'class="%s"' % cssClass
else:
exec 'style = self.%sStyle' % type
exec('style = self.%sStyle' % type)
style = 'style="%s"' % style
# The 'name' attribute of the tag indicates the type of the update.
exec 'tagName = self.%sName' % type
exec('tagName = self.%sName' % type)
# The idea is: if there are several lines, every line must be surrounded
# by a tag. This way, we know that a surrounding tag can't span several
# lines, which is a prerequisite for managing cumulative diffs.
if sep == ' ':
if not isinstance(seq, basestring):
if not isinstance(seq, str):
seq = sep.join(seq)
sep = ''
if isinstance(seq, basestring):
if isinstance(seq, str):
return '%s<%s name="%s" %s title="%s">%s</%s>%s' % \
(sep, tag, tagName, style, msg, seq, tag, sep)
else:
@ -592,7 +592,7 @@ class HtmlDiff:
try:
merger = Merger(lineA, add, previousDiffsA, self)
add = merger.merge()
except Merger.MergeError, e:
except Merger.MergeError as e:
# The merge algorithm has made a burn out. Simplify and
# consider lineA has having been completely deleted and
# lineB has completely inserted.

View file

@ -239,14 +239,14 @@ class LdapConnector:
self.server = ldap.initialize(self.serverUri)
self.server.simple_bind_s(login, password)
return True, None
except AttributeError, ae:
except AttributeError as ae:
# When the ldap module is not there, trying to catch ldap.LDAPError
# will raise an error.
message = str(ae)
self.log('Ldap connect error with login %s (%s).' % \
(login, message))
return False, message
except ldap.LDAPError, le:
except ldap.LDAPError as le:
message = str(le)
self.log('%s: connect error with login %s (%s).' % \
(self.serverUri, login, message))
@ -275,7 +275,7 @@ class LdapConnector:
timeout=self.timeout)
except ldap.TIMEOUT:
pass
except ldap.LDAPError, le:
except ldap.LDAPError as le:
self.log('LDAP query error %s: %s' % \
(le.__class__.__name__, str(le)))
# ------------------------------------------------------------------------------

View file

@ -160,20 +160,20 @@ class Debianizer:
name = '%s/%sctl' % (binFolder, self.appNameLower)
f = file(name, 'w')
f.write(appCtl % self.appNameLower)
os.chmod(name, 0744) # Make it executable by owner.
os.chmod(name, 0o744) # Make it executable by owner.
f.close()
# <app>run
name = '%s/%srun' % (binFolder, self.appNameLower)
f = file(name, 'w')
f.write(appRun % self.appNameLower)
os.chmod(name, 0744) # Make it executable by owner.
os.chmod(name, 0o744) # Make it executable by owner.
f.close()
# startoo
name = '%s/startoo' % binFolder
f = file(name, 'w')
f.write(ooStart)
f.close()
os.chmod(name, 0744) # Make it executable by owner.
os.chmod(name, 0o744) # Make it executable by owner.
# /var/lib/<app> (will store Data.fs, lock files, etc)
varLibFolder = j(debFolder, 'var', 'lib', self.appNameLower)
os.makedirs(varLibFolder)
@ -208,7 +208,7 @@ class Debianizer:
'application.' % n, '%sctl start' % n,
'%sctl restart' % n, '%sctl stop' % n))
f.close()
os.chmod(name, 0744) # Make it executable by owner.
os.chmod(name, 0o744) # Make it executable by owner.
# /etc/init.d/oo (start OpenOffice at boot time)
name = '%s/oo' % initdFolder
f = file(name, 'w')
@ -216,7 +216,7 @@ class Debianizer:
'startoo', 'startoo', "#Can't stop OO."))
f.write('\n')
f.close()
os.chmod(name, 0744) # Make it executable by owner.
os.chmod(name, 0o744) # Make it executable by owner.
# Get the size of the app, in Kb.
os.chdir(tempFolder)
cmd = subprocess.Popen(['du', '-b', '-s', 'debian'],

View file

@ -25,8 +25,8 @@
be strictly greater than 1.'''
# -----------------------------------------------------------------------------
import re, sys, UserList, UserDict
from StringIO import StringIO
import re, sys, collections, UserDict
from io import StringIO
# -----------------------------------------------------------------------------
class ParserError(Exception): pass
@ -69,7 +69,7 @@ LIST_VALUE_ERROR = 'Value "%s" is malformed: within it, %s. You should check ' \
# -----------------------------------------------------------------------------
class Type:
basicTypes = {'f': float, 'i':int, 'g':long, 'b':bool}
basicTypes = {'f': float, 'i':int, 'g':int, 'b':bool}
separators = ['-', ';', ',', ':']
def __init__(self, typeDecl):
self.basicType = None # The python basic type
@ -85,12 +85,12 @@ class Type:
self.listNumber += 1
else:
# Get the basic type
if not (char in Type.basicTypes.keys()):
if not (char in list(Type.basicTypes.keys())):
raise TypeError(BASIC_TYPE_ERROR % char)
self.basicType = Type.basicTypes[char]
break
if not self.basicType:
self.basicType = unicode
self.basicType = str
def convertBasicValue(self, value):
try:
return self.basicType(value.strip())
@ -136,7 +136,7 @@ class Type:
elif not resIsComplete:
try:
res = self.convertListItem(value, separators)
except TypeError, te:
except TypeError as te:
raise TypeError(LIST_VALUE_ERROR % (value, te, self.name))
return res
def convertListItem(self, stringItem, remainingSeps):
@ -161,9 +161,9 @@ class Type:
return self.name
# -----------------------------------------------------------------------------
class Table(UserList.UserList):
class Table(collections.UserList):
def __init__(self):
UserList.UserList.__init__(self)
collections.UserList.__init__(self)
self.name = None
self.parent = None
self.parentRow = None
@ -213,7 +213,7 @@ class TableRow(UserDict.UserDict):
via the parent table self.table.'''
keyError = False
t = self.table
if self.has_key(key):
if key in self:
res = UserDict.UserDict.__getitem__(self, key)
else:
# Get the parent row
@ -259,9 +259,9 @@ class TableRow(UserDict.UserDict):
# -----------------------------------------------------------------------------
class NameResolver:
def resolveNames(self, tables):
for tableName, table in tables.iteritems():
for tableName, table in tables.items():
if table.parent:
if not tables.has_key(table.parent):
if table.parent not in tables:
raise ParserError(PARENT_NOT_FOUND %
(table.parent, table.name))
table.parent = tables[table.parent]
@ -330,10 +330,10 @@ class TableParser:
def manageSpecialChar(self):
specialChar = int(self.specialCharBuffer)
self.specialCharBuffer = ''
if self.specialChars.has_key(specialChar):
if specialChar in self.specialChars:
self.contentBuffer.write(self.specialChars[specialChar])
else:
print('Warning: char %d not known.' % specialChar)
print(('Warning: char %d not known.' % specialChar))
self.state = TableParser.READING_CONTENT
def bufferize(self, char):
if self.state == TableParser.READING_CONTROL_WORD:
@ -403,7 +403,7 @@ class TableParser:
columnNames.append(name.strip())
try:
columnTypes.append(Type(typeDecl.strip()))
except TypeError, te:
except TypeError as te:
raise ParserError(TYPE_ERROR %
(header, self.currentTableName, te))
else:
@ -449,7 +449,7 @@ class TableParser:
if columnType:
try:
columnValue = columnType.convertValue(columnValue)
except TypeError, te:
except TypeError as te:
raise ParserError(VALUE_ERROR %
(columnName, self.currentTableName,
te))
@ -496,7 +496,7 @@ class RtfTablesParser:
# -----------------------------------------------------------------------------
if __name__ =='__main__':
tables = RtfTablesParser("Tests.rtf").parse()
for key, item in tables.iteritems():
print('Table %s' % key)
for key, item in tables.items():
print(('Table %s' % key))
print(item)
# -----------------------------------------------------------------------------

View file

@ -74,7 +74,7 @@ class Sap:
try:
self.sap = pysap.Rfc_connection(conn_string = params)
self.sap.open()
except pysap.BaseSapRfcError, se:
except pysap.BaseSapRfcError as se:
# Put in the error message the connection string without the
# password.
connNoPasswd = params[:params.index('PASSWD')] + 'PASSWD=********'
@ -84,7 +84,7 @@ class Sap:
'''Create a struct corresponding to SAP/C structure definition
p_structDef and fills it with dict p_userData.'''
res = structDef()
for name, value in userData.iteritems():
for name, value in userData.items():
if name not in structDef._sfield_names_:
raise SapError(SAP_STRUCT_ELEM_NOT_FOUND % (paramName, name))
sapType = structDef._sfield_sap_types_[name]
@ -93,7 +93,7 @@ class Sap:
sType = '%s%d' % (sapType[0], sapType[1])
# "None" value is tolerated.
if value == None: value = ''
if not isinstance(value, basestring):
if not isinstance(value, str):
raise SapError(
SAP_STRING_REQUIRED % (name, paramName, sType))
if len(value) > sapType[1]:
@ -113,7 +113,7 @@ class Sap:
functionName = self.functionName
function = self.sap.get_interface(functionName)
# Specify the parameters
for name, value in params.iteritems():
for name, value in params.items():
if type(value) == dict:
# The param corresponds to a SAP/C "struct"
v = self.createStructure(
@ -140,7 +140,7 @@ class Sap:
function[name] = v
# Call the function
function()
except pysap.BaseSapRfcError, se:
except pysap.BaseSapRfcError as se:
raise SapError(SAP_FUNCTION_ERROR % (functionName, str(se)))
return SapResult(function)
@ -198,10 +198,10 @@ class Sap:
self.sap.get_structure(typeName)
res += '%s\n%s\n\n' % \
(typeName, self.getTypeInfo(typeName))
except pysap.BaseSapRfcError, ee:
except pysap.BaseSapRfcError as ee:
pass
return res
except pysap.BaseSapRfcError, se:
except pysap.BaseSapRfcError as se:
if se.value == 'FU_NOT_FOUND':
raise SapError(SAP_FUNCTION_NOT_FOUND % (functionName))
else:
@ -229,6 +229,6 @@ class Sap:
'''Disconnects from SAP.'''
try:
self.sap.close()
except pysap.BaseSapRfcError, se:
except pysap.BaseSapRfcError as se:
raise SapError(SAP_DISCONNECT_ERROR % str(se))
# ------------------------------------------------------------------------------

View file

@ -177,7 +177,7 @@ class Tester:
(not isinstance(flavours, tuple)):
raise TesterError(FLAVOURS_NOT_LIST)
for flavour in flavours:
if not isinstance(flavour, basestring):
if not isinstance(flavour, str):
raise TesterError(FLAVOUR_NOT_STRING)
self.flavours = flavours
self.flavour = None
@ -198,7 +198,7 @@ class Tester:
if self.flavour:
ext = '.%s' % self.flavour
configTableName = 'Configuration%s' % ext
if self.tables.has_key(configTableName):
if configTableName in self.tables:
self.config = self.tables[configTableName].asDict()
self.tempFolder = os.path.join(self.testFolder, 'temp')
if os.path.exists(self.tempFolder):
@ -249,11 +249,11 @@ class Tester:
self.report.say('Test successful.\n')
self.nbOfSuccesses += 1
def run(self):
assert self.tables.has_key('TestSuites'), \
assert 'TestSuites' in self.tables, \
TesterError(MAIN_TABLE_NOT_FOUND % self.testPlan)
for testSuite in self.tables['TestSuites']:
if (not testSuite.has_key('Name')) or \
(not testSuite.has_key('Description')):
if ('Name' not in testSuite) or \
('Description' not in testSuite):
raise TesterError(MAIN_TABLE_MALFORMED)
if testSuite['Name'].startswith('_'):
tsName = testSuite['Name'][1:]
@ -261,8 +261,8 @@ class Tester:
else:
tsName = testSuite['Name']
tsIgnored = False
assert self.tables.has_key('%s.descriptions' % tsName) \
and self.tables.has_key('%s.data' % tsName), \
assert '%s.descriptions' % tsName in self.tables \
and '%s.data' % tsName in self.tables, \
TesterError(TEST_SUITE_NOT_FOUND % (tsName, tsName))
assert len(self.tables['%s.descriptions' % tsName]) == \
len(self.tables['%s.data' % tsName]), \

View file

@ -44,7 +44,7 @@ class FolderDeleter:
dirName = os.path.dirname(dirName)
else:
break
except OSError, oe:
except OSError:
break
# ------------------------------------------------------------------------------
@ -53,7 +53,7 @@ def cleanFolder(folder, exts=extsToClean, folders=(), verbose=False):
'''This function allows to remove, in p_folder and subfolders, any file
whose extension is in p_exts, and any folder whose name is in
p_folders.'''
if verbose: print('Cleaning folder %s...' % folder)
if verbose: print(('Cleaning folder %s...' % folder))
# Remove files with an extension listed in p_exts
if exts:
for root, dirs, files in os.walk(folder):
@ -61,7 +61,7 @@ def cleanFolder(folder, exts=extsToClean, folders=(), verbose=False):
ext = os.path.splitext(fileName)[1]
if (ext in exts) or ext.endswith('~'):
fileToRemove = os.path.join(root, fileName)
if verbose: print('Removing file %s...' % fileToRemove)
if verbose: print(('Removing file %s...' % fileToRemove))
os.remove(fileToRemove)
# Remove folders whose names are in p_folders.
if folders:
@ -69,7 +69,7 @@ def cleanFolder(folder, exts=extsToClean, folders=(), verbose=False):
for folderName in dirs:
if folderName in folders:
toDelete = os.path.join(root, folderName)
if verbose: print('Removing folder %s...' % toDelete)
if verbose: print(('Removing folder %s...' % toDelete))
FolderDeleter.delete(toDelete)
# ------------------------------------------------------------------------------
@ -142,14 +142,14 @@ def copyData(data, target, targetMethod, type='string', encoding=None,
dump(encodeData(chunk, encoding))
elif type == 'zope':
# A OFS.Image.File instance can be split into several chunks
if isinstance(data.data, basestring): # One chunk
if isinstance(data.data, str): # One chunk
dump(encodeData(data.data, encoding))
else:
# Several chunks
data = data.data
while data is not None:
dump(encodeData(data.data, encoding))
data = data.next
data = data.__next__
# ------------------------------------------------------------------------------
def splitList(l, sub):
@ -222,12 +222,12 @@ def getOsTempFolder():
tmp = '/tmp'
if os.path.exists(tmp) and os.path.isdir(tmp):
res = tmp
elif os.environ.has_key('TMP'):
elif 'TMP' in os.environ:
res = os.environ['TMP']
elif os.environ.has_key('TEMP'):
elif 'TEMP' in os.environ:
res = os.environ['TEMP']
else:
raise "Sorry, I can't find a temp folder on your machine."
raise Exception("Sorry, I can't find a temp folder on your machine.")
return res
def getTempFileName(prefix='', extension=''):
@ -273,10 +273,10 @@ def normalizeString(s, usage='fileName'):
except UnicodeDecodeError:
# Another encoding may be in use
s = s.decode('latin-1')
elif not isinstance(s, unicode): s = unicode(s)
elif not isinstance(s, str): s = str(s)
# For extracted text, replace any unwanted char with a blank
if usage == 'extractedText':
res = u''
res = ''
for char in s:
if char not in extractIgnore: res += char
else: res += ' '
@ -291,7 +291,7 @@ def normalizeString(s, usage='fileName'):
for char in s:
if char not in fileNameIgnore: res += char
elif usage.startswith('alpha'):
exec 'rex = %sRex' % usage
exec('rex = %sRex' % usage)
res = ''
for char in s:
if rex.match(char): res += char
@ -319,7 +319,7 @@ def keepDigits(s):
def getStringDict(d):
'''Gets the string literal corresponding to dict p_d.'''
res = []
for k, v in d.iteritems():
for k, v in d.items():
if type(v) not in sequenceTypes:
if not isinstance(k, basestring): k = str(k)
if not isinstance(v, basestring): v = str(v)
@ -386,7 +386,7 @@ def formatNumber(n, sep=',', precision=2, tsep=' '):
# ------------------------------------------------------------------------------
def lower(s):
'''French-accents-aware variant of string.lower.'''
isUnicode = isinstance(s, unicode)
isUnicode = isinstance(s, str)
if not isUnicode: s = s.decode('utf-8')
res = s.lower()
if not isUnicode: res = res.encode('utf-8')
@ -394,14 +394,14 @@ def lower(s):
def upper(s):
'''French-accents-aware variant of string.upper.'''
isUnicode = isinstance(s, unicode)
isUnicode = isinstance(s, str)
if not isUnicode: s = s.decode('utf-8')
res = s.upper()
if not isUnicode: res = res.encode('utf-8')
return res
# ------------------------------------------------------------------------------
typeLetters = {'b': bool, 'i': int, 'j': long, 'f':float, 's':str, 'u':unicode,
typeLetters = {'b': bool, 'i': int, 'j': int, 'f':float, 's':str, 'u':str,
'l': list, 'd': dict}
caExts = {'py': ('.py', '.vpy', '.cpy'), 'xml': ('.pt', '.cpt', '.xml')}
@ -506,8 +506,8 @@ class CodeAnalysis:
if not lines: return
commentRate = (self.commentLines / float(lines)) * 100.0
blankRate = (self.emptyLines / float(lines)) * 100.0
print('%s: %d files, %d lines (%.0f%% comments, %.0f%% blank)' % \
(self.name, self.numberOfFiles, lines, commentRate, blankRate))
print(('%s: %d files, %d lines (%.0f%% comments, %.0f%% blank)' % \
(self.name, self.numberOfFiles, lines, commentRate, blankRate)))
# ------------------------------------------------------------------------------
class LinesCounter:
@ -516,7 +516,7 @@ class LinesCounter:
'%stemp' % os.sep)
def __init__(self, folderOrModule, excludes=None):
if isinstance(folderOrModule, basestring):
if isinstance(folderOrModule, str):
# It is the path of some folder
self.folder = folderOrModule
else:
@ -624,10 +624,10 @@ class FileWrapper:
if self.content.__class__.__name__ == 'Pdata':
# The file content is splitted in several chunks.
f.write(self.content.data)
nextPart = self.content.next
nextPart = self.content.__next__
while nextPart:
f.write(nextPart.data)
nextPart = nextPart.next
nextPart = nextPart.__next__
else:
# Only one chunk
f.write(self.content)

View file

@ -66,9 +66,9 @@ HTML_ENTITIES = {
'euro':'', 'nbsp':' ', "rsquo":"'", "lsquo":"'", "ldquo":"'",
"rdquo":"'", 'ndash': '', 'mdash': '', 'oelig':'oe', 'quot': "'",
'mu': 'µ'}
import htmlentitydefs
for k, v in htmlentitydefs.entitydefs.iteritems():
if not HTML_ENTITIES.has_key(k) and not XML_ENTITIES.has_key(k):
import html.entities
for k, v in html.entities.entitydefs.items():
if k not in HTML_ENTITIES and k not in XML_ENTITIES:
HTML_ENTITIES[k] = ''
def escapeXml(s, format='xml', nsText='text'):
@ -77,13 +77,13 @@ def escapeXml(s, format='xml', nsText='text'):
their ODF counterparts. In this case, it is needed to give the name of
the "text" namespace (p_nsText) as defined in the ODF document where the
line breaks and tabs must be inserted.'''
if isinstance(s, unicode):
res = u''
if isinstance(s, str):
res = ''
else:
res = ''
odf = format == 'odf'
for c in s:
if XML_SPECIAL_CHARS_NO_APOS.has_key(c):
if c in XML_SPECIAL_CHARS_NO_APOS:
# We do not escape 'apos': there is no particular need for that.
res += XML_SPECIAL_CHARS_NO_APOS[c]
elif odf and (c == '\n'):
@ -99,12 +99,12 @@ def escapeXml(s, format='xml', nsText='text'):
def escapeXhtml(s):
'''Return p_s, whose XHTML special chars and carriage return chars have
been replaced with corresponding XHTML entities.'''
if isinstance(s, unicode):
res = u''
if isinstance(s, str):
res = ''
else:
res = ''
for c in s:
if XML_SPECIAL_CHARS_NO_APOS.has_key(c):
if c in XML_SPECIAL_CHARS_NO_APOS:
res += XML_SPECIAL_CHARS_NO_APOS[c]
elif c == '\n':
res += '<br/>'
@ -144,7 +144,7 @@ class XmlElement:
res = self.elem
if self.attrs:
res += '('
for attrName, attrValue in self.attrs.items():
for attrName, attrValue in list(self.attrs.items()):
res += '%s="%s"' % (attrName, attrValue)
res += ')'
return res
@ -167,7 +167,7 @@ class XmlEnvironment:
self.parser = None
def manageNamespaces(self, attrs):
'''Manages namespaces definitions encountered in p_attrs.'''
for attrName, attrValue in attrs.items():
for attrName, attrValue in list(attrs.items()):
if attrName.startswith('xmlns:'):
self.namespaces[attrValue] = attrName[6:]
def ns(self, nsUri):
@ -221,7 +221,7 @@ class XmlParser(ContentHandler, ErrorHandler):
def skippedEntity(self, name):
'''This method is called every time expat does not recognize an entity.
We provide here support for HTML entities.'''
if HTML_ENTITIES.has_key(name):
if name in HTML_ENTITIES:
self.characters(HTML_ENTITIES[name].decode('utf-8'))
else:
# Put a question mark instead of raising an exception.
@ -230,10 +230,10 @@ class XmlParser(ContentHandler, ErrorHandler):
# ErrorHandler methods ---------------------------------------------------
def error(self, error):
if self.raiseOnError: raise error
else: print('SAX error %s' % str(error))
else: print(('SAX error %s' % str(error)))
def fatalError(self, error):
if self.raiseOnError: raise error
else: print('SAX fatal error %s' % str(error))
else: print(('SAX fatal error %s' % str(error)))
def warning(self, error): pass
def parse(self, xml, source='string'):
@ -246,9 +246,9 @@ class XmlParser(ContentHandler, ErrorHandler):
method will close it.
'''
try:
from cStringIO import StringIO
from io import StringIO
except ImportError:
from StringIO import StringIO
from io import StringIO
self._xml = xml
self.parser.setContentHandler(self)
self.parser.setErrorHandler(self)
@ -333,7 +333,7 @@ class XmlUnmarshaller(XmlParser):
def convertAttrs(self, attrs):
'''Converts XML attrs to a dict.'''
res = {}
for k, v in attrs.items():
for k, v in list(attrs.items()):
if ':' in k: # An attr prefixed with a namespace. Remove this.
k = k.split(':')[-1]
res[str(k)] = self.encode(v)
@ -362,9 +362,9 @@ class XmlUnmarshaller(XmlParser):
e = XmlParser.startElement(self, elem, attrs)
# Determine the type of the element.
elemType = 'unicode' # Default value
if attrs.has_key('type'):
if 'type' in attrs:
elemType = attrs['type']
elif self.tagTypes.has_key(elem):
elif elem in self.tagTypes:
elemType = self.tagTypes[elem]
if elemType in self.containerTags:
# I must create a new container object.
@ -375,9 +375,9 @@ class XmlUnmarshaller(XmlParser):
elif elemType == 'dict': newObject = {}
elif elemType == 'file':
newObject = UnmarshalledFile()
if attrs.has_key('name'):
if 'name' in attrs:
newObject.name = self.encode(attrs['name'])
if attrs.has_key('mimeType'):
if 'mimeType' in attrs:
newObject.mimeType = self.encode(attrs['mimeType'])
else: newObject = Object(**self.convertAttrs(attrs))
# Store the value on the last container, or on the root object.
@ -454,17 +454,17 @@ class XmlUnmarshaller(XmlParser):
if not value: value = None
else:
# If we have a custom converter for values of this type, use it.
if self.conversionFunctions.has_key(e.currentBasicType):
if e.currentBasicType in self.conversionFunctions:
try:
value = self.conversionFunctions[e.currentBasicType](
value)
except Exception, err:
except Exception as err:
raise AppyError(CUSTOM_CONVERSION_ERROR % (
e.currentBasicType, value, str(err)))
# If not, try a standard conversion
elif e.currentBasicType in self.numericTypes:
try:
exec 'value = %s' % value
exec('value = %s' % value)
except SyntaxError:
raise AppyError(CONVERSION_ERROR % (
e.currentBasicType, value))
@ -578,7 +578,7 @@ class XmlMarshaller:
tagName = self.getTagName(self.rootElementName)
res.write('<'); res.write(tagName)
# Dumps namespace definitions if any
for prefix, url in self.namespaces.iteritems():
for prefix, url in self.namespaces.items():
if not prefix:
pre = 'xmlns' # The default namespace
else:
@ -597,7 +597,7 @@ class XmlMarshaller:
s = s.decode('utf-8')
# Replace special chars by XML entities
for c in s:
if self.xmlEntities.has_key(c):
if c in self.xmlEntities:
res.write(self.xmlEntities[c])
else:
res.write(c)
@ -617,13 +617,13 @@ class XmlMarshaller:
# There will be several parts.
w(v.data.data.encode('base64'))
# Write subsequent parts
nextPart = v.data.next
nextPart = v.data.__next__
nextPartNb = 2
while nextPart:
w('</%s>' % partTag) # Close the previous part
w('<%s type="base64" number="%d">' % (partTag, nextPartNb))
w(nextPart.data.encode('base64'))
nextPart = nextPart.next
nextPart = nextPart.__next__
nextPartNb += 1
else:
w(v.data.encode('base64'))
@ -654,7 +654,7 @@ class XmlMarshaller:
def dumpDict(self, res, v):
'''Dumps the XML version of dict p_v.'''
for key, value in v.iteritems():
for key, value in v.items():
res.write('<entry type="object">')
self.dumpField(res, 'k', key)
self.dumpField(res, 'v', value)
@ -681,7 +681,7 @@ class XmlMarshaller:
# The previous condition must be checked before this one because
# referred objects may be stored in lists or tuples, too.
for elem in value: self.dumpField(res, 'e', elem)
elif isinstance(value, basestring): self.dumpString(res, value)
elif isinstance(value, str): self.dumpString(res, value)
elif isinstance(value, bool): res.write(self.trueFalse[value])
elif fieldType == 'object':
if hasattr(value, 'absolute_url'):
@ -689,7 +689,7 @@ class XmlMarshaller:
res.write(value.absolute_url())
else:
# Dump the entire object content
for k, v in value.__dict__.iteritems():
for k, v in value.__dict__.items():
if not k.startswith('__'):
self.dumpField(res, k, v)
# Maybe we could add a parameter to the marshaller to know how
@ -771,7 +771,7 @@ class XmlMarshaller:
rootTagName = self.dumpRootTag(res, instance)
# Dump the fields of this root object
if objectType == 'popo':
for fieldName, fieldValue in instance.__dict__.iteritems():
for fieldName, fieldValue in instance.__dict__.items():
mustDump = False
if fieldName in self.fieldsToExclude:
mustDump = False
@ -823,11 +823,11 @@ class XmlMarshaller:
histTag = self.getTagName('history')
eventTag = self.getTagName('event')
res.write('<%s type="list">' % histTag)
key = instance.workflow_history.keys()[0]
key = list(instance.workflow_history.keys())[0]
history = instance.workflow_history[key]
for event in history:
res.write('<%s type="object">' % eventTag)
for k, v in event.iteritems():
for k, v in event.items():
self.dumpField(res, k, v)
res.write('</%s>' % eventTag)
res.write('</%s>' % histTag)
@ -856,7 +856,7 @@ class XmlHandler(ContentHandler):
(like dates) from a file that need to be compared to another file.'''
def __init__(self, xmlTagsToIgnore, xmlAttrsToIgnore):
ContentHandler.__init__(self)
self.res = unicode(xmlPrologue)
self.res = str(xmlPrologue)
self.namespaces = {} # ~{s_namespaceUri:s_namespaceName}~
self.indentLevel = -1
self.tabWidth = 3
@ -891,7 +891,7 @@ class XmlHandler(ContentHandler):
self.res += '\n' + (' ' * self.indentLevel * self.tabWidth)
def manageNamespaces(self, attrs):
'''Manage namespaces definitions encountered in attrs'''
for attrName, attrValue in attrs.items():
for attrName, attrValue in list(attrs.items()):
if attrName.startswith('xmlns:'):
self.namespaces[attrValue] = attrName[6:]
def ns(self, nsUri):
@ -906,7 +906,7 @@ class XmlHandler(ContentHandler):
self.indentLevel += 1
self.dumpSpaces()
self.res += '<%s' % elem
attrsNames = attrs.keys()
attrsNames = list(attrs.keys())
attrsNames.sort()
for attrToIgnore in self.attrsToIgnore:
if attrToIgnore in attrsNames:
@ -986,7 +986,7 @@ class XmlComparator:
else: print(line)
else:
if report: report.say(line[:-1], encoding=encoding)
else: print(line[:-1])
else: print((line[:-1]))
lastLinePrinted = True
else:
lastLinePrinted = False
@ -1061,7 +1061,7 @@ class XhtmlCleaner(XmlParser):
self.env.ignoreContent = False
try:
res = self.parse('<x>%s</x>' % s).encode('utf-8')
except SAXParseException, e:
except SAXParseException as e:
raise self.Error(str(e))
return res
@ -1106,7 +1106,7 @@ class XhtmlCleaner(XmlParser):
prefix = ''
res = '%s<%s' % (prefix, elem)
# Include the found attributes, excepted those that must be ignored.
for name, value in attrs.items():
for name, value in list(attrs.items()):
if not self.keepStyles:
if name in self.attrsToIgnore: continue
elif name == 'style':
@ -1115,7 +1115,7 @@ class XhtmlCleaner(XmlParser):
res += ' %s="%s"' % (name, value)
# Include additional attributes if required.
if elem in self.attrsToAdd:
for name, value in self.attrsToAdd[elem].iteritems():
for name, value in self.attrsToAdd[elem].items():
res += ' %s="%s"' % (name, value)
# Close the tag if it is a no-end tag
if elem in self.noEndTags:
@ -1163,7 +1163,7 @@ class XhtmlCleaner(XmlParser):
# I give here to lstrip an explicit list of what is to be considered
# as blank chars, because I do not want unicode NBSP chars to be in
# this list.
toAdd = content.lstrip(u' \n\r\t')
toAdd = content.lstrip(' \n\r\t')
else:
toAdd = content
# Re-transform XML special chars to entities.