Initial metadata commit. The framework is there, need to figure out what to do with it now and add unit tests

This commit is contained in:
Ian Schenck
2007-06-08 17:16:35 +00:00
parent cc707c521e
commit b68986d1e4
2 changed files with 71 additions and 1 deletions
+12 -1
View File
@@ -2,13 +2,20 @@ import logging, os, sys, time, sets, tempfile
from galaxy import util
from cgi import escape
import galaxy.datatypes.registry
from galaxy.datatypes.metadata import *
log = logging.getLogger(__name__)
# Constants for data states
DATA_NEW, DATA_OK, DATA_FAKE = 'new', 'ok', 'fake'
class DataMeta( type ):
def __init__( cls, name, bases, dict_ ):
cls._metadataspec = MetadataSpecCollection()
Statement.process( cls )
class Data( object ):
__metaclass__ = DataMeta
def set_peek( self, dataset ):
dataset.peek = ''
dataset.blurb = 'data'
@@ -44,6 +51,10 @@ class Data( object ):
"""Unimplemented method, returns dict with method/option for repairing errors"""
return None
@classmethod
def get_metadata_spec( cls ):
return cls._metadataspec
class Text( Data ):
def write_from_stream(self, stream):
"Writes data from a stream"
+59
View File
@@ -0,0 +1,59 @@
import sys
# Taken in part from Elixir and how they do it: http://elixir.ematia.de
STATEMENTS = "__galaxy_statements__"
class Statement( object ):
def __init__( self, target ):
self.target = target
def __call__( self, *args, **kwargs ):
class_locals = sys._getframe(1).f_locals
statements = class_locals.setdefault(STATEMENTS, [])
statements.append((self, args, kwargs))
@classmethod
def process( cls, element ):
for statement, args, kwargs in getattr( element, STATEMENTS, [] ):
statement.target( element, *args, **kwargs )
class MetadataSpecCollection( list ):
pass
class MetadataWrapper( object ):
def __init__( self, metadata ):
self.value = metadata
def get_value( self ):
return self.value
def set_value( self, value ):
value = self.marshal(value)
self.validate(value)
self.value = value
def marshal( self, value ):
'''
This method should/can be overridden to convert the incomming
value to whatever type it is supposed to be.
'''
return value
def validate( self, value ):
'''
Throw an exception if the value is invalid.
'''
pass
class MetadataElementSpec( object ):
READONLY = 1
def __init__( self, datatype, name=None, desc=None, wrapper=MetadataWrapper, attributes=None ):
self.name = name
self.desc = desc
self.wrapper = wrapper
self.attributes = attributes
datatype._metadataspec.append( self )
def hasAttribute( self, attribute ):
return ((self.permission & attribute) == attribute)
def wrap( self, metadata ):
return self.wrapper(metadata)
MetadataElement = Statement(MetadataElementSpec)