On Fri, Jan 22, 2010 at 09:57:13PM +0300, Oleg Broytman wrote:
>    In essence, the problem is in class sqlmeta, method setClass:
> 
>         if cls.idName is None:
>             cls.idName = cls.style.idForTable(cls.table)
> 
>    The method poisons the class so in any class inherited from sqlmeta idName
> will be already set and the test fails.
>    Adding idName to the list of unshared attributes resets idName to None
> but that prevents proper inheritance of idName.
>    To explain all this with code - with current SQLObject the following
> code
> 
> class sqlmeta(sqlmeta):
>     idName = 'ddd'
> 
> class Test1(SQLObject):
>     class sqlmeta(sqlmeta):
>         style = MixedCaseStyle(longID=True)
> 
> print Test1.sqlmeta.idName
> 
> class Test2(SQLObject):
>     class sqlmeta:
>         style = MixedCaseStyle(longID=True)
> 
> print Test2.sqlmeta.idName
> 
>    prints 'ddd' and 'id'; the first idName is right and the second one is
> wrong (it must be 'Test2ID').
>    The same code running with idName added to the list of unshared attributes
> prints 'Test1ID' and 'Test2ID'; the first one is wrong (it must be 'ddd')
> and the second one is right.
>    Probably the correct way of fixing it is to add idName (and 'style'
> because setClass tests and sets it too) to the list of unshared attributes
> but make sqlmeta.__classinit__ to recognize inherited attributes and do not
> reset them. I will think of it...

   Well, instead of trying to find what was inherited and what was set in
parent's setClass() I just prevented setClass() from poisoning the base
sqlmeta. The patch is just

Index: sqlobject/main.py
===================================================================
--- sqlobject/main.py   (revision 4089)
+++ sqlobject/main.py   (working copy)
@@ -853,7 +853,8 @@
                     del values[key]
             cls.sqlmeta = type('sqlmeta', (superclass,), values)
 
-        cls.sqlmeta.setClass(cls)
+        if not is_base: # Do not pollute the base sqlmeta class
+            cls.sqlmeta.setClass(cls)
 
     _SO_setupSqlmeta = classmethod(_SO_setupSqlmeta)

   With the patch the code above prints 'ddd' and 'Test2ID' which is
exactly right.
   The test suite passed so if nobody reports any problem with the patch I
will apply it to the trunk.

Oleg.
-- 
     Oleg Broytman            http://phd.pp.ru/            p...@phd.pp.ru
           Programmers don't die, they just GOSUB without RETURN.

------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Reply via email to