Esempio n. 1
0
def run_main(subcommand,
             lines,
             main_args=None,
             subcommand_args=None,
             to_stdout=False):
    in_fh, in_fn = tmp_file(lines=lines)
    in_fh.close()

    out_fh, out_fn = tempfile.mkstemp()

    if not main_args:
        main_args = []
    main_args.extend([subcommand, "--input", str(in_fn)])
    if not to_stdout:
        main_args.extend(["--output", str(out_fn)])
    if subcommand_args:
        main_args.extend(subcommand_args)

    with captured_output() as (stdout, stderr):
        main(args=main_args)

    fh = open(out_fn, "r")
    out_lines = [line.rstrip("\r\n") for line in fh]
    fh.close()

    stdout = stdout.getvalue().rstrip('\r\n').split("\n")
    stderr = stderr.getvalue().rstrip('\r\n').split("\n")

    os.remove(in_fn)
    os.remove(out_fn)

    return (out_lines, stdout, stderr)
Esempio n. 2
0
    def __sort(self, lines, extra_args, test_func, to_stdout=False):
        in_fh, in_fn = tmp_file(lines=lines)
        in_fh.close()

        out_fh, out_fn = tempfile.mkstemp()

        main_args = ["validate", "--input", str(in_fn)]
        if not to_stdout:
            main_args.extend(["--output", str(out_fn)])
        main_args.extend(extra_args)

        with captured_output() as (stdout, stderr):
            main(args=main_args)

        fh = open(out_fn, "r")
        out_lines = [line.rstrip("\r\n") for line in fh]
        fh.close()

        stdout = stdout.getvalue().rstrip('\r\n').split("\n")
        stderr = stderr.getvalue().rstrip('\r\n').split("\n")

        test_func(out_lines=out_lines, stdout=stdout, stderr=stderr)

        os.remove(in_fn)
        os.remove(out_fn)
Esempio n. 3
0
    def test_empty_file(self):
        fd, path = tempfile.mkstemp()

        # No logging to stderr/stdout
        with captured_output() as (stdout, stderr):
            writer = MafWriter.from_path(
                path=path,
                header=MafHeader(),
                validation_stringency=ValidationStringency.Silent,
            )
            writer.close()
            self.assertEqual(read_lines(path), [])
            self.assertEqual(str(writer.header()), "")
        stdout = stdout.getvalue().rstrip('\r\n').split("\n")
        stderr = stderr.getvalue().rstrip('\r\n').split("\n")
        self.assertListEqual(stdout, [''])
        self.assertListEqual(stderr, [''])

        # Logging to stderr/stdout
        with captured_output() as (stdout, stderr):
            writer = MafWriter.from_path(
                path=path,
                header=MafHeader(),
                validation_stringency=ValidationStringency.Lenient,
            )
            writer.close()
            self.assertEqual(read_lines(path), [])
            self.assertEqual(str(writer.header()), "")
        stdout = stdout.getvalue().rstrip('\r\n').split("\n")
        stderr = stderr.getvalue().rstrip('\r\n').split("\n")
        self.assertListEqual(stdout, [''])
        self.assertListEqualAndIn(
            ['HEADER_MISSING_VERSION', 'HEADER_MISSING_ANNOTATION_SPEC'],
            stderr)

        #  Exceptions
        with captured_output():
            with self.assertRaises(MafFormatException) as context:
                writer = MafWriter.from_path(
                    path=path,
                    header=MafHeader(),
                    validation_stringency=ValidationStringency.Strict,
                )
            self.assertEqual(context.exception.tpe,
                             MafValidationErrorType.HEADER_MISSING_VERSION)
Esempio n. 4
0
    def test_max_errors(self):
        # Silly user
        subcommand_args = ["--max-errors", "0"]
        with captured_output() as (stdout, stderr):
            with self.assertRaises(SystemExit) as context:
                self.__validate__(lines=[], subcommand_args=subcommand_args)

        # Verbose Mode: there should be an error about the version missing from
        # the header!  No error about the missing column
        lines=[
            "\t".join(["c1", "c2", "c3"]),
            "\t".join(["v1", "v2", "v3"]),
            "\t".join(["v1"]),
            "\t".join(["v1", "v2"])
        ]
        subcommand_args = ["--max-errors", "1"]
        out_lines, stdout, stderr = self.__validate__(
            lines=lines,
            subcommand_args=subcommand_args)
        self.assertListEqual(stdout, [''])
        self.assertEqual(len(stderr), 2)
        self.assertTrue("Maximum number of errors encountered" in stderr[1])

        # Verbose Mode: there should be an error in the header and records
        subcommand_args = ["--max-errors", "3", "--mode", "Verbose"]
        out_lines, stdout, stderr = self.__validate__(
            lines=lines,
            subcommand_args=subcommand_args)
        self.assertListEqualAndIn([
            "No version line found in the header",
            "No annotation.spec line found in the header",
            "On line number 3: Found '1' columns but expected '3'"],
            out_lines)
        self.assertListEqual(stdout, [''])
        self.assertTrue("Maximum number of errors encountered" in stderr[1])

        # Summary Mode: there should be an error in the header and records
        subcommand_args = ["--max-errors", "3", "--mode", "Summary"]
        out_lines, stdout, stderr = self.__validate__(
            lines=lines,
            subcommand_args=subcommand_args)
        self.assertListEqualAndIn(
            ['Error Type\tCount\tDescription',
             'HEADER_MISSING_ANNOTATION_SPEC\t1\tThe header has no annotation spec',
             'HEADER_MISSING_VERSION\t1\tThe header has no version',
             'RECORD_MISMATCH_NUMBER_OF_COLUMNS\t1\tThe record has an '
             'unexpected number of columns'],
            out_lines)
        self.assertListEqual(stdout, [''])
        self.assertTrue("Maximum number of errors encountered" in stderr[1])
Esempio n. 5
0
    def test_record_validation_error(self):
        scheme = TestMafWriter.TestScheme()
        fd, path = tempfile.mkstemp()

        # Create the header
        header_lines = (MafHeader.scheme_header_lines(scheme) +
                        ["#key1 value1", "#key2 value2"] +
                        ["str1\tNone\tstr2"])
        header = MafHeader.from_lines(
            lines=header_lines,
            validation_stringency=ValidationStringency.Silent)

        # Create the record
        values = ["string2", "error", "string1"]
        record_line = MafRecord.ColumnSeparator.join(values)
        record = MafRecord.from_line(
            line=record_line,
            scheme=scheme,
            line_number=1,
            validation_stringency=ValidationStringency.Silent,
        )

        # Write the header, and the record twice
        with captured_output() as (stdout, stderr):
            writer = MafWriter.from_path(
                header=header,
                validation_stringency=ValidationStringency.Lenient,
                path=path,
            )
            writer += record
            writer.write(record)
            writer.close()
        stdout = stdout.getvalue().rstrip('\r\n').split("\n")
        stderr = stderr.getvalue().rstrip('\r\n').split("\n")
        self.assertListEqual(stdout, [''])

        # The errors that should be written stderr
        errors = [
            "HEADER_UNSUPPORTED_VERSION",
            "HEADER_UNSUPPORTED_ANNOTATION_SPEC",
            "RECORD_COLUMN_WITH_NO_VALUE",
            "RECORD_COLUMN_WITH_NO_VALUE",
        ]
        self.assertListEqualAndIn(errors, stderr)

        # The second column should be None
        err_record_line = record_line.replace("error", "None")
        self.assertListEqual(read_lines(path),
                             header_lines + [err_record_line, err_record_line])
Esempio n. 6
0
    def test_gz_support(self):
        fd, path = tempfile.mkstemp(suffix=".gz")

        lines = [TestMafWriter.__version_line,
                 TestMafWriter.__annotation_line,
                 "#key1 value1",
                 "#key2 value2",
                 TestMafWriter.__keys_line
                 ]
        with captured_output() as (stdout, stderr):
            header = MafHeader.from_lines(lines=lines)
            writer = MafWriter.from_path(header=header, path=path)
            writer.close()
            self.assertListEqual(read_lines(path), lines)
            self.assertEqual(str(writer.header()) + "\n" +
                                 TestMafWriter.__keys_line,
                             "\n".join(lines))
        stdout = stdout.getvalue().rstrip('\r\n').split("\n")
        stderr = stderr.getvalue().rstrip('\r\n').split("\n")
        self.assertListEqual(stdout, [''])
        self.assertListEqual(stderr, [''])
        os.remove(path)
Esempio n. 7
0
 def test_no_inputs(self):
     with captured_output() as (_, stderr):
         with self.assertRaises(SystemExit) as context:
             main(args=['sort'])