mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-01 15:37:32 +08:00
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:
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user