From 4c86d3fe5930b123375c96c479a0d41526e63d03 Mon Sep 17 00:00:00 2001 From: Christian Krause Date: Mon, 5 Jul 2021 09:46:09 +0200 Subject: [PATCH] [document-start] adds min/max empty lines after document start/end --- tests/rules/test_document_start.py | 62 ++++++++++++++++++++++++++++++ yamllint/rules/document_start.py | 28 +++++++++++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/tests/rules/test_document_start.py b/tests/rules/test_document_start.py index 20de9ad03..843813108 100644 --- a/tests/rules/test_document_start.py +++ b/tests/rules/test_document_start.py @@ -102,3 +102,65 @@ def test_directives(self): '---\n' 'doc: 2\n' '...\n', conf) + + def test_empty_lines(self): + conf = ('document-start:\n' + ' present: true\n' + ' max-empty-lines-after: 0\n') + + self.check('%YAML 1.2\n' + '---\n' + 'doc: ument\n', conf) + + self.check('%YAML 1.2\n' + '---\n' + '\n' + 'doc: ument\n', conf, problem=(4, 1)) + + conf = ('document-start:\n' + ' present: true\n' + ' max-empty-lines-after: 1\n') + + self.check('%YAML 1.2\n' + '---\n' + '\n' + 'doc: ument\n', conf) + + self.check('%YAML 1.2\n' + '---\n' + '\n' + '\n' + 'doc: ument\n', conf, problem=(5, 1)) + + conf = ('document-start:\n' + ' present: true\n' + ' min-empty-lines-after: 1\n') + + self.check('%YAML 1.2\n' + '---\n' + '\n' + 'doc: ument\n', conf) + + self.check('%YAML 1.2\n' + '---\n' + 'doc: ument\n', conf, problem=(3, 1)) + + conf = ('document-start:\n' + ' present: true\n' + ' max-empty-lines-after: 1\n' + ' min-empty-lines-after: 1\n') + + self.check('%YAML 1.2\n' + '---\n' + '\n' + 'doc: ument\n', conf) + + self.check('%YAML 1.2\n' + '---\n' + 'doc: ument\n', conf, problem=(3, 1)) + + self.check('%YAML 1.2\n' + '---\n' + '\n' + '\n' + 'doc: ument\n', conf, problem=(5, 1)) diff --git a/yamllint/rules/document_start.py b/yamllint/rules/document_start.py index 9bab4b40b..da0cee056 100644 --- a/yamllint/rules/document_start.py +++ b/yamllint/rules/document_start.py @@ -79,8 +79,12 @@ ID = 'document-start' TYPE = 'token' -CONF = {'present': bool} -DEFAULT = {'present': True} +CONF = {'present': bool, + 'max-empty-lines-after': (int, -1), + 'min-empty-lines-after': (int, 0)} +DEFAULT = {'present': True, + 'max-empty-lines-after': -1, + 'min-empty-lines-after': 0} def check(conf, token, prev, next, nextnext, context): @@ -94,6 +98,26 @@ def check(conf, token, prev, next, nextnext, context): yield LintProblem(token.start_mark.line + 1, 1, 'missing document start "---"') + if (conf['max-empty-lines-after'] >= 0 and + isinstance(prev, yaml.DocumentStartToken)): + + empty_lines = token.start_mark.line - prev.start_mark.line - 1 + + if empty_lines > conf['max-empty-lines-after']: + yield LintProblem(token.start_mark.line + 1, + token.start_mark.column + 1, + 'too many empty lines after document start') + + if (conf['min-empty-lines-after'] > 0 and + isinstance(prev, yaml.DocumentStartToken)): + + empty_lines = token.start_mark.line - prev.start_mark.line - 1 + + if empty_lines < conf['min-empty-lines-after']: + yield LintProblem(token.start_mark.line + 1, + token.start_mark.column + 1, + 'too few empty lines after document start') + else: if isinstance(token, yaml.DocumentStartToken): yield LintProblem(token.start_mark.line + 1,