Mercurial > repos > iuc > enasearch_retrieve_data
diff generate_macros.py @ 0:cbc24be56f7b draft
planemo upload for repository https://github.com/ASaiM/galaxytools/tree/master/tools/enasearch/ commit 6eda25f5cccc0cf9be09c38a8b48d37aff56ed87
author | iuc |
---|---|
date | Tue, 29 Aug 2017 04:13:09 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/generate_macros.py Tue Aug 29 04:13:09 2017 -0400 @@ -0,0 +1,227 @@ +#!/usr/bin/env python + +import enasearch + +spaces = ' ' +operator_names = { + "=": "equal", + "!=": "different", + "<": "lower", + "<=": "equal or lower", + ">": "higher", + ">=": "equal or higher", +} + + +def format_name(name, alternative_name): + """ + Format name to remove None name and & in name + """ + if name is None: + name = alternative_name + name = name.replace("&", "and") + return name + + +def sort_by_name(dict): + """ + Sort a dictionary on the values + """ + return sorted(dict, key=dict.get) + + +def write_analysis_fields(): + """ + Write the analysis fields + """ + s = '%s<xml name="analysis_fields">\n' % (spaces) + fields = enasearch.get_returnable_fields(result="analysis", verbose=False) + for f in fields: + s += '%s<option value="%s">%s</option>\n' % (2 * spaces, f, f) + s += '%s</xml>\n' % (spaces) + return s + + +def write_display_options(): + """ + Write the display options + """ + s = '%s<xml name="display_options">\n' % (spaces) + when_s = '%s<xml name="when_display_options">\n' % (spaces) + options = enasearch.get_display_options(verbose=False) + for opt in options: + s += '%s<option value="%s">%s</option>\n' % (2 * spaces, opt, options[opt]['description']) + when_s += '%s<when value="%s">\n' % (2 * spaces, opt) + if opt == 'fasta' or opt == 'fastq': + when_s += '%s<param name="range_start" argument="--subseq_range" type="integer" optional="true" label="Start integer for subsequences"/>\n' % (3 * spaces) + when_s += '%s<param name="range_stop" argument="--subseq_range" type="integer" optional="true" label="Stop integer for subsequences"/>\n' % (3 * spaces) + else: + when_s += '%s<param argument="--offset" type="integer" optional="true" label="First record to get"/>\n' % (3 * spaces) + when_s += '%s<param argument="--length" type="integer" optional="true" label="Number of records to retrieve"/>\n' % (3 * spaces) + when_s += '%s</when>\n' % (2 * spaces) + s += '%s</xml>\n' % (spaces) + when_s += '%s</xml>\n' % (spaces) + s += when_s + return s + + +def write_run_fields(): + """ + Write the run fields + """ + s = '%s<xml name="run_fields">\n' % (spaces) + fields = enasearch.get_returnable_fields(result="read_run", verbose=False) + for f in fields: + s += '%s<option value="%s">%s</option>\n' % (2 * spaces, f, f) + s += '%s</xml>\n' % (spaces) + return s + + +def write_taxonomy_results(): + """ + Write the possible taxonomy results + """ + s = '%s<xml name="taxonomy_results">\n' % (spaces) + fields = enasearch.get_taxonomy_results(verbose=False) + for f in fields: + s += '%s<option value="%s">%s</option>\n' % (2 * spaces, f, fields[f]['description']) + s += '%s</xml>\n' % (spaces) + return s + + +def write_result_parameters(fts=False): + """ + Write the parameters that are dependant of results + """ + res = enasearch.get_results(verbose=False) + options = enasearch.get_display_options(verbose=False) + ft = enasearch.get_filter_types(verbose=False) + # Format the filter type related parameters + ft_parameters = {} + for t in ft: + s = '' + if 'operators' in ft[t]: + s = '%s<param name="operation" type="select" label="Operator">\n' % (7 * spaces) + for o in ft[t]['operators']: + on = o + if o in operator_names: + on = operator_names[o] + s += '%s<option value="%s">%s</option>\n' % (8 * spaces, on, on) + s += '%s</param>\n' % (7 * spaces) + if 'value' in ft[t]: + value_format = 'float' if t == 'Number' else 'text' + s += '%s<param name="value" type="%s" value="" label="%s"/>\n' % (7 * spaces, value_format, ft[t]['value']) + elif 'values' in ft[t]: + s += '%s<param name="value" type="select" label="Value">\n' % (7 * spaces) + for v in ft[t]['values']: + s += '%s<option value="%s">%s</option>\n' % (8 * spaces, v, v) + s += '%s</param>\n' % (7 * spaces) + else: + s += '%s<conditional name="op">\n' % (7 * spaces) + s += '%s<param name="operation" type="select" label="Operation">\n' % (8 * spaces) + for op in ft[t]: + s += '%s<option value="%s">%s</option>\n' % (9 * spaces, op, ft[t][op]['description']) + s += '%s</param>\n' % (8 * spaces) + for op in ft[t]: + s += '%s<when value="%s">\n' % (8 * spaces, op) + s += '%s<param name="values" type="text" value="" label="%s" help="Values separated by simple comma"/>\n' % (9 * spaces, ",".join(ft[t][op]['parameters'])) + s += '%s</when>\n' % (8 * spaces) + s += '%s</conditional>\n' % (7 * spaces) + ft_parameters[t] = s + # Start adding the conditional + s = '%s<conditional name="res">\n' % (2 * spaces) + # Add result parameter + s += '%s<param argument="--result" type="select" label="Result to return">\n' % (3 * spaces) + for r in res: + s += '%s<option value="%s">%s</option>\n' % (4 * spaces, r, res[r]['description']) + s += '%s</param>\n' % (3 * spaces) + for r in res: + sf = enasearch.get_sortable_fields(r) + ff = res[r]['filter_fields'] + s += '%s<when value="%s">\n' % (3 * spaces, r) + if not fts: + s += '%s<repeat name="queries" title="Add a query">\n' % (4 * spaces) + # Add combination operator + s += '%s<param name="combination_operation" type="select" label="Combination operation">\n' % (5 * spaces) + s += '%s<option value="AND">AND</option>\n' % (6 * spaces) + s += '%s<option value="OR">OR</option>\n' % (6 * spaces) + s += '%s<option value="NOT">NOT</option>\n' % (6 * spaces) + s += '%s</param>\n' % (5 * spaces) + s += '%s<conditional name="filter_field">\n' % (5 * spaces) + s += '%s<param name="field" type="select" label="Field to query">\n' % (6 * spaces) + for f in ff: + s += '%s<option value="%s">%s</option>\n' % (7 * spaces, f, ff[f]['description']) + s += '%s</param>\n' % (6 * spaces) + for f in ff: + # Add the correct parameter given the type of field + typ = ff[f]['type'].capitalize() + if typ not in ft_parameters: + if f == 'location': + typ = 'Geospatial' + else: + continue + s += '%s<when value="%s">\n' % (6 * spaces, f) + s += ft_parameters[typ] + s += '%s</when>\n' % (6 * spaces) + s += '%s</conditional>\n' % (5 * spaces) + s += '%s</repeat>\n' % (4 * spaces) + # Add display opt + s += '%s<conditional name="display_opt">\n' % (4 * spaces) + s += '%s<param argument="--display" type="select" label="Display option to specify the display format">\n' % (5 * spaces) + s += '%s<expand macro="display_options"/>\n' % (6 * spaces) + s += '%s</param>\n' % (5 * spaces) + for opt in options: + s += '%s<when value="%s"' % (5 * spaces, opt) + if opt != 'fasta' and opt != 'fastq': + s += '>\n' + s += '%s<param argument="--offset" type="integer" optional="true" label="First record to get"/>\n' % (6 * spaces) + s += '%s<param argument="--length" type="integer" optional="true" label="Number of records to retrieve"/>\n' % (6 * spaces) + if opt == 'report': + s += '%s<param argument="--fields" type="select" multiple="true" label="Fields to return">\n' % (6 * spaces) + for f in res[r]['returnable_fields']: + s += '%s<option value="%s">%s</option>\n' % (7 * spaces, f, f) + s += '%s</param>\n' % (6 * spaces) + s += '%s<param argument="--sortfields" type="select" optional="true" multiple="true" label="Fields to sort the results">\n' % (6 * spaces) + for f in sf: + s += '%s<option value="%s">%s</option>\n' % (7 * spaces, f, sf[f]['description']) + s += '%s</param>\n' % (6 * spaces) + s += '%s</when>\n' % (5 * spaces) + else: + s += '/>\n' + s += '%s</conditional>\n' % (4 * spaces) + s += '%s</when>\n' % (3 * spaces) + s += '%s</conditional>\n' % (2 * spaces) + return s + + +def write_search_data_parameters(): + """ + Write the parameters for search_data + """ + fts = '%s<xml name="free_text_search">\n' % (spaces) + fts += write_result_parameters(True) + fts += '%s</xml>\n' % (spaces) + cts = '%s<xml name="conditional_text_search">\n' % (spaces) + cts += write_result_parameters(False) + cts += '%s</xml>\n' % (spaces) + return fts + cts + + +def generate_search_macros(filepath): + """ + Generate the content of the macro file + """ + s = '<?xml version="1.0" ?>\n' + s += '<macros>\n' + s += write_analysis_fields() + s += write_display_options() + s += write_run_fields() + s += write_taxonomy_results() + s += write_search_data_parameters() + s += '</macros>\n' + with open(filepath, "w") as file: + file.write(s) + + +if __name__ == '__main__': + generate_search_macros("search_macros.xml")