]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
persist_data: implement comparison, same as dict
authorChris Larson <chris_larson@mentor.com>
Mon, 4 Apr 2011 16:36:45 +0000 (09:36 -0700)
committerChris Larson <chris_larson@mentor.com>
Wed, 6 Apr 2011 00:23:07 +0000 (17:23 -0700)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
lib/bb/compat.py [new file with mode: 0644]
lib/bb/persist_data.py

diff --git a/lib/bb/compat.py b/lib/bb/compat.py
new file mode 100644 (file)
index 0000000..c6978fc
--- /dev/null
@@ -0,0 +1,28 @@
+"""Code pulled from future python versions, here for compatibility"""
+
+def total_ordering(cls):
+    """Class decorator that fills in missing ordering methods"""
+    convert = {
+        '__lt__': [('__gt__', lambda self, other: other < self),
+                   ('__le__', lambda self, other: not other < self),
+                   ('__ge__', lambda self, other: not self < other)],
+        '__le__': [('__ge__', lambda self, other: other <= self),
+                   ('__lt__', lambda self, other: not other <= self),
+                   ('__gt__', lambda self, other: not self <= other)],
+        '__gt__': [('__lt__', lambda self, other: other > self),
+                   ('__ge__', lambda self, other: not other > self),
+                   ('__le__', lambda self, other: not self > other)],
+        '__ge__': [('__le__', lambda self, other: other >= self),
+                   ('__gt__', lambda self, other: not other >= self),
+                   ('__lt__', lambda self, other: not self >= other)]
+    }
+    roots = set(dir(cls)) & set(convert)
+    if not roots:
+        raise ValueError('must define at least one ordering operation: < > <= >=')
+    root = max(roots)       # prefer __lt__ to __le__ to __gt__ to __ge__
+    for opname, opfunc in convert[root]:
+        if opname not in roots:
+            opfunc.__name__ = opname
+            opfunc.__doc__ = getattr(int, opname).__doc__
+            setattr(cls, opname, opfunc)
+    return cls
index af96b76f401fa88ccf45ad34281a8995ea88853c..03adc7cc53dd99bbdd58f496c4724ebfe5f21717 100644 (file)
@@ -26,7 +26,8 @@ import logging
 import os.path
 import sys
 import warnings
-import bb.msg, bb.data, bb.utils
+from bb.compat import total_ordering
+from collections import Mapping
 
 try:
     import sqlite3
@@ -43,6 +44,7 @@ if hasattr(sqlite3, 'enable_shared_cache'):
     sqlite3.enable_shared_cache(True)
 
 
+@total_ordering
 class SQLTable(collections.MutableMapping):
     """Object representing a table/domain in the database"""
     def __init__(self, cursor, table):
@@ -102,6 +104,12 @@ class SQLTable(collections.MutableMapping):
         data = self._execute("SELECT key FROM %s;" % self.table)
         return (row[0] for row in data)
 
+    def __lt__(self, other):
+        if not isinstance(other, Mapping):
+            raise NotImplemented
+
+        return len(self) < len(other)
+
     def values(self):
         return list(self.itervalues())
 
@@ -175,6 +183,7 @@ def connect(database):
 
 def persist(domain, d):
     """Convenience factory for SQLTable objects based upon metadata"""
+    import bb.data, bb.utils
     cachedir = (bb.data.getVar("PERSISTENT_DIR", d, True) or
                 bb.data.getVar("CACHE", d, True))
     if not cachedir: