def convert(type, input, output, fetch=True, status=None, **kwargs): """ Convert data from one format to another. :param type: The type specifier string of the input data. :param input: A binding dict of the form ``{'format': format, 'data', data}``, where ``format`` is the format specifier string, and ``data`` is the raw data to convert. The dict may also be of the form ``{'format': format, 'uri', uri}``, where ``uri`` is the location of the data (see :py:mod:`girder_worker.uri` for URI formats). :param output: A binding of the form ``{'format': format}``, where ``format`` is the format specifier string to convert the data to. The binding may also be in the form ``{'format': format, 'uri', uri}``, where ``uri`` specifies where to place the converted data. :param fetch: Whether to do an initial data fetch before conversion (default ``True``). :returns: The output binding dict with an additional field ``'data'`` containing the converted data. If ``'uri'`` is present in the output binding, instead saves the data to the specified URI and returns the output binding unchanged. """ if fetch: input['data'] = girder_worker.io.fetch(input, **kwargs) if input['format'] == output['format']: data = input['data'] else: data_descriptor = input try: conversion_path = converter_path(Validator(type, input['format']), Validator(type, output['format'])) except NetworkXNoPath: raise Exception('No conversion path from %s/%s to %s/%s' % (type, input['format'], type, output['format'])) # Run data_descriptor through each conversion in the path for conversion in conversion_path: result = girder_worker.run(conversion, {'input': data_descriptor}, auto_convert=False, status=status, **kwargs) data_descriptor = result['output'] data = data_descriptor['data'] if status == utils.JobStatus.CONVERTING_OUTPUT: job_mgr = kwargs.get('_job_manager') _job_status(job_mgr, utils.JobStatus.PUSHING_OUTPUT) girder_worker.io.push(data, output, **kwargs) return output
def convert(type, input, output, fetch=True, status=None, **kwargs): """ Convert data from one format to another. :param type: The type specifier string of the input data. :param input: A binding dict of the form ``{"format": format, "data", data}``, where ``format`` is the format specifier string, and ``data`` is the raw data to convert. The dict may also be of the form ``{"format": format, "uri", uri}``, where ``uri`` is the location of the data (see :py:mod:`girder_worker.uri` for URI formats). :param output: A binding of the form ``{"format": format}``, where ``format`` is the format specifier string to convert the data to. The binding may also be in the form ``{"format": format, "uri", uri}``, where ``uri`` specifies where to place the converted data. :param fetch: Whether to do an initial data fetch before conversion (default ``True``). :returns: The output binding dict with an additional field ``"data"`` containing the converted data. If ``"uri"`` is present in the output binding, instead saves the data to the specified URI and returns the output binding unchanged. """ if fetch: input["data"] = girder_worker.io.fetch(input, **kwargs) if input["format"] == output["format"]: data = input["data"] else: data_descriptor = input for c in converter_path(Validator(type, input['format']), Validator(type, output['format'])): result = girder_worker.run( c, {"input": data_descriptor}, auto_convert=False, status=status, **kwargs) data_descriptor = result["output"] data = data_descriptor["data"] if status == utils.JobStatus.CONVERTING_OUTPUT: job_mgr = kwargs.get('_job_manager') _job_status(job_mgr, utils.JobStatus.PUSHING_OUTPUT) girder_worker.io.push(data, output, **kwargs) return output
def test_converter_path(self): # There is no path from validators that don't exist with self.assertRaises(NetworkXNoPath): converter_path(Validator('foo', 'bar'), Validator('foo', 'baz')) # There is no path for types which lie in different components with self.assertRaises(NetworkXNoPath): converter_path(self.stringTextValidator, Validator('graph', 'networkx')) self.assertEquals(converter_path(self.stringTextValidator, self.stringTextValidator), []) # There is a direct path from converting between these types self.assertEquals(len(converter_path(self.stringTextValidator, Validator('string', 'json'))), 1)