Rules: indentation: Add the 'indent-sequences' option

Using either 'yes', 'no' or 'whatever', the user will be able to choose
whether to force block sequence items to be indented, to force them not
to be indented, or don't care, respectively.
This commit is contained in:
Adrien Vergé 2016-01-19 22:26:32 +01:00
parent ad5cec9c6c
commit 0b0251bacc
6 changed files with 218 additions and 36 deletions

View File

@ -42,7 +42,7 @@ class ColonTestCase(RuleTestCase):
' - p: kdjf\n'
' - q: val0\n'
' - q2:\n'
' - val1\n'
' - val1\n'
'...\n', conf)
self.check('---\n'
'object:\n'
@ -67,7 +67,7 @@ class ColonTestCase(RuleTestCase):
' - o: {k1: v1}\n'
' - o: {k1: v1}\n'
' - q2:\n'
' - val1\n'
' - val1\n'
'...\n', conf)
self.check('---\n'
'a: {b: {c: d, e : f}}\n', conf)
@ -94,7 +94,7 @@ class ColonTestCase(RuleTestCase):
'...\n', conf, problem=(2, 4))
self.check('---\n'
'- lib :\n'
' - var\n'
' - var\n'
'...\n', conf, problem=(2, 6))
self.check('---\n'
'a: {b: {c : d, e : f}}\n', conf,

View File

@ -115,7 +115,7 @@ class CommentsIndentationTestCase(RuleTestCase):
' # comments\n'
' b: 2\n', conf)
self.check('---\n'
'mylist:\n'
'my list for today:\n'
' - todo 1\n'
' - todo 2\n'
' # commented for now\n'

View File

@ -36,12 +36,12 @@ class HyphenTestCase(RuleTestCase):
'- elem2\n', conf)
self.check('---\n'
'object:\n'
'- elem1\n'
'- elem2\n', conf)
' - elem1\n'
' - elem2\n', conf)
self.check('---\n'
'object:\n'
'- elem1\n'
'- elem2\n', conf)
' - elem1\n'
' - elem2\n', conf)
self.check('---\n'
'object:\n'
' subobject:\n'
@ -69,12 +69,12 @@ class HyphenTestCase(RuleTestCase):
'- elem2\n', conf, problem=(2, 3))
self.check('---\n'
'object:\n'
'- elem1\n'
'- elem2\n', conf, problem=(4, 3))
' - elem1\n'
' - elem2\n', conf, problem=(4, 5))
self.check('---\n'
'object:\n'
'- elem1\n'
'- elem2\n', conf, problem1=(3, 3), problem2=(4, 3))
' - elem1\n'
' - elem2\n', conf, problem1=(3, 5), problem2=(4, 5))
self.check('---\n'
'object:\n'
' subobject:\n'

View File

@ -48,7 +48,20 @@ class IndentationTestCase(RuleTestCase):
'...\n', conf)
def test_one_space(self):
conf = 'indentation: {spaces: 1}'
conf = 'indentation: {spaces: 1, indent-sequences: no}'
self.check('---\n'
'object:\n'
' k1:\n'
' - a\n'
' - b\n'
' k2: v2\n'
' k3:\n'
' - name: Unix\n'
' date: 1969\n'
' - name: Linux\n'
' date: 1991\n'
'...\n', conf)
conf = 'indentation: {spaces: 1, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' k1:\n'
@ -63,7 +76,20 @@ class IndentationTestCase(RuleTestCase):
'...\n', conf)
def test_two_spaces(self):
conf = 'indentation: {spaces: 2}'
conf = 'indentation: {spaces: 2, indent-sequences: no}'
self.check('---\n'
'object:\n'
' k1:\n'
' - a\n'
' - b\n'
' k2: v2\n'
' k3:\n'
' - name: Unix\n'
' date: 1969\n'
' - name: Linux\n'
' date: 1991\n'
'...\n', conf)
conf = 'indentation: {spaces: 2, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' k1:\n'
@ -78,7 +104,20 @@ class IndentationTestCase(RuleTestCase):
'...\n', conf)
def test_three_spaces(self):
conf = 'indentation: {spaces: 3}'
conf = 'indentation: {spaces: 3, indent-sequences: no}'
self.check('---\n'
'object:\n'
' k1:\n'
' - a\n'
' - b\n'
' k2: v2\n'
' k3:\n'
' - name: Unix\n'
' date: 1969\n'
' - name: Linux\n'
' date: 1991\n'
'...\n', conf)
conf = 'indentation: {spaces: 3, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' k1:\n'
@ -92,8 +131,122 @@ class IndentationTestCase(RuleTestCase):
' date: 1991\n'
'...\n', conf)
def test_under_indented(self):
def test_indent_sequences_whatever(self):
conf = 'indentation: {spaces: 4, indent-sequences: whatever}'
self.check('---\n'
'list one:\n'
'- 1\n'
'- 2\n'
'- 3\n'
'list two:\n'
' - a\n'
' - b\n'
' - c\n', conf)
self.check('---\n'
'list one:\n'
' - 1\n'
' - 2\n'
' - 3\n'
'list two:\n'
' - a\n'
' - b\n'
' - c\n', conf, problem=(3, 3))
self.check('---\n'
'list one:\n'
'- 1\n'
'- 2\n'
'- 3\n'
'list two:\n'
' - a\n'
' - b\n'
' - c\n', conf, problem=(7, 3))
self.check('---\n'
'list:\n'
' - 1\n'
' - 2\n'
' - 3\n'
'- a\n'
'- b\n'
'- c\n', conf, problem=(6, 1, 'syntax'))
def test_flow_mappings(self):
conf = 'indentation: {spaces: 2}'
self.check('---\n'
'a: {x: 1,\n'
' y,\n'
' z: 1}\n', conf)
self.check('---\n'
'a: {x: 1,\n'
' y,\n'
' z: 1}\n', conf, problem=(3, 4))
self.check('---\n'
'a: {x: 1,\n'
' y,\n'
' z: 1}\n', conf, problem=(3, 6))
self.check('---\n'
'a: {x: 1,\n'
' y, z: 1\n'
'}\n', conf, problem=(3, 3))
self.check('---\n'
'a: {\n'
' x: 1,\n'
' y, z: 1\n'
'}\n', conf)
self.check('---\n'
'a: {\n'
' x: 1,\n'
' y, z: 1}\n', conf)
self.check('---\n'
'a: {\n'
' x: 1,\n'
' y, z: 1\n'
'}\n', conf, problem=(3, 4))
self.check('---\n'
'a: {\n'
' x: 1,\n'
' y, z: 1\n'
' }\n', conf, problem=(5, 3))
def test_flow_sequences(self):
conf = 'indentation: {spaces: 2}'
self.check('---\n'
'a: [x,\n'
' y,\n'
' z]\n', conf)
self.check('---\n'
'a: [x,\n'
' y,\n'
' z]\n', conf, problem=(3, 4))
self.check('---\n'
'a: [x,\n'
' y,\n'
' z]\n', conf, problem=(3, 6))
self.check('---\n'
'a: [x,\n'
' y, z\n'
']\n', conf, problem=(3, 3))
self.check('---\n'
'a: [\n'
' x,\n'
' y, z\n'
']\n', conf)
self.check('---\n'
'a: [\n'
' x,\n'
' y, z]\n', conf)
self.check('---\n'
'a: [\n'
' x,\n'
' y, z\n'
']\n', conf, problem=(3, 4))
self.check('---\n'
'a: [\n'
' x,\n'
' y, z\n'
' ]\n', conf, problem=(5, 3))
def test_under_indented(self):
conf = 'indentation: {spaces: 2, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' val: 1\n'
@ -109,7 +262,7 @@ class IndentationTestCase(RuleTestCase):
' - name: Unix\n'
' date: 1969\n'
'...\n', conf, problem=(5, 6, 'syntax'))
conf = 'indentation: {spaces: 4}'
conf = 'indentation: {spaces: 4, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' val: 1\n'
@ -127,7 +280,7 @@ class IndentationTestCase(RuleTestCase):
'...\n', conf, problem=(5, 10, 'syntax'))
def test_over_indented(self):
conf = 'indentation: {spaces: 2}'
conf = 'indentation: {spaces: 2, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' val: 1\n'
@ -143,7 +296,7 @@ class IndentationTestCase(RuleTestCase):
' - name: Unix\n'
' date: 1969\n'
'...\n', conf, problem=(5, 12, 'syntax'))
conf = 'indentation: {spaces: 4}'
conf = 'indentation: {spaces: 4, indent-sequences: yes}'
self.check('---\n'
'object:\n'
' val: 1\n'
@ -165,7 +318,7 @@ class IndentationTestCase(RuleTestCase):
self.check('---\n'
' - el1\n'
' - el2:\n'
' - subel\n'
' - subel\n'
'...\n', conf,
problem=(2, 3))
self.check('---\n'
@ -174,24 +327,32 @@ class IndentationTestCase(RuleTestCase):
' - name: Linux\n'
' date: 1991\n'
'...\n', conf, problem=(5, 16, 'syntax'))
conf = 'indentation: {spaces: 4, indent-sequences: whatever}'
self.check('---\n'
' - el1\n'
' - el2:\n'
' - subel\n'
'...\n', conf,
problem=(2, 3))
def test_multi_lines(self):
conf = 'indentation: {spaces: 2, indent-sequences: yes}'
self.check('---\n'
'long_string: >\n'
' bla bla blah\n'
' blah bla bla\n'
'...\n', None)
'...\n', conf)
self.check('---\n'
'- long_string: >\n'
' bla bla blah\n'
' blah bla bla\n'
'...\n', None)
'...\n', conf)
self.check('---\n'
'obj:\n'
' - long_string: >\n'
' bla bla blah\n'
' blah bla bla\n'
'...\n', None)
'...\n', conf)
def test_empty_value(self):
conf = 'indentation: {spaces: 2}'
@ -233,8 +394,23 @@ class IndentationTestCase(RuleTestCase):
'- o:\n'
' k1: v1\n'
'...\n', conf, problem=(3, 8))
self.check('---\n'
'- - - - item\n'
' - elem 1\n'
' - elem 2\n'
' - - - - - very nested: a\n'
' key: value\n'
'...\n', conf)
self.check('---\n'
' - - - - item\n'
' - elem 1\n'
' - elem 2\n'
' - - - - - very nested: a\n'
' key: value\n'
'...\n', conf, problem=(2, 2))
def test_return(self):
conf = 'indentation: {spaces: 2}'
self.check('---\n'
'a:\n'
' b:\n'
@ -243,19 +419,19 @@ class IndentationTestCase(RuleTestCase):
' e:\n'
' f:\n'
'g:\n'
'...\n', None)
'...\n', conf)
self.check('---\n'
'a:\n'
' b:\n'
' c:\n'
' d:\n'
'...\n', None, problem=(5, 4, 'syntax'))
'...\n', conf, problem=(5, 4, 'syntax'))
self.check('---\n'
'a:\n'
' b:\n'
' c:\n'
' d:\n'
'...\n', None, problem=(5, 2, 'syntax'))
'...\n', conf, problem=(5, 2, 'syntax'))
def test_first_line(self):
conf = ('indentation: {spaces: 2}\n'

View File

@ -31,7 +31,7 @@ rules:
max-spaces-after: 1
indentation:
spaces: 2
# indent-sequences: no
indent-sequences: yes
line-length:
max: 80
new-line-at-end-of-file: {level: error}

View File

@ -22,7 +22,8 @@ from yamllint.rules.common import is_explicit_key
ID = 'indentation'
TYPE = 'token'
CONF = {'spaces': int}
CONF = {'spaces': int,
'indent-sequences': (True, False, 'whatever')}
ROOT, MAP, B_SEQ, F_SEQ, KEY, VAL = range(6)
@ -164,16 +165,21 @@ def check(conf, token, prev, next, context):
# yaml.scan()ning this:
# '- lib:\n'
# ' - var\n'
if next.start_mark.column == context['stack'][-1].indent:
# key:
# - e1
# - e2
if conf['indent-sequences'] is False:
indent = context['stack'][-1].indent
else:
# key:
# - e1
# - e2
elif conf['indent-sequences'] is True:
indent = context['stack'][-1].indent + conf['spaces']
else: # 'whatever'
if next.start_mark.column == context['stack'][-1].indent:
# key:
# - e1
# - e2
indent = context['stack'][-1].indent
else:
# key:
# - e1
# - e2
indent = context['stack'][-1].indent + conf['spaces']
else:
# k:
# value