def resolve_job_references(io_hash, job_outputs, should_resolve=True): ''' :param io_hash: an input or output hash in which to resolve any job-based object references possible :type io_hash: dict :param job_outputs: a mapping of finished local jobs to their output hashes :type job_outputs: dict :param should_resolve: whether it is an error if a job-based object reference in *io_hash* cannot be resolved yet :type should_resolve: boolean Modifies *io_hash* in-place. ''' q = [] for field in io_hash: if is_job_ref(io_hash[field]): io_hash[field] = resolve_job_ref(io_hash[field], job_outputs, should_resolve) elif isinstance(io_hash[field], list) or isinstance(io_hash[field], dict): q.append(io_hash[field]) while len(q) > 0: thing = q.pop() if isinstance(thing, list): for i in range(len(thing)): if is_job_ref(thing[i]): thing[i] = resolve_job_ref(thing[i], job_outputs, should_resolve) elif isinstance(thing[i], list) or isinstance(thing[i], dict): q.append(thing[i]) else: for field in thing: if is_job_ref(thing[field]): thing[field] = resolve_job_ref(thing[field], job_outputs, should_resolve) elif isinstance(thing[field], list) or isinstance(thing[field], dict): q.append(thing[field])
def has_local_job_refs(io_hash): ''' :param io_hash: input/output hash :type io_hash: dict :returns: boolean indicating whether any job-based object references are found in *io_hash* ''' q = [] for field in io_hash: if is_job_ref(io_hash[field]): if get_job_from_jbor(io_hash[field]).startswith('localjob'): return True elif isinstance(io_hash[field], list) or isinstance(io_hash[field], dict): q.append(io_hash[field]) while len(q) > 0: thing = q.pop() if isinstance(thing, list): for i in range(len(thing)): if is_job_ref(thing[i]): if get_job_from_jbor(thing[i]).startswith('localjob'): return True elif isinstance(thing[i], list) or isinstance(thing[i], dict): q.append(thing[i]) else: for field in thing: if is_job_ref(thing[field]): if get_job_from_jbor(thing[field]).startswith('localjob'): return True elif isinstance(thing[field], list) or isinstance(thing[field], dict): q.append(thing[field]) return False
def has_local_job_refs(io_hash): ''' :param io_hash: input/output hash :type io_hash: dict :returns: boolean indicating whether any job-based object references are found in *io_hash* ''' q = [] for field in io_hash: if is_job_ref(io_hash[field]): if get_job_from_jbor(io_hash[field]).startswith('localjob'): return True elif isinstance(io_hash[field], list) or isinstance( io_hash[field], dict): q.append(io_hash[field]) while len(q) > 0: thing = q.pop() if isinstance(thing, list): for i in range(len(thing)): if is_job_ref(thing[i]): if get_job_from_jbor(thing[i]).startswith('localjob'): return True elif isinstance(thing[i], list) or isinstance(thing[i], dict): q.append(thing[i]) else: for field in thing: if is_job_ref(thing[field]): if get_job_from_jbor(thing[field]).startswith('localjob'): return True elif isinstance(thing[field], list) or isinstance( thing[field], dict): q.append(thing[field]) return False
def test_run_workflow(self): launched_jobs = self.workflow.run({"0.record": dxpy.dxlink(self.closedrecord)}) self.assertEqual(len(launched_jobs), 2) job_descs = [dxjob.describe() for dxjob in launched_jobs] self.assertEqual(job_descs[0]['name'], 'identity-record - workflowname') self.assertEqual(get_dxlink_ids(job_descs[0]['input']['record'])[0], self.closedrecord.get_id()) self.assertTrue(is_job_ref(job_descs[1]['runInput']['record'])) self.assertEqual(get_job_from_jbor(job_descs[1]['runInput']['record']), job_descs[0]['id']) self.assertEqual(get_field_from_jbor(job_descs[1]['runInput']['record']), 'record') launched_jobs[1].wait_on_done()
def resolve_job_references(io_hash, job_outputs, should_resolve=True): ''' :param io_hash: an input or output hash in which to resolve any job-based object references possible :type io_hash: dict :param job_outputs: a mapping of finished local jobs to their output hashes :type job_outputs: dict :param should_resolve: whether it is an error if a job-based object reference in *io_hash* cannot be resolved yet :type should_resolve: boolean Modifies *io_hash* in-place. ''' q = [] for field in io_hash: if is_job_ref(io_hash[field]): io_hash[field] = resolve_job_ref(io_hash[field], job_outputs, should_resolve) elif isinstance(io_hash[field], list) or isinstance( io_hash[field], dict): q.append(io_hash[field]) while len(q) > 0: thing = q.pop() if isinstance(thing, list): for i in range(len(thing)): if is_job_ref(thing[i]): thing[i] = resolve_job_ref(thing[i], job_outputs, should_resolve) elif isinstance(thing[i], list) or isinstance(thing[i], dict): q.append(thing[i]) else: for field in thing: if is_job_ref(thing[field]): thing[field] = resolve_job_ref(thing[field], job_outputs, should_resolve) elif isinstance(thing[field], list) or isinstance( thing[field], dict): q.append(thing[field])
def test_is_job_ref(self): # Positive results jobref = {"job": "job-B55ZF5kZKQGz1Xxyb5FQ0003", "field": "number"} self.assertTrue(describe.is_job_ref(jobref)) jobref = {"$dnanexus_link": jobref} self.assertTrue(describe.is_job_ref(jobref)) # Negative results jobref = {"job": "job-B55ZF5kZKQGz1Xxyb5FQ0003", "field": "number", "other": "field"} self.assertFalse(describe.is_job_ref(jobref)) jobref = {"job": "job-B55ZF5kZKQGz1Xxyb5FQ0003", "field": 32} self.assertFalse(describe.is_job_ref(jobref)) jobref = {"$dnanexus_link": jobref} self.assertFalse(describe.is_job_ref(jobref)) jobref = {"$dnanexus_link": "job-B55ZF5kZKQGz1Xxyb5FQ0003"} self.assertFalse(describe.is_job_ref(jobref))