def test_out_dir(self): cfg = Config(self.defaults, self.parsed_args) self.assertEqual( cfg.out_dir(), os.path.join(cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) self.parsed_args.out_dir = 'foo' cfg = Config(self.defaults, self.parsed_args) self.assertEqual(cfg.out_dir(), 'foo')
def test_Config(self): cfg = Config(self.defaults, self.parsed_args) methods_needing_args = { 'inter_gene_max_space': None, 'max_nb_genes': None, 'min_genes_required': None, 'min_mandatory_genes_required': None, 'multi_loci': None } for opt, val in self.defaults.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join(cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt == 'multi_loci': self.assertFalse(cfg.multi_loci('whatever')) elif opt in methods_needing_args: self.assertEqual( getattr(cfg, opt)('whatever'), val, msg= f"test of '{opt}' failed : expected{getattr(cfg, opt)('whatever')} != got {val}" ) else: self.assertEqual( getattr(cfg, opt)(), val, msg= f"test of '{opt}' failed : expected{getattr(cfg, opt)()} != got {val}" )
def test_Config_file(self): methods_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', 4), ('set_1/T2SS', 2)], 'max_nb_genes': [('set_1/Flagellum', 6), ('set_1/T3SS', 3)], 'min_genes_required': [('set_1/Flagellum', 8), ('set_1/T4SS', 4)], 'min_mandatory_genes_required': [('set_1/Flagellum', 12), ('set_1/T6SS', 6)], 'multi_loci': {'set_1/Flagellum', 'T4SS'} } self.parsed_args.cfg_file = self.find_data( os.path.join('conf_files', 'macsy_models.conf')) cfg = Config(self.defaults, self.parsed_args) expected_values = {k: v for k, v in self.defaults.items()} expected_values['cfg_file'] = self.parsed_args.cfg_file expected_values.update(methods_needing_args) for opt, val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join(cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt == 'multi_loci': self.assertTrue(cfg.multi_loci('set_1/Flagellum')) self.assertTrue(cfg.multi_loci('set_1/T4SS')) self.assertFalse(cfg.multi_loci('set_1/T6SS')) elif opt in methods_needing_args: for model, genes in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), genes) else: self.assertEqual(getattr(cfg, opt)(), val)
def test_Config_args(self): methods_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', '14'), ('set_1/T2SS', '12')], 'max_nb_genes': [('set_1/Flagellum', '16'), ('set_1/T3SS', '13')], 'min_genes_required': [('set_1/Flagellum', '18'), ('set_1/T4SS', '14')], 'min_mandatory_genes_required': [('set_1/Flagellum', '22'), ('set_1/T6SS', '16')], 'multi_loci': 'set_1/Flagellum, set_1/T4SS', } for opt, value in methods_needing_args.items(): setattr(self.parsed_args, opt, value) simple_opt = { 'hmmer': 'foo', 'i_evalue_sel': 20, 'replicon_topology': 'linear', 'db_type': 'gembase', 'sequence_db': self.find_data(os.path.join('base', 'test_1.fasta')), 'topology_file': __file__ # test only the existence of a file } for opt, val in simple_opt.items(): setattr(self.parsed_args, opt, val) cfg = Config(self.defaults, self.parsed_args) expected_values = {k: v for k, v in self.defaults.items()} expected_values.update(methods_needing_args) expected_values.update(simple_opt) for opt, val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join(cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt == 'multi_loci': self.assertTrue(cfg.multi_loci('set_1/Flagellum')) self.assertTrue(cfg.multi_loci('set_1/T4SS')) self.assertFalse(cfg.multi_loci('set_1/T6SS')) elif opt in methods_needing_args: for model, genes in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), int(genes)) elif opt == 'models_dir': self.assertEqual( getattr(cfg, opt)(), self.defaults['system_models_dir']) else: self.assertEqual( getattr(cfg, opt)(), val, msg= f"{opt} failed: expected: val '{val}' != got '{getattr(cfg, opt)()}'" )
def test_Config_file_n_args(self): cfg_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', '4'), ('set_1/T2SS', '2')], 'max_nb_genes': [('set_1/Flagellum', '6'), ('set_1/T3SS', '3')], 'min_genes_required': [('set_1/Flagellum', '8'), ('set_1/T4SS', '4')], 'min_mandatory_genes_required': [('set_1/Flagellum', '12'), ('set_1/T6SS', '6')], 'multi_loci': 'set_1/Flagellum, set_1/T4SS', } self.parsed_args.cfg_file = self.find_data( os.path.join('conf_files', 'macsy_models.conf')) expected_values = {k: v for k, v in self.defaults.items()} expected_values['cfg_file'] = self.parsed_args.cfg_file expected_values.update(cfg_needing_args) cmd_needing_args = { 'min_genes_required': [('set_1/Flagellum', 18), ('T4SS', 14)], 'min_mandatory_genes_required': [('set_1/Flagellum', 22), ('set_1/T6SS', 16)], } for opt, value in cmd_needing_args.items(): setattr(self.parsed_args, opt, ' '.join([f"{m} {v}" for m, v in value])) simple_opt = {'hmmer': 'foo', 'i_evalue_sel': 20, 'db_type': 'gembase'} for opt, val in simple_opt.items(): setattr(self.parsed_args, opt, val) cfg = Config(self.defaults, self.parsed_args) expected_values.update(cmd_needing_args) expected_values.update(simple_opt) for opt, exp_val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join(cfg.res_search_dir(), f"macsyfinder-{strftime('%Y%m%d_%H-%M-%S')}")) elif opt == 'multi_loci': self.assertTrue(cfg.multi_loci('set_1/Flagellum')) self.assertTrue(cfg.multi_loci('set_1/T4SS')) self.assertFalse(cfg.multi_loci('set_1/T6SS')) elif opt in cfg_needing_args: for model, val in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), int(val)) elif opt == 'models_dir': self.assertEqual( getattr(cfg, opt)(), self.defaults['system_models_dir']) else: self.assertEqual(getattr(cfg, opt)(), exp_val)
def test_Config_conf_file_virtualenv(self): methods_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', 4), ('set_1/T2SS', 2)], 'min_mandatory_genes_required': [('set_1/Flagellum', 9), ('set_1/T2SS', 5)] } modified_args = { 'db_type': 'gembase', 'coverage_profile': 0.1, 'replicon_topology': 'circular' } with tempfile.TemporaryDirectory() as tmpdirname: ori_conf_file = self.find_data( os.path.join('conf_files', 'macsy_virtualenv_test.conf')) conf_dir = os.path.join(tmpdirname, 'etc', 'macsyfinder') os.makedirs(conf_dir) dest_conf_file = os.path.join(conf_dir, 'macsyfinder.conf') shutil.copy(ori_conf_file, dest_conf_file) virtual_env = os.environ.get("VIRTUAL_ENV") os.environ['VIRTUAL_ENV'] = tmpdirname try: cfg = Config(self.defaults, self.parsed_args) expected_values = {k: v for k, v in self.defaults.items()} expected_values.update(methods_needing_args) expected_values.update(modified_args) for opt, val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join( cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt in ('max_nb_genes', 'min_genes_required', 'multi_loci'): # not set in cfg file pass elif opt in methods_needing_args: for model, genes in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), genes) elif opt == 'models_dir': self.assertEqual( getattr(cfg, opt)(), self.defaults['system_models_dir']) else: self.assertEqual(getattr(cfg, opt)(), val) finally: if virtual_env: os.environ["VIRTUAL_ENV"] = virtual_env
def test_Config_default_conf_file(self): methods_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', 4), ('set_1/T2SS', 2)], 'max_nb_genes': [('set_1/Flagellum', 6), ('set_1/T3SS', 3)], 'min_genes_required': [('set_1/Flagellum', 8), ('set_1/T4SS', 4)], 'min_mandatory_genes_required': [('set_1/Flagellum', 12), ('set_1/T6SS', 6)], 'multi_loci': {'set_1/Flagellum', 'set_1/T4SS'} } with tempfile.TemporaryDirectory() as tmpdirname: ori_conf_file = self.find_data( os.path.join('conf_files', 'macsy_models.conf')) dest_conf_file = os.path.join(tmpdirname, 'macsyfinder.conf') shutil.copy(ori_conf_file, dest_conf_file) os.environ['MACSY_CONF'] = dest_conf_file virtual_env = os.environ.get("VIRTUAL_ENV") del os.environ["VIRTUAL_ENV"] try: cfg = Config(self.defaults, self.parsed_args) expected_values = {k: v for k, v in self.defaults.items()} expected_values.update(methods_needing_args) for opt, val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join( cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt == 'multi_loci': self.assertTrue(cfg.multi_loci('set_1/Flagellum')) self.assertTrue(cfg.multi_loci('set_1/T4SS')) self.assertFalse(cfg.multi_loci('set_1/T6SS')) elif opt in methods_needing_args: for model, genes in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), genes) elif opt == 'models_dir': self.assertEqual( getattr(cfg, opt)(), self.defaults['system_models_dir']) else: self.assertEqual(getattr(cfg, opt)(), val) finally: os.environ["VIRTUAL_ENV"] = virtual_env
def test_project_config_file(self): os.chdir(self.tmp_dir) methods_needing_args = { 'inter_gene_max_space': [('set_1/Flagellum', 4), ('set_1/T2SS', 2)], 'max_nb_genes': [('set_1/Flagellum', 6), ('set_1/T3SS', 3)], 'min_genes_required': [('set_1/Flagellum', 8), ('set_1/T4SS', 4)], 'min_mandatory_genes_required': [('set_1/Flagellum', 12), ('set_1/T6SS', 6)], 'multi_loci': {'set_1/Flagellum', 'T4SS'} } hmmer_opts_in_file = {'coverage_profile': 0.8, 'e_value_search': 0.12} try: shutil.copyfile( self.find_data(os.path.join('conf_files', 'project.conf')), os.path.join(self.tmp_dir, 'macsyfinder.conf')) cfg = Config(self.defaults, self.parsed_args) expected_values = {k: v for k, v in self.defaults.items()} expected_values.update(methods_needing_args) expected_values.update(hmmer_opts_in_file) for opt, val in expected_values.items(): if opt == 'out_dir': self.assertEqual( cfg.out_dir(), os.path.join( cfg.res_search_dir(), f'macsyfinder-{strftime("%Y%m%d_%H-%M-%S")}')) elif opt == 'multi_loci': self.assertTrue(cfg.multi_loci('set_1/Flagellum')) self.assertTrue(cfg.multi_loci('set_1/T4SS')) self.assertFalse(cfg.multi_loci('set_1/T6SS')) elif opt in methods_needing_args: for model, genes in expected_values[opt]: self.assertEqual(getattr(cfg, opt)(model), genes) elif opt == 'models_dir': self.assertEqual( getattr(cfg, opt)(), self.defaults['system_models_dir']) else: self.assertEqual(getattr(cfg, opt)(), val) except: os.chdir(self._current_dir)
class TestReport(MacsyTest): def setUp(self): args = argparse.Namespace() args.db_type = 'gembase' args.models_dir = self.find_data('models') args.res_search_dir = tempfile.gettempdir() args.log_level = 30 args.out_dir = os.path.join(args.res_search_dir, 'test_macsyfinder_Report') if os.path.exists(args.out_dir): shutil.rmtree(args.out_dir) os.mkdir(args.out_dir) seq_db = self.find_data("base", "test_base.fa") shutil.copy(seq_db, args.out_dir) args.sequence_db = os.path.join(args.out_dir, os.path.basename(seq_db)) self.cfg = Config(MacsyDefaults(), args) os.mkdir(os.path.join(self.cfg.out_dir(), self.cfg.hmmer_dir())) self.model_name = 'foo' self.model_location = ModelLocation( path=os.path.join(args.models_dir, self.model_name)) # we need to reset the ProfileFactory # because it's a like a singleton # so other tests are influenced by ProfileFactory and it's configuration # for instance search_genes get profile without hmmer_exe self.profile_factory = ProfileFactory(self.cfg) idx = Indexes(self.cfg) idx.build() def tearDown(self): try: shutil.rmtree(self.cfg.working_dir()) except Exception: pass
def test_working_dir(self): cfg = Config(self.defaults, self.parsed_args) self.assertEqual(cfg.out_dir(), cfg.working_dir())
class TestSearchGenes(MacsyTest): def setUp(self): self.tmp_dir = os.path.join(tempfile.gettempdir(), 'test_macsyfinder_search_genes') if os.path.exists(self.tmp_dir): shutil.rmtree(self.tmp_dir) os.mkdir(self.tmp_dir) args = argparse.Namespace() args.sequence_db = self.find_data("base", "test_base.fa") args.db_type = 'gembase' args.models_dir = self.find_data('models') args.log_level = 30 args.out_dir = os.path.join(self.tmp_dir, 'job_1') args.res_search_dir = args.out_dir os.mkdir(args.out_dir) self.cfg = Config(MacsyDefaults(), args) self.model_name = 'foo' self.model_location = ModelLocation( path=os.path.join(args.models_dir, self.model_name)) idx = Indexes(self.cfg) idx._build_my_indexes() self.profile_factory = ProfileFactory(self.cfg) def tearDown(self): try: shutil.rmtree(self.cfg.working_dir()) #pass except: pass @unittest.skipIf(not which('hmmsearch'), 'hmmsearch not found in PATH') def test_search(self): gene_name = "abc" c_gene_abc = CoreGene(self.model_location, gene_name, self.profile_factory) report = search_genes([c_gene_abc], self.cfg) expected_hit = [ Hit(c_gene_abc, "ESCO030p01_000260", 706, "ESCO030p01", 26, float(1.000e-200), float(660.800), float(1.000), float(0.714), 160, 663) ] self.assertEqual(len(report), 1) self.assertEqual(expected_hit[0], report[0].hits[0]) @unittest.skipIf(not which('hmmsearch'), 'hmmsearch not found in PATH') def test_search_recover(self): # first job searching using hmmsearch gene_name = "abc" c_gene_abc = CoreGene(self.model_location, gene_name, self.profile_factory) report = search_genes([c_gene_abc], self.cfg) expected_hit = [ Hit(c_gene_abc, "ESCO030p01_000260", 706, "ESCO030p01", 26, float(1.000e-200), float(660.800), float(1.000), float(0.714), 160, 663) ] # second job using recover # disable hmmer to be sure that test use the recover inner function self.cfg.hmmer = lambda: "hmmer_disable" # and create a new dir for the second job previous_job_path = self.cfg.working_dir() self.cfg.previous_run = lambda: previous_job_path self.cfg.out_dir = lambda: os.path.join(self.tmp_dir, 'job_2') os.mkdir(self.cfg.out_dir()) # rerun with previous run # but we have to reset the profile attached to the gene gene._profile._report self.profile_factory = ProfileFactory(self.cfg) c_gene_abc = CoreGene(self.model_location, gene_name, self.profile_factory) report = search_genes([c_gene_abc], self.cfg) self.assertEqual(len(report), 1) self.assertEqual(expected_hit[0], report[0].hits[0])