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)
Exemple #4
0
    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)()}'"
                )
Exemple #5
0
    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)
Exemple #6
0
    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
Exemple #7
0
    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
Exemple #8
0
    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])