def complete_input_references_in_outputs(cli_outputs, inputs_to_reference): """ Takes the cli outputs and inputs to reference and returns the cli outputs, but with resolved input references :param cli_outputs: The cli outputs to resolve input references for :param inputs_to_reference: The inputs to reference """ resolved_outputs = deepcopy(cli_outputs) for output_key, output_value in resolved_outputs.items(): if output_value['type'] == 'stdout' or output_value['type'] == 'stderr': continue output_binding = output_value['outputBinding'] try: resolved_glob = resolve_input_references(output_binding['glob'], inputs_to_reference) except InvalidInputReference as e: raise InvalidInputReference( 'Invalid Input Reference for output key "{}":\n{}'.format( output_key, str(e))) output_binding['glob'] = resolved_glob return resolved_outputs
def test_recursive_references(): glob = '$(inputs.$(inputs.a_file.basename).basename' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_multiple_references(): glob = '$(inputs.a_file.basename) - $(inputs.a_file.class)' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == 'a_file - File'
def test_not_closed_bracket(): glob = '$(inputs["a_file.basename)' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_could_not_resolve_attribute(): glob = '$(inputs.a_file.invalid)' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_file_list(): glob = 'PRE-$(inputs.a_file[0].basename)-POST' result = resolve_input_references(glob, INPUT_LIST_TO_REFERENCE) assert result == 'PRE-a_file-POST'
def test_bracket_dots(): glob = 'PRE-$(inputs.a_file.basename)-POST' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == 'PRE-a_file-POST'
def test_bracket_single_quote(): glob = 'PRE-$(inputs[\'a_file\'][\'basename\'])-POST' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == 'PRE-a_file-POST'
def test_bracket_double_quote(): glob = 'PRE-$(inputs["a_file"]["basename"])-POST' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == 'PRE-a_file-POST'
def test_int_value(): glob = '$(inputs.a_file.size)' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == '1000'
def test_wrong_order(): glob = '$(inputs.a_file["basename)"]' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_missing_inputs(): glob = '$(invalid.a_file.basename)' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_could_not_resolve_identifier(): glob = '$(inputs["invalid"])' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)
def test_string_index_in_list(): glob = '$(inputs.a_file[invalid].basename)' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_LIST_TO_REFERENCE)
def test_string_index_and_dot(): glob = '$(inputs["a_file"].basename)' result = resolve_input_references(glob, INPUT_TO_REFERENCE) assert result == 'a_file'
def test_recursive_attributes(): glob = '$(inputs["inputs["a_file"]"].basename)' with pytest.raises(InvalidInputReference): resolve_input_references(glob, INPUT_TO_REFERENCE)