The MetadataCollection object is now created only once per dataset object instance (and when datatype is changed), instead of each time dataset.metadata is called.

The 'no_value' attribute for a metadata element's spec is returned when the metadata element's value is None.
This commit is contained in:
Daniel Blankenberg
2008-09-16 15:23:23 -04:00
parent 924dcba729
commit 90e30a30ae
2 changed files with 26 additions and 15 deletions
+20 -11
View File
@@ -151,9 +151,16 @@ class MetadataCollection:
"""
def __init__(self, parent, spec):
self.parent = parent
self.bunch = parent._metadata or dict()
if spec is None: self.spec = MetadataSpecCollection()
else: self.spec = spec
#set default metadata values
if not self.parent._metadata:
self.parent._metadata = {}
for name, value in self.spec.items():
if name not in self.bunch:
self.bunch[name] = value.default
def __iter__(self):
return self.bunch.__iter__()
def get( self, key, default=None ):
@@ -168,19 +175,21 @@ class MetadataCollection:
def __nonzero__(self):
return self.bunch.__nonzero__()
def __getattr__(self, name):
if self.bunch.get( name ):
return self.bunch.get( name )
else:
if self.spec.get(name, None):
return self.spec[name].default
else:
return None
if name == "bunch":
return self.parent._metadata
rval = self.bunch.get( name )
if rval is None:
rval = self.spec.get( name, None )
if rval:
rval = rval.no_value
return rval
def __setattr__(self, name, value):
if name in ["parent","bunch","spec"]:
if name in ["parent","spec"]:
self.__dict__[name] = value
elif name == "bunch":
self.parent._metadata = value
else:
self.__dict__["bunch"][name] = value
self.bunch = self.parent._metadata = dict( self.bunch )
self.bunch[name] = value
MetadataElement = Statement(MetadataElementSpec)
+6 -4
View File
@@ -113,7 +113,7 @@ class HistoryDatasetAssociation( object ):
self.peek = peek
self.extension = extension
self.designation = designation
self._metadata = metadata or dict()
self.metadata = metadata or dict()
self.dbkey = dbkey
self.deleted = deleted
self.visible = visible
@@ -159,9 +159,9 @@ class HistoryDatasetAssociation( object ):
return datatypes_registry.get_datatype_by_extension( self.extension )
def get_metadata( self ):
if not self._metadata:
self._metadata = dict()
return MetadataCollection( self, self.datatype.metadata_spec )
if not hasattr( self, '_metadata_collection' ):
self._metadata_collection = MetadataCollection( self, self.datatype.metadata_spec )
return self._metadata_collection
def set_metadata( self, bunch ):
# Needs to accept a MetadataCollection, a bunch, or a dict
self._metadata = dict( bunch.items() )
@@ -191,6 +191,8 @@ class HistoryDatasetAssociation( object ):
def change_datatype( self, new_ext ):
self.clear_associated_files()
if hasattr( self, '_metadata_collection' ):
del self._metadata_collection
datatypes_registry.change_datatype( self, new_ext )
def get_size( self ):
"""Returns the size of the data on disk"""