コード例 #1
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_name_and_abbrv_handling(self):
        """ Test that name abbreviation ordering and collisions are handled properly """
        with pytest.raises(ParserError):
            Parser(Argument("arg1", abbrv="a"), Argument("arg2", abbrv="a"))
        with pytest.raises(ParserError):
            Parser(Argument("location"))
        with pytest.raises(ParserError):
            Parser(Argument("null", abbrv="n"))

        # Test that under no permutations is the ordering changed in the argparser
        sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)}".split(
        )
        sample_args = [
            Option("quick-mafs", default=0),
            Flag("Quick-flag", abbrv="Q"),
            Option("quick-boi", abbrv="q", default=1),
        ]
        for ordering in itertools.permutations(range(len(sample_args))):
            p = Parser(*(sample_args[i] for i in ordering))
            args = p._argparser.parse_args()
            for i, (argname, value) in enumerate(
                    except_keys(vars(args),
                                [_fixdash(x)
                                 for x in Parser._reserved_names]).items()):
                arg = sample_args[ordering[i]]
                assert _fixdash(arg.name) == argname
                assert arg.default == value

        # Test naming conflicts
        with pytest.raises(ParserError):
            Parser(Argument("a-b"), Flag("a_b"))
コード例 #2
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
 def test_clear_folders(self):
     d = os.path.join(self.test_dir, _testdir)
     os.makedirs(d)
     with open(os.path.join(d, "tmp.txt"), "w") as f:
         f.write("")
     sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)}".split(
     )
     parser = Parser()
     parser.parse_args(clear_folders=True)
     assert not os.listdir(d)
コード例 #3
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_no_default_section(self):
        sys.argv = _sample_argv_conf(self._no_default_file)
        parser = Parser(*_sample_arguments, multiple_jobs=False)
        job = parser.parse_args()

        assert job.name == "IAMNOTDEFAULT"
        assert job.location == os.path.join(self.test_dir, _testdir)
        assert job.gibstr == "not default"
        assert job.gib_num == float("3.2")
        assert job.arg_two == ["1", "2"]
コード例 #4
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_no_conf_multiple_jobs(self):
        sys.argv = _sample_argv + ["--name", "good-name"]
        parser = Parser(*_sample_arguments, multiple_jobs=True)
        jobs = parser.parse_args()
        assert len(jobs) == 1
        job = jobs[0]

        assert job.name == "good-name"
        assert job.location == os.path.join(self.test_dir, _testdir, job.name)
        assert job.gibstr == "4"
        assert job.gib_num == float("3.2")
        assert job.arg_two == ["b", "c"]
        assert job.opt_int == 4
        assert job.opt_d == 14
        assert job.opt_many == list()
        assert job.iam_bool
コード例 #5
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_no_conf_single_job(self):
        sys.argv = _sample_argv
        parser = Parser(*_sample_arguments, multiple_jobs=False)
        job = parser.parse_args()

        assert isinstance(job, JobDescription)
        assert job.location == os.path.join(self.test_dir, _testdir)
        assert job.gibstr == "4"
        assert job.gib_num == float("3.2")
        assert job.arg_two == ["b", "c"]
        assert job.opt_int == 4
        assert job.opt_d == 14
        assert job.opt_many == list()
        assert job.iam_bool
        assert job.explicit_args == {
            "location", "gibstr", "gib_num", "arg_two", "opt_d", "iam_bool"
        }
コード例 #6
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_conf_multiple_jobs(self):
        sys.argv = _sample_argv_conf(self._multiple_jobs_file)
        parser = Parser(*_sample_arguments, multiple_jobs=True)
        jobs = parser.parse_args()
        assert len(jobs) == 2

        assert jobs[0].name == "BUTWHATABOUTSECONDJOB"
        assert jobs[0].location == os.path.join(self.test_dir, _testdir,
                                                jobs[0].name)
        assert jobs[0].gibstr == "pistaccio"
        assert jobs[0].gib_num == float("3.2")
        assert jobs[0].opt_int == 4
        assert jobs[0].opt_d == 6
        assert not jobs[0].iam_bool

        assert jobs[1].name == "THETHIRDJOB"
        assert jobs[1].location == os.path.join(self.test_dir, _testdir,
                                                jobs[1].name)
        assert jobs[
            1].gibstr == "but they were all of them deceived, for another job was made"
        assert jobs[1].gib_num == float("3.2")
        assert jobs[1].opt_int == 5
        assert jobs[1].opt_d == 16
        assert jobs[1].opt_many == [float("1"), float("4.5"), float("-3")]
        assert jobs[1].iam_bool

        # Make sure an error is thrown if name is set from the command line
        sys.argv = _sample_argv_conf(
            self._default_file) + ["--name", "forbidden-name"]
        parser = Parser(*_sample_arguments, multiple_jobs=True)
        with pytest.raises(CLIError):
            parser.parse_args()
コード例 #7
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_no_unknown_args(self):
        # Test with command line argument
        sys.argv = _argv_template + ["--bar", "1", "--foo", "1"]
        parser = Parser(Argument("bar"))
        with pytest.raises(SystemExit) as pytest_wrapped_e:
            parser.parse_args()
        assert pytest_wrapped_e.type == SystemExit
        assert pytest_wrapped_e.value.code == 2

        # Test with config argument
        sys.argv = _argv_template + ["-c", self._sample_single_nargs_file]
        parser = Parser(Option("bar", type=int, default=[1, 2]))
        with pytest.raises(KeyError):
            parser.parse_args()
コード例 #8
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_nargs(self):
        # Test an expected case
        sys.argv = _argv_template + ["--bar", "1", "2"]
        parser = Parser(Argument("bar", nargs=2, type=int),
                        Option("foo", nargs=3, default=["a", "b", "c"]),
                        Option("fizz", nargs=1, default=(1, )))
        assert parser._arguments["fizz"].type is int

        args = parser.parse_args()
        assert len(args.bar) == 2
        assert args.bar == [1, 2]
        assert len(args.foo) == 3
        assert args.foo == ["a", "b", "c"]

        # Test if argument not given
        sys.argv = _argv_template
        parser = Parser(Argument("bar", nargs=0, type=int), )
        with pytest.raises(ParserError):
            parser.parse_args()

        # Test if wrong number of arguments
        sys.argv = _argv_template + ["--bar", "1", "2"]
        parser = Parser(Argument("bar", nargs=3))
        with pytest.raises(ValueError):
            parser.parse_args()
        parser = Parser(Option("bar", nargs=3, default=[1, 2, 3]))
        with pytest.raises(ValueError):
            parser.parse_args()

        # Make sure stuff also works if config file is wrong
        sys.argv = _argv_template + ["-c", self._sample_single_nargs_file]
        parser = Parser(Argument("foo", nargs=3))
        with pytest.raises(ValueError):
            parser.parse_args()

        # Test type parsing
        parser = Parser(Argument("foo", nargs=2, type=int))
        args = parser.parse_args()
        assert args.foo == [3, 4]
コード例 #9
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
 def test_non_optional_args(self):
     sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)} -c {self._multiple_jobs_file}".split(
     )
     parser = Parser(*_sample_arguments, multiple_jobs=True)
     with pytest.raises(ParserError):
         parser.parse_args()
コード例 #10
0
ファイル: test_parser.py プロジェクト: peleiden/pelutils
    def test_conf_single_job(self):
        # Test with only default section
        sys.argv = _sample_argv_conf(self._single_job_file)
        parser = Parser(*_sample_arguments, multiple_jobs=False)
        job = parser.parse_args()

        assert job.name == "BUTWHATABOUTSECONDJOB"
        assert job.location == os.path.join(self.test_dir, _testdir)
        assert job.gibstr == "pistaccio"
        assert job.gib_num == float("3.2")
        assert job.opt_int == 4
        assert job.opt_d == 6
        assert not job.iam_bool

        # Test that multiple sections throws an error, unless DEFAULT is one of only two sections
        sys.argv = _sample_argv_conf(self._single_job_file)
        parser = Parser(*_sample_arguments, multiple_jobs=False)
        parser.parse_args()

        sys.argv = _sample_argv_conf(self._multiple_jobs_file)
        parser = Parser(*_sample_arguments, multiple_jobs=False)
        with pytest.raises(ConfigError):
            parser.parse_args()