rpms/python-sqlobject/devel python-sqlobject-0.7.0-ordered-deps.patch, NONE, 1.1 python-sqlobject.spec, 1.5, 1.6

Luke Macken (lmacken) fedora-extras-commits at redhat.com
Tue Sep 12 02:50:11 UTC 2006


Author: lmacken

Update of /cvs/extras/rpms/python-sqlobject/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv6327

Modified Files:
	python-sqlobject.spec 
Added Files:
	python-sqlobject-0.7.0-ordered-deps.patch 
Log Message:
* Mon Sep 11 2006 Luke Macken <lmacken at redhat.com> 0.7.0-8
- python-sqlobject-0.7.0-ordered-deps.patch from upstream ticket
  http://trac.turbogears.org/turbogears/ticket/279 (Bug #205894)



python-sqlobject-0.7.0-ordered-deps.patch:

--- NEW FILE python-sqlobject-0.7.0-ordered-deps.patch ---
--- SQLObject-0.7.0/sqlobject/manager/command.py.orig	2006-09-09 09:40:56.000000000 -0700
+++ SQLObject-0.7.0/sqlobject/manager/command.py	2006-09-09 09:43:00.000000000 -0700
@@ -18,6 +18,7 @@
 from sqlobject import col
 from sqlobject.util import moduleloader
 from sqlobject.declarative import DeclarativeMeta
+from sqlobject.classregistry import findClass
 
 # It's not very unsafe to use tempnam like we are doing:
 warnings.filterwarnings(
@@ -183,6 +184,81 @@
 
     help = ''
 
+    def orderClassesByDependencyLevel(self, classes):
+        """
+        Return classes ordered by their depth in the class dependency
+        tree (this is *not* the inheritance tree), from the
+        top level (independant) classes to the deepest level.
+        The dependency tree is defined by the foreign key relations.
+        """
+        # @@: written as a self-contained function for now, to prevent
+        # having to modify any core SQLObject component and namespace
+        # contamination.
+        # yemartin - 2006-08-08
+        
+        class SQLObjectCircularReferenceError(Exception): pass
+
+        def findReverseDependencies(cls):
+            """
+            Return a list of classes that cls depends on. Note that
+            "depends on" here mean "has a foreign key pointing to".
+            """
+            depended = []
+            for col in cls.sqlmeta.columnList:
+                if col.foreignKey:
+                    other = findClass(col.foreignKey,
+                                      col.soClass.sqlmeta.registry)
+                    if other not in depended:
+                        depended.append(other)
+            return depended
+        
+        # Cache to save already calculated dependency levels.
+        dependency_levels = {}
+        def calculateDependencyLevel(cls, dependency_stack=[]):
+            """
+            Recursively calculate the dependency level of cls, while
+            using the dependency_stack to detect any circular reference.
+            """
+            # Return value from the cache if already calculated
+            if dependency_levels.has_key(cls):
+                return dependency_levels[cls]
+            # Check for circular references
+            if cls in dependency_stack:
+                dependency_stack.append(cls)
+                raise SQLObjectCircularReferenceError, (
+                        "Found a circular reference: %s " %
+                        (' --> '.join([x.__name__
+                                       for x in dependency_stack])))
+            dependency_stack.append(cls)
+            # Recursively inspect dependent classes.
+            depended = findReverseDependencies(cls)
+            if depended:
+                level = max([calculateDependencyLevel(x, dependency_stack)
+                             for x in depended]) + 1
+            else:
+                level = 0
+            dependency_levels[cls] = level
+            return level
+        
+        # Now simply calculate and sort by dependency levels:
+        try:
+            sorter = []
+            for cls in classes:
+                level = calculateDependencyLevel(cls)
+                sorter.append((level, cls))
+            sorter.sort()
+            ordered_classes = [cls for level, cls in sorter]
+        except SQLObjectCircularReferenceError, msg:
+            # Failsafe: return the classes as-is if a circular reference
+            # prevented the dependency levels to be calculated.
+            print ("Warning: a circular reference was detected in the "
+                    "model. Unable to sort the classes by dependency: they "
+                    "will be treated in alphabetic order. This may or may "
+                    "not work depending on your database backend. "
+                    "The error was:\n%s" % msg)
+            return classes
+        return ordered_classes
+
     def __classinit__(cls, new_args):
         if cls.__bases__ == (object,):
             # This abstract base class
@@ -287,7 +363,7 @@
             else:
                 print 'No eggs specified'
             sys.exit(1)
-        return all
+        return self.orderClassesByDependencyLevel(all)
 
     def classes_from_module(self, module):
         all = []
@@ -584,7 +660,7 @@
         v = self.options.verbose
         dropped = 0
         not_existing = 0
-        for soClass in self.classes():
+        for soClass in self.classes().__reversed__():
             exists = soClass._connection.tableExists(soClass.sqlmeta.table)
             if v >= 1:
                 if exists:


Index: python-sqlobject.spec
===================================================================
RCS file: /cvs/extras/rpms/python-sqlobject/devel/python-sqlobject.spec,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- python-sqlobject.spec	8 Sep 2006 07:11:05 -0000	1.5
+++ python-sqlobject.spec	12 Sep 2006 02:50:11 -0000	1.6
@@ -2,7 +2,7 @@
 
 Name:           python-sqlobject
 Version:        0.7.0
-Release:        7%{?dist}
+Release:        8%{?dist}
 Summary:        SQLObject -Object-Relational Manager, aka database wrapper  
 
 Group:          Development/Libraries
@@ -11,6 +11,7 @@
 Source0:        http://cheeseshop.python.org/packages/source/S/SQLObject/SQLObject-%{version}.tar.gz  
 Patch0:         python-sqlobject-admin.patch
 Patch1:         python-sqlobject-0.7.0-pkg_resources.patch
+Patch2:         python-sqlobject-0.7.0-ordered-deps.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root
 BuildArch:      noarch
@@ -31,6 +32,7 @@
 rm -rf ez_setup
 %patch0 -p1
 %patch1
+%patch2 -p1
 
 %build
 %{__python} setup.py build
@@ -82,6 +84,10 @@
 %{_bindir}/*
 
 %changelog
+* Mon Sep 11 2006 Luke Macken <lmacken at redhat.com> 0.7.0-8
+- python-sqlobject-0.7.0-ordered-deps.patch from upstream ticket
+  http://trac.turbogears.org/turbogears/ticket/279 (Bug #205894)
+
 * Fri Sep  8 2006 Luke Macken <lmacken at redhat.com> 0.7.0-7
 - Include pyo files instead of ghosting them
 - Rebuild for FC6




More information about the fedora-extras-commits mailing list