Mercurial > repos > uga-galaxy-group > webservice_toolsuite_v1_1
diff WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/clientGenerator/paramConverter.py~ @ 0:049760c677de default tip
Galaxy WSExtensions added successfully
author | uga-galaxy-group |
---|---|
date | Tue, 05 Jul 2011 19:34:18 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebServiceExtensionsV1.1/WebServiceToolWorkflow_REST_SOAP/clientGenerator/paramConverter.py~ Tue Jul 05 19:34:18 2011 -0400 @@ -0,0 +1,198 @@ +''' +@author Rui Wnag, Chaitanya Guttula +@see LICENSE (MIT style license file). +''' + +''' +converter galaxy parameter <-----> user input dictionary for web service +'|' is the seperator, if the real name contains it, it will cause wrong result in this converter +''' +from types import * +#from galaxy.tools.parameters.basic import * + +__author__="Rui Wang" + +def nested2flatDict(nestedDic): + ''' + nestedDic is dictionary e.g.{a:{a1:None, a2:None}, b:None, c:[{c1:None, c2:None},{c1:None, c2:None}]}, + converter it into flatDict e.g. + {a|a1:TextToolParameter(), a|a2:TextToolParameter(), b:TextToolParameter(), + c|1|c1:TextToolParameter(),c|1|c2:TextToolParameter(), c|2|c1:TextToolParameter(),c|2|c2:TextToolParameter()} + seperator is |, not / + ''' + if nestedDic is None or len(nestedDic) == 0: + return {}; + flatDic={} + + for key, value in nestedDic.iteritems(): + if type(value) is DictType: + dicRecur(key, value, flatDic); + elif type(value) is ListType: + listRecur(key, value, flatDic); + elif value is None: + flatDic[key]=None#TextToolParameter(None, XML( '<param name="' + str(key) + '" type="text" size="10" value="default" />' ) ) + else: + flatDic[key]=str(value) + return flatDic + +def dicRecur(prefix, dic, flatDic): + ''' + ''' + if dic is None or len(dic) == 0: + raise ValueError, 'dic is empty' + i=0; + for key, value in dic.items(): + if type(value) is DictType: + #print key + dicRecur(prefix+"|"+key, value, flatDic); + elif type(value) is ListType: + listRecur(prefix+"|"+key, value, flatDic); + elif value is None: + #print 'key',key + #if (key.find('$')>-1): + # vlist = key.split('$') + # key = ''.join(vlist) + + #print 'key',key + # flatDic[prefix+"|_"+str(i)+"|"+key]=None + # i=i+1 + #else: + flatDic[prefix+"|"+key]=None#TextToolParameter(None, XML( '<param name="' + str(prefix) + '|' + str(key) + '" type="text" size="10" value="default" />' ) ) + else: + #print prefix + #if (key.find('$')>-1): + # vlist = key.split('$') + # key = ''.join(vlist) + + # print 'key',key + # flatDic[prefix+"|_"+str(i)+"|"+key]=None + # i=i+1 + #else: + flatDic[prefix+"|"+key]=str(value) + +def listRecur(prefix, list, flatDic): + '''''' + + #You are expecting this list to contain a complexType. + #When it doesn't you raise a ValueError. + #If the list contains a simpletype then we add |$| + # when flatenning. + if list is None or len(list)==0: + flatDic[prefix+'|$|'] = []; + return []; + i=0 + for value in list: + if type(value) is DictType: + #print prefix + dicRecur(prefix+"|"+str(i), value, flatDic); + #else:#if type(value) is ListType: + # if prefix+'|0|' not in flatDic: + # flatDic[prefix+'|0|'] = [] + # flatDic[prefix+'|0|'].append(value) + # return ; + i += 1; + +def flat2nestedDict(flatDic): + '''the flatDic has value in it + converter it to nested dictionary''' + if flatDic is None or flatDic=={}: + raise ValueError, 'flatDic is empty' + nestedDic = {}; + for key, value in flatDic.iteritems() : + key_arr = key.split('|'); + print key_arr + last_idx = len(key_arr) - 1; + sub_dic = nestedDic; + if last_idx != 0 : + i = 0; + # Iterates over the split values of a single key + while i < last_idx : + + try : + key_int = int(key_arr[i]); # checking if the split value of key is number (true only if it ) + if key_int >= len(sub_dic) : + for j in range(key_int - len(sub_dic) + 1) : + sub_dic.append({}); + sub_dic = sub_dic[key_int]; + + except ValueError : + + #If the split value is not present in thhe subdic + if key_arr[i] == '$': + print '$ is there'#,nestedDic + else: + if key_arr[i] not in sub_dic : + try : + key_int = int(key_arr[i + 1]); # Ckecking of the next split value in key is number + + # Executed if the key is or array type key + sub_list = []; + sub_dic[key_arr[i]] = sub_list; + for j in range(key_int + 1) : + sub_list.append({}); + sub_dic = sub_list[key_int]; + i += 1; + + except ValueError : # 2 consicutive split values in key are not numerical value (i.e not array) + if key_arr[last_idx-1] == '$' : + if i == last_idx-2 : + print 'Found the value',key_arr[i] + else: + temp = {}; + sub_dic[key_arr[i]] = temp; + sub_dic = temp; + + else: + temp = {}; + sub_dic[key_arr[i]] = temp; + sub_dic = temp; + + # If the split value is present in the subdir then create a new subdic with + else : + sub_dic = nestedDic[key_arr[i]]; + + i += 1; + if value == '' : + value = None; + if key_arr[last_idx-1] == '$': + templist=[]; + if value != []: + if value.find(',')>-1: + vlist = value.split(',') + for l in vlist: + templist.append(l); + else: + templist.append(value); + sub_dic[key_arr[last_idx-2]] = templist; + else: + sub_dic[key_arr[last_idx]] = value; + + # If the leaf node is basic array type + #if key_arr[last_idx] == '': + # sub_dic[key_arr[last_idx-2]].append(value); + #else: + # sub_dic[key_arr[last_idx]] = value; + + return nestedDic + +#testing this module only, before run below test, please comment line 6,30,33,50,53, and uncomment line 29,32,49,52, since they will use other modules of galaxy +if __name__=="__main__": + +# nestedDic={'_params':{ '_program' : 'blastp', '_database' :'swissprot', '_email' :'riververy@yahoo.com', '_async': 1}, '_content':[{'_type':'sequence', '_content':'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'},{'_type':'ss', '_content':'bbbbbbbbbbbbbbbb'}]} + nestedDic={'_params':{ '_program' : 'blastp', '_database' :{'_string':[]}, '_email' :'riververy@yahoo.com', '_async': '', '_test':[{'_name':'chaithu'},{'_name':'srinivas'}]}, '_content':[{'_type':'sequence', '_content':'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'},{'_type':'ss', '_content':'bbbbbbbbbbbbbbbb'}]} + #flatdic = nested2flatDict(nestedDic) + #print flatdic + flatDic={'_parameters|_program': 'blastp', '_parameters|_stype': 'protein', '_parameters|_sequence': 'MKLSKRYRFWQKVIKALGVLALIATLVLVVYLYKLGILNDSNELKDLVHKYEFWGPMIFIVAQIVQIVFPVIPGGVTTVAGFLIFGPTLGFIYNYIGIIIGSVILFWLVKFYGRKFVLLF', '_email': 'chaitanya.g86@gmail.com', '_parameters|_database|_string|$|': 'uniprotkb,swissprot'} +#{'_params|_email': 'riververy@yahoo.com', '_params|_database': 'swissprot', '_params|_async': '1', '_content|0|_type': 'sequence', '_content|1|_type': 'ss','_params|_program|0|': 'hrllo', '_content|1|_content':'bbbbbbbbbbbbbbbb', '_content|0|_content': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'} + print flat2nestedDict(flatDic) + + + + + + + + + + +