@@ -73,7 +73,10 @@ def body_from_url(url, accept, auth=None, data=None, debug=False, method=None):
7373# return python struct from JSON output of MG-RAST or Shock API
7474def obj_from_url (url , auth = None , data = None , debug = False , method = None ):
7575 result = body_from_url (url , 'application/json' , auth = auth , data = data , debug = debug , method = method )
76- obj = json .loads (result .read ().decode ("utf8" ))
76+ if result .headers ["content-type" ] == "application/x-download" :
77+ return (result .read ())
78+ else :
79+ obj = json .loads (result .read ().decode ("utf8" ))
7780 if obj is None :
7881 sys .stderr .write ("ERROR: return structure not valid json format\n " )
7982 sys .exit (1 )
@@ -120,26 +123,31 @@ def async_rest_api(url, auth=None, data=None, debug=False, delay=60):
120123 submit = obj_from_url (url , auth = auth , data = data , debug = debug )
121124# If "status" is nor present, or if "status" is somehow not "submitted"
122125# assume this is not an asynchronous call and it's done.
123- if ('status' in submit ) and (submit ['status' ] == 'done ' ) and ('url ' in submit ):
126+ if ('status' in submit ) and (submit ['status' ] != 'submitted ' ) and ('data ' in submit ):
124127 return submit ['data' ]
125- if not (('status' in submit ) and (submit ['status' ] == 'submitted' ) and ('url' in submit )):
126- return submit
127- result = obj_from_url (submit ['url' ], debug = debug )
128+ # if not (('status' in submit) and (submit['status'] == 'submitted') and ('url' in submit)):
129+ # return submit # No status, no url and no submitted
130+ result = obj_from_url (submit ['url' ], auth = auth , debug = debug )
128131 try :
129- while result ['status' ] != 'done ' :
132+ while result ['status' ] == 'submitted ' :
130133 if debug :
131134 print ("waiting %d seconds ..." % delay )
132135 time .sleep (delay )
133- result = obj_from_url (submit ['url' ], debug = debug )
136+ result = obj_from_url (submit ['url' ], auth = auth , debug = debug )
134137 except KeyError :
135138 print ("Error in response to " + url , file = sys .stderr )
136139 print ("Does not contain 'status' field, likely API syntax error" , file = sys .stderr )
137140 print (json .dumps (result ), file = sys .stderr )
138141 sys .exit (1 )
139- if 'ERROR' in result ['data' ]:
140- sys .stderr .write ("ERROR: %s\n " % result ['data' ]['ERROR' ])
141- print (json .dumps (result ), file = sys .stderr )
142- sys .exit (1 )
142+ except TypeError : # result isn't json, return it anyway
143+ return (result .decode ("utf8" ))
144+ try :
145+ if 'ERROR' in result ['data' ]:
146+ sys .stderr .write ("ERROR: %s\n " % result ['data' ]['ERROR' ])
147+ print (json .dumps (result ), file = sys .stderr )
148+ sys .exit (1 )
149+ except KeyError : # result doesn't have "data"
150+ return result
143151 return result ['data' ]
144152
145153# POST file to MG-RAST or Shock
@@ -407,7 +415,7 @@ def kbids_to_mgids(kbids):
407415def kbid_lookup (ids , reverse = False ):
408416 request = 'mg2kb' if reverse else 'kb2mg'
409417 post = json .dumps ({'ids' : ids }, separators = (',' ,':' ))
410- data = obj_from_url (API_URL + '/job/' + request , data = post )
418+ data = obj_from_url (API_URL + '/job/' + request , auth = auth , data = post )
411419 return data ['data' ]
412420
413421def get_auth_token (opts = None ):
0 commit comments