sqlobject-cvs Mailing List for SQLObject (Page 95)
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
You can subscribe to this list here.
| 2003 |
Jan
|
Feb
|
Mar
(9) |
Apr
(74) |
May
(29) |
Jun
(16) |
Jul
(28) |
Aug
(10) |
Sep
(57) |
Oct
(9) |
Nov
(29) |
Dec
(12) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 |
Jan
(7) |
Feb
(14) |
Mar
(6) |
Apr
(3) |
May
(12) |
Jun
(34) |
Jul
(9) |
Aug
(29) |
Sep
(22) |
Oct
(2) |
Nov
(15) |
Dec
(52) |
| 2005 |
Jan
(47) |
Feb
(78) |
Mar
(14) |
Apr
(35) |
May
(33) |
Jun
(16) |
Jul
(26) |
Aug
(63) |
Sep
(40) |
Oct
(96) |
Nov
(96) |
Dec
(123) |
| 2006 |
Jan
(159) |
Feb
(144) |
Mar
(64) |
Apr
(31) |
May
(88) |
Jun
(48) |
Jul
(16) |
Aug
(64) |
Sep
(87) |
Oct
(92) |
Nov
(56) |
Dec
(76) |
| 2007 |
Jan
(94) |
Feb
(103) |
Mar
(126) |
Apr
(123) |
May
(85) |
Jun
(11) |
Jul
(130) |
Aug
(47) |
Sep
(65) |
Oct
(70) |
Nov
(12) |
Dec
(11) |
| 2008 |
Jan
(30) |
Feb
(55) |
Mar
(88) |
Apr
(20) |
May
(50) |
Jun
|
Jul
(38) |
Aug
(1) |
Sep
(9) |
Oct
(5) |
Nov
(6) |
Dec
(39) |
| 2009 |
Jan
(8) |
Feb
(16) |
Mar
(3) |
Apr
(33) |
May
(44) |
Jun
(1) |
Jul
(10) |
Aug
(33) |
Sep
(74) |
Oct
(22) |
Nov
|
Dec
(15) |
| 2010 |
Jan
(28) |
Feb
(22) |
Mar
(46) |
Apr
(29) |
May
(1) |
Jun
(1) |
Jul
(27) |
Aug
(8) |
Sep
(5) |
Oct
(33) |
Nov
(24) |
Dec
(41) |
| 2011 |
Jan
(4) |
Feb
(12) |
Mar
(35) |
Apr
(29) |
May
(19) |
Jun
(16) |
Jul
(32) |
Aug
(25) |
Sep
(5) |
Oct
(11) |
Nov
(21) |
Dec
(12) |
| 2012 |
Jan
(3) |
Feb
(4) |
Mar
(20) |
Apr
(4) |
May
(25) |
Jun
(13) |
Jul
|
Aug
|
Sep
(2) |
Oct
(25) |
Nov
(9) |
Dec
(1) |
| 2013 |
Jan
(6) |
Feb
(8) |
Mar
|
Apr
(10) |
May
(31) |
Jun
(7) |
Jul
(18) |
Aug
(33) |
Sep
(4) |
Oct
(16) |
Nov
|
Dec
(27) |
| 2014 |
Jan
(2) |
Feb
|
Mar
|
Apr
(11) |
May
(39) |
Jun
(8) |
Jul
(11) |
Aug
(4) |
Sep
|
Oct
(27) |
Nov
|
Dec
(71) |
| 2015 |
Jan
(17) |
Feb
(47) |
Mar
(33) |
Apr
|
May
|
Jun
(9) |
Jul
(7) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(8) |
| 2016 |
Jan
(4) |
Feb
(4) |
Mar
|
Apr
|
May
(12) |
Jun
(7) |
Jul
(9) |
Aug
(31) |
Sep
(8) |
Oct
(3) |
Nov
(15) |
Dec
(1) |
| 2017 |
Jan
(13) |
Feb
(7) |
Mar
(14) |
Apr
(8) |
May
(10) |
Jun
(4) |
Jul
(2) |
Aug
(1) |
Sep
|
Oct
(8) |
Nov
(4) |
Dec
(5) |
| 2018 |
Jan
(2) |
Feb
(8) |
Mar
|
Apr
(4) |
May
|
Jun
(6) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
| 2019 |
Jan
(1) |
Feb
(16) |
Mar
(1) |
Apr
(3) |
May
(5) |
Jun
(1) |
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
(1) |
Dec
(3) |
| 2020 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(1) |
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
(2) |
Nov
|
Dec
(2) |
| 2021 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(1) |
Dec
|
| 2022 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(6) |
Oct
(1) |
Nov
(1) |
Dec
(4) |
| 2023 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(3) |
Sep
(2) |
Oct
(2) |
Nov
(4) |
Dec
|
| 2024 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
(9) |
| 2025 |
Jan
|
Feb
(4) |
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
(2) |
Dec
(2) |
|
From: <sub...@co...> - 2007-04-17 16:31:42
|
Author: phd Date: 2007-04-17 10:31:40 -0600 (Tue, 17 Apr 2007) New Revision: 2554 Modified: SQLObject/docs/News.txt Log: Fixed a longstanding bug with .select() ignoring 'limit' parameter. Modified: SQLObject/docs/News.txt =================================================================== --- SQLObject/docs/News.txt 2007-04-17 16:30:49 UTC (rev 2553) +++ SQLObject/docs/News.txt 2007-04-17 16:31:40 UTC (rev 2554) @@ -204,6 +204,16 @@ * Fixed aggregators and accumulators with inheritance. +SQLObject 0.7.6 +=============== + +Bug Fixes +--------- + +* Fixed a minor comparison problem in test_decimal.py. + +* Fixed a longstanding bug with .select() ignoring 'limit' parameter. + SQLObject 0.7.5 =============== |
|
From: <sub...@co...> - 2007-04-17 16:30:51
|
Author: phd
Date: 2007-04-17 10:30:49 -0600 (Tue, 17 Apr 2007)
New Revision: 2553
Modified:
SQLObject/trunk/sqlobject/sresults.py
SQLObject/trunk/sqlobject/tests/test_select.py
SQLObject/trunk/sqlobject/versioning/__init__.py
Log:
Fixed a longstanding bug with .select() ignoring 'limit' parameter.
Modified: SQLObject/trunk/sqlobject/sresults.py
===================================================================
--- SQLObject/trunk/sqlobject/sresults.py 2007-04-17 16:30:30 UTC (rev 2552)
+++ SQLObject/trunk/sqlobject/sresults.py 2007-04-17 16:30:49 UTC (rev 2553)
@@ -21,16 +21,21 @@
self.clauseTables = clauseTables
self.tables = tablesDict.keys()
self.ops = ops
- if self.ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
- self.ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
- orderBy = self.ops['orderBy']
+ if ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
+ ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
+ orderBy = ops['orderBy']
if isinstance(orderBy, list) or isinstance(orderBy, tuple):
orderBy = map(self._mungeOrderBy, orderBy)
else:
orderBy = self._mungeOrderBy(orderBy)
- self.ops['dbOrderBy'] = orderBy
+ ops['dbOrderBy'] = orderBy
if ops.has_key('connection') and ops['connection'] is None:
del ops['connection']
+ if ops.get('limit', None):
+ assert not ops.get('start', None) and not ops.get('end', None), \
+ "'limit' cannot be used with 'start' or 'end'"
+ ops["start"] = 0
+ ops["end"] = ops["limit"]
def __repr__(self):
return "<%s at %x>" % (self.__class__.__name__, id(self))
@@ -145,13 +150,13 @@
if self.ops.get('end', None) is not None \
and self.ops['end'] < end:
end = self.ops['end']
- return self.clone(start=start, end=end)
+ return self.clone(limit=None, start=start, end=end)
else:
if value < 0:
return list(iter(self))[value]
else:
start = self.ops.get('start', 0) + value
- return list(self.clone(start=start, end=start+1))[0]
+ return list(self.clone(limit=None, start=start, end=start+1))[0]
def __iter__(self):
# @@: This could be optimized, using a simpler algorithm
@@ -178,6 +183,7 @@
def count(self):
""" Counting elements of current select results """
+ assert not self.ops.get('limit'), "'limit' is meaningless with 'distinct'"
assert not (self.ops.get('distinct') and (self.ops.get('start')
or self.ops.get('end'))), \
"distinct-counting of sliced objects is not supported"
Modified: SQLObject/trunk/sqlobject/tests/test_select.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_select.py 2007-04-17 16:30:30 UTC (rev 2552)
+++ SQLObject/trunk/sqlobject/tests/test_select.py 2007-04-17 16:30:49 UTC (rev 2553)
@@ -1,9 +1,8 @@
from __future__ import generators # for enumerate
from sqlobject import *
from sqlobject.main import SQLObjectIntegrityError
-from sqlobject.tests.dbtest import *
-from sqlobject.tests.dbtest import setSQLiteConnectionFactory
-from py.test import raises
+from dbtest import *
+from dbtest import setSQLiteConnectionFactory
try:
enumerate
@@ -86,6 +85,12 @@
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne()')
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne(None)')
+def test_05_select_limit():
+ setupIter()
+ assert len(list(IterTest.select(limit=2))) == 2
+ raises(AssertionError, IterTest.select(limit=2).distinct)
+ raises(AssertionError, IterTest.select(limit=2).clone, start=1)
+
def test_selectBy():
setupClass(IterTest)
a = IterTest(name='a')
Modified: SQLObject/trunk/sqlobject/versioning/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/__init__.py 2007-04-17 16:30:30 UTC (rev 2552)
+++ SQLObject/trunk/sqlobject/versioning/__init__.py 2007-04-17 16:30:49 UTC (rev 2553)
@@ -12,7 +12,7 @@
self.masterClass.get(self.masterID).set(**values)
def nextVersion(self):
- version = self.select(AND(self.q.masterID == self.masterID, self.q.id > self.id), limit=1, orderBy=self.q.id)
+ version = self.select(AND(self.q.masterID == self.masterID, self.q.id > self.id), orderBy=self.q.id)
if version.count():
return version[0]
else:
|
|
From: <sub...@co...> - 2007-04-17 16:30:33
|
Author: phd
Date: 2007-04-17 10:30:30 -0600 (Tue, 17 Apr 2007)
New Revision: 2552
Modified:
SQLObject/branches/0.9/docs/News.txt
SQLObject/branches/0.9/sqlobject/sresults.py
SQLObject/branches/0.9/sqlobject/tests/test_select.py
SQLObject/branches/0.9/sqlobject/versioning/__init__.py
Log:
Fixed a longstanding bug with .select() ignoring 'limit' parameter.
Modified: SQLObject/branches/0.9/docs/News.txt
===================================================================
--- SQLObject/branches/0.9/docs/News.txt 2007-04-17 16:28:32 UTC (rev 2551)
+++ SQLObject/branches/0.9/docs/News.txt 2007-04-17 16:30:30 UTC (rev 2552)
@@ -201,6 +201,16 @@
* Fixed aggregators and accumulators with inheritance.
+SQLObject 0.7.6
+===============
+
+Bug Fixes
+---------
+
+* Fixed a minor comparison problem in test_decimal.py.
+
+* Fixed a longstanding bug with .select() ignoring 'limit' parameter.
+
SQLObject 0.7.5
===============
Modified: SQLObject/branches/0.9/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/0.9/sqlobject/sresults.py 2007-04-17 16:28:32 UTC (rev 2551)
+++ SQLObject/branches/0.9/sqlobject/sresults.py 2007-04-17 16:30:30 UTC (rev 2552)
@@ -21,16 +21,21 @@
self.clauseTables = clauseTables
self.tables = tablesDict.keys()
self.ops = ops
- if self.ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
- self.ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
- orderBy = self.ops['orderBy']
+ if ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
+ ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
+ orderBy = ops['orderBy']
if isinstance(orderBy, list) or isinstance(orderBy, tuple):
orderBy = map(self._mungeOrderBy, orderBy)
else:
orderBy = self._mungeOrderBy(orderBy)
- self.ops['dbOrderBy'] = orderBy
+ ops['dbOrderBy'] = orderBy
if ops.has_key('connection') and ops['connection'] is None:
del ops['connection']
+ if ops.get('limit', None):
+ assert not ops.get('start', None) and not ops.get('end', None), \
+ "'limit' cannot be used with 'start' or 'end'"
+ ops["start"] = 0
+ ops["end"] = ops["limit"]
def __repr__(self):
return "<%s at %x>" % (self.__class__.__name__, id(self))
@@ -145,13 +150,13 @@
if self.ops.get('end', None) is not None \
and self.ops['end'] < end:
end = self.ops['end']
- return self.clone(start=start, end=end)
+ return self.clone(limit=None, start=start, end=end)
else:
if value < 0:
return list(iter(self))[value]
else:
start = self.ops.get('start', 0) + value
- return list(self.clone(start=start, end=start+1))[0]
+ return list(self.clone(limit=None, start=start, end=start+1))[0]
def __iter__(self):
# @@: This could be optimized, using a simpler algorithm
@@ -178,6 +183,7 @@
def count(self):
""" Counting elements of current select results """
+ assert not self.ops.get('limit'), "'limit' is meaningless with 'distinct'"
assert not (self.ops.get('distinct') and (self.ops.get('start')
or self.ops.get('end'))), \
"distinct-counting of sliced objects is not supported"
Modified: SQLObject/branches/0.9/sqlobject/tests/test_select.py
===================================================================
--- SQLObject/branches/0.9/sqlobject/tests/test_select.py 2007-04-17 16:28:32 UTC (rev 2551)
+++ SQLObject/branches/0.9/sqlobject/tests/test_select.py 2007-04-17 16:30:30 UTC (rev 2552)
@@ -1,9 +1,8 @@
from __future__ import generators # for enumerate
from sqlobject import *
from sqlobject.main import SQLObjectIntegrityError
-from sqlobject.tests.dbtest import *
-from sqlobject.tests.dbtest import setSQLiteConnectionFactory
-from py.test import raises
+from dbtest import *
+from dbtest import setSQLiteConnectionFactory
try:
enumerate
@@ -86,6 +85,12 @@
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne()')
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne(None)')
+def test_05_select_limit():
+ setupIter()
+ assert len(list(IterTest.select(limit=2))) == 2
+ raises(AssertionError, IterTest.select(limit=2).distinct)
+ raises(AssertionError, IterTest.select(limit=2).clone, start=1)
+
def test_selectBy():
setupClass(IterTest)
a = IterTest(name='a')
Modified: SQLObject/branches/0.9/sqlobject/versioning/__init__.py
===================================================================
--- SQLObject/branches/0.9/sqlobject/versioning/__init__.py 2007-04-17 16:28:32 UTC (rev 2551)
+++ SQLObject/branches/0.9/sqlobject/versioning/__init__.py 2007-04-17 16:30:30 UTC (rev 2552)
@@ -12,7 +12,7 @@
self.masterClass.get(self.masterID).set(**values)
def nextVersion(self):
- version = self.select(AND(self.q.masterID == self.masterID, self.q.id > self.id), limit=1, orderBy=self.q.id)
+ version = self.select(AND(self.q.masterID == self.masterID, self.q.id > self.id), orderBy=self.q.id)
if version.count():
return version[0]
else:
|
|
From: <sub...@co...> - 2007-04-17 16:28:36
|
Author: phd
Date: 2007-04-17 10:28:32 -0600 (Tue, 17 Apr 2007)
New Revision: 2551
Modified:
SQLObject/branches/0.7/docs/News.txt
SQLObject/branches/0.7/sqlobject/sresults.py
SQLObject/branches/0.7/sqlobject/tests/test_select.py
Log:
Fixed a longstanding bug with .select() ignoring 'limit' parameter.
Modified: SQLObject/branches/0.7/docs/News.txt
===================================================================
--- SQLObject/branches/0.7/docs/News.txt 2007-04-17 16:28:11 UTC (rev 2550)
+++ SQLObject/branches/0.7/docs/News.txt 2007-04-17 16:28:32 UTC (rev 2551)
@@ -15,6 +15,8 @@
* Fixed a minor comparison problem in test_decimal.py.
+* Fixed a longstanding bug with .select() ignoring 'limit' parameter.
+
SQLObject 0.7.5
===============
Modified: SQLObject/branches/0.7/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/0.7/sqlobject/sresults.py 2007-04-17 16:28:11 UTC (rev 2550)
+++ SQLObject/branches/0.7/sqlobject/sresults.py 2007-04-17 16:28:32 UTC (rev 2551)
@@ -20,16 +20,21 @@
self.clauseTables = clauseTables
self.tables = tablesDict.keys()
self.ops = ops
- if self.ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
- self.ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
- orderBy = self.ops['orderBy']
+ if ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
+ ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
+ orderBy = ops['orderBy']
if isinstance(orderBy, list) or isinstance(orderBy, tuple):
orderBy = map(self._mungeOrderBy, orderBy)
else:
orderBy = self._mungeOrderBy(orderBy)
- self.ops['dbOrderBy'] = orderBy
+ ops['dbOrderBy'] = orderBy
if ops.has_key('connection') and ops['connection'] is None:
del ops['connection']
+ if ops.get('limit', None):
+ assert not ops.get('start', None) and not ops.get('end', None), \
+ "'limit' cannot be used with 'start' or 'end'"
+ ops["start"] = 0
+ ops["end"] = ops["limit"]
def __repr__(self):
return "<%s at %x>" % (self.__class__.__name__, id(self))
@@ -140,13 +145,13 @@
if self.ops.get('end', None) is not None \
and self.ops['end'] < end:
end = self.ops['end']
- return self.clone(start=start, end=end)
+ return self.clone(limit=None, start=start, end=end)
else:
if value < 0:
return list(iter(self))[value]
else:
start = self.ops.get('start', 0) + value
- return list(self.clone(start=start, end=start+1))[0]
+ return list(self.clone(limit=None, start=start, end=start+1))[0]
def __iter__(self):
# @@: This could be optimized, using a simpler algorithm
@@ -173,6 +178,7 @@
def count(self):
""" Counting elements of current select results """
+ assert not self.ops.get('limit'), "'limit' is meaningless with 'distinct'"
assert not (self.ops.get('distinct') and (self.ops.get('start')
or self.ops.get('end'))), \
"distinct-counting of sliced objects is not supported"
Modified: SQLObject/branches/0.7/sqlobject/tests/test_select.py
===================================================================
--- SQLObject/branches/0.7/sqlobject/tests/test_select.py 2007-04-17 16:28:11 UTC (rev 2550)
+++ SQLObject/branches/0.7/sqlobject/tests/test_select.py 2007-04-17 16:28:32 UTC (rev 2551)
@@ -1,6 +1,6 @@
from __future__ import generators # for enumerate
from sqlobject import *
-from sqlobject.tests.dbtest import *
+from dbtest import *
try:
enumerate
@@ -71,6 +71,12 @@
pass
assert count == len(names)
+def test_05_select_limit():
+ setupIter()
+ assert len(list(IterTest.select(limit=2))) == 2
+ raises(AssertionError, IterTest.select(limit=2).distinct)
+ raises(AssertionError, IterTest.select(limit=2).clone, start=1)
+
def test_selectBy():
setupClass(IterTest)
a = IterTest(name='a')
|
|
From: <sub...@co...> - 2007-04-17 16:28:13
|
Author: phd
Date: 2007-04-17 10:28:11 -0600 (Tue, 17 Apr 2007)
New Revision: 2550
Modified:
SQLObject/branches/0.8/docs/News.txt
SQLObject/branches/0.8/sqlobject/sresults.py
SQLObject/branches/0.8/sqlobject/tests/test_select.py
Log:
Fixed a longstanding bug with .select() ignoring 'limit' parameter.
Modified: SQLObject/branches/0.8/docs/News.txt
===================================================================
--- SQLObject/branches/0.8/docs/News.txt 2007-04-17 16:24:36 UTC (rev 2549)
+++ SQLObject/branches/0.8/docs/News.txt 2007-04-17 16:28:11 UTC (rev 2550)
@@ -144,6 +144,16 @@
* Fixed aggregators and accumulators with inheritance.
+SQLObject 0.7.6
+===============
+
+Bug Fixes
+---------
+
+* Fixed a minor comparison problem in test_decimal.py.
+
+* Fixed a longstanding bug with .select() ignoring 'limit' parameter.
+
SQLObject 0.7.5
===============
Modified: SQLObject/branches/0.8/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/0.8/sqlobject/sresults.py 2007-04-17 16:24:36 UTC (rev 2549)
+++ SQLObject/branches/0.8/sqlobject/sresults.py 2007-04-17 16:28:11 UTC (rev 2550)
@@ -21,16 +21,21 @@
self.clauseTables = clauseTables
self.tables = tablesDict.keys()
self.ops = ops
- if self.ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
- self.ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
- orderBy = self.ops['orderBy']
+ if ops.get('orderBy', sqlbuilder.NoDefault) is sqlbuilder.NoDefault:
+ ops['orderBy'] = sourceClass.sqlmeta.defaultOrder
+ orderBy = ops['orderBy']
if isinstance(orderBy, list) or isinstance(orderBy, tuple):
orderBy = map(self._mungeOrderBy, orderBy)
else:
orderBy = self._mungeOrderBy(orderBy)
- self.ops['dbOrderBy'] = orderBy
+ ops['dbOrderBy'] = orderBy
if ops.has_key('connection') and ops['connection'] is None:
del ops['connection']
+ if ops.get('limit', None):
+ assert not ops.get('start', None) and not ops.get('end', None), \
+ "'limit' cannot be used with 'start' or 'end'"
+ ops["start"] = 0
+ ops["end"] = ops["limit"]
def __repr__(self):
return "<%s at %x>" % (self.__class__.__name__, id(self))
@@ -145,13 +150,13 @@
if self.ops.get('end', None) is not None \
and self.ops['end'] < end:
end = self.ops['end']
- return self.clone(start=start, end=end)
+ return self.clone(limit=None, start=start, end=end)
else:
if value < 0:
return list(iter(self))[value]
else:
start = self.ops.get('start', 0) + value
- return list(self.clone(start=start, end=start+1))[0]
+ return list(self.clone(limit=None, start=start, end=start+1))[0]
def __iter__(self):
# @@: This could be optimized, using a simpler algorithm
@@ -178,6 +183,7 @@
def count(self):
""" Counting elements of current select results """
+ assert not self.ops.get('limit'), "'limit' is meaningless with 'distinct'"
assert not (self.ops.get('distinct') and (self.ops.get('start')
or self.ops.get('end'))), \
"distinct-counting of sliced objects is not supported"
Modified: SQLObject/branches/0.8/sqlobject/tests/test_select.py
===================================================================
--- SQLObject/branches/0.8/sqlobject/tests/test_select.py 2007-04-17 16:24:36 UTC (rev 2549)
+++ SQLObject/branches/0.8/sqlobject/tests/test_select.py 2007-04-17 16:28:11 UTC (rev 2550)
@@ -1,9 +1,8 @@
from __future__ import generators # for enumerate
from sqlobject import *
from sqlobject.main import SQLObjectIntegrityError
-from sqlobject.tests.dbtest import *
-from sqlobject.tests.dbtest import setSQLiteConnectionFactory
-from py.test import raises
+from dbtest import *
+from dbtest import setSQLiteConnectionFactory
try:
enumerate
@@ -86,6 +85,12 @@
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne()')
raises(SQLObjectIntegrityError, 'IterTest.selectBy(name="b").getOne(None)')
+def test_05_select_limit():
+ setupIter()
+ assert len(list(IterTest.select(limit=2))) == 2
+ raises(AssertionError, IterTest.select(limit=2).distinct)
+ raises(AssertionError, IterTest.select(limit=2).clone, start=1)
+
def test_selectBy():
setupClass(IterTest)
a = IterTest(name='a')
|
|
From: <sub...@co...> - 2007-04-17 16:24:41
|
Author: phd
Date: 2007-04-17 10:24:36 -0600 (Tue, 17 Apr 2007)
New Revision: 2549
Modified:
SQLObject/branches/0.7/docs/News.txt
SQLObject/branches/0.7/sqlobject/tests/test_decimal.py
Log:
Fixed a minor comparison problem in test_decimal.py.
Modified: SQLObject/branches/0.7/docs/News.txt
===================================================================
--- SQLObject/branches/0.7/docs/News.txt 2007-04-17 14:30:46 UTC (rev 2548)
+++ SQLObject/branches/0.7/docs/News.txt 2007-04-17 16:24:36 UTC (rev 2549)
@@ -7,6 +7,14 @@
.. _start:
+SQLObject 0.7.6
+===============
+
+Bug Fixes
+---------
+
+* Fixed a minor comparison problem in test_decimal.py.
+
SQLObject 0.7.5
===============
Modified: SQLObject/branches/0.7/sqlobject/tests/test_decimal.py
===================================================================
--- SQLObject/branches/0.7/sqlobject/tests/test_decimal.py 2007-04-17 14:30:46 UTC (rev 2548)
+++ SQLObject/branches/0.7/sqlobject/tests/test_decimal.py 2007-04-17 16:24:36 UTC (rev 2549)
@@ -18,7 +18,7 @@
return
setupClass(DecimalTable)
d = DecimalTable(col1=21.12)
- assert d.col1 == 21.12
+ assert float(d.col1) == 21.12
if Decimal and supports('decimalColumn'):
def test_2Decimal():
|
|
From: <sub...@co...> - 2007-04-17 14:30:50
|
Author: luke
Date: 2007-04-17 08:30:46 -0600 (Tue, 17 Apr 2007)
New Revision: 2548
Modified:
SQLObject/branches/sqlbuilder-views+1/sqlobject/sresults.py
Log:
bug with distinct and orderby in throughTo
Modified: SQLObject/branches/sqlbuilder-views+1/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/sqlbuilder-views+1/sqlobject/sresults.py 2007-04-17 14:21:50 UTC (rev 2547)
+++ SQLObject/branches/sqlbuilder-views+1/sqlobject/sresults.py 2007-04-17 14:30:46 UTC (rev 2548)
@@ -310,33 +310,32 @@
raise AttributeError("throughTo argument (got %s) should be name of foreignKey or SQL*Join in %s" % (attr, self.sourceClass))
return otherClass.select(clause,
- distinct=True,
orderBy=orderBy,
connection=self._getConnection())
def _throughToFK(self, col):
otherClass = getattr(self.sourceClass, "_SO_class_"+col.foreignKey)
colName = col.name
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(self.sourceClass.q, colName), colName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(self.sourceClass.q, colName), colName)]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, col.name))
return otherClass, otherClass.q.id==getattr(query.q, colName)
def _throughToMultipleJoin(self, join):
otherClass = join.otherClass
colName = join.soClass.sqlmeta.style.dbColumnToPythonAttr(join.joinColumn)
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, self.sourceClass.q.id.fieldName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
joinColumn = getattr(otherClass.q, colName)
- return otherClass, joinColumn==getattr(query.q, self.sourceClass.q.id.fieldName)
+ return otherClass, joinColumn==query.q.id
def _throughToRelatedJoin(self, join):
otherClass = join.otherClass
intTable = sqlbuilder.Table(join.intermediateTable)
colName = join.joinColumn
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(intTable, colName), colName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
clause = sqlbuilder.AND(otherClass.q.id == getattr(intTable, join.otherColumn),
- getattr(intTable, colName) == getattr(query.q, colName))
+ getattr(intTable, colName) == query.q.id)
return otherClass, clause
__all__ = ['SelectResults']
|
|
From: <sub...@co...> - 2007-04-17 14:21:53
|
Author: luke
Date: 2007-04-17 08:21:50 -0600 (Tue, 17 Apr 2007)
New Revision: 2547
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
Log:
checkpoint
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py 2007-04-17 14:21:13 UTC (rev 2546)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py 2007-04-17 14:21:50 UTC (rev 2547)
@@ -5,7 +5,16 @@
class MaterializedSQLObject(SQLObject):
class sqlmeta(_sqlmeta):
- pass
+ cachedIn = None
+
+ def setClass(cls, soClass):
+ super(cls, sqlmeta).setClass(soClass)
+
+ if cls.cachedIn is None:
+ cls.cachedIn = cls.table + '_cache'
+ cls.cacheClass = type(cls.soClass.__name__+'Cache', (SQLObject,))
+
+ setClass = classmethod(setClass)
def _addColumn(cls, connection, column_name, column_definition, changeSchema, post_funcs):
def f(cls, col):
@@ -47,4 +56,14 @@
def decorate(func):
return MaterializedAttr(func, colType, name=name)
return decorate
-
\ No newline at end of file
+
+
+
+def _processCacheClass(new_class_name, bases, new_attrs, post_funcs, early_funcs):
+ def f(cls):
+ for name, value in new_attrs.items():
+ if isinstance(value, MaterializedAttr):
+ cls.sqlmeta.
+ post_funcs.append(f)
+
+listen(_processCacheClass, MaterializedSQLObject, ClassCreateSignal)
\ No newline at end of file
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py 2007-04-17 14:21:13 UTC (rev 2546)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py 2007-04-17 14:21:50 UTC (rev 2547)
@@ -23,6 +23,9 @@
return self.twos.sum('length')
class MaterializedTwo(MaterializedSQLObject):
+ class sqlmeta:
+ cachedIn = 'cache_materialized_two'
+
detail = StringCol()
length = IntCol()
one = ForeignKey('MaterializedOne')
@@ -72,4 +75,12 @@
assert dep.instancesToProcess(ones[0], ['name']) == {
('MaterializedTwo', '_get_name'): [twos[0], twos[1]],
('MaterializedTwo', '_get_name2'): [twos[0], twos[1]],
- }
\ No newline at end of file
+ }
+
+def testCacheObject():
+ assert MaterializedOne.sqlmeta.cacheClass.sqlmeta.table == 'materialized_one_cache'
+ # Overridden by MaterializedTow.sqlmeta.cachedIn
+ assert MaterializedTwo.sqlmeta.cacheClass.sqlmeta.table == 'cache_materialized_two'
+
+def testCacheObject():
+ assert ones[0]._SO_cacheObject is None
\ No newline at end of file
|
|
From: <sub...@co...> - 2007-04-17 14:21:20
|
Author: luke
Date: 2007-04-17 08:21:13 -0600 (Tue, 17 Apr 2007)
New Revision: 2546
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py
Log:
bug with distinct and orderby in throughTo
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py 2007-04-16 13:05:58 UTC (rev 2545)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py 2007-04-17 14:21:13 UTC (rev 2546)
@@ -310,21 +310,20 @@
raise AttributeError("throughTo argument (got %s) should be name of foreignKey or SQL*Join in %s" % (attr, self.sourceClass))
return otherClass.select(clause,
- distinct=True,
orderBy=orderBy,
connection=self._getConnection())
def _throughToFK(self, col):
otherClass = getattr(self.sourceClass, "_SO_class_"+col.foreignKey)
colName = col.name
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(self.sourceClass.q, colName), colName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(self.sourceClass.q, colName), colName)]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, col.name))
return otherClass, otherClass.q.id==getattr(query.q, colName)
def _throughToMultipleJoin(self, join):
otherClass = join.otherClass
colName = join.soClass.sqlmeta.style.dbColumnToPythonAttr(join.joinColumn)
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
joinColumn = getattr(otherClass.q, colName)
return otherClass, joinColumn==query.q.id
@@ -333,7 +332,7 @@
otherClass = join.otherClass
intTable = sqlbuilder.Table(join.intermediateTable)
colName = join.joinColumn
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')])#sqlbuilder.ColumnAS(getattr(intTable, colName), colName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')]).orderBy(None).distinct()
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
clause = sqlbuilder.AND(otherClass.q.id == getattr(intTable, join.otherColumn),
getattr(intTable, colName) == query.q.id)
|
|
From: SourceForge.net <no...@so...> - 2007-04-17 14:17:55
|
Bugs item #1702246, was opened at 2007-04-17 14:17 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1702246&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: David Turner (novalis_dt) Assigned to: Nobody/Anonymous (nobody) Summary: Version tables not dropped when parent tables dropped Initial Comment: When a table is deleted, its version table should also be deleted. I'll probably fix this, but not right now. I just wanted to submit a bug so that people would know it was a known issue. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1702246&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-17 03:42:54
|
Patches item #1701949, was opened at 2007-04-17 00:42 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1701949&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Leandro Lucarella (llucax) Assigned to: Nobody/Anonymous (nobody) Summary: Add documentation about 'validator' Col constructor option Initial Comment: Please, review the patch since english is not my native language and it's very likely that I have spell/grammar errors ;) This patch was motivated by this thread: http://permalink.gmane.org/gmane.comp.python.sqlobject/8031, specially to document what is shown on this e-mail: http://permalink.gmane.org/gmane.comp.python.sqlobject/8042. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1701949&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-16 18:28:57
|
Bugs item #1699518, was opened at 2007-04-13 00:34 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: SQLObject release (specify) Status: Open >Resolution: Later Priority: 5 Private: No Submitted By: kumar mcmillan (kumar303) >Assigned to: Oleg Broytmann (phd) Summary: select(limit=n) - limit keyword is not recognized Initial Comment: 0.8.1 release here is a failing test case :( from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = 1 Foo.createTable(connection=c) f = Foo(connection=c) f = Foo(connection=c) assert Foo.select(connection=c).count() == 2 assert Foo.select(connection=c, limit=1).count() == 1 if __name__ == '__main__': test() ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2007-04-16 22:28 Message: Logged In: YES user_id=4799 Originator: NO Yes, that's a long-standing bug in SelectResults. Meanwhile you can use .select()[:1] or .select().limit(1). ---------------------------------------------------------------------- Comment By: kumar mcmillan (kumar303) Date: 2007-04-16 21:07 Message: Logged In: YES user_id=540473 Originator: YES sorry, bad example. The bug is not with count(), it is with sql reproduction of the entire select. It is not including the limit=limit part of the query. Here is a better test, still failing. from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = StringCol() Foo.createTable(connection=c) f = Foo(bar='bar', connection=c) f = Foo(bar='foo', connection=c) rs = Foo.select(connection=c) assert len(list(rs)) == 2 rs = Foo.select(connection=c, limit=1) print rs assert len(list(rs)) == 1 if __name__ == '__main__': test() print "OK" File Added: test_sresults.py ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2007-04-16 17:16 Message: Logged In: YES user_id=4799 Originator: NO Using both COUNT() and LIMIT is meaningless. LIMIT limits the number of rows returned by SELECT, but SELECT COUNT() returns exactly 1 (one) row, so what are you limiting? If you want to limit what SELECT * returns and later count it - use few separate queries, or a complex query with subqueries. ---------------------------------------------------------------------- Comment By: kumar mcmillan (kumar303) Date: 2007-04-13 00:38 Message: Logged In: YES user_id=540473 Originator: YES tested in SQLObject-0.10dev_r2521-py2.4.egg ... still broken ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-16 17:07:09
|
Bugs item #1699518, was opened at 2007-04-12 20:34 Message generated for change (Comment added) made by kumar303 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: SQLObject release (specify) >Status: Open Resolution: Invalid Priority: 5 Private: No Submitted By: kumar mcmillan (kumar303) Assigned to: Nobody/Anonymous (nobody) Summary: select(limit=n) - limit keyword is not recognized Initial Comment: 0.8.1 release here is a failing test case :( from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = 1 Foo.createTable(connection=c) f = Foo(connection=c) f = Foo(connection=c) assert Foo.select(connection=c).count() == 2 assert Foo.select(connection=c, limit=1).count() == 1 if __name__ == '__main__': test() ---------------------------------------------------------------------- >Comment By: kumar mcmillan (kumar303) Date: 2007-04-16 17:07 Message: Logged In: YES user_id=540473 Originator: YES sorry, bad example. The bug is not with count(), it is with sql reproduction of the entire select. It is not including the limit=limit part of the query. Here is a better test, still failing. from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = StringCol() Foo.createTable(connection=c) f = Foo(bar='bar', connection=c) f = Foo(bar='foo', connection=c) rs = Foo.select(connection=c) assert len(list(rs)) == 2 rs = Foo.select(connection=c, limit=1) print rs assert len(list(rs)) == 1 if __name__ == '__main__': test() print "OK" File Added: test_sresults.py ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2007-04-16 13:16 Message: Logged In: YES user_id=4799 Originator: NO Using both COUNT() and LIMIT is meaningless. LIMIT limits the number of rows returned by SELECT, but SELECT COUNT() returns exactly 1 (one) row, so what are you limiting? If you want to limit what SELECT * returns and later count it - use few separate queries, or a complex query with subqueries. ---------------------------------------------------------------------- Comment By: kumar mcmillan (kumar303) Date: 2007-04-12 20:38 Message: Logged In: YES user_id=540473 Originator: YES tested in SQLObject-0.10dev_r2521-py2.4.egg ... still broken ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-16 13:16:54
|
Bugs item #1699518, was opened at 2007-04-13 00:34 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: SQLObject release (specify) >Status: Closed >Resolution: Invalid Priority: 5 Private: No Submitted By: kumar mcmillan (kumar303) Assigned to: Nobody/Anonymous (nobody) Summary: select(limit=n) - limit keyword is not recognized Initial Comment: 0.8.1 release here is a failing test case :( from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = 1 Foo.createTable(connection=c) f = Foo(connection=c) f = Foo(connection=c) assert Foo.select(connection=c).count() == 2 assert Foo.select(connection=c, limit=1).count() == 1 if __name__ == '__main__': test() ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2007-04-16 17:16 Message: Logged In: YES user_id=4799 Originator: NO Using both COUNT() and LIMIT is meaningless. LIMIT limits the number of rows returned by SELECT, but SELECT COUNT() returns exactly 1 (one) row, so what are you limiting? If you want to limit what SELECT * returns and later count it - use few separate queries, or a complex query with subqueries. ---------------------------------------------------------------------- Comment By: kumar mcmillan (kumar303) Date: 2007-04-13 00:38 Message: Logged In: YES user_id=540473 Originator: YES tested in SQLObject-0.10dev_r2521-py2.4.egg ... still broken ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-16 13:06:10
|
Bugs item #1699321, was opened at 2007-04-12 18:49 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699321&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: cjwhrw12 (cjwhrw12) Assigned to: Oleg Broytmann (phd) Summary: Can't get SQLObjectGuide Initial Comment: Link: https://wiki.launchpad.canonical.com/SQLObjectGuide Name in posting: http://sqlobject.org ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2007-04-16 17:06 Message: Logged In: YES user_id=4799 Originator: NO Removed from the docs in the Subversion. The site will be updated on the next release cycle. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2007-04-12 19:14 Message: Logged In: YES user_id=4799 Originator: NO It seems it's no longer available from the Launchpad. If you know any mirror or copy - please suggest. Else it will be removed from the list of links. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699321&group_id=74338 |
|
From: <sub...@co...> - 2007-04-16 13:06:07
|
Author: phd Date: 2007-04-16 07:05:58 -0600 (Mon, 16 Apr 2007) New Revision: 2545 Modified: SQLObject/docs/links.txt Log: Removed stale link to "Canonical's SQLObject guide". Modified: SQLObject/docs/links.txt =================================================================== --- SQLObject/docs/links.txt 2007-04-16 13:04:45 UTC (rev 2544) +++ SQLObject/docs/links.txt 2007-04-16 13:05:58 UTC (rev 2545) @@ -8,9 +8,6 @@ Articles and Documentation -------------------------- -* `Canonical's SQLObject guide - <https://wiki.launchpad.canonical.com/SQLObjectGuide>`_. - * `SQLObject and CherryPy <http://www.cherrypy.org/wiki/SQLObjectThreadPerConnection>`_. |
|
From: <sub...@co...> - 2007-04-16 13:04:48
|
Author: phd Date: 2007-04-16 07:04:45 -0600 (Mon, 16 Apr 2007) New Revision: 2544 Modified: SQLObject/branches/0.9/docs/links.txt Log: Removed stale link to "Canonical's SQLObject guide". Modified: SQLObject/branches/0.9/docs/links.txt =================================================================== --- SQLObject/branches/0.9/docs/links.txt 2007-04-16 13:04:19 UTC (rev 2543) +++ SQLObject/branches/0.9/docs/links.txt 2007-04-16 13:04:45 UTC (rev 2544) @@ -8,9 +8,6 @@ Articles and Documentation -------------------------- -* `Canonical's SQLObject guide - <https://wiki.launchpad.canonical.com/SQLObjectGuide>`_. - * `SQLObject and CherryPy <http://www.cherrypy.org/wiki/SQLObjectThreadPerConnection>`_. |
|
From: <sub...@co...> - 2007-04-16 13:04:23
|
Author: phd Date: 2007-04-16 07:04:19 -0600 (Mon, 16 Apr 2007) New Revision: 2543 Modified: SQLObject/branches/0.8/docs/links.txt Log: Removed stale link to "Canonical's SQLObject guide". Modified: SQLObject/branches/0.8/docs/links.txt =================================================================== --- SQLObject/branches/0.8/docs/links.txt 2007-04-16 13:03:04 UTC (rev 2542) +++ SQLObject/branches/0.8/docs/links.txt 2007-04-16 13:04:19 UTC (rev 2543) @@ -8,9 +8,6 @@ Articles and Documentation -------------------------- -* `Canonical's SQLObject guide - <https://wiki.launchpad.canonical.com/SQLObjectGuide>`_. - * `SQLObject and CherryPy <http://www.cherrypy.org/wiki/SQLObjectThreadPerConnection>`_. |
|
From: <sub...@co...> - 2007-04-16 13:03:19
|
Author: phd Date: 2007-04-16 07:03:04 -0600 (Mon, 16 Apr 2007) New Revision: 2542 Modified: SQLObject/branches/0.7/docs/links.txt Log: Removed stale link to "Canonical's SQLObject guide". Modified: SQLObject/branches/0.7/docs/links.txt =================================================================== --- SQLObject/branches/0.7/docs/links.txt 2007-04-16 05:35:35 UTC (rev 2541) +++ SQLObject/branches/0.7/docs/links.txt 2007-04-16 13:03:04 UTC (rev 2542) @@ -39,9 +39,6 @@ Articles and Documentation -------------------------- -* `Canonical's SQLObject guide - <https://wiki.launchpad.canonical.com/SQLObjectGuide>`_. - * `SQLObject and CherryPy <http://www.cherrypy.org/wiki/SQLObjectThreadPerConnection>`_. |
|
From: <sub...@co...> - 2007-04-15 23:25:58
|
Author: luke
Date: 2007-04-15 17:25:54 -0600 (Sun, 15 Apr 2007)
New Revision: 2537
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
Log:
Updates to materialized/dependency handling
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py 2007-04-15 22:27:53 UTC (rev 2536)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py 2007-04-15 23:25:54 UTC (rev 2537)
@@ -1,8 +1,11 @@
from sqlobject import declarative
+from sqlobject import sqlbuilder
from sqlobject.events import *
from sqlobject.include.pydispatch import dispatcher
+from sqlobject import classregistry
from operator import isCallable
+import inspect
def _processDependentOn(new_class_name, bases, new_attrs, post_funcs, early_funcs):
def f(cls):
@@ -20,17 +23,17 @@
class DependencyItem(object):
- def __init__(self, item):
+ def __init__(self, item, *extras):
self.key = item
- self.value = item
+ self.value = item + extras
class Dependency(object):
DependencyItemClass = DependencyItem
DecoratorFactory = depFromClsAttr
- def __init__(self, target, source, **extra):
- self.target = self.DependencyItemClass(target)
- self.source = self.DependencyItemClass(source)
+ def __init__(self, target, source, *extras):
+ self.target = self.DependencyItemClass(target, *extras)
+ self.source = self.DependencyItemClass(source, *extras)
class DependencyManager(object):
DependencyClass = Dependency
@@ -45,7 +48,7 @@
self._deps.setdefault(dep.source.key, set()).add(dep.target)
self._reverseDeps.setdefault(dep.target.key, set()).add(dep.source)
- def get(self, source):
+ def get(self, *source):
''' get immediate dependent values for source '''
return self.getMany([source])
@@ -71,8 +74,9 @@
for target in deps.get(source,set())))
- def dependentOn(self, source, factory=None):
+ def dependentOn(self, *source, **kw):
''' decorator '''
+ factory = kw.pop('factory', None)
if factory is None:
factory = self.DependencyClass.DecoratorFactory()
def decorate(func):
@@ -86,10 +90,8 @@
def dependencyForAdd(self, *args):
if len(args) == 1 and isinstance(args[0], self.DependencyClass):
dep = args[0]
- elif len(args) == 2:
+ else:
dep = self.DependencyClass(*args)
- else:
- raise TypeError('Incorrect arguments to add(), expected %s instance or (target,source), got: %s' % (self.DependencyClass.__name__, args))
return dep
#if isinstance(inst, str):
@@ -97,20 +99,57 @@
#else:
# sourceClass = inst.__class__.__name__
+
class SQLDependency(Dependency):
- pass
+ def __init__(self, target, source, *extras):
+ if isinstance(source[0], sqlbuilder.SQLExpression):
+ source = (str(source[0].tableName), str(source[0].fieldName)) + source[1:]
+ print source
+ if len(source) == 3:
+ other = source[2]
+ try:
+ hash(other)
+ except TypeError:
+ other = lambda o=other: o
+ extras = (other,) + extras
+ source = source[:2]
+ else:
+ extras = (None,) + extras
+ self.target = self.DependencyItemClass(target, *extras)
+ self.source = self.DependencyItemClass(source, *extras)
class SQLDependencyManager(DependencyManager):
+ DependencyClass = SQLDependency
- def process(self, inst, attrs):
- ''' find and recalculate items dependent on attrs'''
+ def instancesToProcess(self, inst, attrs):
+ ''' find items dependent on attrs'''
+ ret = {}
sourceClass = inst.__class__.__name__
deps = self.getMany((sourceClass, attr) for attr in attrs)
- for targetClass, targetAttr, route in deps:
- targetClass = getClassFromName(targetClass)
- for t_inst in route(inst, targetClass):
- t_inst._SO_resetCache(targetAttr)
+ for targetClassName, targetAttr, route in deps:
+
+ targetClass = classregistry.findClass(targetClassName, class_registry=inst.sqlmeta.registry)
+
+ print "Route", route
+ if inspect.isfunction(route):
+ argspec = inspect.getargspec(route)
+ print "argspec", argspec
+ if len(argspec[0]) == len(argspec[3]) and not argspec[1] and not argspec[2]:
+ print "exec", route()
+ route = route()
+ print "RouteX", route
+ if route is None:
+ route = lambda i,c: [i]
+ elif isinstance(route, sqlbuilder.SQLExpression):
+ route = lambda i,c,r=route: c.select(sqlbuilder.AND(r, i))
+
+ ret.setdefault((targetClassName, targetAttr),[]).extend(route(inst, targetClass))
+ return ret
+ def process(self, inst, attrs):
+ for (cls, attr), insts in self.instancesToProcess(inst, attrs).iteritems():
+ for inst in insts:
+ inst._SO_resetCache(attr)
def FK(self, name):
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py 2007-04-15 22:27:53 UTC (rev 2536)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py 2007-04-15 23:25:54 UTC (rev 2537)
@@ -10,14 +10,14 @@
def _addColumn(cls, connection, column_name, column_definition, changeSchema, post_funcs):
def f(cls, col):
if col.foreignKey:
- dep.add((cls.__name__, col.name), (col.foreignKey, 'id'))
+ dep.add((cls.__name__, col.name), (col.foreignKey, 'id', lambda cls=cls,col=col: getattr(cls.q, col.origName)))
post_funcs.append(f)
events.listen(_addColumn, MaterializedSQLObject, events.AddColumnSignal)
def _addJoin(cls, join_name, join_definition, post_funcs):
def f(cls, join):
- dep.add((cls.__name__, join.joinMethodName), (join.otherClassName, 'id'))
+ dep.add((cls.__name__, join.joinMethodName), (join.otherClassName, 'id', lambda cls=cls,join=join: getattr(cls.q, join.joinMethodName)))
post_funcs.append(f)
events.listen(_addJoin, MaterializedSQLObject, events.AddJoinSignal)
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py 2007-04-15 22:27:53 UTC (rev 2536)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py 2007-04-15 23:25:54 UTC (rev 2537)
@@ -3,16 +3,17 @@
from sqlobject.tests.dbtest import *
from sqlobject.materialized import *
+dep = DependencyManager()
class DependencyOne(SQLObject):
name = StringCol()
twos = SQLMultipleJoin('DependencyTwo', joinColumn='one_id')
- @dep.dependentOn(('DependencyOne', 'twos'))
+ @dep.dependentOn('DependencyOne', 'twos')
def _get_twoCount(self):
return self.twos.count()
- @dep.dependentOn(('DependencyTwo', 'length'))
+ @dep.dependentOn('DependencyTwo', 'length')
def _get_detailSize(self):
return self.twos.sum('length')
@@ -21,12 +22,12 @@
length = IntCol()
one = ForeignKey('DependencyOne')
- @dep.dependentOn(('DependencyOne', 'name'))
+ @dep.dependentOn('DependencyOne', 'name')
def _get_name(self):
return self.one.name
- @dep.dependentOn(('DependencyTwo', 'detail'))
- @dep.dependentOn(('DependencyOne', 'name'))
+ @dep.dependentOn('DependencyTwo', 'detail')
+ @dep.dependentOn('DependencyOne', 'name')
def _get_name2(self):
return self.one.name + self.detail
@@ -34,5 +35,5 @@
setupClass([DependencyOne, DependencyTwo])
def testSetup():
- assert dep.get(('DependencyOne', 'name')) == set([('DependencyTwo','_get_name'),
+ assert dep.get('DependencyOne', 'name') == set([('DependencyTwo','_get_name'),
('DependencyTwo','_get_name2')])
\ No newline at end of file
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py 2007-04-15 22:27:53 UTC (rev 2536)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py 2007-04-15 23:25:54 UTC (rev 2537)
@@ -25,13 +25,13 @@
def test_addDependency():
dep = DependencyManager()
dep.add(('B', 'name'), ('A', 'name'))
- assert dep.get(('A', 'name')) == set([('B', 'name')])
+ assert dep.get('A', 'name') == set([('B', 'name')])
def test_addDependencies():
dep = DependencyManager()
dep.add(('B', 'name'), ('A', 'name'))
dep.add(('B', 'condName'), ('A', 'name'))
- assert dep.get(('A', 'name')) == set((('B', 'name'),
+ assert dep.get('A', 'name') == set((('B', 'name'),
('B', 'condName')))
def test_addDepWithDecorator():
@@ -41,11 +41,11 @@
a = A()
- @dep.dependentOn(('A', 'name'))
+ @dep.dependentOn('A', 'name')
def name(self):
return self.a.name
- assert dep.get(('A', 'name')) == set([('C', 'name')])
+ assert dep.get('A', 'name') == set([('C', 'name')])
def test_addDepsWithDecorator():
dep = DependencyManager()
@@ -55,13 +55,13 @@
a = A()
b = B()
- @dep.dependentOn(('B', 'name'))
- @dep.dependentOn(('A', 'name'))
+ @dep.dependentOn('B', 'name')
+ @dep.dependentOn('A', 'name')
def name(self):
return self.a.name + self.b.name
- assert dep.get(('A', 'name')) == set([('C', 'name')])
- assert dep.get(('B', 'name')) == set([('C', 'name')])
+ assert dep.get('A', 'name') == set([('C', 'name')])
+ assert dep.get('B', 'name') == set([('C', 'name')])
@@ -122,7 +122,7 @@
('c','x'): (('x', 2), {})
}
- assert dep.get(('a','w')) == set([('x', 1), ('x', 2)])
+ assert dep.get('a','w') == set([('x', 1), ('x', 2)])
#def test_addDepWithSignal():
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py 2007-04-15 22:27:53 UTC (rev 2536)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py 2007-04-15 23:25:54 UTC (rev 2537)
@@ -2,18 +2,23 @@
from sqlobject import *
from sqlobject.tests.dbtest import *
from sqlobject.materialized import *
+from sqlobject.sqlbuilder import ImportProxy
+MO = ImportProxy('MaterializedOne')
+MT = ImportProxy('MaterializedTwo')
+
+
class MaterializedOne(MaterializedSQLObject):
name = StringCol()
twos = SQLMultipleJoin('MaterializedTwo', joinColumn='one_id')
@cachedAs(IntCol)
- @dep.dependentOn(('MaterializedOne', 'twos'))
+ @dep.dependentOn('MaterializedOne', 'twos', MO.q.twos)
def _get_twoCount(self):
return self.twos.count()
@cachedAs(IntCol)
- @dep.dependentOn(('MaterializedTwo', 'length'))
+ @dep.dependentOn('MaterializedTwo', 'length', MO.q.twos)
def _get_detailSize(self):
return self.twos.sum('length')
@@ -23,27 +28,48 @@
one = ForeignKey('MaterializedOne')
@cachedAs(StringCol)
- @dep.dependentOn(('MaterializedOne', 'name'))
+ @dep.dependentOn('MaterializedOne', 'name', MT.q.one)
def _get_name(self):
return self.one.name
@cachedAs(StringCol)
- @dep.dependentOn(('MaterializedTwo', 'detail'))
- @dep.dependentOn(('MaterializedOne', 'name'))
+ @dep.dependentOn('MaterializedTwo', 'detail')
+ @dep.dependentOn('MaterializedOne', 'name', MT.q.one)
def _get_name2(self):
return self.one.name + self.detail
def setup_module(mod):
setupClass([MaterializedOne, MaterializedTwo])
+ mod.ones = inserts(MaterializedOne, (('S',),
+ ('T',),
+ ), 'name')
+ mod.twos = inserts(MaterializedTwo, (('a', 2, mod.ones[0].id),
+ ('b', 3, mod.ones[0].id),
+ ('c', 4, mod.ones[1].id),
+ ('d', 5, mod.ones[1].id),
+ ), 'detail length oneID')
def testSetup():
- assert dep.get(('MaterializedOne', 'name')) == set([('MaterializedTwo','_get_name'),
- ('MaterializedTwo','_get_name2')])
+ deps = dep.get('MaterializedOne', 'name')
+ assert set([(x,y) for x,y,z in deps]) == set([('MaterializedTwo','_get_name'),
+ ('MaterializedTwo','_get_name2')])
+ assert [z for x,y,z in deps][0] != [None, None]
def testSetupDepsForFK():
- assert dep.get(('MaterializedOne', 'id')) == set([('MaterializedTwo', 'oneID')])
+ # Can't test route directly
+ deps = dep.get('MaterializedOne', 'id')
+ assert [(x,y) for x,y,z in deps][0] == ('MaterializedTwo', 'oneID')
+ assert [z for x,y,z in deps][0] is not None
def testSetupDepsForJoin():
- assert dep.get(('MaterializedTwo', 'id')) == set([('MaterializedOne', 'twos')])
+ deps = dep.get('MaterializedTwo', 'id')
+ assert set((x,y) for x,y,z in deps) == set([('MaterializedOne', 'twos')])
+ assert [z for x,y,z in deps][0] is not None
-
\ No newline at end of file
+
+def testProcessInstances():
+
+ assert dep.instancesToProcess(ones[0], ['name']) == {
+ ('MaterializedTwo', '_get_name'): [twos[0], twos[1]],
+ ('MaterializedTwo', '_get_name2'): [twos[0], twos[1]],
+ }
\ No newline at end of file
|
|
From: <sub...@co...> - 2007-04-15 22:15:29
|
Author: luke
Date: 2007-04-15 16:15:10 -0600 (Sun, 15 Apr 2007)
New Revision: 2534
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py
Log:
Bug in select.throughTo
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py 2007-04-15 22:14:44 UTC (rev 2533)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/sresults.py 2007-04-15 22:15:10 UTC (rev 2534)
@@ -324,19 +324,19 @@
def _throughToMultipleJoin(self, join):
otherClass = join.otherClass
colName = join.soClass.sqlmeta.style.dbColumnToPythonAttr(join.joinColumn)
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, self.sourceClass.q.id.fieldName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')])
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
joinColumn = getattr(otherClass.q, colName)
- return otherClass, joinColumn==getattr(query.q, self.sourceClass.q.id.fieldName)
+ return otherClass, joinColumn==query.q.id
def _throughToRelatedJoin(self, join):
otherClass = join.otherClass
intTable = sqlbuilder.Table(join.intermediateTable)
colName = join.joinColumn
- query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(getattr(intTable, colName), colName)])
+ query = self.queryForSelect().newItems([sqlbuilder.ColumnAS(self.sourceClass.q.id, 'id')])#sqlbuilder.ColumnAS(getattr(intTable, colName), colName)])
query = sqlbuilder.Alias(query, "%s_%s" % (self.sourceClass.__name__, join.joinMethodName))
clause = sqlbuilder.AND(otherClass.q.id == getattr(intTable, join.otherColumn),
- getattr(intTable, colName) == getattr(query.q, colName))
+ getattr(intTable, colName) == query.q.id)
return otherClass, clause
__all__ = ['SelectResults']
|
|
From: <sub...@co...> - 2007-04-15 22:14:49
|
Author: luke
Date: 2007-04-15 16:14:44 -0600 (Sun, 15 Apr 2007)
New Revision: 2533
Added:
SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_sqlbuilder_joins_instances.py
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/main.py
SQLObject/branches/cache-deps-on-views/sqlobject/sqlbuilder.py
SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_select_through.py
Log:
Bug in select.throughTo, use joins and instances in sqlbuilder expressions
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/main.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/main.py 2007-04-15 01:24:40 UTC (rev 2532)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/main.py 2007-04-15 22:14:44 UTC (rev 2533)
@@ -49,6 +49,7 @@
import events
from sresults import SelectResults
from formencode import schema, compound
+from converters import registerConverter
import sys
if sys.version_info[:3] < (2, 2, 0):
@@ -1624,7 +1625,13 @@
cls._connection = value
setConnection = classmethod(setConnection)
+ def __sqlrepr__(self, db):
+ return sqlbuilder.sqlrepr(self.__class__.q.id==self.id)
+
+ def tablesUsedImmediate(self):
+ return [self.__class__.q]
+
def capitalize(name):
return name[0].capitalize() + name[1:]
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/sqlbuilder.py 2007-04-15 01:24:40 UTC (rev 2532)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/sqlbuilder.py 2007-04-15 22:14:44 UTC (rev 2533)
@@ -168,6 +168,9 @@
def __str__(self):
return repr(self)
+# def __hash__(self):
+# return id(self)
+
def __cmp__(self, other):
raise VersionError, "Python 2.1+ required"
def __rcmp__(self, other):
@@ -349,7 +352,6 @@
registerConverter(UnicodeField, SQLExprConverter)
-
class Table(SQLExpression):
FieldClass = Field
@@ -382,6 +384,16 @@
raise AttributeError
if attr == 'id':
return self.FieldClass(self.tableName, self.soClass.sqlmeta.idName, attr)
+ elif attr+'ID' in self.soClass.sqlmeta.columns:
+ column = self.soClass.sqlmeta.columns[attr+'ID']
+ return getattr(self, column.name)==getattr(self.soClass, '_SO_class_'+column.foreignKey).q.id
+ elif attr in [x.joinMethodName for x in self.soClass.sqlmeta.joins]:
+ join = [x for x in self.soClass.sqlmeta.joins if x.joinMethodName == attr][0]
+ if hasattr(join, 'otherColumn'):
+ return AND(join.otherClass.q.id == Field(join.intermediateTable, join.otherColumn),
+ Field(join.intermediateTable, join.joinColumn) == self.soClass.q.id)
+ else:
+ return getattr(join.otherClass.q, join.joinColumn)==self.soClass.q.id
elif attr not in self.soClass.sqlmeta.columns:
raise AttributeError("%s instance has no attribute '%s'" % (self.soClass.__name__, attr))
else:
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_select_through.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_select_through.py 2007-04-15 01:24:40 UTC (rev 2532)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_select_through.py 2007-04-15 22:14:44 UTC (rev 2533)
@@ -48,6 +48,7 @@
def testThroughRelatedJoin():
assert list(threes[0].twos.throughTo.threes) == [threes[0], threes[1]]
+ assert list(SRThrough3.select(SRThrough3.q.id==threes[0].id).throughTo.twos) == list(threes[0].twos)
def testThroughFKAndJoin():
assert list(threes[0].ones.throughTo.three.throughTo.twos) == [twos[0]]
\ No newline at end of file
Added: SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_sqlbuilder_joins_instances.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_sqlbuilder_joins_instances.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/tests/test_sqlbuilder_joins_instances.py 2007-04-15 22:14:44 UTC (rev 2533)
@@ -0,0 +1,62 @@
+from sqlobject import *
+from sqlobject.sqlbuilder import *
+from sqlobject.tests.dbtest import *
+
+''' Testing for expressing join, foreign keys, and instance identity in SQLBuilder expressions.
+'''
+
+class SBPerson(SQLObject):
+ name = StringCol()
+ addresses = SQLMultipleJoin('SBAddress', joinColumn='personID')
+ sharedAddresses = SQLRelatedJoin('SBAddress', addRemoveName='SharedAddress')
+
+class SBAddress(SQLObject):
+ city = StringCol()
+ person = ForeignKey('SBPerson')
+ sharedPeople = SQLRelatedJoin('SBPerson')
+
+
+def setup_module(mod):
+ setupClass([SBPerson, SBAddress])
+ mod.ppl = inserts(SBPerson, [('James',),
+ ('Julia',)],
+ 'name')
+ mod.adds = inserts(SBAddress, [('London',mod.ppl[0].id),
+ ('Chicago',mod.ppl[1].id),
+ ('Abu Dhabi', mod.ppl[1].id)],
+ 'city personID')
+ mod.ppl[0].addSharedAddress(mod.adds[0])
+ mod.ppl[0].addSharedAddress(mod.adds[1])
+ mod.ppl[1].addSharedAddress(mod.adds[0])
+
+def testJoin():
+ assert list(SBPerson.select(AND(SBPerson.q.addresses,SBAddress.q.city=='London'))) == \
+ list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London'))) == \
+ list(SBAddress.selectBy(city='London').throughTo.person)
+
+def testFK():
+ assert list(SBPerson.select(AND(SBAddress.q.person, SBAddress.q.city=='London'))) == \
+ list(SBPerson.select(AND(SBPerson.q.id==SBAddress.q.personID, SBAddress.q.city=='London')))
+
+def testJoin2():
+ assert list(SBAddress.select(AND(SBPerson.q.addresses, SBPerson.q.name=='Julia'))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia'))) == \
+ list(SBPerson.selectBy(name='Julia').throughTo.addresses)
+
+def testFK2():
+ assert list(SBAddress.select(AND(SBAddress.q.person, SBPerson.q.name=='Julia'))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.name=='Julia')))
+
+def testRelatedJoin():
+ assert list(SBAddress.select(AND(SBAddress.q.sharedPeople, SBPerson.q.name=='Julia'))) == \
+ list(SBPerson.selectBy(name='Julia').throughTo.sharedAddresses) == \
+ list(ppl[1].sharedAddresses)
+
+def testInstance():
+ assert list(SBAddress.select(AND(SBAddress.q.person, ppl[0]))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id))) == \
+ list(ppl[0].addresses)
+
+def testInstance2():
+ assert list(SBAddress.select(AND(SBPerson.q.addresses, ppl[0]))) == \
+ list(SBAddress.select(AND(SBPerson.q.id==SBAddress.q.personID, SBPerson.q.id==ppl[0].id)))
\ No newline at end of file
|
|
From: <sub...@co...> - 2007-04-14 21:52:05
|
Author: luke
Date: 2007-04-14 15:51:58 -0600 (Sat, 14 Apr 2007)
New Revision: 2529
Added:
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/__init__.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/__init__.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py
SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
Modified:
SQLObject/branches/cache-deps-on-views/sqlobject/events.py
SQLObject/branches/cache-deps-on-views/sqlobject/main.py
Log:
Non-functional start
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/events.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/events.py 2007-04-14 07:48:21 UTC (rev 2528)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/events.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -138,6 +138,16 @@
post_funcs are called with ``(cls, so_column_obj)``
"""
+class AddJoinSignal(Signal):
+ """
+ Called when a join is added to a class, with arguments
+ ``(cls, join_name, join_definition, post_funcs)``.
+ This is called *after* the join has been added,
+ and is called for each join after class creation.
+
+ post_funcs are called with ``(cls, so_join_obj)``
+ """
+
# @@: Signals for indexes and joins? These are mostly event consumers,
# though.
Modified: SQLObject/branches/cache-deps-on-views/sqlobject/main.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/main.py 2007-04-14 07:48:21 UTC (rev 2528)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/main.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -510,6 +510,9 @@
########################################
def addJoin(cls, joinDef):
+ post_funcs = []
+ cls.send(events.AddJoinSignal, cls.soClass,
+ joinDef.name, joinDef, post_funcs)
sqlmeta = cls
soClass = cls.soClass
# The name of the method we'll create. If it's
@@ -556,6 +559,9 @@
if soClass._SO_finishedClassCreation:
makeProperties(soClass)
+
+ for func in post_funcs:
+ func(soClass, join)
addJoin = classmethod(addJoin)
Property changes on: SQLObject/branches/cache-deps-on-views/sqlobject/materialized
___________________________________________________________________
Name: svn:ignore
+ *.pyc
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/__init__.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/__init__.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/__init__.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,2 @@
+from dependency import *
+from materialized import *
\ No newline at end of file
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/dependency.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,134 @@
+from sqlobject import declarative
+from sqlobject.events import *
+from sqlobject.include.pydispatch import dispatcher
+
+from operator import isCallable
+
+def _processDependentOn(new_class_name, bases, new_attrs, post_funcs, early_funcs):
+ def f(cls):
+ for name, value in new_attrs.items():
+ if hasattr(value, '_dependentOn'):
+ for dep, maker, source in value._dependentOn:
+ dep.add(maker(cls, name, value),source)
+ early_funcs.append(f)
+
+listen(_processDependentOn, dispatcher.Any, ClassCreateSignal)
+
+class depFromClsAttr(object):
+ def __call__(self, cls, name, value):
+ return (cls.__name__, name)
+
+
+class DependencyItem(object):
+ def __init__(self, item):
+ self.key = item
+ self.value = item
+
+class Dependency(object):
+ DependencyItemClass = DependencyItem
+ DecoratorFactory = depFromClsAttr
+
+ def __init__(self, target, source, **extra):
+ self.target = self.DependencyItemClass(target)
+ self.source = self.DependencyItemClass(source)
+
+class DependencyManager(object):
+ DependencyClass = Dependency
+
+ def __init__(self):
+ self._deps = {}
+ self._reverseDeps = {}
+
+ def add(self, *args):
+ ''' Add a dependency. '''
+ dep = self.dependencyForAdd(*args)
+ self._deps.setdefault(dep.source.key, set()).add(dep.target)
+ self._reverseDeps.setdefault(dep.target.key, set()).add(dep.source)
+
+ def get(self, source):
+ ''' get immediate dependent values for source '''
+ return self.getMany([source])
+
+ def getMany(self, sources):
+ deps = (self.treeFrom(source, depth=1) for source in sources)
+ return reduce(set.union, (set(y[0] for y in x.values()) for x in deps), set())
+
+ def treeFrom(self, source, depth=None):
+ ''' dictionary of dependencies with their dependenices arising from source'''
+ return self._tree(self._deps, source, depth=depth)
+
+ def treeTo(self, source, depth=None):
+ ''' dictionary of dependencies with their dependenices leading to source'''
+ return self._tree(self._reverseDeps, source, depth=depth)
+
+ def _tree(self, deps, source, depth=None):
+ if depth == 0:
+ return {}
+ if depth:
+ depth = depth-1
+
+ return dict(((target.key, (target.value, self._tree(deps, target.key, depth=depth)))
+ for target in deps.get(source,set())))
+
+
+ def dependentOn(self, source, factory=None):
+ ''' decorator '''
+ if factory is None:
+ factory = self.DependencyClass.DecoratorFactory()
+ def decorate(func):
+ depOn = getattr(func, '_dependentOn', [])
+ depOn.append((self, factory, source))
+ setattr(func, '_dependentOn', depOn)
+ return func
+ return decorate
+
+
+ def dependencyForAdd(self, *args):
+ if len(args) == 1 and isinstance(args[0], self.DependencyClass):
+ dep = args[0]
+ elif len(args) == 2:
+ dep = self.DependencyClass(*args)
+ else:
+ raise TypeError('Incorrect arguments to add(), expected %s instance or (target,source), got: %s' % (self.DependencyClass.__name__, args))
+ return dep
+
+#if isinstance(inst, str):
+# sourceClass = inst
+#else:
+# sourceClass = inst.__class__.__name__
+
+class SQLDependency(Dependency):
+ pass
+
+class SQLDependencyManager(DependencyManager):
+
+ def process(self, inst, attrs):
+ ''' find and recalculate items dependent on attrs'''
+ sourceClass = inst.__class__.__name__
+ deps = self.getMany((sourceClass, attr) for attr in attrs)
+ for targetClass, targetAttr, route in deps:
+ targetClass = getClassFromName(targetClass)
+ for t_inst in route(inst, targetClass):
+ t_inst._SO_resetCache(targetAttr)
+
+
+
+ def FK(self, name):
+ '''route for foreign key'''
+ def f(inst, cls):
+ return cls.select(cls.q.id==getattr(inst, name+'ID'))
+ return f
+
+ def J(self, name):
+ '''route for join'''
+ def f(inst, cls):
+ return cls.select(getattr(cls.q,name)==inst.id)
+ return f
+
+ def S(self, *args):
+ '''route for self'''
+ if not len(args):
+ return self.S
+ return args[0]
+
+dep = SQLDependencyManager()
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/materialized.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,50 @@
+from sqlobject import SQLObject, sqlmeta as _sqlmeta
+from sqlobject import events
+from dependency import *
+
+class MaterializedSQLObject(SQLObject):
+
+ class sqlmeta(_sqlmeta):
+ pass
+
+def _addColumn(cls, connection, column_name, column_definition, changeSchema, post_funcs):
+ def f(cls, col):
+ if col.foreignKey:
+ dep.add((cls.__name__, col.name), (col.foreignKey, 'id'))
+ post_funcs.append(f)
+
+events.listen(_addColumn, MaterializedSQLObject, events.AddColumnSignal)
+
+def _addJoin(cls, join_name, join_definition, post_funcs):
+ def f(cls, join):
+ dep.add((cls.__name__, join.joinMethodName), (join.otherClassName, 'id'))
+ post_funcs.append(f)
+
+events.listen(_addJoin, MaterializedSQLObject, events.AddJoinSignal)
+
+
+class MaterializedAttr(object):
+ def __init__(self, func, colType, name=None):
+ self.func = func
+ self.colType = colType
+ if name is None:
+ self.name = self.func.__name__
+ else:
+ self.name = name
+
+ self.__name__ = self.name
+ self.__dict__.update(func.__dict__)
+
+ def __call__(self, obj):
+ val = None
+ if getattr(obj, '_SO_cacheInstance', None):
+ val = getattr(obj._SO_cacheInstance, self.name)
+ if val is None:
+ val = self.func(obj)
+ return val
+
+def cachedAs(colType, name=None):
+ def decorate(func):
+ return MaterializedAttr(func, colType, name=name)
+ return decorate
+
\ No newline at end of file
Property changes on: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests
___________________________________________________________________
Name: svn:ignore
+ *.pyc
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/__init__.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/__init__.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/__init__.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1 @@
+#
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,38 @@
+from py.test import raises
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+from sqlobject.materialized import *
+
+
+class DependencyOne(SQLObject):
+ name = StringCol()
+ twos = SQLMultipleJoin('DependencyTwo', joinColumn='one_id')
+
+ @dep.dependentOn(('DependencyOne', 'twos'))
+ def _get_twoCount(self):
+ return self.twos.count()
+
+ @dep.dependentOn(('DependencyTwo', 'length'))
+ def _get_detailSize(self):
+ return self.twos.sum('length')
+
+class DependencyTwo(SQLObject):
+ detail = StringCol()
+ length = IntCol()
+ one = ForeignKey('DependencyOne')
+
+ @dep.dependentOn(('DependencyOne', 'name'))
+ def _get_name(self):
+ return self.one.name
+
+ @dep.dependentOn(('DependencyTwo', 'detail'))
+ @dep.dependentOn(('DependencyOne', 'name'))
+ def _get_name2(self):
+ return self.one.name + self.detail
+
+def setup_module(mod):
+ setupClass([DependencyOne, DependencyTwo])
+
+def testSetup():
+ assert dep.get(('DependencyOne', 'name')) == set([('DependencyTwo','_get_name'),
+ ('DependencyTwo','_get_name2')])
\ No newline at end of file
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_dependency_manager.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,129 @@
+from py.test import raises
+from sqlobject import *
+from sqlobject import declarative
+from sqlobject.tests.dbtest import *
+from sqlobject.materialized import *
+
+from pprint import pprint
+
+class A(object):
+ name = 'A'
+
+class B(object):
+ c = True
+ a = A()
+
+ def name(self):
+ return self.a.name
+
+ def condName(self):
+ if self.c:
+ return self.a.name
+ else:
+ return 'B'
+
+def test_addDependency():
+ dep = DependencyManager()
+ dep.add(('B', 'name'), ('A', 'name'))
+ assert dep.get(('A', 'name')) == set([('B', 'name')])
+
+def test_addDependencies():
+ dep = DependencyManager()
+ dep.add(('B', 'name'), ('A', 'name'))
+ dep.add(('B', 'condName'), ('A', 'name'))
+ assert dep.get(('A', 'name')) == set((('B', 'name'),
+ ('B', 'condName')))
+
+def test_addDepWithDecorator():
+ dep = DependencyManager()
+
+ class C(declarative.Declarative):
+
+ a = A()
+
+ @dep.dependentOn(('A', 'name'))
+ def name(self):
+ return self.a.name
+
+ assert dep.get(('A', 'name')) == set([('C', 'name')])
+
+def test_addDepsWithDecorator():
+ dep = DependencyManager()
+
+ class C(declarative.Declarative):
+
+ a = A()
+ b = B()
+
+ @dep.dependentOn(('B', 'name'))
+ @dep.dependentOn(('A', 'name'))
+ def name(self):
+ return self.a.name + self.b.name
+
+ assert dep.get(('A', 'name')) == set([('C', 'name')])
+ assert dep.get(('B', 'name')) == set([('C', 'name')])
+
+
+
+def test_depTreeFrom1():
+ dep = DependencyManager()
+ dep.add(('B', 'name'), ('A', 'name'))
+ assert dep.treeFrom(('A', 'name')) == {
+ ('B','name'): (('B','name'), {})
+ }
+
+def test_depTreeFrom2():
+ dep = DependencyManager()
+ dep.add(('B', 'name'), ('A', 'name'))
+ dep.add(('D', 'name'), ('A', 'name'))
+ dep.add(('C', 'cname'), ('B', 'name'))
+ pprint(dep.treeFrom(('A', 'name')))
+ assert dep.treeFrom(('A', 'name')) == {
+ ('B','name'): (('B', 'name'),
+ {
+ ('C', 'cname'): (('C', 'cname'),{})
+ }),
+ ('D','name'): (('D','name'), {})
+ }
+
+def test_depTreeTo1():
+ dep = DependencyManager()
+ dep.add(('B', 'name'), ('A', 'name'))
+ dep.add(('D', 'name'), ('A', 'name'))
+ dep.add(('C', 'cname'), ('B', 'name'))
+ pprint(dep.treeTo(('C', 'cname')))
+ assert dep.treeTo(('C', 'cname')) == {
+ ('B','name'): (('B','name'),
+ {
+ ('A', 'name'): (('A', 'name'),{})
+ }),
+ }
+
+def test_customItems():
+ class DItem(DependencyItem):
+ def __init__(self, (a,b,c)):
+ self.key = (a,b)
+ self.value = (b,c)
+
+ class Dep(Dependency):
+ DependencyItemClass = DItem
+
+ dep = DependencyManager()
+ dep.DependencyClass = Dep
+
+ dep.add(('b', 'x', 1), ('a', 'w', 1))
+ dep.add(('c', 'x', 2), ('a', 'w', 1))
+ dep.add(('d', 'y', 2), ('b', 'x', 1))
+ assert dep.treeFrom(('a','w')) == {
+ ('b','x'): (('x', 1),
+ {
+ ('d', 'y'): (('y', 2), {})
+ }),
+ ('c','x'): (('x', 2), {})
+ }
+
+ assert dep.get(('a','w')) == set([('x', 1), ('x', 2)])
+
+
+#def test_addDepWithSignal():
+# pass
Added: SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py
===================================================================
--- SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py (rev 0)
+++ SQLObject/branches/cache-deps-on-views/sqlobject/materialized/tests/test_materialized.py 2007-04-14 21:51:58 UTC (rev 2529)
@@ -0,0 +1,49 @@
+from py.test import raises
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+from sqlobject.materialized import *
+
+class MaterializedOne(MaterializedSQLObject):
+ name = StringCol()
+ twos = SQLMultipleJoin('MaterializedTwo', joinColumn='one_id')
+
+ @cachedAs(IntCol)
+ @dep.dependentOn(('MaterializedOne', 'twos'))
+ def _get_twoCount(self):
+ return self.twos.count()
+
+ @cachedAs(IntCol)
+ @dep.dependentOn(('MaterializedTwo', 'length'))
+ def _get_detailSize(self):
+ return self.twos.sum('length')
+
+class MaterializedTwo(MaterializedSQLObject):
+ detail = StringCol()
+ length = IntCol()
+ one = ForeignKey('MaterializedOne')
+
+ @cachedAs(StringCol)
+ @dep.dependentOn(('MaterializedOne', 'name'))
+ def _get_name(self):
+ return self.one.name
+
+ @cachedAs(StringCol)
+ @dep.dependentOn(('MaterializedTwo', 'detail'))
+ @dep.dependentOn(('MaterializedOne', 'name'))
+ def _get_name2(self):
+ return self.one.name + self.detail
+
+def setup_module(mod):
+ setupClass([MaterializedOne, MaterializedTwo])
+
+def testSetup():
+ assert dep.get(('MaterializedOne', 'name')) == set([('MaterializedTwo','_get_name'),
+ ('MaterializedTwo','_get_name2')])
+
+def testSetupDepsForFK():
+ assert dep.get(('MaterializedOne', 'id')) == set([('MaterializedTwo', 'oneID')])
+
+def testSetupDepsForJoin():
+ assert dep.get(('MaterializedTwo', 'id')) == set([('MaterializedOne', 'twos')])
+
+
\ No newline at end of file
|
|
From: SourceForge.net <no...@so...> - 2007-04-12 20:38:09
|
Bugs item #1699518, was opened at 2007-04-12 20:34 Message generated for change (Comment added) made by kumar303 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: SQLObject release (specify) Status: Open Resolution: None Priority: 5 Private: No Submitted By: kumar mcmillan (kumar303) Assigned to: Nobody/Anonymous (nobody) Summary: select(limit=n) - limit keyword is not recognized Initial Comment: 0.8.1 release here is a failing test case :( from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = 1 Foo.createTable(connection=c) f = Foo(connection=c) f = Foo(connection=c) assert Foo.select(connection=c).count() == 2 assert Foo.select(connection=c, limit=1).count() == 1 if __name__ == '__main__': test() ---------------------------------------------------------------------- >Comment By: kumar mcmillan (kumar303) Date: 2007-04-12 20:38 Message: Logged In: YES user_id=540473 Originator: YES tested in SQLObject-0.10dev_r2521-py2.4.egg ... still broken ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 |
|
From: SourceForge.net <no...@so...> - 2007-04-12 20:34:07
|
Bugs item #1699518, was opened at 2007-04-12 20:34 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: General Group: SQLObject release (specify) Status: Open Resolution: None Priority: 5 Private: No Submitted By: kumar mcmillan (kumar303) Assigned to: Nobody/Anonymous (nobody) Summary: select(limit=n) - limit keyword is not recognized Initial Comment: 0.8.1 release here is a failing test case :( from sqlobject import * def test(): c = connectionForURI('sqlite:/:memory:') class Foo(SQLObject): bar = 1 Foo.createTable(connection=c) f = Foo(connection=c) f = Foo(connection=c) assert Foo.select(connection=c).count() == 2 assert Foo.select(connection=c, limit=1).count() == 1 if __name__ == '__main__': test() ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=1699518&group_id=74338 |