diff options
author | Chris Larson <chris_larson@mentor.com> | 2011-04-04 09:36:45 -0700 |
---|---|---|
committer | Chris Larson <chris_larson@mentor.com> | 2011-04-05 17:23:07 -0700 |
commit | 1190406c526c7bb7cf415867be83e0403812a7dd (patch) | |
tree | ede0aaec85199ab556df6d35d0c957a36a3b6ca7 /lib | |
parent | d6fba8bad6277eb2a19e94f93a7a4baf74b29ef3 (diff) | |
download | bitbake-contrib-1190406c526c7bb7cf415867be83e0403812a7dd.tar.gz |
persist_data: implement comparison, same as dict
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bb/compat.py | 28 | ||||
-rw-r--r-- | lib/bb/persist_data.py | 11 |
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/bb/compat.py b/lib/bb/compat.py new file mode 100644 index 000000000..c6978fccc --- /dev/null +++ b/lib/bb/compat.py @@ -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 diff --git a/lib/bb/persist_data.py b/lib/bb/persist_data.py index af96b76f4..03adc7cc5 100644 --- a/lib/bb/persist_data.py +++ b/lib/bb/persist_data.py @@ -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: |