def get_tree(dict_argv): """ Check that arguments given for tree step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["tree"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["tree"]) # Add arguments from commandline conf_conffile.update(dict_argv, "tree") # Add default arguments if not found in commandline nor config file defaults = { "verbose": 0, "quiet": False, "threads": 1, "soft": "iqtree", "model": None, "boot": 0, "write_boot": False, "memory": None, "fast": False } conf_conffile.add_default(defaults, "tree") conf_conffile.set_boolean("tree", "quiet") conf_conffile.set_boolean("tree", "fast") conf_conffile.set_boolean("tree", "write_boot") conf_conffile.set_int("tree", "boot") conf_conffile.set_int("tree", "verbose") conf_conffile.set_int("tree", "threads") tree_dict = conf_conffile.get_section_dict("tree") return tree_dict
def test_conf_parser_update(capsys): """ Test update section Update current parameters with values given """ c1 = autils.Conf_all_parser(CONFFILE, ["sec1", "sec4"]) update = {"param1": "55", "defparam": "default value"} # Add default parameters to sec1 c1.update(update, "sec1") assert c1.get_section_dict("sec1") == {"param1": "55", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value", "defparam": "default value"} assert c1.get_section_dict("sec4") == {} c1["sec1"]["param1"] == "10" c1["sec1"]["defparam"] == "default value" c1["sec4"]["param1"] == "3" # sec4 has default parameter found in configfile # Add default parameters to sec1 c2 = autils.Conf_all_parser(CONFFILE, ["sec1", "sec4"]) c2.update(update, "sec4") assert c2.get_section_dict("sec1") == {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value"} assert c2.get_section_dict("sec4") == {"param1": "55", "defparam": "default value"} c2["sec1"]["param1"] == "10" c2["sec4"]["param1"] == "55" # sec4 has default parameter found in configfile
def test_conf_parser_init_empty(capsys): """ test class Conf_all_parser init when no config file or empty config file """ # No conf file, no section c = autils.Conf_all_parser("") assert c.sec_dicts == {} # No conf file, empty section list c = autils.Conf_all_parser("", []) assert c.sec_dicts == {} # No conf file, sections c = autils.Conf_all_parser("", ["sec1", "sec2"]) assert c.sec_dicts == {"sec1": {}, "sec2": {}} confdir = os.path.join("test", "data", "generated_by_utils") os.makedirs(confdir) conffile = os.path.join(confdir, "conf.ini") open(conffile, "w").close() # Empty conffile, no section c = autils.Conf_all_parser(conffile) assert c.sec_dicts == {} # Empty conffile, sections c = autils.Conf_all_parser(conffile, ["sec1", "sec2"]) assert c.sec_dicts == {"sec1": {}, "sec2": {}} shutil.rmtree(confdir)
def get_corepers(dict_argv): """ Check that arguments given for corepers step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["corepers"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["corepers"]) # Add arguments from commandline conf_conffile.update(dict_argv, "corepers") # Add default arguments if not found in commandline nor config file defaults = { "verbose": 0, "quiet": False, "tol": 1, "mixed": False, "multi": False, "floor": False, "threads": 1 } conf_conffile.add_default(defaults, "corepers") conf_conffile.set_boolean("corepers", "quiet") conf_conffile.set_boolean("corepers", "floor") conf_conffile.set_boolean("corepers", "mixed") conf_conffile.set_boolean("corepers", "multi") conf_conffile.set_int("corepers", "verbose") conf_conffile.set_float("corepers", "tol") conf_conffile.set_int("corepers", "threads") corepers_dict = conf_conffile.get_section_dict("corepers") return corepers_dict
def get_pangenome(dict_argv): """ Check that arguments given for pangenome step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["pangenome"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["pangenome"]) # Add arguments from commandline conf_conffile.update(dict_argv, "pangenome") # Add default arguments if not found in commandline nor config file defaults = { "verbose": 0, "threads": 1, "min_id": 0.8, "quiet": False, "clust_mode": 1, "outfile": "", "spedir": "" } conf_conffile.add_default(defaults, "pangenome") conf_conffile.set_boolean("pangenome", "quiet") conf_conffile.set_int("pangenome", "verbose") conf_conffile.set_int("pangenome", "threads") conf_conffile.set_float("pangenome", "min_id") pan_dict = conf_conffile.get_section_dict("pangenome") return pan_dict
def test_conf_parser_setbool(capsys): """ try to convert a given parameter to a boolean """ c1 = autils.Conf_all_parser(CONFFILE, ["sec_bool"]) # 0/1 to False/True c1.set_boolean("sec_bool", "bool num_false") assert c1["sec_bool"]["bool num_false"] == "0" assert c1.sec_dicts["sec_bool"]["bool num_false"] == False c1.set_boolean("sec_bool", "bool_num_true") assert c1["sec_bool"]["bool_num_true"] == "1" assert c1.sec_dicts["sec_bool"]["bool_num_true"] == True # off/on to False/True c1.set_boolean("sec_bool", "bool_f") assert c1["sec_bool"]["bool_f"] == "off" assert c1.sec_dicts["sec_bool"]["bool_f"] == False c1.set_boolean("sec_bool", "bool_t") assert c1["sec_bool"]["bool_t"] == "ON" assert c1.sec_dicts["sec_bool"]["bool_t"] == True # no/yes to False/True c1.set_boolean("sec_bool", "bool_n") assert c1["sec_bool"]["bool_n"] == "no" assert c1.sec_dicts["sec_bool"]["bool_n"] == False c1.set_boolean("sec_bool", "bool_y") assert c1["sec_bool"]["bool_y"] == "YES" assert c1.sec_dicts["sec_bool"]["bool_y"] == True # false/true to False/True c1.set_boolean("sec_bool", "bool_false") assert c1["sec_bool"]["bool_false"] == "FalSe" assert c1.sec_dicts["sec_bool"]["bool_false"] == False c1.set_boolean("sec_bool", "bool_true") assert c1["sec_bool"]["bool_true"] == "tRUE" assert c1.sec_dicts["sec_bool"]["bool_true"] == True # With a boolean called with "", not cleaned cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c_str = autils.Conf_all_parser(cfg_file, ["sec_bool"], clean_str=False) with pytest.raises(SystemExit): c_str.set_boolean("sec_bool", "bool_f") out, err = capsys.readouterr() assert ('ERROR: bool_f must be a boolean. Wrong value: "off".') in out # With a boolean called with "" but cleaned cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c_str = autils.Conf_all_parser(cfg_file, ["sec_bool"]) c_str.set_boolean("sec_bool", "bool_f") assert c1["sec_bool"]["bool_f"] == 'off' assert c1.sec_dicts["sec_bool"]["bool_f"] == False # error with pytest.raises(SystemExit): c1.set_boolean('sec1', "param1") out, err = capsys.readouterr() assert ('ERROR: param1 must be a boolean. Wrong value: 10.') in out
def get_prepare(dict_argv): """ Check that arguments given for prepare step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["prepare"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["prepare"]) # Add arguments from commandline conf_conffile.update(dict_argv, "prepare") # Add default arguments if not found in cmd line nor config file defaults = { "verbose": 0, "threads": 1, "cutn": 5, "l90": 100, "nbcont": 999, "levels": "all", "quiet": False, "ncbi_species_name": "", "ncbi_species_taxid": "", "ncbi_taxid": "", "strains": "", "tmp_dir": "", "db_dir": "", "info_file": "", "min_dist": 1e-4, "max_dist": 0.06, "norefseq": False, "only_mash": False, "ncbi_section": "refseq" } conf_conffile.add_default(defaults, "prepare") # Change to expected types (boolean, int, float) conf_conffile.set_boolean("prepare", "quiet") conf_conffile.set_boolean("prepare", "only_mash") conf_conffile.set_boolean("prepare", "norefseq") conf_conffile.set_int("prepare", "threads") conf_conffile.set_int("prepare", "verbose") conf_conffile.set_int("prepare", "cutn") conf_conffile.set_int("prepare", "l90") conf_conffile.set_int("prepare", "nbcont") conf_conffile.set_float("prepare", "min_dist") conf_conffile.set_float("prepare", "max_dist") prep_dict = conf_conffile.get_section_dict("prepare") return prep_dict
def test_conf_parser_add_default(capsys): """ Test add default parameters to config parser. If parameter given already exists, do nothing. If does not exist, add it with given value """ c = autils.Conf_all_parser(CONFFILE, ["sec1", "sec4"]) defaults = {"param1": "55", "defparam": "default value"} # Add default parameters to sec1 c.add_default(defaults, "sec1") assert c.get_section_dict("sec1") == {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value", "defparam": "default value"} assert c.get_section_dict("sec4") == {} c["sec1"]["param1"] == "10" c["sec1"]["defparam"] == "default value" c["sec4"]["param1"] == "3" # sec4 has default parameter found in configfile # Add default parameters to sec4 (sec1 already have them) c.add_default(defaults, "sec4") assert c.get_section_dict("sec1") == {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value", "defparam": "default value"} assert c.get_section_dict("sec4") == {"param1": "55", "defparam": "default value"} c["sec1"]["param1"] == "10" c["sec1"]["defparam"] == "default value" c["sec4"]["param1"] == "55"
def test_conf_parser_init_notexisting(capsys): """ test class Conf_all_parser init when given configfile does not exist """ with pytest.raises(SystemExit): autils.Conf_all_parser("not_existing_conffile.ini") out, err = capsys.readouterr() assert "Error: config file not_existing_conffile.ini not found." in out
def get_align(dict_argv): """ Check that arguments given for align step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["align"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["align"]) # Add arguments from commandline conf_conffile.update(dict_argv, "align") # Add default arguments if not found in commandline nor config file defaults = {"prot_ali": False} conf_conffile.add_default(defaults, "align") conf_conffile.set_boolean("align", "prot_ali") ali_dict = conf_conffile.get_section_dict("align") return ali_dict
def test_conf_parser_init_duplicate(capsys): """ test class Conf_all_parser configfile contains a duplicated parameter -> raises error """ conffile = os.path.join("test", "data", "utils", "configfile-dup.ini") with pytest.raises(SystemExit): autils.Conf_all_parser(conffile) out, err = capsys.readouterr() assert "option 'bool_y' in section 'sec_bool' already exists" in out
def get_annotate(dict_argv): """ Check that arguments given for annotate step are compatible """ # Get arguments from config file and add them (overwrite if needed) if not "configfile" in dict_argv: conf_conffile = utils_argparse.Conf_all_parser("", ["annotate"]) else: conf_conffile = utils_argparse.Conf_all_parser(dict_argv['configfile'], readsec=["annotate"]) # Add arguments from commandline not_allowed = ["l90", "nbcont", "cutn"] for param in not_allowed: if param in conf_conffile.get_section_dict("annotate").keys(): print(f"{param} not allowed in annotate section.") sys.exit(1) conf_conffile.update(dict_argv, "annotate") if "date" not in dict(conf_conffile["annotate"]): import time date = time.strftime("%m%y") conf_conffile.update({"date": date}, "annotate") # Add default arguments if not found in commandline nor config file defaults = { "verbose": 0, "threads": 1, "quiet": False, "prodigal_only": False, "small": False, "qc_only": False, "list_file": "list_file", "db_path": "db_path", "from_info": False } conf_conffile.add_default(defaults, "annotate") conf_conffile.set_boolean("annotate", "quiet") conf_conffile.set_boolean("annotate", "prodigal_only") conf_conffile.set_boolean("annotate", "small") conf_conffile.set_boolean("annotate", "qc_only") conf_conffile.set_int("annotate", "verbose") conf_conffile.set_int("annotate", "threads") annot_dict = conf_conffile.get_section_dict("annotate") return annot_dict
def test_conf_parser_setint(capsys): """ try to convert a given parameter to an int """ c1 = autils.Conf_all_parser(CONFFILE, ["sec1"]) c1.set_int("sec1", "param1") assert c1["sec1"]["param1"] == "10" assert c1.sec_dicts["sec1"]["param1"] == 10 # With an int called with "" but cleaned cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c_str = autils.Conf_all_parser(cfg_file, ["sec2"]) assert c_str.sec_dicts["sec2"]["paramint"] == "2" c_str.set_int("sec2", "paramint") assert c_str["sec2"]["paramint"] == "2" assert c_str.sec_dicts["sec2"]["paramint"] == 2 with pytest.raises(SystemExit): c1.set_int("sec1", "toto") out, err = capsys.readouterr() assert ('ERROR: toto must be an int. Wrong value: parameter.') in out
def test_conf_parser_init(): """ Test config parser with a given config file. Check value of defaults etc. """ # configfile but no section c = autils.Conf_all_parser(CONFFILE) assert c["sec1"]["toto"] == "parameter" assert c["sec1"]["param1"] == "10" assert c["sec2"]["param1"] == "3" assert c["sec3"]["param1"] == "3" assert c["sec1"]["param2"] == "10" assert c["sec2"]["param2"] == '' assert c["sec3"]["param2"] == "10" assert c.sec_dicts == {} # configfile and 2 sections among 3 existing in configfile c = autils.Conf_all_parser(CONFFILE, ["sec1", "sec3"]) assert c["sec1"]["toto"] == "parameter" assert c["sec1"]["param1"] == "10" assert c["sec2"]["param1"] == "3" assert c["sec2"]["myval"] == "parameter" assert c["sec3"]["param1"] == "3" assert c["sec1"]["param2"] == "10" assert c["sec2"]["param2"] == '' assert c["sec3"]["param2"] == "10" assert c.sec_dicts == {"sec1": {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value"}, "sec3": {"param1": "3", "param2": "10"}} # configfile 2 sections, 1 not in configfile c = autils.Conf_all_parser(CONFFILE, ["sec1", "sec4"]) assert c["sec1"]["toto"] == "parameter" assert c["sec1"]["param1"] == "10" assert c["sec2"]["param1"] == "3" assert c["sec4"]["param1"] == "3" # created sec4 with default parameters assert c["sec4"]["param2"] == "10" # created sec4 with default parameters assert not "toto" in c["sec4"] # created sec4 with default parameters assert c.sec_dicts == {"sec1": {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value"}, "sec4": {}} # But sec4 dict is empty (no param given in configfile)
def test_conf_parser_clean_str(capsys): """ Check that surounding "" are removed """ cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c = autils.Conf_all_parser(cfg_file, ["sec2", "sec_bool"]) assert c.get_section_dict("sec2") == {"param2": "", "myval": "parameter", 'param3': "myparameter", "param1": "3", "paramint": "2"} assert c.get_section_dict("sec_bool") == {"bool num_false": "0", "bool_num_true": "1", "bool_f": "off", "bool_t": "ON", "bool_n": "no", "bool_y": "YES", "bool_false": "FalSe", "bool_true": "tRUE", "param1": "3", "param2": "10"}
def test_conf_parser_get_section(capsys): """ Test get dict of values for a given section """ c = autils.Conf_all_parser(CONFFILE, ["sec1", "sec4"]) # Get sec1 dict assert c.get_section_dict("sec1") == {"param1": "10", "param2": "10", 'sec1p': "", "toto": "parameter", "titi": "my value"} assert c.get_section_dict("sec4") == {} # Try to get sec2 dict, but does not exist with pytest.raises(SystemExit): c.get_section_dict("sec2") out, err = capsys.readouterr() assert ('No section sec2 in test/data/utils/configfile.ini') in out
def test_conf_parser_setfloat(capsys): """ try to convert a given parameter to a float """ c1 = autils.Conf_all_parser(CONFFILE, ["sec_float"]) # float with decimal c1.set_float("sec_float", "float_param") assert c1["sec_float"]["float_param"] == "0.12" assert c1.sec_dicts["sec_float"]["float_param"] == 0.12 # exp format c1.set_float("sec_float", "float_param2") assert c1["sec_float"]["float_param2"] == "1e5" assert c1.sec_dicts["sec_float"]["float_param2"] == 100000 with pytest.raises(SystemExit): c1.set_float("sec1", "toto") out, err = capsys.readouterr() assert ('ERROR: toto must be a float. Wrong value: parameter.') in out # With a fload called with "" but cleaned cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c_str = autils.Conf_all_parser(cfg_file, ["sec_float"]) assert c_str.sec_dicts["sec_float"]["float_param"] == "0.12" c_str.set_float("sec_float", "float_param") assert c_str["sec_float"]["float_param"] == "0.12" assert c_str.sec_dicts["sec_float"]["float_param"] == 0.12 # With a fload called with "" not cleaned cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c_str = autils.Conf_all_parser(cfg_file, ["sec_float"], clean_str=False) assert c_str.sec_dicts["sec_float"]["float_param"] == '"0.12"' with pytest.raises(SystemExit): c_str.set_float("sec_float", "float_param") out, err = capsys.readouterr() assert ('ERROR: float_param must be a float. Wrong value: "0.12".') in out
def test_conf_parser_init_noCleanStr(): """ Test config parser with a given config file. Do not clean str (keep surounding "") """ # configfile but no section cfg_file = os.path.join("test", "data", "utils", "configfile-str.ini") c = autils.Conf_all_parser(cfg_file, clean_str=False) assert c["sec2"]["param1"] == "3" assert c["sec2"]["param2"] == '' assert c["sec2"]["myval"] == '"parameter"' assert c["sec2"]["param3"] == 'myparameter' assert c["sec3"]["param1"] == "3" assert c["sec3"]["param2"] == "10" assert c["sec_bool"]["bool num_false"] == "0" assert c["sec_bool"]["bool_t"] == "ON" assert c["sec_bool"]["bool_f"] == '"off"' assert c.sec_dicts == {}