commands, also added a default template that uses the text editor for any unknown file type. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
273 lines
13 KiB
Python
273 lines
13 KiB
Python
#----------------------------------------------------------------------------
|
|
# Name: objutils.py
|
|
# Purpose: Object Utilities
|
|
#
|
|
# Author: Alan Mullendore
|
|
#
|
|
# Created: 5/10/05
|
|
# CVS-ID: $Id$
|
|
# Copyright: (c) 2004-2005 ActiveGrid, Inc.
|
|
# License: wxWindows License
|
|
#----------------------------------------------------------------------------
|
|
|
|
import logging
|
|
import traceback
|
|
import sys
|
|
import os
|
|
import xmlmarshaller
|
|
|
|
AG_TYPE_MAPPING = { "ag:append" : "activegrid.model.processmodel.AppendOperation",
|
|
"ag:body" : "activegrid.model.processmodel.Body",
|
|
"ag:copy" : "activegrid.model.processmodel.CopyOperation",
|
|
"ag:cssRule" : "activegrid.model.processmodel.CssRule",
|
|
"ag:datasource" : "activegrid.data.dataservice.DataSource",
|
|
"ag:debug" : "activegrid.model.processmodel.DebugOperation",
|
|
"ag:deployment" : "activegrid.server.deployment.Deployment",
|
|
"ag:glue" : "activegrid.model.processmodel.Glue",
|
|
"ag:hr" : "activegrid.model.processmodel.HorizontalRow",
|
|
"ag:image" : "activegrid.model.processmodel.Image",
|
|
"ag:inputs" : "activegrid.model.processmodel.Inputs",
|
|
"ag:label" : "activegrid.model.processmodel.Label",
|
|
"ag:processmodel": "activegrid.model.processmodel.ProcessModel",
|
|
"ag:processmodelref" : "activegrid.server.deployment.ProcessModelRef",
|
|
"ag:query" : "activegrid.model.processmodel.Query",
|
|
"ag:schemaOptions" : "activegrid.model.schema.SchemaOptions",
|
|
"ag:schemaref" : "activegrid.server.deployment.SchemaRef",
|
|
"ag:set" : "activegrid.model.processmodel.SetOperation",
|
|
"ag:text" : "activegrid.model.processmodel.Text",
|
|
"ag:title" : "activegrid.model.processmodel.Title",
|
|
"ag:view" : "activegrid.model.processmodel.View",
|
|
"bpws:case" : "activegrid.model.processmodel.BPELCase",
|
|
"bpws:catch" : "activegrid.model.processmodel.BPELCatch",
|
|
"bpws:faultHandlers" : "activegrid.model.processmodel.BPELFaultHandlers",
|
|
"bpws:invoke" : "activegrid.model.processmodel.BPELInvoke",
|
|
"bpws:onMessage" : "activegrid.model.processmodel.BPELOnMessage",
|
|
"bpws:otherwise" : "activegrid.model.processmodel.BPELOtherwise",
|
|
"bpws:pick" : "activegrid.model.processmodel.BPELPick",
|
|
"bpws:process" : "activegrid.model.processmodel.BPELProcess",
|
|
"bpws:receive" : "activegrid.model.processmodel.BPELReceive",
|
|
"bpws:reply" : "activegrid.model.processmodel.BPELReply",
|
|
"bpws:scope" : "activegrid.model.processmodel.BPELScope",
|
|
"bpws:sequence" : "activegrid.model.processmodel.BPELSequence",
|
|
"bpws:switch" : "activegrid.model.processmodel.BPELSwitch",
|
|
"bpws:terminate" : "activegrid.model.processmodel.BPELTerminate",
|
|
"bpws:variable" : "activegrid.model.processmodel.BPELVariable",
|
|
"bpws:variables" : "activegrid.model.processmodel.BPELVariables",
|
|
"bpws:while" : "activegrid.model.processmodel.BPELWhile",
|
|
"wsdl:message" : "activegrid.model.processmodel.WSDLMessage",
|
|
"wsdl:part" : "activegrid.model.processmodel.WSDLPart",
|
|
"xforms:group" : "activegrid.model.processmodel.XFormsGroup",
|
|
"xforms:input" : "activegrid.model.processmodel.XFormsInput",
|
|
"xforms:label" : "activegrid.model.processmodel.XFormsLabel",
|
|
"xforms:output" : "activegrid.model.processmodel.XFormsOutput",
|
|
"xforms:secret" : "activegrid.model.processmodel.XFormsSecret",
|
|
"xforms:submit" : "activegrid.model.processmodel.XFormsSubmit",
|
|
"xs:all" : "activegrid.model.schema.XsdSequence",
|
|
"xs:complexType" : "activegrid.model.schema.XsdComplexType",
|
|
"xs:element" : "activegrid.model.schema.XsdElement",
|
|
"xs:field" : "activegrid.model.schema.XsdKeyField",
|
|
"xs:key" : "activegrid.model.schema.XsdKey",
|
|
"xs:keyref" : "activegrid.model.schema.XsdKeyRef",
|
|
"xs:schema" : "activegrid.model.schema.Schema",
|
|
"xs:selector" : "activegrid.model.schema.XsdKeySelector",
|
|
"xs:sequence" : "activegrid.model.schema.XsdSequence",
|
|
"projectmodel" : "activegrid.tool.ProjectEditor.ProjectModel",
|
|
}
|
|
|
|
def defaultLoad(fileObject, knownTypes=None):
|
|
xml = fileObject.read()
|
|
loadedObject = defaultUnmarshal(xml, knownTypes=knownTypes)
|
|
if hasattr(fileObject, 'name'):
|
|
loadedObject.fileName = os.path.abspath(fileObject.name)
|
|
loadedObject.initialize()
|
|
return loadedObject
|
|
|
|
def defaultUnmarshal(xml, knownTypes=None):
|
|
if not knownTypes: knownTypes = AG_TYPE_MAPPING
|
|
return xmlmarshaller.unmarshal(xml, knownTypes=knownTypes)
|
|
|
|
def defaultSave(fileObject, objectToSave, prettyPrint=True, knownTypes=None, withEncoding=1, encoding='utf-8'):
|
|
xml = defaultMarshal(objectToSave, prettyPrint=prettyPrint, knownTypes=knownTypes, withEncoding=withEncoding, encoding=encoding)
|
|
fileObject.write(xml)
|
|
fileObject.flush()
|
|
|
|
def defaultMarshal(objectToSave, prettyPrint=True, knownTypes=None, withEncoding=1, encoding='utf-8'):
|
|
if not knownTypes: knownTypes = AG_TYPE_MAPPING
|
|
return xmlmarshaller.marshal(objectToSave, prettyPrint=prettyPrint, knownTypes=knownTypes, withEncoding=withEncoding, encoding=encoding)
|
|
|
|
def clone(objectToClone, knownTypes=None, encoding='utf-8'):
|
|
if not knownTypes: knownTypes = AG_TYPE_MAPPING
|
|
xml = xmlmarshaller.marshal(objectToClone, prettyPrint=True, knownTypes=knownTypes, encoding=encoding)
|
|
clonedObject = xmlmarshaller.unmarshal(xml, knownTypes=knownTypes)
|
|
if hasattr(objectToClone, 'fileName'):
|
|
clonedObject.fileName = objectToClone.fileName
|
|
try:
|
|
clonedObject.initialize()
|
|
except AttributeError:
|
|
pass
|
|
return clonedObject
|
|
|
|
def classForName(className):
|
|
pathList = className.split('.')
|
|
moduleName = '.'.join(pathList[:-1])
|
|
code = __import__(moduleName)
|
|
for name in pathList[1:]:
|
|
code = code.__dict__[name]
|
|
return code
|
|
|
|
def hasattrignorecase(object, name):
|
|
namelow = name.lower()
|
|
for attr in dir(object):
|
|
if attr.lower() == namelow:
|
|
return True
|
|
for attr in dir(object):
|
|
if attr.lower() == '_' + namelow:
|
|
return True
|
|
return False
|
|
|
|
def setattrignorecase(object, name, value):
|
|
namelow = name.lower()
|
|
for attr in object.__dict__:
|
|
if attr.lower() == namelow:
|
|
object.__dict__[attr] = value
|
|
return
|
|
object.__dict__[name] = value
|
|
|
|
def getattrignorecase(object, name):
|
|
namelow = name.lower()
|
|
for attr in object.__dict__:
|
|
if attr.lower() == namelow:
|
|
return object.__dict__[attr]
|
|
return object.__dict__[name]
|
|
|
|
def hasPropertyValue(obj, attr):
|
|
hasProp = False
|
|
try:
|
|
prop = obj.__class__.__dict__[attr]
|
|
if (isinstance(prop, property)):
|
|
hasProp = hasattr(obj, attr)
|
|
if (hasProp):
|
|
# It's a property and it has a value but sometimes we don't want it.
|
|
# If there is a _hasattr method execute it and the
|
|
# result will tell us whether to include this value
|
|
try:
|
|
hasProp = obj._hasattr(attr)
|
|
except:
|
|
pass
|
|
except KeyError:
|
|
pass
|
|
return hasProp
|
|
|
|
def toDiffableString(value):
|
|
s = repr(value)
|
|
ds = ""
|
|
i = s.find(" at 0x")
|
|
start = 0
|
|
while (i >= 0):
|
|
j = s.find(">", i)
|
|
if (j < i):
|
|
break
|
|
ds += s[start:i]
|
|
start = j
|
|
i = s.find(" at 0x", start)
|
|
return ds + s[start:]
|
|
|
|
PRINT_OBJ_GETATTR = 1
|
|
PRINT_OBJ_HIDE_INTERNAL = 2
|
|
PRINT_OBJ_COMPACT = 4
|
|
PRINT_OBJ_NONONE = 8
|
|
PRINT_OBJ_INTERNAL = 512
|
|
|
|
def printObject(out, object, name="", indent=0, flags=0, exclude=None, maxIndent=30):
|
|
if ((maxIndent != None) and (indent > maxIndent)):
|
|
print >> out, " "*indent, name, str(object)
|
|
return True
|
|
finalNewLine = False
|
|
printed = True
|
|
if ((flags & PRINT_OBJ_COMPACT) > 0):
|
|
if (exclude and object in exclude):
|
|
return
|
|
indent = 0
|
|
if ((flags & PRINT_OBJ_INTERNAL) == 0):
|
|
finalNewLine = True
|
|
flags |= PRINT_OBJ_INTERNAL
|
|
if (object == None):
|
|
if (flags & PRINT_OBJ_NONONE) == 0:
|
|
print >> out, " "*indent, name, " = None",
|
|
else:
|
|
finalNewLine = False
|
|
printed = False
|
|
elif (name.startswith("_") and ((flags & PRINT_OBJ_HIDE_INTERNAL) > 0)):
|
|
finalNewLine = False
|
|
printed = False
|
|
elif (isinstance(object, (list, tuple))):
|
|
if (exclude and object in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " of length = ", len(object), " (already printed)",
|
|
elif (exclude and name in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " of length = ", len(object), " (excluded)",
|
|
else:
|
|
if (exclude != None): exclude.append(object)
|
|
print >> out, " "*indent, name, " : ", type(object), " of length = %i" % len(object),
|
|
for i, o in enumerate(object):
|
|
print >> out
|
|
printObject(out, o, name="[%i]" % i, indent=indent+2, flags=flags, exclude=exclude, maxIndent=maxIndent)
|
|
elif (isinstance(object, dict)):
|
|
if (exclude and object in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " (already printed)",
|
|
else:
|
|
if (exclude != None): exclude.append(object)
|
|
if (len(name) > 0):
|
|
print >> out, " "*indent, name,
|
|
if ((flags & PRINT_OBJ_COMPACT) == 0):
|
|
print >> out
|
|
indent += 2
|
|
print >> out, " "*indent, "{",
|
|
if ((flags & PRINT_OBJ_COMPACT) == 0):
|
|
print >> out
|
|
keys = object.keys()
|
|
keys.sort()
|
|
for n in keys:
|
|
if ((n != None) and (not n.startswith("_") or ((flags & PRINT_OBJ_HIDE_INTERNAL) == 0))):
|
|
if printObject(out, object[n], name=n, indent=indent+2, flags=flags, exclude=exclude, maxIndent=maxIndent):
|
|
if ((flags & PRINT_OBJ_COMPACT) == 0):
|
|
print >> out
|
|
else:
|
|
print >> out, ",",
|
|
print >> out, " "*indent, "}",
|
|
elif (hasattr(object, "__dict__")):
|
|
if (exclude and object in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " (already printed) = ", toDiffableString(object),
|
|
else:
|
|
if (exclude != None): exclude.append(object)
|
|
if (name.startswith("_")):
|
|
print >> out, " "*indent, name, " : ", type(object),
|
|
elif (exclude and object.__dict__ in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " (already printed)",
|
|
else:
|
|
print >> out, " "*indent, name, " : ", type(object),
|
|
if ((flags & PRINT_OBJ_GETATTR) == 0):
|
|
if ((flags & PRINT_OBJ_COMPACT) == 0):
|
|
print >> out
|
|
printObject(out, object.__dict__, indent=indent, flags=flags, exclude=exclude, maxIndent=maxIndent)
|
|
else:
|
|
keys = object.__dict__.keys()
|
|
keys.sort()
|
|
for n in keys:
|
|
if ((flags & PRINT_OBJ_COMPACT) == 0):
|
|
print >> out
|
|
printObject(out, getattr(object, n), name=n, indent=indent+2, flags=flags, exclude=exclude, maxIndent=maxIndent)
|
|
elif (indent < 0):
|
|
print >> out, object,
|
|
elif isinstance(object, basestring):
|
|
if (exclude and name in exclude):
|
|
print >> out, " "*indent, name, " : ", type(object), " of length = ", len(object), " (excluded)",
|
|
elif (len(object) > 100):
|
|
print >> out, " "*indent, name, ":", type(object), "[%i] = %s...%s" % (len(object), object[:50], object[-50:]),
|
|
else:
|
|
print >> out, " "*indent, name, ":", type(object), "=", str(object),
|
|
else:
|
|
print >> out, " "*indent, name, ":", type(object), "=", str(object),
|
|
if (finalNewLine):
|
|
print >> out
|
|
return printed
|