diff --git a/tests/test_syntax_errors.py b/tests/test_syntax_errors.py index bd4ddd2e4..786d8f533 100644 --- a/tests/test_syntax_errors.py +++ b/tests/test_syntax_errors.py @@ -92,3 +92,7 @@ def test_sets(self): ' a:\n' ' set\n' '...\n', None) + + def test_non_printable_characters(self): + self.check('output: \x1b\n', + None, problem=(9, 0)) diff --git a/yamllint/linter.py b/yamllint/linter.py index c687f142e..c4f3a924e 100644 --- a/yamllint/linter.py +++ b/yamllint/linter.py @@ -183,6 +183,12 @@ def get_syntax_error(buffer): 'syntax error: ' + e.problem + ' (syntax)') problem.level = 'error' return problem + except yaml.reader.ReaderError as e: + problem = LintProblem(e.position + 1, + 0, + 'syntax error: ' + e.reason + ' (syntax)') + problem.level = 'error' + return problem def _run(buffer, conf, filepath): diff --git a/yamllint/parser.py b/yamllint/parser.py index de331f472..e6a74a32b 100644 --- a/yamllint/parser.py +++ b/yamllint/parser.py @@ -121,9 +121,9 @@ def comments_between_tokens(token1, token2): def token_or_comment_generator(buffer): - yaml_loader = yaml.BaseLoader(buffer) try: + yaml_loader = yaml.BaseLoader(buffer) prev = None curr = yaml_loader.get_token() while curr is not None: @@ -139,7 +139,8 @@ def token_or_comment_generator(buffer): prev = curr curr = next - except yaml.scanner.ScannerError: + # errors like this are already analysed by get_syntax_error + except (yaml.scanner.ScannerError, yaml.reader.ReaderError): pass