Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2003)

Unified Diff: boto/sdb/persist/object.py

Issue 8386013: Merging in latest boto. (Closed) Base URL: svn://svn.chromium.org/boto
Patch Set: Redoing vendor drop by deleting and then merging. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « boto/sdb/persist/checker.py ('k') | boto/sdb/persist/property.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: boto/sdb/persist/object.py
diff --git a/boto/sdb/persist/object.py b/boto/sdb/persist/object.py
deleted file mode 100644
index 993df1ee836bf38ffa59da99993c225c4d31468f..0000000000000000000000000000000000000000
--- a/boto/sdb/persist/object.py
+++ /dev/null
@@ -1,207 +0,0 @@
-# Copyright (c) 2006,2007,2008 Mitch Garnaat http://garnaat.org/
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish, dis-
-# tribute, sublicense, and/or sell copies of the Software, and to permit
-# persons to whom the Software is furnished to do so, subject to the fol-
-# lowing conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-# IN THE SOFTWARE.
-
-from boto.exception import SDBPersistenceError
-from boto.sdb.persist import get_manager, object_lister
-from boto.sdb.persist.property import Property, ScalarProperty
-import uuid
-
-class SDBBase(type):
- "Metaclass for all SDBObjects"
- def __init__(cls, name, bases, dict):
- super(SDBBase, cls).__init__(name, bases, dict)
- # Make sure this is a subclass of SDBObject - mainly copied from django ModelBase (thanks!)
- try:
- if filter(lambda b: issubclass(b, SDBObject), bases):
- # look for all of the Properties and set their names
- for key in dict.keys():
- if isinstance(dict[key], Property):
- property = dict[key]
- property.set_name(key)
- prop_names = []
- props = cls.properties()
- for prop in props:
- prop_names.append(prop.name)
- setattr(cls, '_prop_names', prop_names)
- except NameError:
- # 'SDBObject' isn't defined yet, meaning we're looking at our own
- # SDBObject class, defined below.
- pass
-
-class SDBObject(object):
- __metaclass__ = SDBBase
-
- _manager = get_manager()
-
- @classmethod
- def get_lineage(cls):
- l = [c.__name__ for c in cls.mro()]
- l.reverse()
- return '.'.join(l)
-
- @classmethod
- def get(cls, id=None, **params):
- if params.has_key('manager'):
- manager = params['manager']
- else:
- manager = cls._manager
- if manager.domain and id:
- a = cls._manager.domain.get_attributes(id, '__type__')
- if a.has_key('__type__'):
- return cls(id, manager)
- else:
- raise SDBPersistenceError('%s object with id=%s does not exist' % (cls.__name__, id))
- else:
- rs = cls.find(**params)
- try:
- obj = rs.next()
- except StopIteration:
- raise SDBPersistenceError('%s object matching query does not exist' % cls.__name__)
- try:
- rs.next()
- except StopIteration:
- return obj
- raise SDBPersistenceError('Query matched more than 1 item')
-
- @classmethod
- def find(cls, **params):
- if params.has_key('manager'):
- manager = params['manager']
- del params['manager']
- else:
- manager = cls._manager
- keys = params.keys()
- if len(keys) > 4:
- raise SDBPersistenceError('Too many fields, max is 4')
- parts = ["['__type__'='%s'] union ['__lineage__'starts-with'%s']" % (cls.__name__, cls.get_lineage())]
- properties = cls.properties()
- for key in keys:
- found = False
- for property in properties:
- if property.name == key:
- found = True
- if isinstance(property, ScalarProperty):
- checker = property.checker
- parts.append("['%s' = '%s']" % (key, checker.to_string(params[key])))
- else:
- raise SDBPersistenceError('%s is not a searchable field' % key)
- if not found:
- raise SDBPersistenceError('%s is not a valid field' % key)
- query = ' intersection '.join(parts)
- if manager.domain:
- rs = manager.domain.query(query)
- else:
- rs = []
- return object_lister(None, rs, manager)
-
- @classmethod
- def list(cls, max_items=None, manager=None):
- if not manager:
- manager = cls._manager
- if manager.domain:
- rs = manager.domain.query("['__type__' = '%s']" % cls.__name__, max_items=max_items)
- else:
- rs = []
- return object_lister(cls, rs, manager)
-
- @classmethod
- def properties(cls):
- properties = []
- while cls:
- for key in cls.__dict__.keys():
- if isinstance(cls.__dict__[key], Property):
- properties.append(cls.__dict__[key])
- if len(cls.__bases__) > 0:
- cls = cls.__bases__[0]
- else:
- cls = None
- return properties
-
- # for backwards compatibility
- find_properties = properties
-
- def __init__(self, id=None, manager=None):
- if manager:
- self._manager = manager
- self.id = id
- if self.id:
- self._auto_update = True
- if self._manager.domain:
- attrs = self._manager.domain.get_attributes(self.id, '__type__')
- if len(attrs.keys()) == 0:
- raise SDBPersistenceError('Object %s: not found' % self.id)
- else:
- self.id = str(uuid.uuid4())
- self._auto_update = False
-
- def __setattr__(self, name, value):
- if name in self._prop_names:
- object.__setattr__(self, name, value)
- elif name.startswith('_'):
- object.__setattr__(self, name, value)
- elif name == 'id':
- object.__setattr__(self, name, value)
- else:
- self._persist_attribute(name, value)
- object.__setattr__(self, name, value)
-
- def __getattr__(self, name):
- if not name.startswith('_'):
- a = self._manager.domain.get_attributes(self.id, name)
- if a.has_key(name):
- object.__setattr__(self, name, a[name])
- return a[name]
- raise AttributeError
-
- def __repr__(self):
- return '%s<%s>' % (self.__class__.__name__, self.id)
-
- def _persist_attribute(self, name, value):
- if self.id:
- self._manager.domain.put_attributes(self.id, {name : value}, replace=True)
-
- def _get_sdb_item(self):
- return self._manager.domain.get_item(self.id)
-
- def save(self):
- attrs = {'__type__' : self.__class__.__name__,
- '__module__' : self.__class__.__module__,
- '__lineage__' : self.get_lineage()}
- for property in self.properties():
- attrs[property.name] = property.to_string(self)
- if self._manager.domain:
- self._manager.domain.put_attributes(self.id, attrs, replace=True)
- self._auto_update = True
-
- def delete(self):
- if self._manager.domain:
- self._manager.domain.delete_attributes(self.id)
-
- def get_related_objects(self, ref_name, ref_cls=None):
- if self._manager.domain:
- query = "['%s' = '%s']" % (ref_name, self.id)
- if ref_cls:
- query += " intersection ['__type__'='%s']" % ref_cls.__name__
- rs = self._manager.domain.query(query)
- else:
- rs = []
- return object_lister(ref_cls, rs, self._manager)
-
« no previous file with comments | « boto/sdb/persist/checker.py ('k') | boto/sdb/persist/property.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698