Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/galaxy/tool_util/verify/asserts/__init__.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/galaxy/tool_util/verify/asserts/__init__.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,87 @@ +import logging +import sys + +from galaxy.util import unicodify +from galaxy.util.getargspec import getfullargspec + +log = logging.getLogger(__name__) + +assertion_module_names = ['text', 'tabular', 'xml', 'hdf5', 'archive', 'size'] + +# Code for loading modules containing assertion checking functions, to +# create a new module of assertion functions, create the needed python +# source file "test/base/asserts/<MODULE_NAME>.py" and add +# <MODULE_NAME> to the list of assertion module names defined above. +assertion_modules = [] +for assertion_module_name in assertion_module_names: + full_assertion_module_name = 'galaxy.tool_util.verify.asserts.' + assertion_module_name + try: + # Dynamically import module + __import__(full_assertion_module_name) + assertion_module = sys.modules[full_assertion_module_name] + assertion_modules.append(assertion_module) + except Exception: + log.exception('Failed to load assertion module: %s', assertion_module_name) + + +def verify_assertions(data, assertion_description_list): + """ This function takes a list of assertions and a string to check + these assertions against. """ + for assertion_description in assertion_description_list: + verify_assertion(data, assertion_description) + + +def verify_assertion(data, assertion_description): + tag = assertion_description["tag"] + assert_function_name = "assert_" + tag + assert_function = None + for assertion_module in assertion_modules: + if hasattr(assertion_module, assert_function_name): + assert_function = getattr(assertion_module, assert_function_name) + + if assert_function is None: + errmsg = "Unable to find test function associated with XML tag '%s'. Check your tool file syntax." % tag + raise AssertionError(errmsg) + + assert_function_args = getfullargspec(assert_function).args + args = {} + for attribute, value in assertion_description["attributes"].items(): + if attribute in assert_function_args: + args[attribute] = value + + # Three special arguments automatically populated independently of + # tool XML attributes. output is passed in as the contents of the + # output file. verify_assertions_function is passed in as the + # verify_assertions function defined above, this allows + # recursively checking assertions on subsections of + # output. children is the parsed version of the child elements of + # the XML element describing this assertion. See + # assert_element_text in test/base/asserts/xml.py as an example of + # how to use verify_assertions_function and children in conjuction + # to apply assertion checking to a subset of the input. The parsed + # version of an elements child elements do not need to just define + # assertions, developers of assertion functions can also use the + # child elements in novel ways to define inputs the assertion + # checking function (for instance consider the following fictional + # assertion function for checking column titles of tabular output + # - <has_column_titles><with_name name="sequence"><with_name + # name="probability"></has_column_titles>.) + if "output" in assert_function_args: + # If the assert_function will have an attribute called "output" + # the data passed from the test to the function will be unicodified. + # This is because most of the assert functions are working on pure + # text files. + args["output"] = unicodify(data) + if "output_bytes" in assert_function_args: + # This will read in data as bytes and will not change it prior passing + # it to the assert_function + args["output_bytes"] = data + + if "verify_assertions_function" in assert_function_args: + args["verify_assertions_function"] = verify_assertions + + if "children" in assert_function_args: + args["children"] = assertion_description["children"] + + # TODO: Verify all needed function arguments are specified. + assert_function(**args)