Author: chrisz
Date: Fri Apr 6 15:48:37 2007
New Revision: 6421
Modified:
Webware/trunk/MiddleKit/Core/Klasses.py
Webware/trunk/MiddleKit/Core/Model.py
Webware/trunk/MiddleKit/Core/ModelUser.py
Webware/trunk/MiddleKit/Design/CodeGenerator.py
Webware/trunk/MiddleKit/Run/SQLObjectStore.py
Log:
Code cleanup and backward compatibility with Python < 2.3.
Modified: Webware/trunk/MiddleKit/Core/Klasses.py
==============================================================================
--- Webware/trunk/MiddleKit/Core/Klasses.py (original)
+++ Webware/trunk/MiddleKit/Core/Klasses.py Fri Apr 6 15:48:37 2007
@@ -6,9 +6,11 @@
from MiscUtils.DataTable import DataTable
from MiscUtils.DictForArgs import *
from UserDict import UserDict
-from types import *
-import os
-import sys
+
+try: # backward compatibility for Python < 2.3
+ True, False
+except NameError:
+ True, False = 1, 0
class Klasses(ModelObject, UserDict):
@@ -23,38 +25,30 @@
def __init__(self, model):
UserDict.__init__(self)
-
assert isinstance(model, Model)
self._model = model
self._klasses = []
self._filename = None
self._name = None
self._tableHeadings = None
-
self.initTypeMap()
-
def classNames(self):
return ['ModelObject', 'Klasses', 'Klass', 'Attr', 'BasicTypeAttr', 'ObjRefAttr', 'EnumAttr', 'DateTimeAttr']
-
def initTypeMap(self):
"""
Initializes self._typeNamesToAttrClassNames which maps MiddleKit type names (like int and enum) to the name of the attribute class that would implement them.
Mapping to class names rather than actual classes is key, because in __init__, a different set of attribute classes can be passed in.
"""
map = {}
-
names = 'bool int long float string enum date time list ObjRef decimal'
names = names.split()
for name in names:
map[name] = name.capitalize()+'Attr'
-
map['datetime'] = 'DateTimeAttr'
-
self._typeNamesToAttrClassNames = map
-
def assignClassIds(self, generator):
if self.setting('UseHashForClassIds', False):
# This is better because class ids will likely stay the same even as
@@ -113,7 +107,7 @@
self.addKlass(klass)
else:
name = row['Attribute']
- if name and name[0]!='#' and name[-1]!=':':
+ if name and name[0] != '#' and name[-1] != ':':
pyClassName = self.pyClassNameForAttrDict(row)
pyClass = self._model.coreClass(pyClassName)
klass.addAttr(pyClass(row))
Modified: Webware/trunk/MiddleKit/Core/Model.py
==============================================================================
--- Webware/trunk/MiddleKit/Core/Model.py (original)
+++ Webware/trunk/MiddleKit/Core/Model.py Fri Apr 6 15:48:37 2007
@@ -6,6 +6,10 @@
from cPickle import load, dump
except ImportError:
from pickle import load, dump
+try: # backward compatibility for Python < 2.3
+ True, False
+except NameError:
+ True, False = 1, 0
class ModelError(Exception):
@@ -31,17 +35,20 @@
class Model(Configurable):
- """
- A Model defines the classes, attributes and enumerations of an application.
+ """A Model defines the classes, attributes and enumerations of an application.
+
+ It also provides access to the Python classes that implement these structures
+ for use by other MiddleKit entities including code generators and object stores.
- It also provides access to the Python classes that implement these structures for use by other MiddleKit entities including code generators and object stores.
"""
pickleVersion = 1
# increment this if a non-compatible change is made in Klasses,
# Klass or Attr
- def __init__(self, filename=None, classesFilename=None, configFilename=None, customCoreClasses={}, rootModel=None, havePythonClasses=1):
+ def __init__(self,
+ filename=None, classesFilename=None, configFilename=None,
+ customCoreClasses={}, rootModel=None, havePythonClasses=1):
Configurable.__init__(self)
self._havePythonClasses = havePythonClasses
self._filename = None
@@ -81,7 +88,7 @@
start = time.time()
assert self._filename is None, 'Cannot read twice.'
# Assume the .mkmodel extension if none is given
- if os.path.splitext(filename)[1]=='':
+ if os.path.splitext(filename)[1] == '':
filename += '.mkmodel'
self._filename = os.path.abspath(filename)
self._name = None
@@ -105,10 +112,7 @@
# print '%.2f seconds\n' % dur
def readKlassesInModelDir(self):
- """
- Reads the Classes.csv file, or the Classes.pickle.cache file as
- appropriate.
- """
+ """Read the Classes.csv or Classes.pickle.cache file as appropriate."""
path = None
csvPath = os.path.join(self._filename, 'Classes.csv')
if os.path.exists(csvPath):
@@ -152,12 +156,12 @@
name = klass.name()
if byName.has_key(name):
for i in range(len(inOrder)):
- if inOrder[i].name()==name:
+ if inOrder[i].name() == name:
inOrder[i] = klass
else:
inOrder.append(klass)
byName[name] = klass
- assert len(byName)==len(inOrder)
+ assert len(byName) == len(inOrder)
for name, klass in byName.items():
assert klass is self.klass(name)
for klass in inOrder:
@@ -178,12 +182,15 @@
if parentFilenames is None:
parentFilenames = self.setting('Inherit', [])
for filename in parentFilenames:
- filename = os.path.abspath(os.path.join(os.path.dirname(self._filename), filename))
+ filename = os.path.abspath(os.path.join(
+ os.path.dirname(self._filename), filename))
if self._allModelsByFilename.has_key(filename):
model = self._allModelsByFilename[filename]
assert model!=self._rootModel
else:
- model = self.__class__(filename, customCoreClasses=self._coreClasses, rootModel=self, havePythonClasses=self._havePythonClasses)
+ model = self.__class__(filename,
+ customCoreClasses=self._coreClasses,
+ rootModel=self, havePythonClasses=self._havePythonClasses)
self._allModelsByFilename[filename] = model
self._parents.append(model)
@@ -208,21 +215,25 @@
self._searchOrder = searchOrder
def dontReadParents(self):
- """
- The attributes _parents and _searchOrder are set.
- Used internally for the rare case of reading class files directly (instead of from a model directory).
+ """Set attributes _parents and _searchOrder.
+
+ Used internally for the rare case of reading class files directly
+ (instead of from a model directory).
+
"""
self._parents = []
self._searchOrder = [self]
def allModelsDepthFirstLeftRight(self, parents=None):
- """
+ """Return ordered list of models.
+
Returns a list of all models, including self, parents and
ancestors, in a depth-first, left-to-right order. Does not
remove duplicates (found in inheritance diamonds).
Mostly useful for readParents() to establish the lookup
order regarding model inheritance.
+
"""
if parents is None:
parents = []
@@ -232,7 +243,12 @@
return parents
def coreClass(self, className):
- """ For the given name, returns a class from MiddleKit.Core or the custom set of classes that were passed in via initialization. """
+ """Return code class.
+
+ For the given name, returns a class from MiddleKit.Core
+ or the custom set of classes that were passed in via initialization.
+
+ """
pyClass = self._coreClasses.get(className, None)
if pyClass is None:
results = {}
@@ -243,17 +259,19 @@
return pyClass
def coreClassNames(self):
- """ Returns a list of model class names found in MiddleKit.Core. """
+ """Return a list of model class names found in MiddleKit.Core."""
# a little cheesy, but it does the job:
import MiddleKit.Core as Core
return Core.__all__
def klasses(self):
- """
- Return an instance that inherits from Klasses, using the base
+ """Get klasses.
+
+ Returns an instance that inherits from Klasses, using the base
classes passed to __init__, if any.
See also: klass(), allKlassesInOrder(), allKlassesByName()
+
"""
if self._klasses is None:
Klasses = self.coreClass('Klasses')
@@ -261,9 +279,11 @@
return self._klasses
def klass(self, name, default=NoDefault):
- """
+ """Get klass.
+
Returns the klass with the given name, searching the parent
models if necessary.
+
"""
for model in self._searchOrder:
klass = model.klasses().get(name, None)
@@ -275,23 +295,28 @@
return default
def allKlassesInOrder(self):
- """
+ """Get klasses in order.
+
Returns a sequence of all the klasses in this model, unique by
name, including klasses inherited from parent models.
The order is the order of declaration, top-down.
+
"""
return self._allKlassesInOrder
def allKlassesByName(self):
- """
+ """Get klasses by name.
+
Returns a dictionary of all the klasses in this model, unique
by name, including klasses inherited from parent models.
+
"""
return self._allKlassesByName
def allKlassesInDependencyOrder(self):
- """
+ """Get klasses in dependency order.
+
Returns a sequence of all the klasses in this model, in an
order such that klasses follow the klasses they refer to
(via obj ref attributes).
@@ -302,6 +327,7 @@
since there can be no definitive order when a cycle exists.
You can break cycles by setting Ref=False for some
attribute in the cycle.
+
"""
for klass in self._allKlassesInOrder:
klass.willBuildDependencies()
@@ -316,20 +342,24 @@
klass.recordDependencyOrder(allKlasses, visited)
# The above loop fails to capture classes that are in cycles,
# but in that case there really is no dependency order.
- if len(allKlasses)<len(self._allKlassesInOrder):
- raise ModelError('Cannot determine a dependency order among the classes due to a cycle. Try setting Ref=0 for one of the attributes to break the cycle.')
- assert len(allKlasses)==len(self._allKlassesInOrder), '%r, %r, %r' % (len(allKlasses), len(self._allKlassesInOrder), allKlasses)
- #print '>> allKlassesInDependencyOrder() =', ' '.join([klass.name() for klass in allKlasses])
+ if len(allKlasses) < len(self._allKlassesInOrder):
+ raise ModelError("Cannot determine a dependency order"
+ " among the classes due to a cycle. Try setting Ref=0"
+ " for one of the attributes to break the cycle.")
+ assert len(allKlasses) == len(self._allKlassesInOrder), \
+ '%r, %r, %r' % (len(allKlasses), len(self._allKlassesInOrder), allKlasses)
+ # print '>> allKlassesInDependencyOrder() =', ' '.join([k.name() for k in allKlasses])
return allKlasses
def pyClassForName(self, name):
- """
- Returns the Python class for the given name, which must be
- present in the object model. Accounts for
- self.setting('Package').
+ """Get Python class for name.
+
+ Returns the Python class for the given name, which must be present
+ in the object model. Accounts for self.setting('Package').
+
+ If you already have a reference to the model klass, then you can
+ just ask it for klass.pyClass().
- If you already have a reference to the model klass, then
- you can just ask it for klass.pyClass().
"""
pyClass = self._pyClassForName.get(name, None)
if pyClass is None:
@@ -340,7 +370,9 @@
try:
exec 'import %s%s as module' % (pkg, name) in results
except ImportError, exc:
- raise ModelError("Could not import module for class '%s' due to %r. If you've added this class recently, you need to re-generate your model." % (name, exc.args[0]))
+ raise ModelError("Could not import module for class '%s' due to %r."
+ " If you've added this class recently,"
+ " you need to re-generate your model." % (name, exc.args[0]))
pyClass = getattr(results['module'], 'pyClass', None)
if pyClass is None:
pyClass = getattr(results['module'], name)
@@ -362,10 +394,10 @@
def defaultConfig(self):
return {
- 'Threaded': 1,
+ 'Threaded': True,
'ObjRefSuffixes': ('ClassId', 'ObjId'),
'UseBigIntObjRefColumns': False,
-# 'SQLLog': { 'File': 'stdout', },
+ # 'SQLLog': { 'File': 'stdout', },
'PreSQL': '',
'PostSQL': '',
'DropStatements': 'database', # database, tables
@@ -377,8 +409,8 @@
'ValueColName': 'value',
'NameColName': 'name',
},
- # can use: [cC]lassName, _ClassName, [aA]ttrName, _AttrName.
- # "_" prefix means "as is", the others control the case of the first character.
+ # can use: [cC]lassName, _ClassName, [aA]ttrName, _AttrName.
+ # "_" prefix means "as is", the others control the case of the first character.
}
def usesExternalSQLEnums(self):
@@ -395,6 +427,7 @@
if out is None:
out = sys.stdout
if len(self._klasses.klassesInOrder()) < 1:
- out.write("warning: Model '%s' doesn't contain any class definitions.\n" % self.name())
+ out.write("warning: Model '%s' doesn't contain any class definitions.\n"
+ % self.name())
for klass in self.klasses().klassesInOrder():
klass.printWarnings(out)
Modified: Webware/trunk/MiddleKit/Core/ModelUser.py
==============================================================================
--- Webware/trunk/MiddleKit/Core/ModelUser.py (original)
+++ Webware/trunk/MiddleKit/Core/ModelUser.py Fri Apr 6 15:48:37 2007
@@ -1,7 +1,8 @@
+import sys
+from types import ModuleType, ClassType
+
from MiscUtils.MixIn import MixIn
from MiscUtils import NoDefault
-import sys
-from types import *
class ModelUser:
@@ -35,7 +36,7 @@
def readModelFileNamed(self, filename, modelClass=None, **keywords):
assert self._model is None, 'Cannot re-read a model.'
- if modelClass==None:
+ if modelClass == None:
from MiddleKit.Core.Model import Model as modelClass
self._model = modelClass(**keywords)
self._model.read(filename)
@@ -54,7 +55,8 @@
print 'class =', self.__class__
modules = self.modulesForClass(self.__class__)
- if verbose: print 'modules =', ', '.join(modules)
+ if verbose:
+ print 'modules =', ', '.join(modules)
modules.reverse() # so that mix-ins in subclasses override super
modules = [sys.modules[m] for m in modules]
@@ -63,13 +65,18 @@
assert type(module) is ModuleType
self.installMixInsForModule(module, verbose)
- if verbose: print
+ if verbose:
+ print
def installMixInsForModule(self, module, verbose=0):
- # @@ 2000-10-18 ce: perhaps MixIns should be applied to the actual MiddleKit.Core class and not the custom one that possibly was passed into model. This would help with "invoking super" which may be a non-trivial operation in a mix-in of a generator module.
+ # @@ 2000-10-18 ce: perhaps MixIns should be applied to the actual
+ # MiddleKit.Core class and not the custom one that possibly was
+ # passed into model. This would help with "invoking super" which
+ # may be a non-trivial operation in a mix-in of a generator module.
coreClassNames = self._model.coreClassNames()
- if verbose: print '>>', module
+ if verbose:
+ print '>>', module
for name in dir(module):
generatorThing = getattr(module, name)
if type(generatorThing) is ClassType:
@@ -78,7 +85,8 @@
if name in coreClassNames:
baseClass = self._model.coreClass(name)
if baseClass is not generatorThing:
- if verbose: print '>> mixing %s into %s' % (generatorThing, baseClass)
+ if verbose:
+ print '>> mixing %s into %s' % (generatorThing, baseClass)
assert type(baseClass) is ClassType
assert type(generatorThing) is ClassType
MixIn(baseClass, generatorThing, mixInSuperMethods=1)
@@ -112,7 +120,7 @@
if modules is None:
modules = []
className = pyClass.__name__
- if className!='ModelUser':
+ if className != 'ModelUser':
modules.append(pyClass.__module__)
for baseClass in pyClass.__bases__:
self.modulesForClass(baseClass, modules)
Modified: Webware/trunk/MiddleKit/Design/CodeGenerator.py
==============================================================================
--- Webware/trunk/MiddleKit/Design/CodeGenerator.py (original)
+++ Webware/trunk/MiddleKit/Design/CodeGenerator.py Fri Apr 6 15:48:37 2007
@@ -22,11 +22,16 @@
import os, sys
+
from MiscUtils.Configurable import Configurable
-from types import *
from time import asctime, localtime, time
from MiddleKit.Core.ModelUser import ModelUser
+try: # backward compatibility for Python < 2.3
+ True, False
+except NameError:
+ True, False = 1, 0
+
class CodeGenerator(ModelUser):
Modified: Webware/trunk/MiddleKit/Run/SQLObjectStore.py
==============================================================================
--- Webware/trunk/MiddleKit/Run/SQLObjectStore.py (original)
+++ Webware/trunk/MiddleKit/Run/SQLObjectStore.py Fri Apr 6 15:48:37 2007
@@ -48,8 +48,8 @@
"""
def updateStmt(self):
- assert self.sourceObject.serialNum!=0
- assert self.targetObject.serialNum()!=0
+ assert self.sourceObject.serialNum != 0
+ assert self.targetObject.serialNum() != 0
sourceKlass = self.sourceObject._mk_klass
assert sourceKlass
sourceTableName = sourceKlass.sqlTableName()
@@ -83,6 +83,7 @@
ObjectStore.__init__(self)
self._dbArgs = kwargs
self._connected = 0
+ self._commited = 0
self._sqlEcho = None
self._sqlCount = 0
self._pool = None # an optional DBPool
@@ -98,11 +99,11 @@
# Check thread safety
self._threadSafety = self.threadSafety()
- if self._threaded and self._threadSafety==0:
+ if self._threaded and self._threadSafety == 0:
raise SQLObjectStoreThreadingError, 'Threaded is 1, but the DB API threadsafety is 0.'
# Cache some settings
- self._markDeletes = self.setting('DeleteBehavior', 'delete')=='mark'
+ self._markDeletes = self.setting('DeleteBehavior', 'delete') == 'mark'
# Set up SQL echo
self.setUpSQLEcho()
@@ -120,7 +121,7 @@
args = self._dbArgs
self._dbArgs = self.setting('DatabaseArgs',{})
self._dbArgs.update(args)
- #print 'dbArgs = %s' % self._dbArgs
+ # print 'dbArgs = %s' % self._dbArgs
# Connect
self.connect()
@@ -133,15 +134,15 @@
modelWasSet().
"""
setting = self.setting('SQLLog', None)
- if setting==None or setting=={}:
+ if setting == None or setting == {}:
self._sqlEcho = None
else:
filename = setting['File']
- if filename==None:
+ if filename == None:
self._sqlEcho = None
- elif filename=='stdout':
+ elif filename == 'stdout':
self._sqlEcho = sys.stdout
- elif filename=='stderr':
+ elif filename == 'stderr':
self._sqlEcho = sys.stderr
else:
mode = setting.get('Mode', 'write')
@@ -221,7 +222,7 @@
## Changes ##
- def commitInserts(self,allThreads=0):
+ def commitInserts(self, allThreads=0):
unknownSerialNums = []
# @@ ... sort here for dependency order
for object in self._newObjects.items(allThreads):
@@ -238,12 +239,12 @@
def _insertObject(self, object, unknownSerialNums):
# New objects not in the persistent store have serial numbers less than 1
- if object.serialNum()>0:
+ if object.serialNum() > 0:
try:
rep = repr(object)
except:
rep = '(repr exception)'
- assert object.serialNum()<1, 'object=%s' % rep
+ assert object.serialNum() < 1, 'object=%s' % rep
# try to get the next ID (if database supports this)
idNum = self.retrieveNextInsertId(object.klass())
@@ -277,7 +278,7 @@
Subclass responsibility. """
raise AbstractError, self.__class__
- def commitUpdates(self,allThreads=0):
+ def commitUpdates(self, allThreads=0):
conn = None
try:
for object in self._changedObjects.values(allThreads):
@@ -288,7 +289,7 @@
self.doneWithConnection(conn)
self._changedObjects.clear(allThreads)
- def commitDeletions(self,allThreads=0):
+ def commitDeletions(self, allThreads=0):
conn = None
try:
for object in self._deletedObjects.items(allThreads):
@@ -308,13 +309,13 @@
klass = self._klassForClass(aClass)
objects = self.fetchObjectsOfClass(klass, serialNum=serialNum, isDeep=0)
count = len(objects)
- if count==0:
+ if count == 0:
if default is NoDefault:
raise UnknownObjectError, 'aClass = %r, serialNum = %r' % (aClass, serialNum)
else:
return default
else:
- assert count==1
+ assert count == 1
return objects[0]
def fetchObjectsOfClass(self, aClass, clauses='', isDeep=1, refreshAttrs=1, serialNum=None):
@@ -391,7 +392,8 @@
Note that you can pass in a connection to force a particular one
to be used.
"""
- sql = str(sql) # Excel-based models yield Unicode strings which some db modules don't like
+ sql = str(sql) # Excel-based models yield Unicode strings which some db modules don't like
+ sql = sql.strip()
if aggressiveGC:
import gc
assert gc.isenabled()
@@ -401,11 +403,8 @@
timestamp = funcs.timestamp()['pretty']
self._sqlEcho.write('SQL %04i. %s %s\n' % (self._sqlCount, timestamp, sql))
self._sqlEcho.flush()
-# if self._sqlCount in (2, 3, 4):
-# import traceback as tb
-# tb.print_stack()
conn, cur = self.connectionAndCursor(connection)
- self._executeSQL(cur, sql.strip())
+ self._executeSQL(cur, sql)
return conn, cur
def _executeSQL(self, cur, sql):
@@ -416,12 +415,10 @@
"""
cur.execute(sql)
-
def setSQLEcho(self, file):
""" Sets a file to echo sql statements to, as sent through executeSQL(). None can be passed to turn echo off. """
self._sqlEcho = file
-
def connectionAndCursor(self, connection=None):
"""
Returns the connection and cursor needed for executing SQL,
@@ -492,11 +489,11 @@
assumption by overriding this method.
"""
assert isinstance(objRef, types.LongType), 'type=%r, objRef=%r' % (type(objRef), objRef)
- if objRef==0:
+ if objRef == 0:
return None
else:
klassId, serialNum = objRefSplit(objRef)
- if klassId==0 or serialNum==0:
+ if klassId == 0 or serialNum == 0:
# invalid! we don't use 0 serial numbers
return self.objRefZeroSerialNum(objRef)
@@ -511,9 +508,9 @@
clauses = 'where %s=%d' % (klass.sqlSerialColumnName(), serialNum)
objs = self.fetchObjectsOfClass(klass, clauses, isDeep=0)
- if len(objs)==1:
+ if len(objs) == 1:
return objs[0]
- elif len(objs)>1:
+ elif len(objs) > 1:
raise ValueError, 'Multiple objects.' # @@ 2000-11-22 ce: expand the msg with more information
else:
return self.objRefDangles(objRef)
@@ -523,11 +520,11 @@
if it has been loaded into memory. If the object has never been
fetched from the database, None is returned. """
assert isinstance(objRef, types.LongType), 'type=%r, objRef=%r' % (type(objRef), objRef)
- if objRef==0:
+ if objRef == 0:
return 0
else:
klassId, serialNum = objRefSplit(objRef)
- if klassId==0 or serialNum==0:
+ if klassId == 0 or serialNum == 0:
# invalid! we don't use 0 serial numbers
return self.objRefZeroSerialNum(objRef)
@@ -569,6 +566,15 @@
The default behavior is to close the connection.
"""
if conn is not None:
+ # Starting with 1.2.0, MySQLdb disables autocommit by default,
+ # as required by the DB-API standard (PEP-249). If you are using
+ # InnoDB tables or some other type of transactional table type,
+ # you'll need to do connection.commit() before closing the connection,
+ # or else none of your changes will be written to the database.
+ try:
+ conn.commit()
+ except:
+ pass
conn.close()
@@ -582,7 +588,7 @@
conn = None
try:
for klass in self.model().klasses().values():
- out.write(klass.name()+'\n')
+ out.write(klass.name() + '\n')
conn, cur = self.executeSQL('select * from %s;' % klass.name(), conn)
out.write(str(self._cursor.fetchall()))
out.write('\n')
@@ -603,8 +609,8 @@
out = sys.stdout
for klass in self.model().klasses().values():
if progress:
- sys.stderr.write( "." )
- out.write('%s objects\n' % ( klass.name() ) )
+ sys.stderr.write(".")
+ out.write('%s objects\n' % (klass.name()))
attrs = [ attr for attr in klass.allAttrs() if attr.hasSQLColumn() ]
colNames = [ attr.name() for attr in attrs ]
colNames.insert(0, klass.sqlSerialColumnName())
@@ -614,26 +620,26 @@
objlist = self.fetchObjectsOfClass(klass.name(),isDeep=0)
for obj in objlist:
fields = []
- fields.append( str(obj.serialNum()))
+ fields.append(str(obj.serialNum()))
for attr in attrs:
# jdh 2003-03-07: if the attribute is a dangling object reference, the value
# will be None. This means that dangling references will _not_ be remembered
# across dump/generate/create/insert procedures.
- method = getattr( obj, attr.pyGetName() )
+ method = getattr(obj, attr.pyGetName())
value = apply(method,())
if value is None:
fields.append('')
- elif isinstance( value, MiddleObject ):
- fields.append( value.klass().name() + "." + str( value.serialNum() ) )
+ elif isinstance(value, MiddleObject):
+ fields.append(value.klass().name() + "." + str(value.serialNum()))
else:
- fields.append( str(value))
+ fields.append(str(value))
out.write(CSVJoiner.joinCSVFields(fields).replace('\r','\\r'))
out.write('\n')
out.write('\n')
out.write('\n')
if progress:
- sys.stderr.write( "\n" )
+ sys.stderr.write("\n")
class Model:
@@ -686,10 +692,10 @@
append(value)
else:
extend(value) # value could be sequence for attrs that require multiple SQL columns
- if len(values)==0:
+ if len(values) == 0:
values = ['0']
values = ','.join(values)
- return insertSQLStart+values+');'
+ return insertSQLStart + values + ');'
def sqlUpdateStmt(self):
"""
@@ -716,7 +722,7 @@
"""
klass = self.klass()
assert klass is not None
- if self.store().model().setting('DeleteBehavior', 'delete')=='mark':
+ if self.store().model().setting('DeleteBehavior', 'delete') == 'mark':
return 'update %s set deleted=%s where %s=%d;' % (klass.sqlTableName(), self.store().sqlNowCall(), klass.sqlSerialColumnName(), self.serialNum())
else:
return 'delete from %s where %s=%d;' % (klass.sqlTableName(), klass.sqlSerialColumnName(), self.serialNum())
@@ -827,7 +833,7 @@
columns, see ObjRefAttr).
"""
colName = self.sqlColumnName()
- return colName+'='+self.sqlValue(value)
+ return colName + '=' + self.sqlValue(value)
def readStoreDataRow(self, obj, row, i):
"""
@@ -835,7 +841,7 @@
"""
value = row[i]
obj.setValueForAttr(self, value)
- return i+1
+ return i + 1
class BasicTypeAttr:
@@ -899,7 +905,7 @@
def sqlForNonNone(self, value):
assert isinstance(value, MiddleObject)
- if value.serialNum()==0:
+ if value.serialNum() == 0:
info = UnknownSerialNumInfo()
info.sourceAttr = self
info.targetObject = value
@@ -920,7 +926,7 @@
"""
if self.setting('UseBigIntObjRefColumns', False):
colName = self.sqlColumnName()
- return colName+'='+self.sqlValue(value)
+ return colName + '=' + self.sqlValue(value)
else:
classIdName, objIdName = self.sqlColumnNames()
if value is None:
@@ -939,7 +945,7 @@
value = objRefJoin(classId, objId)
# @@ 2004-20-02 ce ^ that's wasteful to join them just so they can be split later, but it works well with the legacy code
obj.setValueForAttr(self, value)
- return i+2
+ return i + 2
class ListAttr:
|