Author: phd
Date: 2005-01-15 14:32:28 +0000 (Sat, 15 Jan 2005)
New Revision: 550
Modified:
home/phd/SQLObject/inheritance/sqlobject/col.py
home/phd/SQLObject/inheritance/sqlobject/joins.py
home/phd/SQLObject/inheritance/sqlobject/main.py
home/phd/SQLObject/inheritance/tests/test_sqlobject.py
Log:
Merged patches from revisions 546:549 from the trunk:
546: Added FloatValidator and a test for it.
547: PickleCol now has a parameter pickleProtocol.
Default is 1 (binary) for compatibility with Python 2.2.
548: Fixed incompatibility with Python 2.2: used col.popKey() instead of kw.pop().
549: Fixed more incompatibility with Python 2.2: use string.find(),
emulate sum() and enumerate() if they aren't available.
550: Fixed even more incompatibility with Python 2.2:
Use type(orderBy) instead of isinstance(orderBy, basestring).
Modified: home/phd/SQLObject/inheritance/sqlobject/col.py
===================================================================
--- home/phd/SQLObject/inheritance/sqlobject/col.py 2005-01-15 14:25:16 UTC (rev 549)
+++ home/phd/SQLObject/inheritance/sqlobject/col.py 2005-01-15 14:32:28 UTC (rev 550)
@@ -528,13 +528,44 @@
class BoolCol(Col):
baseClass = SOBoolCol
+
+class FloatValidator(validators.Validator):
+
+ def fromPython(self, value, state):
+ if value is None:
+ return None
+ if not isinstance(value, (int, long, float, sqlbuilder.SQLExpression)):
+ raise validators.InvalidField("expected a float in the FloatCol '%s', got %s instead" % \
+ (self.name, type(value)), value, state)
+ return value
+
+ def toPython(self, value, state):
+ if value is None:
+ return None
+ if isinstance(value, (int, long, float, sqlbuilder.SQLExpression)):
+ return value
+ try:
+ return float(value)
+ except:
+ raise validators.InvalidField("expected a float in the FloatCol '%s', got %s instead" % \
+ (self.name, type(value)), value, state)
+
class SOFloatCol(SOCol):
+ validatorClass = FloatValidator # can be overriden in descendants
# 3-03 @@: support precision (e.g., DECIMAL)
+ def __init__(self, **kw):
+ SOCol.__init__(self, **kw)
+ self.validator = validators.All.join(self.createValidator(), self.validator)
+
def autoConstraints(self):
return [consts.isFloat]
+ def createValidator(self):
+ """Create a validator for the column. Can be overriden in descendants."""
+ return self.validatorClass(name=self.name)
+
def _sqlType(self):
return 'FLOAT'
@@ -544,6 +575,7 @@
class FloatCol(Col):
baseClass = SOFloatCol
+
class SOKeyCol(SOCol):
# 3-03 @@: this should have a simplified constructor
@@ -700,7 +732,7 @@
return value
if mxdatetime_available and isinstance(value, DateTimeType):
# convert mxDateTime instance to datetime
- if ("%H" in self.format) or ("%T" in self.format):
+ if (self.format.find("%H") >= 0) or (self.format.find("%T")) >= 0:
return datetime.datetime(value.year, value.month, value.day,
value.hour, value.minute, int(value.second))
else:
@@ -904,18 +936,25 @@
return None
if isinstance(value, str):
return pickle.loads(value)
- return value
+ raise validators.InvalidField("expected a pickle string in the PickleCol '%s', got %s instead" % \
+ (self.name, type(value)), value, state)
def fromPython(self, value, state):
if value is None:
return None
- pickled = pickle.dumps(value)
- return BinaryValidator.fromPython(self, pickled, state)
+ return pickle.dumps(value)
-
class SOPickleCol(SOBLOBCol):
validatorClass = PickleValidator # can be overriden in descendants
+ def __init__(self, **kw):
+ self.pickleProtocol = popKey(kw, 'pickleProtocol', 1)
+ SOBLOBCol.__init__(self, **kw)
+
+ def createValidator(self):
+ """Create a validator for the column. Can be overriden in descendants."""
+ return self.validatorClass(name=self.name, pickleProtocol=self.pickleProtocol)
+
class PickleCol(BLOBCol):
baseClass = SOPickleCol
Modified: home/phd/SQLObject/inheritance/sqlobject/joins.py
===================================================================
--- home/phd/SQLObject/inheritance/sqlobject/joins.py 2005-01-15 14:25:16 UTC (rev 549)
+++ home/phd/SQLObject/inheritance/sqlobject/joins.py 2005-01-15 14:32:28 UTC (rev 550)
@@ -2,6 +2,7 @@
NoDefault = sqlbuilder.NoDefault
import styles
import classregistry
+from col import popKey
__all__ = ['MultipleJoin', 'RelatedJoin']
@@ -18,7 +19,7 @@
kw['joinDef'] = self
self.kw = kw
if self.kw.has_key('joinMethodName'):
- self._joinMethodName = self.kw.pop('joinMethodName')
+ self._joinMethodName = popKey(self.kw, 'joinMethodName')
else:
self._joinMethodName = None
Modified: home/phd/SQLObject/inheritance/sqlobject/main.py
===================================================================
--- home/phd/SQLObject/inheritance/sqlobject/main.py 2005-01-15 14:25:16 UTC (rev 549)
+++ home/phd/SQLObject/inheritance/sqlobject/main.py 2005-01-15 14:32:28 UTC (rev 550)
@@ -1341,7 +1341,7 @@
tablesDict = sqlbuilder.tablesUsedDict(self.clause)
tablesDict[sourceClass._table] = 1
orderBy = ops.get('orderBy')
- if orderBy and not isinstance(orderBy, basestring):
+ if orderBy and type(orderBy) <> type(''):
tablesDict.update(sqlbuilder.tablesUsedDict(orderBy))
#DSM: if this class has a parent, we need to link it
#DSM: and be sure the parent is in the table list.
Modified: home/phd/SQLObject/inheritance/tests/test_sqlobject.py
===================================================================
--- home/phd/SQLObject/inheritance/tests/test_sqlobject.py 2005-01-15 14:25:16 UTC (rev 549)
+++ home/phd/SQLObject/inheritance/tests/test_sqlobject.py 2005-01-15 14:32:28 UTC (rev 550)
@@ -341,6 +341,14 @@
########################################
## Select results
########################################
+try:
+ enumerate
+except NameError:
+ def enumerate(iterable):
+ i = 0
+ for obj in iterable:
+ yield i, obj
+ i += 1
class IterTest(SQLObject):
name = StringCol(dbName='name_col')
@@ -369,11 +377,6 @@
self.failIf(count != len(self.names))
def test_02_generator(self):
- def enumerate(iterable):
- i = 0
- for obj in iterable:
- yield i, obj
- i += 1
all = IterTest.select()
count = 0
for i, test in enumerate(all):
@@ -579,6 +582,14 @@
self.assertEqual(func([ c.n1 for c in counters]), value)
def test1(self):
+ try:
+ sum
+ except NameError:
+ def sum(sequence):
+ s = 0
+ for item in sequence:
+ s = s + item
+ return s
self.accumulateEqual(sum,Counter2.select(orderBy='n1'),
sum(range(10)) * 10)
@@ -890,6 +901,7 @@
name = StringCol(validator=validators.PlainText(), default='x', dbName='name_col')
name2 = StringCol(validator=validators.ConfirmType(str), default='y')
name3 = IntCol(validator=validators.Wrapper(fromPython=int), default=100)
+ name4 = FloatCol(default=2.718)
class ValidationTest(SQLObjectTest):
@@ -905,6 +917,10 @@
t = SOValidation(name2='hey')
self.assertRaises(validators.InvalidField, setattr, t,
'name2', 1)
+ self.assertRaises(validators.InvalidField, setattr, t,
+ 'name3', '1')
+ self.assertRaises(validators.InvalidField, setattr, t,
+ 'name4', '1')
t.name2 = 'you'
def testWrapType(self):
|