diff --git a/tests/rules/test_brackets.py b/tests/rules/test_brackets.py new file mode 100644 index 0000000..512cee8 --- /dev/null +++ b/tests/rules/test_brackets.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016 Adrien Vergé +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from tests.rules.common import RuleTestCase + + +class ColonTestCase(RuleTestCase): + rule_id = 'brackets' + + def test_disabled(self): + conf = 'brackets: disable' + self.check('---\n' + 'array1: []\n' + 'array2: [ ]\n' + 'array3: [ a, b]\n' + 'array4: [a, b, c ]\n' + 'array5: [a, b, c ]\n' + 'array6: [ a, b, c ]\n' + 'array7: [ a, b, c ]\n', conf) + + def test_min_spaces(self): + conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 0}' + self.check('---\n' + 'array: []\n', conf) + + conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 1}' + self.check('---\n' + 'array: []\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [ ]\n', conf) + self.check('---\n' + 'array: [a, b]\n', conf, problem1=(2, 9), problem2=(2, 13)) + self.check('---\n' + 'array: [ a, b ]\n', conf) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf) + + conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 3}' + self.check('---\n' + 'array: [ a, b ]\n', conf, + problem1=(2, 10), problem2=(2, 15)) + self.check('---\n' + 'array: [ a, b ]\n', conf) + + def test_max_spaces(self): + conf = 'brackets: {max-spaces-inside: 0, min-spaces-inside: -1}' + self.check('---\n' + 'array: []\n', conf) + self.check('---\n' + 'array: [ ]\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [a, b]\n', conf) + self.check('---\n' + 'array: [ a, b ]\n', conf, + problem1=(2, 9), problem2=(2, 14)) + self.check('---\n' + 'array: [ a, b ]\n', conf, + problem1=(2, 11), problem2=(2, 18)) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf) + + conf = 'brackets: {max-spaces-inside: 3, min-spaces-inside: -1}' + self.check('---\n' + 'array: [ a, b ]\n', conf) + self.check('---\n' + 'array: [ a, b ]\n', conf, + problem1=(2, 12), problem2=(2, 21)) + + def test_min_and_max_spaces(self): + conf = 'brackets: {max-spaces-inside: 0, min-spaces-inside: 0}' + self.check('---\n' + 'array: []\n', conf) + self.check('---\n' + 'array: [ ]\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [ a, b]\n', conf, problem=(2, 11)) + + conf = 'brackets: {max-spaces-inside: 1, min-spaces-inside: 1}' + self.check('---\n' + 'array: [a, b, c ]\n', conf, problem=(2, 9)) + + conf = 'brackets: {max-spaces-inside: 2, min-spaces-inside: 0}' + self.check('---\n' + 'array: [a, b, c ]\n', conf) + self.check('---\n' + 'array: [ a, b, c ]\n', conf) + self.check('---\n' + 'array: [ a, b, c ]\n', conf, problem=(2, 11)) diff --git a/tests/rules/test_colons.py b/tests/rules/test_colons.py index c6bcc07..f64bdcc 100644 --- a/tests/rules/test_colons.py +++ b/tests/rules/test_colons.py @@ -32,7 +32,7 @@ class ColonTestCase(RuleTestCase): ' val\n' ' property : value\n' ' prop2 : val2\n' - ' propriété : [ valeur ]\n' + ' propriété : [valeur]\n' ' o:\n' ' k1: [v1, v2]\n' ' p:\n' @@ -54,7 +54,7 @@ class ColonTestCase(RuleTestCase): ' val\n' ' property: value\n' ' prop2: val2\n' - ' propriété: [ valeur ]\n' + ' propriété: [valeur]\n' ' o:\n' ' k1: [v1, v2]\n', conf) self.check('---\n' diff --git a/yamllint/conf/default.yml b/yamllint/conf/default.yml index 63c20c6..dd55af0 100644 --- a/yamllint/conf/default.yml +++ b/yamllint/conf/default.yml @@ -3,6 +3,12 @@ rules: #block-sequence-indentation: # present: yes + brackets: + min-spaces-inside: 0 + max-spaces-inside: 0 + #braces: + # min-spaces-inside: 0 + # max-spaces-inside: 0 colons: max-spaces-before: 0 max-spaces-after: 1 @@ -30,10 +36,4 @@ rules: new-line-at-end-of-file: {level: error} new-lines: type: unix - #spaces-in-brackets: [ 1, 2 ] - # min: 1 - # max: 1 - #spaces-in-braces: { df: d } - # min: 1 - # max: 1 trailing-spaces: {} diff --git a/yamllint/rules/__init__.py b/yamllint/rules/__init__.py index 28c5c8a..81bb0e7 100644 --- a/yamllint/rules/__init__.py +++ b/yamllint/rules/__init__.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from yamllint.rules import ( + brackets, colons, commas, document_end, @@ -29,6 +30,7 @@ from yamllint.rules import ( ) _RULES = { + brackets.ID: brackets, colons.ID: colons, commas.ID: commas, document_end.ID: document_end, diff --git a/yamllint/rules/brackets.py b/yamllint/rules/brackets.py new file mode 100644 index 0000000..d40f4aa --- /dev/null +++ b/yamllint/rules/brackets.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016 Adrien Vergé +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import yaml + +from yamllint.rules.common import spaces_after, spaces_before + + +ID = 'brackets' +TYPE = 'token' +CONF = {'min-spaces-inside': int, + 'max-spaces-inside': int} + + +def check(conf, token, prev, next): + if isinstance(token, yaml.FlowSequenceStartToken): + problem = spaces_after(token, prev, next, + min=conf['min-spaces-inside'], + max=conf['max-spaces-inside'], + min_desc='too few spaces inside brackets', + max_desc='too many spaces inside brackets') + if problem is not None: + yield problem + + elif (isinstance(token, yaml.FlowSequenceEndToken) and + (prev is None or + not isinstance(prev, yaml.FlowSequenceStartToken))): + problem = spaces_before(token, prev, next, + min=conf['min-spaces-inside'], + max=conf['max-spaces-inside'], + min_desc='too few spaces inside brackets', + max_desc='too many spaces inside brackets') + if problem is not None: + yield problem diff --git a/yamllint/rules/colons.py b/yamllint/rules/colons.py index 3e23ea0..d73c3ad 100644 --- a/yamllint/rules/colons.py +++ b/yamllint/rules/colons.py @@ -16,7 +16,7 @@ import yaml -from yamllint.rules.common import max_spaces_after, max_spaces_before +from yamllint.rules.common import spaces_after, spaces_before ID = 'colons' @@ -27,12 +27,14 @@ CONF = {'max-spaces-before': int, def check(conf, token, prev, next): if isinstance(token, yaml.ValueToken): - problem = max_spaces_before(conf['max-spaces-before'], token, prev, - next, 'too many spaces before colon') + problem = spaces_before(token, prev, next, + max=conf['max-spaces-before'], + max_desc='too many spaces before colon') if problem is not None: yield problem - problem = max_spaces_after(conf['max-spaces-after'], token, prev, next, - 'too many spaces after colon') + problem = spaces_after(token, prev, next, + max=conf['max-spaces-after'], + max_desc='too many spaces after colon') if problem is not None: yield problem diff --git a/yamllint/rules/commas.py b/yamllint/rules/commas.py index ba1e4c4..152c2d0 100644 --- a/yamllint/rules/commas.py +++ b/yamllint/rules/commas.py @@ -16,7 +16,7 @@ import yaml -from yamllint.rules.common import max_spaces_after, max_spaces_before +from yamllint.rules.common import spaces_after, spaces_before ID = 'commas' @@ -27,12 +27,14 @@ CONF = {'max-spaces-before': int, def check(conf, token, prev, next): if isinstance(token, yaml.FlowEntryToken): - problem = max_spaces_before(conf['max-spaces-before'], token, prev, - next, 'too many spaces before comma') + problem = spaces_before(token, prev, next, + max=conf['max-spaces-before'], + max_desc='too many spaces before comma') if problem is not None: yield problem - problem = max_spaces_after(conf['max-spaces-after'], token, prev, next, - 'too many spaces after comma') + problem = spaces_after(token, prev, next, + max=conf['max-spaces-after'], + max_desc='too many spaces after comma') if problem is not None: yield problem diff --git a/yamllint/rules/common.py b/yamllint/rules/common.py index 77ea7d6..955d91a 100644 --- a/yamllint/rules/common.py +++ b/yamllint/rules/common.py @@ -17,18 +17,25 @@ from yamllint.errors import LintProblem -def max_spaces_after(nb, token, prev, next, description): - if (next is not None and token.end_mark.line == next.start_mark.line and - nb != - 1 and - next.start_mark.pointer - token.end_mark.pointer > nb): - return LintProblem(token.start_mark.line + 1, next.start_mark.column, - description) +def spaces_after(token, prev, next, min=-1, max=-1, + min_desc=None, max_desc=None): + if next is not None and token.end_mark.line == next.start_mark.line: + spaces = next.start_mark.pointer - token.end_mark.pointer + if max != - 1 and spaces > max: + return LintProblem(token.start_mark.line + 1, + next.start_mark.column, max_desc) + elif min != - 1 and spaces < min: + return LintProblem(token.start_mark.line + 1, + next.start_mark.column + 1, min_desc) -def max_spaces_before(nb, token, prev, next, description): - if (prev is not None and - prev.end_mark.line == token.start_mark.line and - nb != - 1 and - prev.end_mark.pointer + nb < token.start_mark.pointer): - return LintProblem(token.start_mark.line + 1, token.start_mark.column, - description) +def spaces_before(token, prev, next, min=-1, max=-1, + min_desc=None, max_desc=None): + if prev is not None and prev.end_mark.line == token.start_mark.line: + spaces = token.start_mark.pointer - prev.end_mark.pointer + if max != - 1 and spaces > max: + return LintProblem(token.start_mark.line + 1, + token.start_mark.column, max_desc) + elif min != - 1 and spaces < min: + return LintProblem(token.start_mark.line + 1, + token.start_mark.column + 1, min_desc) diff --git a/yamllint/rules/hyphens.py b/yamllint/rules/hyphens.py index 335f92c..99ee968 100644 --- a/yamllint/rules/hyphens.py +++ b/yamllint/rules/hyphens.py @@ -16,7 +16,7 @@ import yaml -from yamllint.rules.common import max_spaces_after +from yamllint.rules.common import spaces_after ID = 'hyphens' @@ -26,7 +26,8 @@ CONF = {'max-spaces-after': int} def check(conf, token, prev, next): if isinstance(token, yaml.BlockEntryToken): - problem = max_spaces_after(conf['max-spaces-after'], token, prev, next, - 'too many spaces after hyphen') + problem = spaces_after(token, prev, next, + max=conf['max-spaces-after'], + max_desc='too many spaces after hyphen') if problem is not None: yield problem