20
20
#
21
21
# https://www.nipreps.org/community/licensing/
22
22
#
23
- import json
23
+ from pathlib import Path
24
24
25
+ import orjson
25
26
from nipype .interfaces .base import (
26
27
BaseInterfaceInputSpec ,
27
28
Bunch ,
@@ -127,6 +128,7 @@ class UploadIQMsInputSpec(BaseInterfaceInputSpec):
127
128
128
129
class UploadIQMsOutputSpec (TraitedSpec ):
129
130
api_id = traits .Either (None , traits .Str , desc = 'Id for report returned by the web api' )
131
+ payload_file = File (desc = 'Submitted payload (only for debugging)' )
130
132
131
133
132
134
class UploadIQMs (SimpleInterface ):
@@ -153,6 +155,18 @@ def _run_interface(self, runtime):
153
155
modality = self .inputs .modality ,
154
156
)
155
157
158
+ payload_str = orjson .dumps (
159
+ payload ,
160
+ option = (
161
+ orjson .OPT_SORT_KEYS
162
+ | orjson .OPT_INDENT_2
163
+ | orjson .OPT_APPEND_NEWLINE
164
+ | orjson .OPT_SERIALIZE_NUMPY
165
+ ),
166
+ )
167
+ Path ('payload.json' ).write_bytes (payload_str )
168
+ self ._results ['payload_file' ] = str (Path ('payload.json' ).absolute ())
169
+
156
170
try :
157
171
self ._results ['api_id' ] = response .json ()['_id' ]
158
172
except (AttributeError , KeyError , ValueError ):
@@ -161,7 +175,7 @@ def _run_interface(self, runtime):
161
175
'QC metrics upload failed to create an ID for the record '
162
176
f'uploaded. Response from server follows: { response .text } '
163
177
'\n \n Payload:\n '
164
- f'{ json . dumps ( payload , indent = 2 ) } '
178
+ f'{ payload_str } '
165
179
)
166
180
config .loggers .interface .warning (errmsg )
167
181
@@ -177,7 +191,7 @@ def _run_interface(self, runtime):
177
191
'' ,
178
192
'' ,
179
193
'Payload:' ,
180
- json . dumps ( payload , indent = 2 ) ,
194
+ payload_str ,
181
195
]
182
196
)
183
197
config .loggers .interface .warning (errmsg )
@@ -209,8 +223,6 @@ def upload_qc_metrics(
209
223
210
224
"""
211
225
from copy import deepcopy
212
- from json import dumps , loads
213
- from pathlib import Path
214
226
215
227
import requests
216
228
@@ -219,7 +231,7 @@ def upload_qc_metrics(
219
231
errmsg = 'Unknown API endpoint' if not endpoint else 'Authentication failed.'
220
232
return Bunch (status_code = 1 , text = errmsg )
221
233
222
- in_data = loads (Path (in_iqms ).read_text ())
234
+ in_data = orjson . loads (Path (in_iqms ).read_bytes ())
223
235
224
236
# Extract metadata and provenance
225
237
meta = in_data .pop ('bids_meta' )
@@ -267,20 +279,23 @@ def upload_qc_metrics(
267
279
268
280
start_message = messages .QC_UPLOAD_START .format (url = endpoint )
269
281
config .loggers .interface .info (start_message )
282
+
283
+ errmsg = None
270
284
try :
271
285
# if the modality is bold, call "bold" endpoint
272
286
response = requests .post (
273
287
f'{ endpoint } /{ modality } ' ,
274
288
headers = headers ,
275
- data = dumps (data ),
289
+ data = orjson . dumps (data , option = orjson . OPT_SERIALIZE_NUMPY ),
276
290
timeout = 15 ,
277
291
)
278
292
except requests .ConnectionError as err :
279
- errmsg = f'Error uploading IQMs -- Connection error:\n { err } '
280
- return Bunch (status_code = 1 , text = errmsg )
293
+ errmsg = (f'Error uploading IQMs: Connection error:' , f'{ err } ' )
281
294
except requests .exceptions .ReadTimeout as err :
282
- errmsg = f'Error uploading IQMs -- { endpoint } seems down:\n { err } '
283
- return Bunch (status_code = 1 , text = errmsg )
295
+ errmsg = (f'Error uploading IQMs: Server { endpoint } is down.' , f'{ err } ' )
296
+
297
+ if errmsg is not None :
298
+ response = Bunch (status_code = 1 , text = '\n ' .join (errmsg ))
284
299
285
300
return response , data
286
301
0 commit comments