sqlobject-cvs Mailing List for SQLObject (Page 38)
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
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sub...@co...> - 2011-05-29 11:54:05
|
Author: phd Date: Sun May 29 05:53:58 2011 New Revision: 4396 Log: Merged revisions 4393:4395 from branch 1.0: A syntax incompatibility was fixed in SQLiteConnection that prevented SQLObject to be used with Python 2.4. Modified: SQLObject/trunk/docs/News.txt SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Modified: SQLObject/trunk/docs/News.txt ============================================================================== --- SQLObject/trunk/docs/News.txt Sun May 29 05:52:09 2011 (r4395) +++ SQLObject/trunk/docs/News.txt Sun May 29 05:53:58 2011 (r4396) @@ -28,6 +28,12 @@ * All 'mydict.has_key(name)' checks were replaced with 'name in mydict'. +SQLObject 1.0.1 +=============== + +* A syntax incompatibility was fixed in SQLiteConnection that prevented + SQLObject to be used with Python 2.4. + SQLObject 1.0.0 =============== Modified: SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Sun May 29 05:52:09 2011 (r4395) +++ SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Sun May 29 05:53:58 2011 (r4396) @@ -100,7 +100,7 @@ assert host is None and port is None, ( "SQLite can only be used locally (with a URI like " "sqlite:/file or sqlite:///file, not sqlite://%s%s)" % - (host, ':%r' % port if port else '')) + (host, port and ':%r' % port or '')) assert user is None and password is None, ( "You may not provide usernames or passwords for SQLite " "databases") |
From: <sub...@co...> - 2011-05-29 11:52:16
|
Author: phd Date: Sun May 29 05:52:09 2011 New Revision: 4395 Log: Reformatted paragraph. Modified: SQLObject/branches/1.0/docs/News.txt Modified: SQLObject/branches/1.0/docs/News.txt ============================================================================== --- SQLObject/branches/1.0/docs/News.txt Sun May 29 05:50:56 2011 (r4394) +++ SQLObject/branches/1.0/docs/News.txt Sun May 29 05:52:09 2011 (r4395) @@ -10,8 +10,8 @@ SQLObject 1.0.1 =============== -* A syntax incompatibility was fixed in SQLiteConnection that - prevented SQLObject to be used with Python 2.4. +* A syntax incompatibility was fixed in SQLiteConnection that prevented + SQLObject to be used with Python 2.4. SQLObject 1.0.0 =============== |
From: <sub...@co...> - 2011-05-29 11:51:02
|
Author: phd Date: Sun May 29 05:50:56 2011 New Revision: 4394 Log: Singular. Modified: SQLObject/branches/1.0/docs/News.txt Modified: SQLObject/branches/1.0/docs/News.txt ============================================================================== --- SQLObject/branches/1.0/docs/News.txt Sun May 29 05:46:27 2011 (r4393) +++ SQLObject/branches/1.0/docs/News.txt Sun May 29 05:50:56 2011 (r4394) @@ -10,7 +10,7 @@ SQLObject 1.0.1 =============== -* A syntax incompatibilities was fixed in SQLiteConnection that +* A syntax incompatibility was fixed in SQLiteConnection that prevented SQLObject to be used with Python 2.4. SQLObject 1.0.0 |
From: <sub...@co...> - 2011-05-29 11:46:34
|
Author: phd Date: Sun May 29 05:46:27 2011 New Revision: 4393 Log: A syntax incompatibilities was fixed in SQLiteConnection that prevented SQLObject to be used with Python 2.4. Modified: SQLObject/branches/1.0/docs/News.txt SQLObject/branches/1.0/sqlobject/sqlite/sqliteconnection.py Modified: SQLObject/branches/1.0/docs/News.txt ============================================================================== --- SQLObject/branches/1.0/docs/News.txt Sun May 29 05:42:56 2011 (r4392) +++ SQLObject/branches/1.0/docs/News.txt Sun May 29 05:46:27 2011 (r4393) @@ -7,8 +7,11 @@ .. _start: -SQLObject (trunk) -================= +SQLObject 1.0.1 +=============== + +* A syntax incompatibilities was fixed in SQLiteConnection that + prevented SQLObject to be used with Python 2.4. SQLObject 1.0.0 =============== Modified: SQLObject/branches/1.0/sqlobject/sqlite/sqliteconnection.py ============================================================================== --- SQLObject/branches/1.0/sqlobject/sqlite/sqliteconnection.py Sun May 29 05:42:56 2011 (r4392) +++ SQLObject/branches/1.0/sqlobject/sqlite/sqliteconnection.py Sun May 29 05:46:27 2011 (r4393) @@ -100,7 +100,7 @@ assert host is None and port is None, ( "SQLite can only be used locally (with a URI like " "sqlite:/file or sqlite:///file, not sqlite://%s%s)" % - (host, ':%r' % port if port else '')) + (host, port and ':%r' % port or '')) assert user is None and password is None, ( "You may not provide usernames or passwords for SQLite " "databases") |
From: <sub...@co...> - 2011-05-29 11:43:04
|
Author: phd Date: Sun May 29 05:42:56 2011 New Revision: 4392 Log: Merged revision 4390 from branch 0.15: added orderBy to the join column to fix order. Modified: SQLObject/trunk/sqlobject/tests/test_views.py Modified: SQLObject/trunk/sqlobject/tests/test_views.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/test_views.py Sun May 29 05:41:53 2011 (r4391) +++ SQLObject/trunk/sqlobject/tests/test_views.py Sun May 29 05:42:56 2011 (r4392) @@ -6,17 +6,17 @@ number = StringCol() calls = SQLMultipleJoin('PhoneCall') incoming = SQLMultipleJoin('PhoneCall', joinColumn='toID') - + class PhoneCall(SQLObject): phoneNumber = ForeignKey('PhoneNumber') to = ForeignKey('PhoneNumber') minutes = IntCol() - + class ViewPhoneCall(ViewSQLObject): class sqlmeta: idName = PhoneCall.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=PhoneCall.q.minutes) number = StringCol(dbName=PhoneNumber.q.number) phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id) @@ -26,7 +26,7 @@ class sqlmeta: idName = PhoneNumber.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)) numberOfCalls = IntCol(dbName=func.COUNT(PhoneCall.q.phoneNumberID)) number = StringCol(dbName=PhoneNumber.q.number) @@ -40,7 +40,7 @@ class sqlmeta: idName = ViewPhone.q.id clause = ViewPhone.q.id == PhoneCall.q.toID - + number = StringCol(dbName=ViewPhone.q.number) timesCalled = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) timesCalledLong = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) @@ -50,13 +50,13 @@ class ViewPhoneMore2(ViewPhoneMore): class sqlmeta: table = 'vpm' - + class ViewPhoneInnerAggregate(ViewPhone): twiceMinutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)*2) def setup_module(mod): - setupClass([mod.PhoneNumber,mod.PhoneCall]) + setupClass([mod.PhoneNumber, mod.PhoneCall]) mod.ViewPhoneCall._connection = mod.PhoneNumber._connection mod.ViewPhone._connection = mod.PhoneNumber._connection mod.ViewPhoneMore._connection = mod.PhoneNumber._connection @@ -123,11 +123,11 @@ assert s.count() == len(phones) s = ViewPhoneCall.select() assert s.count() == len(calls) - + def testSelect2(): s = ViewPhone.select(ViewPhone.q.number==phones[0].number) assert s.getOne().phoneNumber == phones[0] - + def testDistinctCount(): # This test is for SelectResults non-* based count when distinct # We're really just checking this doesn't raise anything due to lack of sqlrepr'ing |
From: <sub...@co...> - 2011-05-29 11:42:00
|
Author: phd Date: Sun May 29 05:41:53 2011 New Revision: 4391 Log: Merged revision 4390 from branch 0.15: added orderBy to the join column to fix order. Modified: SQLObject/branches/1.0/sqlobject/tests/test_views.py Modified: SQLObject/branches/1.0/sqlobject/tests/test_views.py ============================================================================== --- SQLObject/branches/1.0/sqlobject/tests/test_views.py Sun May 29 05:40:20 2011 (r4390) +++ SQLObject/branches/1.0/sqlobject/tests/test_views.py Sun May 29 05:41:53 2011 (r4391) @@ -6,17 +6,17 @@ number = StringCol() calls = SQLMultipleJoin('PhoneCall') incoming = SQLMultipleJoin('PhoneCall', joinColumn='toID') - + class PhoneCall(SQLObject): phoneNumber = ForeignKey('PhoneNumber') to = ForeignKey('PhoneNumber') minutes = IntCol() - + class ViewPhoneCall(ViewSQLObject): class sqlmeta: idName = PhoneCall.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=PhoneCall.q.minutes) number = StringCol(dbName=PhoneNumber.q.number) phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id) @@ -26,20 +26,21 @@ class sqlmeta: idName = PhoneNumber.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)) numberOfCalls = IntCol(dbName=func.COUNT(PhoneCall.q.phoneNumberID)) number = StringCol(dbName=PhoneNumber.q.number) phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id) calls = SQLMultipleJoin('PhoneCall', joinColumn='phoneNumberID') - vCalls = SQLMultipleJoin('ViewPhoneCall', joinColumn='phoneNumberID') + vCalls = SQLMultipleJoin('ViewPhoneCall', joinColumn='phoneNumberID', + orderBy='id') class ViewPhoneMore(ViewSQLObject): ''' View on top of view ''' class sqlmeta: idName = ViewPhone.q.id clause = ViewPhone.q.id == PhoneCall.q.toID - + number = StringCol(dbName=ViewPhone.q.number) timesCalled = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) timesCalledLong = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) @@ -49,13 +50,13 @@ class ViewPhoneMore2(ViewPhoneMore): class sqlmeta: table = 'vpm' - + class ViewPhoneInnerAggregate(ViewPhone): twiceMinutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)*2) def setup_module(mod): - setupClass([mod.PhoneNumber,mod.PhoneCall]) + setupClass([mod.PhoneNumber, mod.PhoneCall]) mod.ViewPhoneCall._connection = mod.PhoneNumber._connection mod.ViewPhone._connection = mod.PhoneNumber._connection mod.ViewPhoneMore._connection = mod.PhoneNumber._connection @@ -122,12 +123,12 @@ assert s.count() == len(phones) s = ViewPhoneCall.select() assert s.count() == len(calls) - + def testSelect2(): s = ViewPhone.select(ViewPhone.q.number==phones[0].number) assert s.getOne().phoneNumber == phones[0] - + def testDistinctCount(): # This test is for SelectResults non-* based count when distinct # We're really just checking this doesn't raise anything due to lack of sqlrepr'ing - assert ViewPhone.select(distinct=True).count() == 2 \ No newline at end of file + assert ViewPhone.select(distinct=True).count() == 2 |
From: <sub...@co...> - 2011-05-29 11:40:29
|
Author: phd Date: Sun May 29 05:40:20 2011 New Revision: 4390 Log: Added orderBy to the join column to fix order. Modified: SQLObject/branches/0.15/sqlobject/tests/test_views.py Modified: SQLObject/branches/0.15/sqlobject/tests/test_views.py ============================================================================== --- SQLObject/branches/0.15/sqlobject/tests/test_views.py Tue May 17 09:58:56 2011 (r4389) +++ SQLObject/branches/0.15/sqlobject/tests/test_views.py Sun May 29 05:40:20 2011 (r4390) @@ -6,17 +6,17 @@ number = StringCol() calls = SQLMultipleJoin('PhoneCall') incoming = SQLMultipleJoin('PhoneCall', joinColumn='toID') - + class PhoneCall(SQLObject): phoneNumber = ForeignKey('PhoneNumber') to = ForeignKey('PhoneNumber') minutes = IntCol() - + class ViewPhoneCall(ViewSQLObject): class sqlmeta: idName = PhoneCall.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=PhoneCall.q.minutes) number = StringCol(dbName=PhoneNumber.q.number) phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id) @@ -26,20 +26,21 @@ class sqlmeta: idName = PhoneNumber.q.id clause = PhoneCall.q.phoneNumberID==PhoneNumber.q.id - + minutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)) numberOfCalls = IntCol(dbName=func.COUNT(PhoneCall.q.phoneNumberID)) number = StringCol(dbName=PhoneNumber.q.number) phoneNumber = ForeignKey('PhoneNumber', dbName=PhoneNumber.q.id) calls = SQLMultipleJoin('PhoneCall', joinColumn='phoneNumberID') - vCalls = SQLMultipleJoin('ViewPhoneCall', joinColumn='phoneNumberID') + vCalls = SQLMultipleJoin('ViewPhoneCall', joinColumn='phoneNumberID', + orderBy='id') class ViewPhoneMore(ViewSQLObject): ''' View on top of view ''' class sqlmeta: idName = ViewPhone.q.id clause = ViewPhone.q.id == PhoneCall.q.toID - + number = StringCol(dbName=ViewPhone.q.number) timesCalled = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) timesCalledLong = IntCol(dbName=func.COUNT(PhoneCall.q.toID)) @@ -49,13 +50,13 @@ class ViewPhoneMore2(ViewPhoneMore): class sqlmeta: table = 'vpm' - + class ViewPhoneInnerAggregate(ViewPhone): twiceMinutes = IntCol(dbName=func.SUM(PhoneCall.q.minutes)*2) def setup_module(mod): - setupClass([mod.PhoneNumber,mod.PhoneCall]) + setupClass([mod.PhoneNumber, mod.PhoneCall]) mod.ViewPhoneCall._connection = mod.PhoneNumber._connection mod.ViewPhone._connection = mod.PhoneNumber._connection mod.ViewPhoneMore._connection = mod.PhoneNumber._connection @@ -122,12 +123,12 @@ assert s.count() == len(phones) s = ViewPhoneCall.select() assert s.count() == len(calls) - + def testSelect2(): s = ViewPhone.select(ViewPhone.q.number==phones[0].number) assert s.getOne().phoneNumber == phones[0] - + def testDistinctCount(): # This test is for SelectResults non-* based count when distinct # We're really just checking this doesn't raise anything due to lack of sqlrepr'ing - assert ViewPhone.select(distinct=True).count() == 2 \ No newline at end of file + assert ViewPhone.select(distinct=True).count() == 2 |
From: SourceForge.net <no...@so...> - 2011-05-26 16:31:56
|
Bugs item #3308035, was opened at 2011-05-26 18:31 Message generated for change (Tracker Item Submitted) made by cito You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3308035&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: SQLite Group: SQLObject release (specify) Status: Open Resolution: None Priority: 5 Private: No Submitted By: Christoph Zwerschke (cito) Assigned to: Nobody/Anonymous (nobody) Summary: Ternary operator breaks compatibility with Py < 2.5 Initial Comment: SQLObject 1.0.0 has in sqlobject/sqlite/sqliteconnection.py in line 103 the following ternary operator expression: ':%r' % port if port else '' This should be replaced with port and ':%r' % port or '' because otherwise importing the file gives a syntax error on Python < 2.5. Since there is a Py 2.4 egg on PyPI and in the same function even the decorator syntax for classmethods is avoided, it seems that the code is actually intended to work even with Python 2.3. After fixing this, please document the minimum required Python version and test with that version before releasing. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3308035&group_id=74338 |
From: <sub...@co...> - 2011-05-16 18:56:29
|
Author: fetchinson Date: Mon May 16 12:56:20 2011 New Revision: 4388 Log: New branch for python 3 compatibility Added: SQLObject/branches/py3k/ - copied from r4387, SQLObject/trunk/ |
Author: phd Date: Sun May 15 09:48:10 2011 New Revision: 4387 Log: The first patch by Daniel Fetchinson from a series of patches for python 3 compatibility: change all 'mydict.has_key(name)' type of checks with 'name in mydict'. Modified: SQLObject/trunk/docs/News.txt SQLObject/trunk/sqlobject/cache.py SQLObject/trunk/sqlobject/classregistry.py SQLObject/trunk/sqlobject/col.py SQLObject/trunk/sqlobject/dbconnection.py SQLObject/trunk/sqlobject/declarative.py SQLObject/trunk/sqlobject/include/pydispatch/dispatcher.py SQLObject/trunk/sqlobject/include/pydispatch/robustapply.py SQLObject/trunk/sqlobject/index.py SQLObject/trunk/sqlobject/inheritance/__init__.py SQLObject/trunk/sqlobject/joins.py SQLObject/trunk/sqlobject/main.py SQLObject/trunk/sqlobject/manager/command.py SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py SQLObject/trunk/sqlobject/postgres/pgconnection.py SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py SQLObject/trunk/sqlobject/sresults.py SQLObject/trunk/sqlobject/tests/dbtest.py SQLObject/trunk/sqlobject/util/moduleloader.py SQLObject/trunk/sqlobject/versioning/__init__.py Modified: SQLObject/trunk/docs/News.txt ============================================================================== --- SQLObject/trunk/docs/News.txt Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/docs/News.txt Sun May 15 09:48:10 2011 (r4387) @@ -21,11 +21,13 @@ now SQLObject uses text_factory instead and properly returns empty strings. -Source code ------------ +Source code and internals +------------------------- * Decorators @classmethod and @staticmethod are used everywhere. +* All 'mydict.has_key(name)' checks were replaced with 'name in mydict'. + SQLObject 1.0.0 =============== Modified: SQLObject/trunk/sqlobject/cache.py ============================================================================== --- SQLObject/trunk/sqlobject/cache.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/cache.py Sun May 15 09:48:10 2011 (r4387) @@ -230,9 +230,9 @@ return self.lock.acquire() try: - if self.cache.has_key(id): + if id in self.cache: del self.cache[id] - if self.expiredCache.has_key(id): + if id in self.expiredCache: del self.expiredCache[id] finally: self.lock.release() @@ -323,7 +323,7 @@ if cls is None: for cache in self.caches.values(): cache.clear() - elif self.caches.has_key(cls.__name__): + elif cls.__name__ in self.caches: self.caches[cls.__name__].clear() def tryGet(self, id, cls): @@ -356,7 +356,7 @@ if cls is None: for cache in self.caches.values(): cache.expireAll() - elif self.caches.has_key(cls.__name__): + elif cls.__name__ in self.caches: self.caches[cls.__name__].expireAll() def getAll(self, cls=None): Modified: SQLObject/trunk/sqlobject/classregistry.py ============================================================================== --- SQLObject/trunk/sqlobject/classregistry.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/classregistry.py Sun May 15 09:48:10 2011 (r4387) @@ -55,7 +55,7 @@ created. If it's already been created, the callback will be called immediately. """ - if self.classes.has_key(className): + if className in self.classes: callback(self.classes[className], *args, **kw) else: self.callbacks.setdefault(className, []).append((callback, args, kw)) @@ -90,7 +90,7 @@ getattr(sys.modules.get(cls.__module__), '__file__', '(unknown)'))) self.classes[cls.__name__] = cls - if self.callbacks.has_key(cls.__name__): + if cls.__name__ in self.callbacks: for callback, args, kw in self.callbacks[cls.__name__]: callback(cls, *args, **kw) del self.callbacks[cls.__name__] @@ -124,7 +124,7 @@ self.registries = {} def registry(self, item): - if not self.registries.has_key(item): + if item not in self.registries: self.registries[item] = ClassRegistry(item) return self.registries[item] Modified: SQLObject/trunk/sqlobject/col.py ============================================================================== --- SQLObject/trunk/sqlobject/col.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/col.py Sun May 15 09:48:10 2011 (r4387) @@ -1560,7 +1560,7 @@ def pushKey(kw, name, value): - if not kw.has_key(name): + if not name in kw: kw[name] = value all = [] Modified: SQLObject/trunk/sqlobject/dbconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/dbconnection.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/dbconnection.py Sun May 15 09:48:10 2011 (r4387) @@ -786,7 +786,7 @@ def _SO_delete(self, inst): cls = inst.__class__.__name__ - if not self._deletedCache.has_key(cls): + if not cls in self._deletedCache: self._deletedCache[cls] = [] self._deletedCache[cls].append(inst.id) meth = new.instancemethod(self._dbConnection._SO_delete.im_func, self, self.__class__) @@ -897,7 +897,7 @@ # I'm a little surprised we have to do this, but apparently # the object's private dictionary of attributes doesn't # override this descriptor. - if (obj is not None) and obj.__dict__.has_key('_connection'): + if (obj is not None) and '_connection' in obj.__dict__: return obj.__dict__['_connection'] return self.getConnection() @@ -978,14 +978,14 @@ def registerConnection(self, schemes, builder): for uriScheme in schemes: - assert not self.schemeBuilders.has_key(uriScheme) \ + assert not uriScheme in self.schemeBuilders \ or self.schemeBuilders[uriScheme] is builder, \ "A driver has already been registered for the URI scheme %s" % uriScheme self.schemeBuilders[uriScheme] = builder def registerConnectionInstance(self, inst): if inst.name: - assert not self.instanceNames.has_key(inst.name) \ + assert not inst.name in self.instanceNames \ or self.instanceNames[inst.name] is cls, \ "A instance has already been registered with the name %s" % inst.name assert inst.name.find(':') == -1, "You cannot include ':' in your class names (%r)" % cls.name @@ -997,7 +997,7 @@ uri += '?' + urllib.urlencode(args) else: uri += '&' + urllib.urlencode(args) - if self.cachedURIs.has_key(uri): + if uri in self.cachedURIs: return self.cachedURIs[uri] if uri.find(':') != -1: scheme, rest = uri.split(':', 1) @@ -1008,7 +1008,7 @@ conn = connCls.connectionFromURI(uri) else: # We just have a name, not a URI - assert self.instanceNames.has_key(uri), \ + assert uri in self.instanceNames, \ "No SQLObject driver exists under the name %s" % uri conn = self.instanceNames[uri] # @@: Do we care if we clobber another connection? @@ -1016,7 +1016,7 @@ return conn def dbConnectionForScheme(self, scheme): - assert self.schemeBuilders.has_key(scheme), ( + assert scheme in self.schemeBuilders, ( "No SQLObject driver exists for %s (only %s)" % (scheme, ', '.join(self.schemeBuilders.keys()))) return self.schemeBuilders[scheme]() Modified: SQLObject/trunk/sqlobject/declarative.py ============================================================================== --- SQLObject/trunk/sqlobject/declarative.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/declarative.py Sun May 15 09:48:10 2011 (r4387) @@ -63,7 +63,7 @@ self.type = type def __call__(self, *args, **kw): - assert not kw.has_key('self') and not kw.has_key('cls'), ( + assert not 'self' in kw and not 'cls' in kw, ( "You cannot use 'self' or 'cls' arguments to a " "classinstancemethod") return self.func(*((self.obj, self.type) + args), **kw) @@ -87,7 +87,7 @@ cls = type.__new__(meta, class_name, bases, new_attrs) for func in early_funcs: func(cls) - if new_attrs.has_key('__classinit__'): + if '__classinit__' in new_attrs: cls.__classinit__ = staticmethod(cls.__classinit__.im_func) cls.__classinit__(cls, new_attrs) for func in post_funcs: @@ -107,7 +107,7 @@ def __classinit__(cls, new_attrs): cls.declarative_count = counter.next() for name in cls.__mutableattributes__: - if not new_attrs.has_key(name): + if name not in new_attrs: setattr(cls, copy.copy(getattr(cls, name))) def __instanceinit__(self, new_attrs): @@ -119,7 +119,7 @@ % (self.__class__.__name__, name)) for name, value in new_attrs.items(): setattr(self, name, value) - if not new_attrs.has_key('declarative_count'): + if 'declarative_count' not in new_attrs: self.declarative_count = counter.next() def __init__(self, *args, **kw): @@ -127,7 +127,7 @@ assert len(self.__unpackargs__) == 2, \ "When using __unpackargs__ = ('*', varname), you must only provide a single variable name (you gave %r)" % self.__unpackargs__ name = self.__unpackargs__[1] - if kw.has_key(name): + if name in kw: raise TypeError( "keyword parameter '%s' was given by position and name" % name) @@ -140,14 +140,14 @@ len(self.__unpackargs__), len(args))) for name, arg in zip(self.__unpackargs__, args): - if kw.has_key(name): + if name in kw: raise TypeError( "keyword parameter '%s' was given by position and name" % name) kw[name] = arg - if kw.has_key('__alsocopy'): + if '__alsocopy' in kw: for name, value in kw['__alsocopy'].items(): - if not kw.has_key(name): + if name not in kw: if name in self.__mutableattributes__: value = copy.copy(value) kw[name] = value @@ -175,7 +175,7 @@ else: name = '%s class' % cls.__name__ v = cls.__dict__.copy() - if v.has_key('declarative_count'): + if 'declarative_count' in v: name = '%s %i' % (name, v['declarative_count']) del v['declarative_count'] # @@: simplifying repr: Modified: SQLObject/trunk/sqlobject/include/pydispatch/dispatcher.py ============================================================================== --- SQLObject/trunk/sqlobject/include/pydispatch/dispatcher.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/include/pydispatch/dispatcher.py Sun May 15 09:48:10 2011 (r4387) @@ -140,7 +140,7 @@ if weak: receiver = saferef.safeRef(receiver, onDelete=_removeReceiver) senderkey = id(sender) - if connections.has_key(senderkey): + if senderkey in connections: signals = connections[senderkey] else: connections[senderkey] = signals = {} @@ -160,7 +160,7 @@ receiverID = id(receiver) # get current set, remove any current references to # this receiver in the set, including back-references - if signals.has_key(signal): + if signal in signals: receivers = signals[signal] _removeOldBackRefs(senderkey, signal, receiver, receivers) else: @@ -296,7 +296,7 @@ for receiver in set: if receiver: # filter out dead instance-method weakrefs try: - if not receivers.has_key( receiver ): + if not receiver in receivers: receivers[receiver] = 1 yield receiver except TypeError: Modified: SQLObject/trunk/sqlobject/include/pydispatch/robustapply.py ============================================================================== --- SQLObject/trunk/sqlobject/include/pydispatch/robustapply.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/include/pydispatch/robustapply.py Sun May 15 09:48:10 2011 (r4387) @@ -32,7 +32,7 @@ receiver, codeObject, startIndex = function( receiver ) acceptable = codeObject.co_varnames[startIndex+len(arguments):codeObject.co_argcount] for name in codeObject.co_varnames[startIndex:startIndex+len(arguments)]: - if named.has_key( name ): + if name in named: raise TypeError( """Argument %r specified both positionally and as a keyword for calling %r"""% ( name, receiver, @@ -46,4 +46,4 @@ del named[arg] return receiver(*arguments, **named) - \ No newline at end of file + Modified: SQLObject/trunk/sqlobject/index.py ============================================================================== --- SQLObject/trunk/sqlobject/index.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/index.py Sun May 15 09:48:10 2011 (r4387) @@ -26,7 +26,7 @@ if args and kw: raise TypeError, "You cannot mix named and unnamed arguments" columns = [d['column'] for d in self.descriptions - if d.has_key('column')] + if 'column' in d] if kw and len(kw) != len(columns) or args and len(args) != len(columns): raise TypeError, ("get() takes exactly %d argument and an optional " "named argument 'connection' (%d given)" % ( @@ -49,12 +49,12 @@ for desc in columns: if not isinstance(desc, dict): desc = {'column': desc} - if desc.has_key('expression'): - assert not desc.has_key('column'), ( + if 'expression' in desc: + assert 'column' not in desc, ( 'You cannot provide both an expression and a column ' '(for %s in index %s in %s)' % (desc, self.name, self.soClass)) - assert not desc.has_key('length'), ( + assert 'length' not in desc, ( 'length does not apply to expressions (for %s in ' 'index %s in %s)' % (desc, self.name, self.soClass)) @@ -64,7 +64,7 @@ if not isinstance(columnName, str): columnName = columnName.name colDict = self.soClass.sqlmeta.columns - if not colDict.has_key(columnName): + if columnName not in colDict: for possible in colDict.values(): if possible.origName == columnName: column = possible @@ -91,7 +91,7 @@ uniqueOrIndex = 'INDEX' spec = [] for desc in self.descriptions: - if desc.has_key('expression'): + if 'expression' in desc: spec.append(self.getExpression(desc, 'sqlite')) else: spec.append(desc['column'].dbName) @@ -111,9 +111,9 @@ uniqueOrIndex = 'INDEX' spec = [] for desc in self.descriptions: - if desc.has_key('expression'): + if 'expression' in desc: spec.append(self.getExpression(desc, 'mysql')) - elif desc.has_key('length'): + elif 'length' in desc: spec.append('%s(%d)' % (desc['column'].dbName, desc['length'])) else: spec.append(desc['column'].dbName) Modified: SQLObject/trunk/sqlobject/inheritance/__init__.py ============================================================================== --- SQLObject/trunk/sqlobject/inheritance/__init__.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/inheritance/__init__.py Sun May 15 09:48:10 2011 (r4387) @@ -57,7 +57,7 @@ continue currentClass = childClass while currentClass: - if tableRegistryCopy.has_key(currentClass): + if currentClass in tableRegistryCopy: if currentClass in tableRegistry: #DSM: Remove this class as it is a parent one #DSM: of a needed children @@ -214,7 +214,7 @@ @classmethod def getColumns(sqlmeta): columns = sqlmeta.getAllColumns() - if columns.has_key('childName'): + if 'childName' in columns: del columns['childName'] return columns @@ -349,7 +349,7 @@ #DSM: Note: we can't use the ** call paremeter directly #DSM: as we must be able to delete items from the dictionary #DSM: (and our children must know that the items were removed!) - if kw.has_key('kw'): + if 'kw' in kw: kw = kw['kw'] #DSM: If we are the children of an inheritable class, #DSM: we must first create our parent Modified: SQLObject/trunk/sqlobject/joins.py ============================================================================== --- SQLObject/trunk/sqlobject/joins.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/joins.py Sun May 15 09:48:10 2011 (r4387) @@ -35,7 +35,7 @@ name = joinMethodName def withClass(self, soClass): - if self.kw.has_key('joinMethodName'): + if 'joinMethodName' in self.kw: self._joinMethodName = self.kw['joinMethodName'] del self.kw['joinMethodName'] return self.baseClass(creationOrder=self.creationOrder, Modified: SQLObject/trunk/sqlobject/main.py ============================================================================== --- SQLObject/trunk/sqlobject/main.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/main.py Sun May 15 09:48:10 2011 (r4387) @@ -92,9 +92,9 @@ elif var.startswith('_doc_'): props.setdefault(var[5:], {})['doc'] = value for var, setters in props.items(): - if len(setters) == 1 and setters.has_key('doc'): + if len(setters) == 1 and 'doc' in setters: continue - if d.has_key(var): + if var in d: if isinstance(d[var], (types.MethodType, types.FunctionType)): warnings.warn( "I tried to set the property %r, but it was " @@ -119,7 +119,7 @@ for var, value in d.items(): if isinstance(value, property): for prop in [value.fget, value.fset, value.fdel]: - if prop and not d.has_key(prop.__name__): + if prop and not prop.__name__ in d: delFunc(obj, var) break @@ -238,7 +238,7 @@ def __classinit__(cls, new_attrs): for attr in cls._unshared_attributes: - if not new_attrs.has_key(attr): + if attr not in new_attrs: setattr(cls, attr, None) declarative.setup_attributes(cls, new_attrs) @@ -464,17 +464,17 @@ del sqlmeta.columnDefinitions[name] sqlmeta.columnList.remove(column) delattr(soClass, rawGetterName(name)) - if sqlmeta._plainGetters.has_key(name): + if name in sqlmeta._plainGetters: delattr(soClass, getterName(name)) delattr(soClass, rawSetterName(name)) - if sqlmeta._plainSetters.has_key(name): + if name in sqlmeta._plainSetters: delattr(soClass, setterName(name)) if column.foreignKey: delattr(soClass, rawGetterName(soClass.sqlmeta.style.instanceIDAttrToAttr(name))) - if sqlmeta._plainForeignGetters.has_key(name): + if name in sqlmeta._plainForeignGetters: delattr(soClass, getterName(name)) delattr(soClass, rawSetterName(soClass.sqlmeta.style.instanceIDAttrToAttr(name))) - if sqlmeta._plainForeignSetters.has_key(name): + if name in sqlmeta._plainForeignSetters: delattr(soClass, setterName(name)) if column.alternateMethodName: delattr(soClass, column.alternateMethodName) @@ -565,15 +565,15 @@ # by index. sqlmeta.joins[i] = None delattr(soClass, rawGetterName(meth)) - if sqlmeta._plainJoinGetters.has_key(meth): + if meth in sqlmeta._plainJoinGetters: delattr(soClass, getterName(meth)) if hasattr(join, 'remove'): delattr(soClass, '_SO_remove' + join.addRemovePrefix) - if sqlmeta._plainJoinRemovers.has_key(meth): + if meth in sqlmeta._plainJoinRemovers: delattr(soClass, 'remove' + join.addRemovePrefix) if hasattr(join, 'add'): delattr(soClass, '_SO_add' + join.addRemovePrefix) - if sqlmeta._plainJoinAdders.has_key(meth): + if meth in sqlmeta._plainJoinAdders: delattr(soClass, 'add' + join.addRemovePrefix) if soClass._SO_finishedClassCreation: @@ -728,11 +728,11 @@ if not is_base: cls._SO_cleanDeprecatedAttrs(new_attrs) - if new_attrs.has_key('_connection'): + if '_connection' in new_attrs: connection = new_attrs['_connection'] del cls._connection - assert not new_attrs.has_key('connection') - elif new_attrs.has_key('connection'): + assert 'connection' not in new_attrs + elif 'connection' in new_attrs: connection = new_attrs['connection'] del cls.connection else: @@ -818,7 +818,7 @@ inheritance. Lastly it calls sqlmeta.setClass, which handles much of the setup. """ - if (not new_attrs.has_key('sqlmeta') + if ('sqlmeta' not in new_attrs and not is_base): # We have to create our own subclass, usually. # type(className, bases_tuple, attr_dict) creates a new subclass. @@ -859,7 +859,7 @@ a deprecation warning is given. """ for attr in (): - if new_attrs.has_key(attr): + if attr in new_attrs: deprecated("%r is deprecated and read-only; please do " "not use it in your classes until it is fully " "deprecated" % attr, level=1, stacklevel=5) @@ -1056,7 +1056,7 @@ # Filter out items that don't map to column names. # Those will be set directly on the object using # setattr(obj, name, value). - is_column = self.sqlmeta._plainSetters.has_key + is_column = lambda _c: _c in self.sqlmeta._plainSetters f_is_column = lambda item: is_column(item[0]) f_not_column = lambda item: not is_column(item[0]) items = kw.items() @@ -1190,14 +1190,14 @@ # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: - if kw.has_key('_SO_fetch_no_create'): + if '_SO_fetch_no_create' in kw: return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, self, kw, post_funcs) # Pass the connection object along if we were given one. - if kw.has_key('connection'): + if 'connection' in kw: connection = kw.pop('connection') if getattr(self, '_connection', None) is not connection: self._connection = connection @@ -1205,7 +1205,7 @@ self._SO_writeLock = threading.Lock() - if kw.has_key('id'): + if 'id' in kw: id = self.sqlmeta.idType(kw['id']) del kw['id'] else: @@ -1238,7 +1238,7 @@ # Then we check if the column wasn't passed in, and # if not we try to get the default. - if not kw.has_key(column.name) and not kw.has_key(column.foreignName): + if column.name not in kw and column.foreignName not in kw: default = column.default # If we don't get it, it's an error: Modified: SQLObject/trunk/sqlobject/manager/command.py ============================================================================== --- SQLObject/trunk/sqlobject/manager/command.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/manager/command.py Sun May 15 09:48:10 2011 (r4387) @@ -65,7 +65,7 @@ existing[col.dbName] = col missing = {} for col in soClass.sqlmeta.columnList: - if existing.has_key(col.dbName): + if col.dbName in existing: del existing[col.dbName] else: missing[col.dbName] = col @@ -220,7 +220,7 @@ using the dependency_stack to detect any circular reference. """ # Return value from the cache if already calculated - if dependency_levels.has_key(cls): + if cls in dependency_levels: return dependency_levels[cls] # Check for circular references if cls in dependency_stack: @@ -766,7 +766,7 @@ existing[col.dbName] = col missing = {} for col in soClass.sqlmeta.columnList: - if existing.has_key(col.dbName): + if col.dbName in existing: del existing[col.dbName] else: missing[col.dbName] = col @@ -968,7 +968,7 @@ for fn in os.listdir(last_version_dir): if not fn.endswith('.sql'): continue - if not files_copy.has_key(fn): + if not fn in files_copy: if v > 1: print "Missing file %s" % fn break Modified: SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py Sun May 15 09:48:10 2011 (r4387) @@ -269,7 +269,7 @@ if default is not None: kw['default'] = default - if keymap.has_key(field_name): + if field_name in keymap: kw['foreignKey'] = keymap[field_name] results.append(colClass(**kw)) Modified: SQLObject/trunk/sqlobject/postgres/pgconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/postgres/pgconnection.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/postgres/pgconnection.py Sun May 15 09:48:10 2011 (r4387) @@ -258,7 +258,7 @@ for field, t, notnull, defaultstr in colData: if field == primaryKey: continue - if keymap.has_key(field): + if field in keymap: colClass = col.ForeignKey kw = {'foreignKey': soClass.sqlmeta.style.dbTableToPythonClass(keymap[field])} name = soClass.sqlmeta.style.dbColumnToPythonAttr(field) Modified: SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Sun May 15 09:48:10 2011 (r4387) @@ -139,7 +139,7 @@ return conn threadid = thread.get_ident() if (self._pool is not None - and self._threadPool.has_key(threadid)): + and threadid in self._threadPool): conn = self._threadPool[threadid] del self._threadPool[threadid] if conn in self._pool: @@ -163,7 +163,7 @@ threadid = self._threadOrigination.get(id(conn)) DBAPI.releaseConnection(self, conn, explicit=explicit) if (self._pool is not None and threadid - and not self._threadPool.has_key(threadid)): + and threadid not in self._threadPool): self._threadPool[threadid] = conn else: if self._pool and conn in self._pool: Modified: SQLObject/trunk/sqlobject/sresults.py ============================================================================== --- SQLObject/trunk/sqlobject/sresults.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/sresults.py Sun May 15 09:48:10 2011 (r4387) @@ -23,7 +23,7 @@ else: orderBy = self._mungeOrderBy(orderBy) ops['dbOrderBy'] = orderBy - if ops.has_key('connection') and ops['connection'] is None: + if 'connection' in ops 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), \ Modified: SQLObject/trunk/sqlobject/tests/dbtest.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/dbtest.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/tests/dbtest.py Sun May 15 09:48:10 2011 (r4387) @@ -99,7 +99,7 @@ def getConnectionURI(): name = conftest.option.Database - if conftest.connectionShortcuts.has_key(name): + if name in conftest.connectionShortcuts: name = conftest.connectionShortcuts[name] return name Modified: SQLObject/trunk/sqlobject/util/moduleloader.py ============================================================================== --- SQLObject/trunk/sqlobject/util/moduleloader.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/util/moduleloader.py Sun May 15 09:48:10 2011 (r4387) @@ -9,7 +9,7 @@ return mod def load_module_from_name(filename, module_name): - if sys.modules.has_key(module_name): + if module_name in sys.modules: return sys.modules[module_name] init_filename = os.path.join(os.path.dirname(filename), '__init__.py') if not os.path.exists(init_filename): @@ -22,7 +22,7 @@ f.write('#\n') f.close() fp = None - if sys.modules.has_key(module_name): + if module_name in sys.modules: return sys.modules[module_name] if '.' in module_name: parent_name = '.'.join(module_name.split('.')[:-1]) Modified: SQLObject/trunk/sqlobject/versioning/__init__.py ============================================================================== --- SQLObject/trunk/sqlobject/versioning/__init__.py Sun May 15 09:36:33 2011 (r4386) +++ SQLObject/trunk/sqlobject/versioning/__init__.py Sun May 15 09:48:10 2011 (r4387) @@ -36,7 +36,7 @@ return super(Version, cls).select(clause, *args, **kw) def __getattr__(self, attr): - if self.__dict__.has_key(attr): + if attr in self.__dict__: return self.__dict__[attr] else: return getattr(self.master, attr) |
From: <sub...@co...> - 2011-05-15 15:36:42
|
Author: phd Date: Sun May 15 09:36:33 2011 New Revision: 4386 Log: Better description of the change as a feature. Modified: SQLObject/trunk/docs/News.txt Modified: SQLObject/trunk/docs/News.txt ============================================================================== --- SQLObject/trunk/docs/News.txt Sun May 8 10:55:26 2011 (r4385) +++ SQLObject/trunk/docs/News.txt Sun May 15 09:36:33 2011 (r4386) @@ -15,19 +15,17 @@ * SelectResults (returned from .select()) is allowed in IN(column, list). +* A different workaround is used in SQLiteConnection to prevent PySQLite + from converting strings to unicode - in the case of a registered text + conversion function PySQLite silently converts empty strings to Nones; + now SQLObject uses text_factory instead and properly returns empty + strings. + Source code ----------- * Decorators @classmethod and @staticmethod are used everywhere. -Internals ---------- - -* A different workaround is used in SQLiteConnection to prevent PySQLite - from converting strings to unicode - in the case of a registered text - conversion function PySQLite silently converts empty strings to Nones; - now SQLObject uses text_factory instead. - SQLObject 1.0.0 =============== |
Author: phd Date: Sun May 8 10:55:26 2011 New Revision: 4385 Log: Decorators @classmethod and @staticmethod are used everywhere. Modified: SQLObject/trunk/docs/News.txt SQLObject/trunk/docs/TODO.txt SQLObject/trunk/sqlobject/boundattributes.py SQLObject/trunk/sqlobject/col.py SQLObject/trunk/sqlobject/dbconnection.py SQLObject/trunk/sqlobject/declarative.py SQLObject/trunk/sqlobject/firebird/firebirdconnection.py SQLObject/trunk/sqlobject/inheritance/__init__.py SQLObject/trunk/sqlobject/main.py SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py SQLObject/trunk/sqlobject/mssql/mssqlconnection.py SQLObject/trunk/sqlobject/mysql/mysqlconnection.py SQLObject/trunk/sqlobject/postgres/pgconnection.py SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py SQLObject/trunk/sqlobject/sybase/sybaseconnection.py SQLObject/trunk/sqlobject/tests/dbtest.py SQLObject/trunk/sqlobject/tests/test_boundattributes.py SQLObject/trunk/sqlobject/tests/test_declarative.py SQLObject/trunk/sqlobject/tests/test_reparent_sqlmeta.py SQLObject/trunk/sqlobject/versioning/__init__.py SQLObject/trunk/sqlobject/views.py Modified: SQLObject/trunk/docs/News.txt ============================================================================== --- SQLObject/trunk/docs/News.txt Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/docs/News.txt Sun May 8 10:55:26 2011 (r4385) @@ -15,6 +15,11 @@ * SelectResults (returned from .select()) is allowed in IN(column, list). +Source code +----------- + +* Decorators @classmethod and @staticmethod are used everywhere. + Internals --------- Modified: SQLObject/trunk/docs/TODO.txt ============================================================================== --- SQLObject/trunk/docs/TODO.txt Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/docs/TODO.txt Sun May 8 10:55:26 2011 (r4385) @@ -1,8 +1,6 @@ TODO ---- -* Decorators @classmethod and @staticmethod. - * Declare one encoding for all UnicodeCol's per table or even per connection. Don't forget about fromDatabase. Modified: SQLObject/trunk/sqlobject/boundattributes.py ============================================================================== --- SQLObject/trunk/sqlobject/boundattributes.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/boundattributes.py Sun May 8 10:55:26 2011 (r4385) @@ -68,6 +68,7 @@ declarative.Declarative.__instanceinit__(self, new_attrs) self.__dict__['_all_attrs'] = self._add_attrs(self, new_attrs) + @staticmethod def _add_attrs(this_object, new_attrs): private = this_object._private_variables all_attrs = list(this_object._all_attrs) @@ -77,8 +78,8 @@ if key not in all_attrs: all_attrs.append(key) return tuple(all_attrs) - _add_attrs = staticmethod(_add_attrs) + @declarative.classinstancemethod def __addtoclass__(self, cls, added_class, attr_name): me = self or cls attrs = {} @@ -101,18 +102,14 @@ me.set_object(added_class, attr_name, obj) - __addtoclass__ = declarative.classinstancemethod(__addtoclass__) - + @classmethod def set_object(cls, added_class, attr_name, obj): setattr(added_class, attr_name, obj) - set_object = classmethod(set_object) - + @classmethod def make_object(cls, added_class, attr_name, *args, **attrs): raise NotImplementedError - make_object = classmethod(make_object) - def __setattr__(self, name, value): self.__dict__['_all_attrs'] = self._add_attrs(self, {name: value}) self.__dict__[name] = value Modified: SQLObject/trunk/sqlobject/col.py ============================================================================== --- SQLObject/trunk/sqlobject/col.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/col.py Sun May 8 10:55:26 2011 (r4385) @@ -1136,6 +1136,7 @@ class DateTimeCol(Col): baseClass = SODateTimeCol + @staticmethod def now(): if default_datetime_implementation == DATETIME_IMPLEMENTATION: return datetime.datetime.now() @@ -1145,7 +1146,6 @@ assert 0, ("No datetime implementation available " "(DATETIME_IMPLEMENTATION=%r)" % DATETIME_IMPLEMENTATION) - now = staticmethod(now) class DateValidator(DateTimeValidator): Modified: SQLObject/trunk/sqlobject/dbconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/dbconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/dbconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -129,14 +129,15 @@ db = db[1:] return uri + urllib.quote(db) + @classmethod def connectionFromOldURI(cls, uri): return cls._connectionFromParams(*cls._parseOldURI(uri)) - connectionFromOldURI = classmethod(connectionFromOldURI) + @classmethod def connectionFromURI(cls, uri): return cls._connectionFromParams(*cls._parseURI(uri)) - connectionFromURI = classmethod(connectionFromURI) + @staticmethod def _parseOldURI(uri): schema, rest = uri.split(':', 1) assert rest.startswith('/'), "URIs must start with scheme:/ -- you did not include a / (in %r)" % rest @@ -185,8 +186,8 @@ argvalue = urllib.unquote(argvalue) args[argname] = argvalue return user, password, host, port, path, args - _parseOldURI = staticmethod(_parseOldURI) + @staticmethod def _parseURI(uri): protocol, request = urllib.splittype(uri) user, password, port = None, None, None @@ -224,7 +225,6 @@ args[name] = value return user, password, host, port, path, args - _parseURI = staticmethod(_parseURI) def soClassAdded(self, soClass): """ Modified: SQLObject/trunk/sqlobject/declarative.py ============================================================================== --- SQLObject/trunk/sqlobject/declarative.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/declarative.py Sun May 8 10:55:26 2011 (r4385) @@ -158,6 +158,7 @@ kw['__alsocopy'] = self.__dict__ return self.__class__(*args, **kw) + @classinstancemethod def singleton(self, cls): if self: return self @@ -165,8 +166,8 @@ if not hasattr(cls, name): setattr(cls, name, cls(declarative_count=cls.declarative_count)) return getattr(cls, name) - singleton = classinstancemethod(singleton) + @classinstancemethod def __repr__(self, cls): if self: name = '%s object' % self.__class__.__name__ @@ -188,15 +189,13 @@ else: return '<%s %s>' % (name, ' '.join(args)) + @staticmethod def _repr_vars(dictNames): names = [n for n in dictNames if not n.startswith('_') and n != 'declarative_count'] names.sort() return names - _repr_vars = staticmethod(_repr_vars) - - __repr__ = classinstancemethod(__repr__) def setup_attributes(cls, new_attrs): for name, value in new_attrs.items(): Modified: SQLObject/trunk/sqlobject/firebird/firebirdconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/firebird/firebirdconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/firebird/firebirdconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -31,6 +31,7 @@ DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, auth, password, host, port, path, args): if not password: password = 'masterkey' @@ -41,7 +42,6 @@ path = path[1:] path = path.replace('/', os.sep) return cls(host, port, db=path, user=auth, password=password, **args) - _connectionFromParams = classmethod(_connectionFromParams) def _runWithConnection(self, meth, *args): if not self.autoCommit: @@ -104,6 +104,7 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def _queryAddLimitOffset(cls, query, start, end): """Firebird slaps the limit and offset (actually 'first' and 'skip', respectively) statement right after the select.""" @@ -119,7 +120,6 @@ return ' '.join([limit_str, match.group(2)]) else: return query - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createTable(self, soClass): self.query('CREATE TABLE %s (\n%s\n)' % \ Modified: SQLObject/trunk/sqlobject/inheritance/__init__.py ============================================================================== --- SQLObject/trunk/sqlobject/inheritance/__init__.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/inheritance/__init__.py Sun May 8 10:55:26 2011 (r4385) @@ -93,6 +93,7 @@ return clone.accumulateMany(skipInherited=True, *attributes) class InheritableSQLMeta(sqlmeta): + @classmethod def addColumn(sqlmeta, columnDef, changeSchema=False, connection=None, childUpdate=False): soClass = sqlmeta.soClass #DSM: Try to add parent properties to the current class @@ -133,8 +134,7 @@ c.sqlmeta.addColumn(columnDef, connection=connection, childUpdate=True) if q: setattr(c.q, columnDef.name, q) - addColumn = classmethod(addColumn) - + @classmethod def delColumn(sqlmeta, column, changeSchema=False, connection=None, childUpdate=False): if childUpdate: soClass = sqlmeta.soClass @@ -157,8 +157,7 @@ c.sqlmeta.delColumn(column, changeSchema=changeSchema, connection=connection, childUpdate=True) - delColumn = classmethod(delColumn) - + @classmethod def addJoin(sqlmeta, joinDef, childUpdate=False): soClass = sqlmeta.soClass #DSM: Try to add parent properties to the current class @@ -188,8 +187,7 @@ for c in sqlmeta.childClasses.values(): c.sqlmeta.addJoin(joinDef, childUpdate=True) - addJoin = classmethod(addJoin) - + @classmethod def delJoin(sqlmeta, joinDef, childUpdate=False): if childUpdate: soClass = sqlmeta.soClass @@ -204,8 +202,7 @@ for c in sqlmeta.childClasses.values(): c.sqlmeta.delJoin(joinDef, childUpdate=True) - delJoin = classmethod(delJoin) - + @classmethod def getAllColumns(sqlmeta): columns = sqlmeta.columns.copy() sm = sqlmeta @@ -213,14 +210,13 @@ columns.update(sm.parentClass.sqlmeta.columns) sm = sm.parentClass.sqlmeta return columns - getAllColumns = classmethod(getAllColumns) + @classmethod def getColumns(sqlmeta): columns = sqlmeta.getAllColumns() if columns.has_key('childName'): del columns['childName'] return columns - getColumns = classmethod(getColumns) class InheritableSQLObject(SQLObject): @@ -249,7 +245,7 @@ getattr(currentClass.q, column.name)) currentClass = currentClass.sqlmeta.parentClass - # @classmethod + @classmethod def _SO_setupSqlmeta(cls, new_attrs, is_base): # Note: cannot use super(InheritableSQLObject, cls)._SO_setupSqlmeta - # InheritableSQLObject is not defined when it's __classinit__ @@ -284,8 +280,7 @@ if not sqlmeta.childName: sqlmeta.childName = cls.__name__ - _SO_setupSqlmeta = classmethod(_SO_setupSqlmeta) - + @classmethod def get(cls, id, connection=None, selectResults=None, childResults=None, childUpdate=False): val = super(InheritableSQLObject, cls).get(id, connection, selectResults) @@ -318,8 +313,7 @@ #DSM: We can now return ourself return val - get = classmethod(get) - + @classmethod def _notifyFinishClassCreation(cls): sqlmeta = cls.sqlmeta # verify names of added columns @@ -347,7 +341,6 @@ # There are no joins - call addJoin to propagate joins # from parent classes to children sqlmeta.addJoin(None) - _notifyFinishClassCreation = classmethod(_notifyFinishClassCreation) def _create(self, id, **kw): @@ -400,14 +393,15 @@ # TC: Reraise the original exception raise + @classmethod def _findAlternateID(cls, name, dbName, value, connection=None): result = list(cls.selectBy(connection, **{name: value})) if not result: return result, None obj = result[0] return [obj.id], obj - _findAlternateID = classmethod(_findAlternateID) + @classmethod def select(cls, clause=None, *args, **kwargs): parentClass = cls.sqlmeta.parentClass childUpdate = kwargs.pop('childUpdate', None) @@ -469,8 +463,8 @@ else: return super(InheritableSQLObject, cls).select( clause, *args, **kwargs) - select = classmethod(select) + @classmethod def selectBy(cls, connection=None, **kw): clause = [] foreignColumns = {} @@ -504,8 +498,6 @@ conn = connection or cls._connection return cls.SelectResultsClass(cls, clause, connection=conn) - selectBy = classmethod(selectBy) - def destroySelf(self): #DSM: If this object has parents, recursivly kill them if hasattr(self, '_parent') and self._parent: Modified: SQLObject/trunk/sqlobject/main.py ============================================================================== --- SQLObject/trunk/sqlobject/main.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/main.py Sun May 8 10:55:26 2011 (r4385) @@ -245,11 +245,11 @@ def __init__(self, instance): self.instance = weakref.proxy(instance) + @classmethod def send(cls, signal, *args, **kw): events.send(signal, cls.soClass, *args, **kw) - send = classmethod(send) - + @classmethod def setClass(cls, soClass): cls.soClass = soClass if not cls.style: @@ -288,8 +288,6 @@ cls.joins = [] cls.joinDefinitions = cls.joinDefinitions[:] - setClass = classmethod(setClass) - ############################################################ ## Adding special values, like columns and indexes ############################################################ @@ -298,6 +296,7 @@ ## Column handling ######################################## + @classmethod def addColumn(cls, columnDef, changeSchema=False, connection=None): post_funcs = [] cls.send(events.AddColumnSignal, cls.soClass, connection, @@ -433,8 +432,7 @@ for func in post_funcs: func(soClass, column) - addColumn = classmethod(addColumn) - + @classmethod def addColumnsFromDatabase(sqlmeta, connection=None): soClass = sqlmeta.soClass conn = connection or soClass._connection @@ -444,8 +442,7 @@ columnDef.name = columnDef.name.encode('ascii') sqlmeta.addColumn(columnDef) - addColumnsFromDatabase = classmethod(addColumnsFromDatabase) - + @classmethod def delColumn(cls, column, changeSchema=False, connection=None): sqlmeta = cls soClass = sqlmeta.soClass @@ -493,12 +490,11 @@ for func in post_funcs: func(soClass, column) - delColumn = classmethod(delColumn) - ######################################## ## Join handling ######################################## + @classmethod def addJoin(cls, joinDef): sqlmeta = cls soClass = cls.soClass @@ -547,8 +543,7 @@ if soClass._SO_finishedClassCreation: makeProperties(soClass) - addJoin = classmethod(addJoin) - + @classmethod def delJoin(sqlmeta, joinDef): soClass = sqlmeta.soClass for join in sqlmeta.joins: @@ -585,26 +580,24 @@ unmakeProperties(soClass) makeProperties(soClass) - delJoin = classmethod(delJoin) - ######################################## ## Indexes ######################################## + @classmethod def addIndex(cls, indexDef): cls.indexDefinitions.append(indexDef) index = indexDef.withClass(cls.soClass) cls.indexes.append(index) setattr(cls.soClass, index.name, index) - addIndex = classmethod(addIndex) ######################################## ## Utility methods ######################################## + @classmethod def getColumns(sqlmeta): return sqlmeta.columns.copy() - getColumns = classmethod(getColumns) def asDict(self): """ @@ -616,6 +609,7 @@ result['id'] = self.instance.id return result + @classmethod def expireAll(sqlmeta, connection=None): """ Expire all instances of this class. @@ -627,7 +621,6 @@ for item in cache_set.getAll(soClass): item.expire() - expireAll = classmethod(expireAll) sqlhub = dbconnection.ConnectionHub() @@ -816,7 +809,7 @@ classregistry.registry(sqlmeta.registry).addClass(cls) - # @classmethod + @classmethod def _SO_setupSqlmeta(cls, new_attrs, is_base): """ This fixes up the sqlmeta attribute. It handles both the case @@ -858,9 +851,7 @@ if not is_base: # Do not pollute the base sqlmeta class cls.sqlmeta.setClass(cls) - _SO_setupSqlmeta = classmethod(_SO_setupSqlmeta) - - # @classmethod + @classmethod def _SO_cleanDeprecatedAttrs(cls, new_attrs): """ This removes attributes on SQLObject subclasses that have @@ -873,8 +864,7 @@ "not use it in your classes until it is fully " "deprecated" % attr, level=1, stacklevel=5) - _SO_cleanDeprecatedAttrs = classmethod(_SO_cleanDeprecatedAttrs) - + @classmethod def get(cls, id, connection=None, selectResults=None): assert id is not None, 'None is not a possible id for %s' % cls.__name__ @@ -906,11 +896,9 @@ val._SO_writeLock.release() return val - get = classmethod(get) - + @classmethod def _notifyFinishClassCreation(cls): pass - _notifyFinishClassCreation = classmethod(_notifyFinishClassCreation) def _init(self, id, connection=None, selectResults=None): assert id is not None @@ -1310,6 +1298,7 @@ def _SO_getID(self, obj): return getID(obj) + @classmethod def _findAlternateID(cls, name, dbName, value, connection=None): if isinstance(name, str): name = (name,) @@ -1328,8 +1317,8 @@ [cls.sqlmeta.idName] + [column.dbName for column in cls.sqlmeta.columnList], condition), None - _findAlternateID = classmethod(_findAlternateID) + @classmethod def _SO_fetchAlternateID(cls, name, dbName, value, connection=None, idxName=None): result, obj = cls._findAlternateID(name, dbName, value, connection) if not result: @@ -1348,12 +1337,12 @@ else: obj = cls.get(result[0], selectResults=result[1:]) return obj - _SO_fetchAlternateID = classmethod(_SO_fetchAlternateID) + @classmethod def _SO_depends(cls): return findDependencies(cls.__name__, cls.sqlmeta.registry) - _SO_depends = classmethod(_SO_depends) + @classmethod def select(cls, clause=None, clauseTables=None, orderBy=NoDefault, limit=None, lazyColumns=False, reversed=False, @@ -1368,22 +1357,20 @@ distinct=distinct, connection=connection, join=join, forUpdate=forUpdate) - select = classmethod(select) + @classmethod def selectBy(cls, connection=None, **kw): conn = connection or cls._connection return cls.SelectResultsClass(cls, conn._SO_columnClause(cls, kw), connection=conn) - selectBy = classmethod(selectBy) - + @classmethod def tableExists(cls, connection=None): conn = connection or cls._connection return conn.tableExists(cls.sqlmeta.table) - tableExists = classmethod(tableExists) - + @classmethod def dropTable(cls, ifExists=False, dropJoinTables=True, cascade=False, connection=None): conn = connection or cls._connection @@ -1400,8 +1387,8 @@ connection.query(sql) for func in post_funcs: func(cls, conn) - dropTable = classmethod(dropTable) + @classmethod def createTable(cls, ifNotExists=False, createJoinTables=True, createIndexes=True, applyConstraints=True, connection=None): @@ -1427,8 +1414,8 @@ for func in post_funcs: func(cls, conn) return extra_sql - createTable = classmethod(createTable) + @classmethod def createTableSQL(cls, createJoinTables=True, createIndexes=True, connection=None): conn = connection or cls._connection @@ -1442,8 +1429,8 @@ if index_sql: sql += ';\n' + index_sql return sql, constraints - createTableSQL = classmethod(createTableSQL) + @classmethod def createJoinTables(cls, ifNotExists=False, connection=None): conn = connection or cls._connection for join in cls._getJoinsToCreate(): @@ -1451,24 +1438,24 @@ conn.tableExists(join.intermediateTable)): continue conn._SO_createJoinTable(join) - createJoinTables = classmethod(createJoinTables) + @classmethod def createJoinTablesSQL(cls, connection=None): conn = connection or cls._connection sql = [] for join in cls._getJoinsToCreate(): sql.append(conn._SO_createJoinTableSQL(join)) return ';\n'.join(sql) - createJoinTablesSQL = classmethod(createJoinTablesSQL) + @classmethod def createIndexes(cls, ifNotExists=False, connection=None): conn = connection or cls._connection for index in cls.sqlmeta.indexes: if not index: continue conn._SO_createIndex(cls, index) - createIndexes = classmethod(createIndexes) + @classmethod def createIndexesSQL(cls, connection=None): conn = connection or cls._connection sql = [] @@ -1477,8 +1464,8 @@ continue sql.append(conn.createIndexSQL(cls, index)) return ';\n'.join(sql) - createIndexesSQL = classmethod(createIndexesSQL) + @classmethod def _getJoinsToCreate(cls): joins = [] for join in cls.sqlmeta.joins: @@ -1490,8 +1477,8 @@ continue joins.append(join) return joins - _getJoinsToCreate = classmethod(_getJoinsToCreate) + @classmethod def dropJoinTables(cls, ifExists=False, connection=None): conn = connection or cls._connection for join in cls.sqlmeta.joins: @@ -1506,8 +1493,7 @@ continue conn._SO_dropJoinTable(join) - dropJoinTables = classmethod(dropJoinTables) - + @classmethod def clearTable(cls, connection=None, clearJoinTables=True): # 3-03 @@: Maybe this should check the cache... but it's # kind of crude anyway, so... @@ -1516,7 +1502,6 @@ if clearJoinTables: for join in cls._getJoinsToCreate(): conn.clearTable(join.intermediateTable) - clearTable = classmethod(clearTable) def destroySelf(self): post_funcs = [] @@ -1590,25 +1575,22 @@ for func in post_funcs: func(self) + @classmethod def delete(cls, id, connection=None): obj = cls.get(id, connection=connection) obj.destroySelf() - delete = classmethod(delete) - + @classmethod def deleteMany(cls, where=NoDefault, connection=None): conn = connection or cls._connection conn.query(conn.sqlrepr(sqlbuilder.Delete(cls.sqlmeta.table, where))) - deleteMany = classmethod(deleteMany) - + @classmethod def deleteBy(cls, connection=None, **kw): conn = connection or cls._connection conn.query(conn.sqlrepr(sqlbuilder.Delete(cls.sqlmeta.table, conn._SO_columnClause(cls, kw)))) - deleteBy = classmethod(deleteBy) - def __repr__(self): if not hasattr(self, 'id'): # Object initialization not finished. No attributes can be read. @@ -1621,19 +1603,17 @@ def __sqlrepr__(self, db): return str(self.id) + @classmethod def sqlrepr(cls, value, connection=None): return (connection or cls._connection).sqlrepr(value) - sqlrepr = classmethod(sqlrepr) - + @classmethod def coerceID(cls, value): if isinstance(value, cls): return value.id else: return cls.sqlmeta.idType(value) - coerceID = classmethod(coerceID) - def _reprItems(self): items = [] for col in self.sqlmeta.columnList: @@ -1644,13 +1624,12 @@ items.append((col.name, value)) return items + @classmethod def setConnection(cls, value): if isinstance(value, basestring): value = dbconnection.connectionForURI(value) cls._connection = value - setConnection = classmethod(setConnection) - def tablesUsedImmediate(self): return [self.__class__.q] Modified: SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/maxdb/maxdbconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -76,11 +76,11 @@ DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, auth, password, host, port, path, args): path = path.replace('/', os.path.sep) return cls(host, port, user=auth, password=password, database=path, **args) - _connectionFromParams = classmethod(_connectionFromParams) def _getConfigParams(self,sqlmode,auto): autocommit='off' @@ -133,6 +133,7 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def sqlAddLimit(cls,query,limit): sql = query sql = sql.replace("SELECT","SELECT ROWNO, ") @@ -141,15 +142,13 @@ else: sql = sql + 'WHERE ' + limit return sql - sqlAddLimit = classmethod(sqlAddLimit) + @classmethod def _queryAddLimitOffset(cls, query, start, end): if start: raise LowerBoundOfSliceIsNotSupported limit = ' ROWNO <= %d ' % (end) return cls.sqlAddLimit(query,limit) - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) - def createTable(self, soClass): #we create the table in a transaction because the addition of the Modified: SQLObject/trunk/sqlobject/mssql/mssqlconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/mssql/mssqlconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/mssql/mssqlconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -74,11 +74,11 @@ self._can_use_max_types = None DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, user, password, host, port, path, args): path = path.strip('/') return cls(user=user, password=password, host=host or 'localhost', port=port, db=path, **args) - _connectionFromParams = classmethod(_connectionFromParams) def insert_id(self, conn): """ @@ -154,6 +154,7 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def _queryAddLimitOffset(cls, query, start, end): if end and not start: limit_str = "SELECT TOP %i" % end @@ -163,7 +164,6 @@ return ' '.join([limit_str, match.group(2)]) else: return query - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createReferenceConstraint(self, soClass, col): return col.mssqlCreateReferenceConstraint() Modified: SQLObject/trunk/sqlobject/mysql/mysqlconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/mysql/mysqlconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/mysql/mysqlconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -50,10 +50,10 @@ DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, user, password, host, port, path, args): return cls(db=path.strip('/'), user=user or '', password=password or '', host=host or 'localhost', port=port or 0, **args) - _connectionFromParams = classmethod(_connectionFromParams) def makeConnection(self): dbEncoding = self.dbEncoding @@ -162,13 +162,13 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def _queryAddLimitOffset(cls, query, start, end): if not start: return "%s LIMIT %i" % (query, end) if not end: return "%s LIMIT %i, -1" % (query, start) return "%s LIMIT %i, %i" % (query, start, end-start) - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createReferenceConstraint(self, soClass, col): return col.mysqlCreateReferenceConstraint() Modified: SQLObject/trunk/sqlobject/postgres/pgconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/postgres/pgconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/postgres/pgconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -106,6 +106,7 @@ self.dbEncoding = kw.pop("charset", None) DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, user, password, host, port, path, args): path = path.strip('/') if (host is None) and path.count('/'): # Non-default unix socket @@ -113,7 +114,6 @@ host = '/' + '/'.join(path_parts[:-1]) path = path_parts[-1] return cls(host=host, port=port, db=path, user=user, password=password, **args) - _connectionFromParams = classmethod(_connectionFromParams) def _setAutoCommit(self, conn, auto): # psycopg2 does not have an autocommit method. @@ -159,13 +159,13 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def _queryAddLimitOffset(cls, query, start, end): if not start: return "%s LIMIT %i" % (query, end) if not end: return "%s OFFSET %i" % (query, start) return "%s LIMIT %i OFFSET %i" % (query, end-start, start) - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createColumn(self, soClass, col): return col.postgresCreateSQL() Modified: SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -95,6 +95,7 @@ # SQLObject converts it to unicode itself. self._memoryConn.text_factory = str + @classmethod def _connectionFromParams(cls, user, password, host, port, path, args): assert host is None and port is None, ( "SQLite can only be used locally (with a URI like " @@ -106,7 +107,6 @@ if path == "/:memory:": path = ":memory:" return cls(filename=path, **args) - _connectionFromParams = classmethod(_connectionFromParams) def oldUri(self): path = self.filename @@ -248,13 +248,13 @@ else: return DBAPI._insertSQL(self, table, names, values) + @classmethod def _queryAddLimitOffset(cls, query, start, end): if not start: return "%s LIMIT %i" % (query, end) if not end: return "%s LIMIT 0 OFFSET %i" % (query, start) return "%s LIMIT %i OFFSET %i" % (query, end-start, start) - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createColumn(self, soClass, col): return col.sqliteCreateSQL() Modified: SQLObject/trunk/sqlobject/sybase/sybaseconnection.py ============================================================================== --- SQLObject/trunk/sqlobject/sybase/sybaseconnection.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/sybase/sybaseconnection.py Sun May 8 10:55:26 2011 (r4385) @@ -33,10 +33,10 @@ kw['autoCommit'] = autoCommit DBAPI.__init__(self, **kw) + @classmethod def _connectionFromParams(cls, user, password, host, port, path, args): return cls(user=user, password=password, host=host or 'localhost', port=port, db=path, **args) - _connectionFromParams = classmethod(_connectionFromParams) def insert_id(self, conn): """ @@ -93,12 +93,12 @@ self.printDebug(conn, id, 'QueryIns', 'result') return id + @classmethod def _queryAddLimitOffset(cls, query, start, end): # XXX Sybase doesn't support OFFSET if end: return "SET ROWCOUNT %i %s SET ROWCOUNT 0" % (end, query) return query - _queryAddLimitOffset = classmethod(_queryAddLimitOffset) def createReferenceConstraint(self, soClass, col): return None Modified: SQLObject/trunk/sqlobject/tests/dbtest.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/dbtest.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/tests/dbtest.py Sun May 8 10:55:26 2011 (r4385) @@ -124,6 +124,7 @@ createSQL = sqlobject.StringCol(notNull=True) connectionURI = sqlobject.StringCol(notNull=True) + @classmethod def installOrClear(cls, soClasses, force=False): cls.setup() reversed = list(soClasses)[:] @@ -162,8 +163,8 @@ table = soClass.sqlmeta.table if not soClass._connection.tableExists(table): cls.install(soClass) - installOrClear = classmethod(installOrClear) + @classmethod def install(cls, soClass): """ Creates the given table in its database. @@ -182,8 +183,8 @@ connectionURI=soClass._connection.uri()) for extra_sql in all_extra: soClass._connection.query(extra_sql) - install = classmethod(install) + @classmethod def drop(cls, soClass): """ Drops a the given table from its database @@ -193,22 +194,21 @@ soClass._connection.query(sql) else: soClass.dropTable() - drop = classmethod(drop) + @classmethod def clear(cls, soClass): """ Removes all the rows from a table. """ soClass.clearTable() - clear = classmethod(clear) + @classmethod def setup(cls): """ This sets up *this* table. """ if not cls._connection.tableExists(cls.sqlmeta.table): cls.createTable() - setup = classmethod(setup) installOrClear = InstalledTestDatabase.installOrClear Modified: SQLObject/trunk/sqlobject/tests/test_boundattributes.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/test_boundattributes.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/tests/test_boundattributes.py Sun May 8 10:55:26 2011 (r4385) @@ -15,6 +15,7 @@ replace = None + @declarative.classinstancemethod def make_object(self, cls, added_class, attr_name, **attrs): if not self: return cls.singleton().make_object( @@ -26,8 +27,6 @@ self.replace.attrs = attrs return self.replace - make_object = declarative.classinstancemethod(make_object) - class Holder: def __init__(self, name): self.holder_name = name Modified: SQLObject/trunk/sqlobject/tests/test_declarative.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/test_declarative.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/tests/test_declarative.py Sun May 8 10:55:26 2011 (r4385) @@ -33,6 +33,7 @@ Declarative.__instanceinit__(self, new_attrs) self.attrs = self.add_attrs(self.attrs, new_attrs) + @staticmethod def add_attrs(old_attrs, new_attrs): old_attrs = old_attrs[:] for name in new_attrs.keys(): @@ -43,7 +44,6 @@ old_attrs.append(name) old_attrs.sort() return old_attrs - add_attrs = staticmethod(add_attrs) c = 1 Modified: SQLObject/trunk/sqlobject/tests/test_reparent_sqlmeta.py ============================================================================== --- SQLObject/trunk/sqlobject/tests/test_reparent_sqlmeta.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/tests/test_reparent_sqlmeta.py Sun May 8 10:55:26 2011 (r4385) @@ -12,13 +12,13 @@ class Reparented2(SQLObject): class sqlmeta(object): + @classmethod def setClass(cls, soClass): # Well, it's pretty hard to call the superclass method # when it's a classmethod and it's not actually your # *current* superclass. Sigh real_sqlmeta.setClass.im_func(cls, soClass) cls.worked = True - setClass = classmethod(setClass) dummy = StringCol() Modified: SQLObject/trunk/sqlobject/versioning/__init__.py ============================================================================== --- SQLObject/trunk/sqlobject/versioning/__init__.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/versioning/__init__.py Sun May 8 10:55:26 2011 (r4385) @@ -29,11 +29,11 @@ return fields + @classmethod def select(cls, clause=None, *args, **kw): if not getattr(cls, '_connection', None): cls._connection = cls.masterClass._connection return super(Version, cls).select(clause, *args, **kw) - select = classmethod(select) def __getattr__(self, attr): if self.__dict__.has_key(attr): Modified: SQLObject/trunk/sqlobject/views.py ============================================================================== --- SQLObject/trunk/sqlobject/views.py Mon Apr 25 09:01:26 2011 (r4384) +++ SQLObject/trunk/sqlobject/views.py Sun May 8 10:55:26 2011 (r4385) @@ -1,8 +1,3 @@ -#from sqlobject.sqlbuilder import * -#from sqlobject.declarative import classinstancemethod -#from sqlobject import classregistry -#from SQLObject import SQLObject -#from sqlobject.col import Col, KeyCol from sqlbuilder import * from main import SQLObject, sqlmeta import types, threading |
From: <sub...@co...> - 2011-04-25 15:01:32
|
Author: phd Date: Mon Apr 25 09:01:26 2011 New Revision: 4384 Log: Removed unused import. Modified: SQLObject/trunk/sqlobject/main.py Modified: SQLObject/trunk/sqlobject/main.py ============================================================================== --- SQLObject/trunk/sqlobject/main.py Mon Apr 25 09:00:16 2011 (r4383) +++ SQLObject/trunk/sqlobject/main.py Mon Apr 25 09:01:26 2011 (r4384) @@ -40,7 +40,6 @@ import declarative import events from sresults import SelectResults -from formencode import schema, compound from util.threadinglocal import local import sys |
From: <sub...@co...> - 2011-04-25 15:00:24
|
Author: phd Date: Mon Apr 25 09:00:16 2011 New Revision: 4383 Log: Fixed bad indentation found by PyLint. Modified: SQLObject/trunk/sqlobject/main.py Modified: SQLObject/trunk/sqlobject/main.py ============================================================================== --- SQLObject/trunk/sqlobject/main.py Mon Apr 18 13:03:30 2011 (r4382) +++ SQLObject/trunk/sqlobject/main.py Mon Apr 25 09:00:16 2011 (r4383) @@ -1343,7 +1343,7 @@ names = ', '.join(names) raise SQLObjectNotFound, "The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names) if obj: - return obj + return obj if connection: obj = cls.get(result[0], connection=connection, selectResults=result[1:]) else: @@ -1538,8 +1538,8 @@ # Free related joins for join in k.sqlmeta.joins: if isinstance(join, joins.SORelatedJoin) and join.otherClassName == klass.__name__: - q = "DELETE FROM %s WHERE %s=%d" % (join.intermediateTable, join.otherColumn, self.id) - self._connection.query(q) + q = "DELETE FROM %s WHERE %s=%d" % (join.intermediateTable, join.otherColumn, self.id) + self._connection.query(q) cols = findDependantColumns(klass.__name__, k) @@ -1668,16 +1668,16 @@ return not self.__eq__(other) def __lt__(self, other): - return NotImplemented + return NotImplemented def __le__(self, other): - return NotImplemented + return NotImplemented def __gt__(self, other): - return NotImplemented + return NotImplemented def __ge__(self, other): - return NotImplemented + return NotImplemented def __getstate__(self): |
From: SourceForge.net <no...@so...> - 2011-04-20 08:38:12
|
Bugs item #3290112, was opened at 2011-04-20 09:03 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&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: Deleted Resolution: None >Priority: 1 Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:38 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:38 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:37:08
|
Patches item #3186787, was opened at 2011-02-19 15:42 Message generated for change (Settings changed) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=3186787&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: Deleted Resolution: None Priority: 1 Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: onS1Rb <a href="http://efworbiwykpx.com/">efworbiwykpx</a>, [url=http://mujkeonebzro.com/]mujkeonebzro[/url], [link=http://iiihflgwqtao.com/]iiihflgwqtao[/link], http://gwrbpnjnjqzj.com/ ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:37 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-02-19 15:52 Message: Spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=3186787&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:36:52
|
Patches item #3131373, was opened at 2010-12-07 15:19 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=3131373&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: Widget (example) Group: Unstable (example) Status: Deleted Resolution: None Priority: 1 Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: fophfpi <a href="http://efhddkz.com">efhddkz</a> [url=http://fgawcri.com]fgawcri[/url] http://oghagsf.com ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:36 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-02-19 15:55 Message: Spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=3131373&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:05:10
|
Bugs item #3290112, was opened at 2011-04-20 09:03 Message generated for change (Settings changed) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&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: Documentation >Group: SQLObject from repository >Status: Open Resolution: None >Priority: 5 Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:04:57
|
Bugs item #3290104, was opened at 2011-04-20 08:49 Message generated for change (Settings changed) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290104&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: Deleted Resolution: None Priority: 1 >Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: here was spam Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:03 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:03 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290104&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:04:43
|
Bugs item #3289886, was opened at 2011-04-20 01:55 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289886&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: Deleted Resolution: None Priority: 1 >Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: here was spam Initial Comment: http://lockrarold.t35.com/ http://hyasnotap.t35.com ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289886&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:04:05
|
Bugs item #3290112, was opened at 2011-04-20 09:03 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&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: Deleted Resolution: None >Priority: 1 >Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:04 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:03:22
|
Bugs item #3290104, was opened at 2011-04-20 08:49 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290104&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: Deleted Resolution: None >Priority: 1 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:03 Message: spam ---------------------------------------------------------------------- Comment By: Oleg Broytman (phd) Date: 2011-04-20 12:03 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290104&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 08:01:15
|
Bugs item #3289886, was opened at 2011-04-20 01:55 Message generated for change (Settings changed) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289886&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: Deleted Resolution: None >Priority: 1 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: http://lockrarold.t35.com/ http://hyasnotap.t35.com ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289886&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 07:59:42
|
Bugs item #3289874, was opened at 2011-04-20 01:43 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289874&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: Deleted Resolution: None >Priority: 1 >Private: Yes Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) >Summary: here was spam Initial Comment: http://lockrarold.t35.com/ http://hyasnotap.t35.com ---------------------------------------------------------------------- >Comment By: Oleg Broytman (phd) Date: 2011-04-20 11:59 Message: spam ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3289874&group_id=74338 |
From: SourceForge.net <no...@so...> - 2011-04-20 05:03:53
|
Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-SourceForge-Tracker-unixname: sqlobject X-SourceForge-Tracker-trackerid: 540672 X-SourceForge-Tracker-itemid: 3290112 X-SourceForge-Tracker-itemstatus: Open X-SourceForge-Tracker-itemassignee: nobody X-SourceForge-Tracker-itemupdate-reason: Tracker Item Submitted X-SourceForge-Tracker-itemupdate-username: nobody Bugs item #3290112, was opened at 2011-04-20 05:03 Message generated for change (Tracker Item Submitted) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&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: Documentation Group: SQLObject from repository Status: Open Resolution: None Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie Initial Comment: http://psychragme.t35.com/ANAL-CREAMPIE.html Anal creampie http://psychragme.t35.com/ANAL-FUCKING.html Anal fucking http://psychragme.t35.com/ANAL-GALLERIES.html Anal galleries http://psychragme.t35.com/ANAL-HARDCORE.html Anal hardcore http://psychragme.t35.com/ANAL-MOVIES.html Anal movies http://psychragme.t35.com/ANAL-PICTURES.html Anal pictures http://psychragme.t35.com/ANAL-PORN.html Anal porn http://psychragme.t35.com/ANAL-SEX.html Anal sex http://psychragme.t35.com/ANAL-SITE.html Anal site http://psychragme.t35.com/ANAL-VIDEOS.html Anal videos http://psychragme.t35.com/ANAL-WEBSITE.html Anal website http://psychragme.t35.com/FIRST-ANAL.html First anal http://psychragme.t35.com/FREE-ANAL.html Free anal http://psychragme.t35.com/HOT-ANAL-SEX.html Hot anal sex http://psychragme.t35.com/TEEN-ANAL.html Teen anal ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540672&aid=3290112&group_id=74338 |