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