diff --git a/tests/rules/test_braces.py b/tests/rules/test_braces.py index 308715b..69c5461 100644 --- a/tests/rules/test_braces.py +++ b/tests/rules/test_braces.py @@ -31,6 +31,36 @@ class ColonTestCase(RuleTestCase): 'dict6: { a: 1, b, c: 3 }\n' 'dict7: { a: 1, b, c: 3 }\n', conf) + def test_forbid(self): + conf = ('braces:\n' + ' forbid: false\n') + self.check('---\n' + 'dict: {}\n', conf) + self.check('---\n' + 'dict: {a}\n', conf) + self.check('---\n' + 'dict: {a: 1}\n', conf) + self.check('---\n' + 'dict: {\n' + ' a: 1\n' + '}\n', conf) + + conf = ('braces:\n' + ' forbid: true\n') + self.check('---\n' + 'dict:\n' + ' a: 1\n', conf) + self.check('---\n' + 'dict: {}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {a}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {a: 1}\n', conf, problem=(2, 8)) + self.check('---\n' + 'dict: {\n' + ' a: 1\n' + '}\n', conf, problem=(2, 8)) + def test_min_spaces(self): conf = ('braces:\n' ' max-spaces-inside: -1\n' diff --git a/tests/rules/test_brackets.py b/tests/rules/test_brackets.py index 273f1a7..a35eff9 100644 --- a/tests/rules/test_brackets.py +++ b/tests/rules/test_brackets.py @@ -31,6 +31,35 @@ class ColonTestCase(RuleTestCase): 'array6: [ a, b, c ]\n' 'array7: [ a, b, c ]\n', conf) + def test_forbid(self): + conf = ('brackets:\n' + ' forbid: false\n') + self.check('---\n' + 'array: []\n', conf) + self.check('---\n' + 'array: [a, b]\n', conf) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf) + + conf = ('brackets:\n' + ' forbid: true\n') + self.check('---\n' + 'array:\n' + ' - a\n' + ' - b\n', conf) + self.check('---\n' + 'array: []\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [a, b]\n', conf, problem=(2, 9)) + self.check('---\n' + 'array: [\n' + ' a,\n' + ' b\n' + ']\n', conf, problem=(2, 9)) + def test_min_spaces(self): conf = ('brackets:\n' ' max-spaces-inside: -1\n' diff --git a/yamllint/rules/braces.py b/yamllint/rules/braces.py index 0d28aee..759306e 100644 --- a/yamllint/rules/braces.py +++ b/yamllint/rules/braces.py @@ -15,10 +15,14 @@ # along with this program. If not, see . """ -Use this rule to control the number of spaces inside braces (``{`` and ``}``). +Use this rule to control the use of flow mappings or number of spaces inside +braces (``{`` and ``}``). .. rubric:: Options +* ``forbid`` is used to forbid the use of flow mappings which are denoted by + surrounding braces (``{`` and ``}``). Use ``true`` to forbid the use of flow + mappings completely. * ``min-spaces-inside`` defines the minimal number of spaces required inside braces. * ``max-spaces-inside`` defines the maximal number of spaces allowed inside @@ -34,6 +38,7 @@ Use this rule to control the number of spaces inside braces (``{`` and ``}``). rules: braces: + forbid: false min-spaces-inside: 0 max-spaces-inside: 0 min-spaces-inside-empty: -1 @@ -41,6 +46,20 @@ Use this rule to control the number of spaces inside braces (``{`` and ``}``). .. rubric:: Examples +#. With ``braces: {forbid: true}`` + + the following code snippet would **PASS**: + :: + + object: + key1: 4 + key2: 8 + + the following code snippet would **FAIL**: + :: + + object: { key1: 4, key2: 8 } + #. With ``braces: {min-spaces-inside: 0, max-spaces-inside: 0}`` the following code snippet would **PASS**: @@ -103,23 +122,31 @@ Use this rule to control the number of spaces inside braces (``{`` and ``}``). import yaml +from yamllint.linter import LintProblem from yamllint.rules.common import spaces_after, spaces_before ID = 'braces' TYPE = 'token' -CONF = {'min-spaces-inside': int, +CONF = {'forbid': bool, + 'min-spaces-inside': int, 'max-spaces-inside': int, 'min-spaces-inside-empty': int, 'max-spaces-inside-empty': int} -DEFAULT = {'min-spaces-inside': 0, +DEFAULT = {'forbid': False, + 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1} def check(conf, token, prev, next, nextnext, context): - if (isinstance(token, yaml.FlowMappingStartToken) and + if conf['forbid'] and isinstance(token, yaml.FlowMappingStartToken): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow mapping') + + elif (isinstance(token, yaml.FlowMappingStartToken) and isinstance(next, yaml.FlowMappingEndToken)): problem = spaces_after(token, prev, next, min=(conf['min-spaces-inside-empty'] diff --git a/yamllint/rules/brackets.py b/yamllint/rules/brackets.py index 587c4f0..6ab02df 100644 --- a/yamllint/rules/brackets.py +++ b/yamllint/rules/brackets.py @@ -15,11 +15,14 @@ # along with this program. If not, see . """ -Use this rule to control the number of spaces inside brackets (``[`` and -``]``). +Use this rule to control the use of flow sequences or the number of spaces +inside brackets (``[`` and ``]``). .. rubric:: Options +* ``forbid`` is used to forbid the use of flow sequences which are denoted by + surrounding brackets (``[`` and ``]``). Use ``true`` to forbid the use of + flow sequences completely. * ``min-spaces-inside`` defines the minimal number of spaces required inside brackets. * ``max-spaces-inside`` defines the maximal number of spaces allowed inside @@ -35,6 +38,7 @@ Use this rule to control the number of spaces inside brackets (``[`` and rules: brackets: + forbid: false min-spaces-inside: 0 max-spaces-inside: 0 min-spaces-inside-empty: -1 @@ -42,6 +46,21 @@ Use this rule to control the number of spaces inside brackets (``[`` and .. rubric:: Examples +#. With ``brackets: {forbid: true}`` + + the following code snippet would **PASS**: + :: + + object: + - 1 + - 2 + - abc + + the following code snippet would **FAIL**: + :: + + object: [ 1, 2, abc ] + #. With ``brackets: {min-spaces-inside: 0, max-spaces-inside: 0}`` the following code snippet would **PASS**: @@ -104,23 +123,31 @@ Use this rule to control the number of spaces inside brackets (``[`` and import yaml +from yamllint.linter import LintProblem from yamllint.rules.common import spaces_after, spaces_before ID = 'brackets' TYPE = 'token' -CONF = {'min-spaces-inside': int, +CONF = {'forbid': bool, + 'min-spaces-inside': int, 'max-spaces-inside': int, 'min-spaces-inside-empty': int, 'max-spaces-inside-empty': int} -DEFAULT = {'min-spaces-inside': 0, +DEFAULT = {'forbid': False, + 'min-spaces-inside': 0, 'max-spaces-inside': 0, 'min-spaces-inside-empty': -1, 'max-spaces-inside-empty': -1} def check(conf, token, prev, next, nextnext, context): - if (isinstance(token, yaml.FlowSequenceStartToken) and + if conf['forbid'] and isinstance(token, yaml.FlowSequenceStartToken): + yield LintProblem(token.start_mark.line + 1, + token.end_mark.column + 1, + 'forbidden flow sequence') + + elif (isinstance(token, yaml.FlowSequenceStartToken) and isinstance(next, yaml.FlowSequenceEndToken)): problem = spaces_after(token, prev, next, min=(conf['min-spaces-inside-empty']