diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index 53a8bca7ba0..8661bfa0832 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -84,7 +84,7 @@ class Data( object ): # flag the object as modified for SQLAlchemy. if copy_from: dataset.metadata = copy_from.metadata - def set_meta( self, dataset, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): """Unimplemented method, allows guessing of metadata from contents of file""" return True def set_readonly_meta( self, dataset ): diff --git a/lib/galaxy/datatypes/interval.py b/lib/galaxy/datatypes/interval.py index 97d82f1266b..afbb8831ac5 100644 --- a/lib/galaxy/datatypes/interval.py +++ b/lib/galaxy/datatypes/interval.py @@ -64,8 +64,8 @@ class Interval( Tabular ): else: dataset.blurb = "%s regions" % util.commaify( str( line_count ) ) - def set_meta( self, dataset, first_line_is_header=False, **kwd ): - Tabular.set_meta( self, dataset, skip=0 ) + def set_meta( self, dataset, overwrite = True, first_line_is_header = False, **kwd ): + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = 0 ) """Tries to guess from the line the location number of the column for the chromosome, region start-end and strand""" if dataset.has_data(): @@ -80,7 +80,8 @@ class Interval( Tabular ): for index, col_name in enumerate( elems ): if col_name in valid: meta_name = valid[col_name] - setattr( dataset.metadata, meta_name, index+1 ) + if overwrite or not dataset.metadata.element_is_set( meta_name ): + setattr( dataset.metadata, meta_name, index+1 ) values = alias_spec[ meta_name ] start = values.index( col_name ) for lower in values[ start: ]: @@ -94,26 +95,32 @@ class Interval( Tabular ): if len( elems ) > 2: for str in data.col1_startswith: if line.lower().startswith( str ): - dataset.metadata.chromCol = 1 + if overwrite or not dataset.metadata.element_is_set( 'chromCol' ): + dataset.metadata.chromCol = 1 try: int( elems[1] ) - dataset.metadata.startCol = 2 + if overwrite or not dataset.metadata.element_is_set( 'startCol' ): + dataset.metadata.startCol = 2 except: pass # Metadata default will be used try: int( elems[2] ) - dataset.metadata.endCol = 3 + if overwrite or not dataset.metadata.element_is_set( 'endCol' ): + dataset.metadata.endCol = 3 except: pass # Metadata default will be used if len( elems ) > 3: try: int( elems[3] ) except: - dataset.metadata.nameCol = 4 + if overwrite or not dataset.metadata.element_is_set( 'nameCol' ): + dataset.metadata.nameCol = 4 if len( elems ) < 6 or elems[5] not in data.valid_strand: - dataset.metadata.strandCol = 0 + if overwrite or not dataset.metadata.element_is_set( 'strandCol' ): + dataset.metadata.strandCol = 0 else: - dataset.metadata.strandCol = 6 + if overwrite or not dataset.metadata.element_is_set( 'strandCol' ): + dataset.metadata.strandCol = 6 metadata_is_set = True break if metadata_is_set: @@ -286,8 +293,9 @@ class Bed( Interval ): MetadataElement( name="endCol", default=3, desc="End column", param=metadata.ColumnParameter ) MetadataElement( name="strandCol", desc="Strand column (click box & select)", param=metadata.ColumnParameter, optional=True, no_value=0 ) MetadataElement( name="columns", default=3, desc="Number of columns", readonly=True, visible=False ) + ###do we need to repeat these? they are the same as should be inherited from interval type - def set_meta( self, dataset, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): """Sets the metadata information for datasets previously determined to be in bed format.""" i = 0 if dataset.has_data(): @@ -300,15 +308,18 @@ class Bed( Interval ): for startswith in data.col1_startswith: if line.lower().startswith( startswith ): if len( elems ) > 3: - dataset.metadata.nameCol = 4 + if overwrite or not dataset.metadata.element_is_set( 'nameCol' ): + dataset.metadata.nameCol = 4 if len(elems) < 6: - dataset.metadata.strandCol = 0 + if overwrite or not dataset.metadata.element_is_set( 'strandCol' ): + dataset.metadata.strandCol = 0 else: - dataset.metadata.strandCol = 6 + if overwrite or not dataset.metadata.element_is_set( 'strandCol' ): + dataset.metadata.strandCol = 6 metadata_set = True break if metadata_set: break - Tabular.set_meta( self, dataset, skip=i ) + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = i ) def as_ucsc_display_file( self, dataset, **kwd ): """Returns file contents with only the bed data. If bed 6+, treat as interval.""" @@ -443,7 +454,7 @@ class Gff( Tabular ): Tabular.__init__(self, **kwd) self.add_display_app ( 'elegans', 'display in GBrowse', 'as_gbrowse_display_file', 'gbrowse_links' ) - def set_meta( self, dataset, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): i = 0 for i, line in enumerate( file ( dataset.file_name ) ): line = line.rstrip('\r\n') @@ -456,7 +467,7 @@ class Gff( Tabular ): break except: pass - Tabular.set_meta( self, dataset, skip=i ) + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = i ) def make_html_table( self, dataset, skipchars=[] ): """Create HTML table, used for displaying peek""" @@ -589,7 +600,7 @@ class Gff3( Gff ): """Initialize datatype, by adding GBrowse display app""" Gff.__init__(self, **kwd) - def set_meta( self, dataset, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): i = 0 for i, line in enumerate( file ( dataset.file_name ) ): line = line.rstrip('\r\n') @@ -614,7 +625,7 @@ class Gff3( Gff ): phase = elems[7] if valid_start and valid_end and start < end and strand in self.valid_gff3_strand and phase in self.valid_gff3_phase: break - Tabular.set_meta( self, dataset, skip=i ) + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = i ) def sniff( self, filename ): """ @@ -692,7 +703,7 @@ class Wiggle( Tabular ): def make_html_table( self, dataset ): return Tabular.make_html_table( self, dataset, skipchars=['track', '#'] ) - def set_meta( self, dataset, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): i = 0 for i, line in enumerate( file ( dataset.file_name ) ): line = line.rstrip('\r\n') @@ -705,7 +716,7 @@ class Wiggle( Tabular ): for str in data.col1_startswith: if elems[0].lower().startswith(str): break - Tabular.set_meta( self, dataset, skip=i ) + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = i ) def sniff( self, filename ): """ @@ -746,8 +757,8 @@ class CustomTrack ( Tabular ): """Initialize interval datatype, by adding UCSC display app""" Tabular.__init__(self, **kwd) self.add_display_app ( 'ucsc', 'display at UCSC', 'as_ucsc_display_file', 'ucsc_links' ) - def set_meta( self, dataset, **kwd ): - Tabular.set_meta( self, dataset, skip=1 ) + def set_meta( self, dataset, overwrite = True, **kwd ): + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = 1 ) def display_peek( self, dataset ): """Returns formated html of peek""" return Tabular.make_html_table( self, dataset, skipchars=['track', '#'] ) @@ -858,8 +869,8 @@ class GBrowseTrack ( Tabular ): Tabular.__init__(self, **kwd) self.add_display_app ('elegans', 'display in GBrowse', 'as_gbrowse_display_file', 'gbrowse_links' ) - def set_meta( self, dataset, **kwd ): - Tabular.set_meta( self, dataset, skip=1 ) + def set_meta( self, dataset, overwrite = True, **kwd ): + Tabular.set_meta( self, dataset, overwrite = overwrite, skip = 1 ) def make_html_table( self, dataset ): return Tabular.make_html_table( self, dataset, skipchars=['track', '#'] ) diff --git a/lib/galaxy/datatypes/metadata.py b/lib/galaxy/datatypes/metadata.py index 6aea93dd336..05ee719c6c9 100644 --- a/lib/galaxy/datatypes/metadata.py +++ b/lib/galaxy/datatypes/metadata.py @@ -185,6 +185,8 @@ class MetadataCollection: self.parent._metadata = value else: self.bunch[name] = value + def element_is_set( self, name ): + return bool( self.bunch.get( name, False ) ) MetadataElement = Statement(MetadataElementSpec) diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index 4efa3da5922..954ee426f98 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -190,8 +190,7 @@ class Registry( object ): # initialization. if data.has_data(): data.init_meta( copy_from=data ) - if isinstance( data.datatype, tabular.Tabular ): - data.set_readonly_meta() + data.set_meta( overwrite = False ) data.set_peek() return data diff --git a/lib/galaxy/datatypes/sequence.py b/lib/galaxy/datatypes/sequence.py index 997714a59c0..a6ca0db0136 100644 --- a/lib/galaxy/datatypes/sequence.py +++ b/lib/galaxy/datatypes/sequence.py @@ -164,7 +164,7 @@ class Maf( Alignment ): def init_meta( self, dataset, copy_from=None ): Alignment.init_meta( self, dataset, copy_from=copy_from ) - def set_meta( self, dataset, first_line_is_header=False, **kwd ): + def set_meta( self, dataset, overwrite = True, **kwd ): """ Parses and sets species and chromosomes from MAF files. """ @@ -190,6 +190,7 @@ class Maf( Alignment ): if i > 100000: break except: pass + #these metadata values are not accessable by users, always overwrite dataset.metadata.species = species dataset.metadata.species_chromosomes = species_chromosomes diff --git a/lib/galaxy/datatypes/tabular.py b/lib/galaxy/datatypes/tabular.py index fddd92de944..6d0b2e73deb 100644 --- a/lib/galaxy/datatypes/tabular.py +++ b/lib/galaxy/datatypes/tabular.py @@ -26,8 +26,8 @@ class Tabular( data.Text ): data.Text.init_meta( self, dataset, copy_from=copy_from ) def set_readonly_meta( self, dataset, skip=1, **kwd ): """Resets the values of readonly metadata elements.""" - Tabular.set_meta( self, dataset, skip=skip ) - def set_meta( self, dataset, skip=1, **kwd ): + Tabular.set_meta( self, dataset, overwrite = True, skip = skip ) + def set_meta( self, dataset, overwrite = True, skip = 1, **kwd ): """ Tries to determine the number of columns as well as those columns that contain numerical values in the dataset. A skip parameter is @@ -35,6 +35,7 @@ class Tabular( data.Text ): their data type classes are responsible to determine how many invalid comment lines should be skipped. """ + #we treat 'overwrite' as always True (we always want to set tabular metadata when called) if dataset.has_data(): column_types = [] diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py index a53dddd0d7b..3cda6ce6c76 100644 --- a/lib/galaxy/jobs/__init__.py +++ b/lib/galaxy/jobs/__init__.py @@ -409,12 +409,7 @@ class JobWrapper( object ): dataset.blurb = "error" elif dataset.has_data(): # Only set metadata values if they are missing... - if dataset.missing_meta(): - dataset.set_meta() - else: - # ...however, some tools add / remove columns, - # so we have to reset the readonly metadata values - dataset.set_readonly_meta() + dataset.set_meta( overwrite_exisiting = False ) dataset.set_peek() else: dataset.blurb = "empty" diff --git a/scripts/check_galaxy.py b/scripts/check_galaxy.py index 572b22388b9..faf9df58e6b 100755 --- a/scripts/check_galaxy.py +++ b/scripts/check_galaxy.py @@ -190,7 +190,7 @@ class Browser: tc.fv("1", "password", pw) tc.submit("Login") tc.code(200) - if len(tc.get_browser()._browser.forms()) > 0: + if len(tc.get_browser().get_all_forms()) > 0: # uh ohs, fail p = userParser() p.feed(tc.browser.get_html()) @@ -210,7 +210,7 @@ class Browser: tc.fv("1", "confirm", pw) tc.submit("Create") tc.code(200) - if len(tc.get_browser()._browser.forms()) > 0: + if len(tc.get_browser().get_all_forms()) > 0: p = userParser() p.feed(tc.browser.get_html()) if p.already_exists: