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