Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ae829c062 | ||
|
|
400aa084da | ||
|
|
a825645cbe | ||
|
|
1764e32def | ||
|
|
d6a81f1b23 | ||
|
|
38d14c7314 | ||
|
|
ff1c9ad221 | ||
|
|
4b2b57aa32 | ||
|
|
51b6d8377f | ||
|
|
f507319419 | ||
|
|
c0c8534501 | ||
|
|
2b26cbc56b | ||
|
|
c037d3e586 | ||
|
|
228c47ab77 | ||
|
|
413d7a8e4e | ||
|
|
c332c8e3d4 | ||
|
|
ea67ba3394 | ||
|
|
a7dbfb08b3 |
@@ -32,7 +32,7 @@ or:
|
||||
- This line is waaaaaaaaaay too long but yamllint will not report anything about it.
|
||||
This line will be checked by yamllint.
|
||||
|
||||
It it possible, although not recommend, to disabled **all** rules for a
|
||||
It is possible, although not recommend, to disabled **all** rules for a
|
||||
specific line:
|
||||
|
||||
.. code-block:: yaml
|
||||
@@ -46,7 +46,7 @@ If you need to disable multiple rules, it is allowed to chain rules like this:
|
||||
Disabling checks for all (or part of) the file
|
||||
----------------------------------------------
|
||||
|
||||
To prevent yamllint from reporting problems for the whoe file, or for a block of
|
||||
To prevent yamllint from reporting problems for the whole file, or for a block of
|
||||
lines within the file, use ``# yamllint disable ...`` and ``# yamllint enable
|
||||
...`` directive comments. For instance:
|
||||
|
||||
@@ -60,7 +60,7 @@ lines within the file, use ``# yamllint disable ...`` and ``# yamllint enable
|
||||
|
||||
- rest of the document...
|
||||
|
||||
It it possible, although not recommend, to disabled **all** rules:
|
||||
It is possible, although not recommend, to disabled **all** rules:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
|
||||
@@ -9,8 +9,12 @@ text editor.
|
||||
Vim
|
||||
---
|
||||
|
||||
Assuming that the `syntastic <https://github.com/scrooloose/syntastic>`_ plugin
|
||||
is installed, add to your ``.vimrc``:
|
||||
Assuming that the `ALE <https://github.com/w0rp/ale>`_ plugin is
|
||||
installed, yamllint is supported by default. It is automatically enabled when
|
||||
editing YAML files.
|
||||
|
||||
If you instead use the `syntastic <https://github.com/scrooloose/syntastic>`_
|
||||
plugin, add this to your ``.vimrc``:
|
||||
|
||||
::
|
||||
|
||||
@@ -23,6 +27,12 @@ Assuming that the `neomake <https://github.com/benekastah/neomake>`_ plugin is
|
||||
installed, yamllint is supported by default. It is automatically enabled when
|
||||
editing YAML files.
|
||||
|
||||
Emacs
|
||||
-----
|
||||
|
||||
If you are `flycheck <https://github.com/flycheck/flycheck>`_ user, you can use
|
||||
`flycheck-yamllint <https://github.com/krzysztof-magosa/flycheck-yamllint>`_ integration.
|
||||
|
||||
Other text editors
|
||||
------------------
|
||||
|
||||
|
||||
11
hooks.yaml
Normal file
11
hooks.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
|
||||
# For use with pre-commit.
|
||||
# See usage instructions at http://pre-commit.com
|
||||
|
||||
- id: yamllint
|
||||
name: yamllint
|
||||
description: This hook runs yamllint.
|
||||
entry: yamllint
|
||||
language: python
|
||||
files: \.(yaml|yml)$
|
||||
@@ -32,11 +32,19 @@ class ColonTestCase(RuleTestCase):
|
||||
'dict7: { a: 1, b, c: 3 }\n', conf)
|
||||
|
||||
def test_min_spaces(self):
|
||||
conf = 'braces: {max-spaces-inside: -1, min-spaces-inside: 0}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {}\n', conf)
|
||||
|
||||
conf = 'braces: {max-spaces-inside: -1, min-spaces-inside: 1}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {}\n', conf, problem=(2, 8))
|
||||
self.check('---\n'
|
||||
@@ -52,7 +60,11 @@ class ColonTestCase(RuleTestCase):
|
||||
' b\n'
|
||||
'}\n', conf)
|
||||
|
||||
conf = 'braces: {max-spaces-inside: -1, min-spaces-inside: 3}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 3\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: { a: 1, b }\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 17))
|
||||
@@ -60,7 +72,11 @@ class ColonTestCase(RuleTestCase):
|
||||
'dict: { a: 1, b }\n', conf)
|
||||
|
||||
def test_max_spaces(self):
|
||||
conf = 'braces: {max-spaces-inside: 0, min-spaces-inside: -1}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {}\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -79,7 +95,11 @@ class ColonTestCase(RuleTestCase):
|
||||
' b\n'
|
||||
'}\n', conf)
|
||||
|
||||
conf = 'braces: {max-spaces-inside: 3, min-spaces-inside: -1}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 3\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: { a: 1, b }\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -87,7 +107,11 @@ class ColonTestCase(RuleTestCase):
|
||||
problem1=(2, 11), problem2=(2, 23))
|
||||
|
||||
def test_min_and_max_spaces(self):
|
||||
conf = 'braces: {max-spaces-inside: 0, min-spaces-inside: 0}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {}\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -95,14 +119,169 @@ class ColonTestCase(RuleTestCase):
|
||||
self.check('---\n'
|
||||
'dict: { a: 1, b}\n', conf, problem=(2, 10))
|
||||
|
||||
conf = 'braces: {max-spaces-inside: 1, min-spaces-inside: 1}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {a: 1, b, c: 3 }\n', conf, problem=(2, 8))
|
||||
|
||||
conf = 'braces: {max-spaces-inside: 2, min-spaces-inside: 0}'
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 2\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'dict: {a: 1, b, c: 3 }\n', conf)
|
||||
self.check('---\n'
|
||||
'dict: { a: 1, b, c: 3 }\n', conf)
|
||||
self.check('---\n'
|
||||
'dict: { a: 1, b, c: 3 }\n', conf, problem=(2, 10))
|
||||
|
||||
def test_min_spaces_empty(self):
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: 0\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf)
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: 3\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
|
||||
def test_max_spaces_empty(self):
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf, problem=(2, 9))
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf, problem=(2, 10))
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 3\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf, problem=(2, 12))
|
||||
|
||||
def test_min_and_max_spaces_empty(self):
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 2\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf, problem=(2, 11))
|
||||
|
||||
def test_mixed_empty_nonempty(self):
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: 0\n')
|
||||
self.check('---\n'
|
||||
'array: { a: 1, b }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: {a: 1, b}\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 16))
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf,
|
||||
problem1=(2, 9))
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: { a: 1, b }\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 17))
|
||||
self.check('---\n'
|
||||
'array: {a: 1, b}\n', conf)
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 2\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: { a: 1, b }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: {a: 1, b }\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 18))
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf,
|
||||
problem1=(2, 11))
|
||||
|
||||
conf = ('braces:\n'
|
||||
' max-spaces-inside: 1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: { a: 1, b }\n', conf)
|
||||
self.check('---\n'
|
||||
'array: {a: 1, b}\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 16))
|
||||
self.check('---\n'
|
||||
'array: {}\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: { }\n', conf)
|
||||
|
||||
@@ -32,11 +32,19 @@ class ColonTestCase(RuleTestCase):
|
||||
'array7: [ a, b, c ]\n', conf)
|
||||
|
||||
def test_min_spaces(self):
|
||||
conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 0}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
|
||||
conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 1}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
@@ -51,7 +59,11 @@ class ColonTestCase(RuleTestCase):
|
||||
' b\n'
|
||||
']\n', conf)
|
||||
|
||||
conf = 'brackets: {max-spaces-inside: -1, min-spaces-inside: 3}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 3\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf,
|
||||
problem1=(2, 10), problem2=(2, 15))
|
||||
@@ -59,7 +71,11 @@ class ColonTestCase(RuleTestCase):
|
||||
'array: [ a, b ]\n', conf)
|
||||
|
||||
def test_max_spaces(self):
|
||||
conf = 'brackets: {max-spaces-inside: 0, min-spaces-inside: -1}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -78,7 +94,11 @@ class ColonTestCase(RuleTestCase):
|
||||
' b\n'
|
||||
']\n', conf)
|
||||
|
||||
conf = 'brackets: {max-spaces-inside: 3, min-spaces-inside: -1}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 3\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -86,7 +106,11 @@ class ColonTestCase(RuleTestCase):
|
||||
problem1=(2, 12), problem2=(2, 21))
|
||||
|
||||
def test_min_and_max_spaces(self):
|
||||
conf = 'brackets: {max-spaces-inside: 0, min-spaces-inside: 0}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
@@ -94,14 +118,169 @@ class ColonTestCase(RuleTestCase):
|
||||
self.check('---\n'
|
||||
'array: [ a, b]\n', conf, problem=(2, 11))
|
||||
|
||||
conf = 'brackets: {max-spaces-inside: 1, min-spaces-inside: 1}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: [a, b, c ]\n', conf, problem=(2, 9))
|
||||
|
||||
conf = 'brackets: {max-spaces-inside: 2, min-spaces-inside: 0}'
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 2\n'
|
||||
' min-spaces-inside: 0\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
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))
|
||||
|
||||
def test_min_spaces_empty(self):
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: 0\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: -1\n'
|
||||
' min-spaces-inside-empty: 3\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
|
||||
def test_max_spaces_empty(self):
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf, problem=(2, 9))
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf, problem=(2, 10))
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 3\n'
|
||||
' min-spaces-inside-empty: -1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf, problem=(2, 12))
|
||||
|
||||
def test_min_and_max_spaces_empty(self):
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 2\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: []\n', conf, problem=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf, problem=(2, 11))
|
||||
|
||||
def test_mixed_empty_nonempty(self):
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: -1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 0\n'
|
||||
' min-spaces-inside-empty: 0\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [a, b]\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 13))
|
||||
self.check('---\n'
|
||||
'array: []\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf,
|
||||
problem1=(2, 9))
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 0\n'
|
||||
' min-spaces-inside: -1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 14))
|
||||
self.check('---\n'
|
||||
'array: [a, b]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: []\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 2\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [a, b ]\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 15))
|
||||
self.check('---\n'
|
||||
'array: []\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf,
|
||||
problem1=(2, 11))
|
||||
|
||||
conf = ('brackets:\n'
|
||||
' max-spaces-inside: 1\n'
|
||||
' min-spaces-inside: 1\n'
|
||||
' max-spaces-inside-empty: 1\n'
|
||||
' min-spaces-inside-empty: 1\n')
|
||||
self.check('---\n'
|
||||
'array: [ a, b ]\n', conf)
|
||||
self.check('---\n'
|
||||
'array: [a, b]\n', conf,
|
||||
problem1=(2, 9), problem2=(2, 13))
|
||||
self.check('---\n'
|
||||
'array: []\n', conf,
|
||||
problem1=(2, 9))
|
||||
self.check('---\n'
|
||||
'array: [ ]\n', conf)
|
||||
|
||||
@@ -632,7 +632,7 @@ class IndentationTestCase(RuleTestCase):
|
||||
' date: 1991\n'
|
||||
'...\n', conf)
|
||||
|
||||
def test_consistent(self):
|
||||
def test_consistent_spaces(self):
|
||||
conf = ('indentation: {spaces: consistent,\n'
|
||||
' indent-sequences: whatever}\n'
|
||||
'document-start: disable\n')
|
||||
@@ -713,6 +713,142 @@ class IndentationTestCase(RuleTestCase):
|
||||
'- b\n'
|
||||
'- c\n', conf)
|
||||
|
||||
def test_consistent_spaces_and_indent_sequences(self):
|
||||
conf = 'indentation: {spaces: consistent, indent-sequences: true}'
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
'- 1\n'
|
||||
'- 2\n'
|
||||
'- 3\n'
|
||||
'list two:\n'
|
||||
' - a\n'
|
||||
' - b\n'
|
||||
' - c\n', conf, problem1=(3, 1))
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
' - 1\n'
|
||||
' - 2\n'
|
||||
' - 3\n'
|
||||
'list two:\n'
|
||||
' - a\n'
|
||||
' - b\n'
|
||||
' - c\n', conf, problem1=(7, 5))
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
' - 1\n'
|
||||
' - 2\n'
|
||||
' - 3\n'
|
||||
'list two:\n'
|
||||
'- a\n'
|
||||
'- b\n'
|
||||
'- c\n', conf, problem1=(7, 1))
|
||||
|
||||
conf = 'indentation: {spaces: consistent, indent-sequences: false}'
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
'- 1\n'
|
||||
'- 2\n'
|
||||
'- 3\n'
|
||||
'list two:\n'
|
||||
' - a\n'
|
||||
' - b\n'
|
||||
' - c\n', conf, problem1=(7, 5))
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
'- 1\n'
|
||||
'- 2\n'
|
||||
'- 3\n'
|
||||
'list two:\n'
|
||||
' - a\n'
|
||||
' - b\n'
|
||||
' - c\n', conf, problem1=(7, 3))
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
' - 1\n'
|
||||
' - 2\n'
|
||||
' - 3\n'
|
||||
'list two:\n'
|
||||
'- a\n'
|
||||
'- b\n'
|
||||
'- c\n', conf, problem1=(3, 3))
|
||||
|
||||
conf = ('indentation: {spaces: consistent,\n'
|
||||
' indent-sequences: consistent}')
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
'- 1\n'
|
||||
'- 2\n'
|
||||
'- 3\n'
|
||||
'list two:\n'
|
||||
' - a\n'
|
||||
' - b\n'
|
||||
' - c\n', conf, problem1=(7, 5))
|
||||
self.check('---\n'
|
||||
'list one:\n'
|
||||
' - 1\n'
|
||||
' - 2\n'
|
||||
' - 3\n'
|
||||
'list two:\n'
|
||||
'- a\n'
|
||||
'- b\n'
|
||||
'- c\n', conf, problem1=(7, 1))
|
||||
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, problem1=(7, 5))
|
||||
|
||||
conf = 'indentation: {spaces: consistent, 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)
|
||||
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, problem1=(7, 5))
|
||||
|
||||
def test_indent_sequences_whatever(self):
|
||||
conf = 'indentation: {spaces: 4, indent-sequences: whatever}'
|
||||
self.check('---\n'
|
||||
|
||||
82
tests/test_module.py
Normal file
82
tests/test_module.py
Normal file
@@ -0,0 +1,82 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
|
||||
class ModuleTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.wd = tempfile.mkdtemp(prefix='yamllint-tests-')
|
||||
|
||||
# file with only one warning
|
||||
with open(os.path.join(self.wd, 'warn.yaml'), 'w') as f:
|
||||
f.write('key: value\n')
|
||||
|
||||
# file in dir
|
||||
os.mkdir(os.path.join(self.wd, 'sub'))
|
||||
with open(os.path.join(self.wd, 'sub', 'nok.yaml'), 'w') as f:
|
||||
f.write('---\n'
|
||||
'list: [ 1, 1, 2, 3, 5, 8] \n')
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.wd)
|
||||
|
||||
def test_run_module_no_args(self):
|
||||
with self.assertRaises(subprocess.CalledProcessError) as ctx:
|
||||
subprocess.check_output(['python', '-m', 'yamllint'],
|
||||
stderr=subprocess.STDOUT)
|
||||
self.assertEqual(ctx.exception.returncode, 2)
|
||||
self.assertRegexpMatches(ctx.exception.output.decode(),
|
||||
r'^usage: yamllint')
|
||||
|
||||
def test_run_module_on_bad_dir(self):
|
||||
with self.assertRaises(subprocess.CalledProcessError) as ctx:
|
||||
subprocess.check_output(['python', '-m', 'yamllint',
|
||||
'/does/not/exist'],
|
||||
stderr=subprocess.STDOUT)
|
||||
self.assertRegexpMatches(ctx.exception.output.decode(),
|
||||
r'No such file or directory')
|
||||
|
||||
def test_run_module_on_file(self):
|
||||
out = subprocess.check_output(
|
||||
['python', '-m', 'yamllint', os.path.join(self.wd, 'warn.yaml')])
|
||||
lines = out.decode().splitlines()
|
||||
self.assertIn('/warn.yaml', lines[0])
|
||||
self.assertEqual('\n'.join(lines[1:]),
|
||||
' 1:1 warning missing document start "---"'
|
||||
' (document-start)\n')
|
||||
|
||||
def test_run_module_on_dir(self):
|
||||
with self.assertRaises(subprocess.CalledProcessError) as ctx:
|
||||
subprocess.check_output(['python', '-m', 'yamllint', self.wd])
|
||||
self.assertEqual(ctx.exception.returncode, 1)
|
||||
|
||||
files = ctx.exception.output.decode().split('\n\n')
|
||||
self.assertIn(
|
||||
'/warn.yaml\n'
|
||||
' 1:1 warning missing document start "---"'
|
||||
' (document-start)',
|
||||
files[0])
|
||||
self.assertIn(
|
||||
'/sub/nok.yaml\n'
|
||||
' 2:9 error too many spaces inside brackets'
|
||||
' (brackets)\n'
|
||||
' 2:27 error trailing spaces (trailing-spaces)',
|
||||
files[1])
|
||||
@@ -22,7 +22,7 @@ indentation, etc."""
|
||||
|
||||
|
||||
APP_NAME = 'yamllint'
|
||||
APP_VERSION = '1.6.0'
|
||||
APP_VERSION = '1.7.0'
|
||||
APP_DESCRIPTION = __doc__
|
||||
|
||||
__author__ = u'Adrien Vergé'
|
||||
|
||||
4
yamllint/__main__.py
Normal file
4
yamllint/__main__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from yamllint.cli import run
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
@@ -4,9 +4,13 @@ rules:
|
||||
braces:
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 0
|
||||
min-spaces-inside-empty: -1
|
||||
max-spaces-inside-empty: -1
|
||||
brackets:
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 0
|
||||
min-spaces-inside-empty: -1
|
||||
max-spaces-inside-empty: -1
|
||||
colons:
|
||||
max-spaces-before: 0
|
||||
max-spaces-after: 1
|
||||
|
||||
@@ -63,7 +63,7 @@ class LintProblem(object):
|
||||
return '%d:%d: %s' % (self.line, self.column, self.message)
|
||||
|
||||
|
||||
def get_costemic_problems(buffer, conf):
|
||||
def get_cosmetic_problems(buffer, conf):
|
||||
rules = conf.enabled_rules()
|
||||
|
||||
# Split token rules from line rules
|
||||
@@ -193,7 +193,7 @@ def _run(buffer, conf):
|
||||
# right line
|
||||
syntax_error = get_syntax_error(buffer)
|
||||
|
||||
for problem in get_costemic_problems(buffer, conf):
|
||||
for problem in get_cosmetic_problems(buffer, conf):
|
||||
# Insert the syntax error (if any) at the right place...
|
||||
if (syntax_error and syntax_error.line <= problem.line and
|
||||
syntax_error.column <= problem.column):
|
||||
|
||||
@@ -23,6 +23,10 @@ Use this rule to control the number of spaces inside braces (``{`` and ``}``).
|
||||
braces.
|
||||
* ``max-spaces-inside`` defines the maximal number of spaces allowed inside
|
||||
braces.
|
||||
* ``min-spaces-inside-empty`` defines the minimal number of spaces required
|
||||
inside empty braces.
|
||||
* ``max-spaces-inside-empty`` defines the maximal number of spaces allowed
|
||||
inside empty braces.
|
||||
|
||||
.. rubric:: Examples
|
||||
|
||||
@@ -59,6 +63,30 @@ Use this rule to control the number of spaces inside braces (``{`` and ``}``).
|
||||
::
|
||||
|
||||
object: {key1: 4, key2: 8 }
|
||||
|
||||
#. With ``braces: {min-spaces-inside-empty: 0, max-spaces-inside-empty: 0}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
object: {}
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
object: { }
|
||||
|
||||
#. With ``braces: {min-spaces-inside-empty: 1, max-spaces-inside-empty: -1}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
object: { }
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
object: {}
|
||||
"""
|
||||
|
||||
|
||||
@@ -70,11 +98,27 @@ from yamllint.rules.common import spaces_after, spaces_before
|
||||
ID = 'braces'
|
||||
TYPE = 'token'
|
||||
CONF = {'min-spaces-inside': int,
|
||||
'max-spaces-inside': int}
|
||||
'max-spaces-inside': int,
|
||||
'min-spaces-inside-empty': int,
|
||||
'max-spaces-inside-empty': int}
|
||||
|
||||
|
||||
def check(conf, token, prev, next, nextnext, context):
|
||||
if isinstance(token, yaml.FlowMappingStartToken):
|
||||
if (isinstance(token, yaml.FlowMappingStartToken) and
|
||||
isinstance(next, yaml.FlowMappingEndToken)):
|
||||
problem = spaces_after(token, prev, next,
|
||||
min=(conf['min-spaces-inside-empty']
|
||||
if conf['min-spaces-inside-empty'] != -1
|
||||
else conf['min-spaces-inside']),
|
||||
max=(conf['max-spaces-inside-empty']
|
||||
if conf['max-spaces-inside-empty'] != -1
|
||||
else conf['max-spaces-inside']),
|
||||
min_desc='too few spaces inside empty braces',
|
||||
max_desc='too many spaces inside empty braces')
|
||||
if problem is not None:
|
||||
yield problem
|
||||
|
||||
elif isinstance(token, yaml.FlowMappingStartToken):
|
||||
problem = spaces_after(token, prev, next,
|
||||
min=conf['min-spaces-inside'],
|
||||
max=conf['max-spaces-inside'],
|
||||
|
||||
@@ -24,6 +24,10 @@ Use this rule to control the number of spaces inside brackets (``[`` and
|
||||
brackets.
|
||||
* ``max-spaces-inside`` defines the maximal number of spaces allowed inside
|
||||
brackets.
|
||||
* ``min-spaces-inside-empty`` defines the minimal number of spaces required
|
||||
inside empty brackets.
|
||||
* ``max-spaces-inside-empty`` defines the maximal number of spaces allowed
|
||||
inside empty brackets.
|
||||
|
||||
.. rubric:: Examples
|
||||
|
||||
@@ -60,6 +64,30 @@ Use this rule to control the number of spaces inside brackets (``[`` and
|
||||
::
|
||||
|
||||
object: [1, 2, abc ]
|
||||
|
||||
#. With ``brackets: {min-spaces-inside-empty: 0, max-spaces-inside-empty: 0}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
object: []
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
object: [ ]
|
||||
|
||||
#. With ``brackets: {min-spaces-inside-empty: 1, max-spaces-inside-empty: -1}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
object: [ ]
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
object: []
|
||||
"""
|
||||
|
||||
|
||||
@@ -71,11 +99,28 @@ from yamllint.rules.common import spaces_after, spaces_before
|
||||
ID = 'brackets'
|
||||
TYPE = 'token'
|
||||
CONF = {'min-spaces-inside': int,
|
||||
'max-spaces-inside': int}
|
||||
'max-spaces-inside': int,
|
||||
'min-spaces-inside-empty': int,
|
||||
'max-spaces-inside-empty': int}
|
||||
|
||||
|
||||
def check(conf, token, prev, next, nextnext, context):
|
||||
if isinstance(token, yaml.FlowSequenceStartToken):
|
||||
if (isinstance(token, yaml.FlowSequenceStartToken) and
|
||||
isinstance(next, yaml.FlowSequenceEndToken)):
|
||||
problem = spaces_after(token, prev, next,
|
||||
min=(conf['min-spaces-inside-empty']
|
||||
if conf['min-spaces-inside-empty'] != -1
|
||||
else conf['min-spaces-inside']),
|
||||
max=(conf['max-spaces-inside-empty']
|
||||
if conf['max-spaces-inside-empty'] != -1
|
||||
else conf['max-spaces-inside']),
|
||||
min_desc='too few spaces inside empty brackets',
|
||||
max_desc=('too many spaces inside empty '
|
||||
'brackets'))
|
||||
if problem is not None:
|
||||
yield problem
|
||||
|
||||
elif isinstance(token, yaml.FlowSequenceStartToken):
|
||||
problem = spaces_after(token, prev, next,
|
||||
min=conf['min-spaces-inside'],
|
||||
max=conf['max-spaces-inside'],
|
||||
|
||||
@@ -469,7 +469,19 @@ def _check(conf, token, prev, next, nextnext, context):
|
||||
if context['indent-sequences'] is False:
|
||||
indent = context['stack'][-1].indent
|
||||
elif context['indent-sequences'] is True:
|
||||
indent = detect_indent(context['stack'][-1].indent, next)
|
||||
if (context['spaces'] == 'consistent' and
|
||||
next.start_mark.column -
|
||||
context['stack'][-1].indent == 0):
|
||||
# In this case, the block sequence item is not indented
|
||||
# (while it should be), but we don't know yet the
|
||||
# indentation it should have (because `spaces` is
|
||||
# `consistent` and its value has not been computed yet
|
||||
# -- this is probably the beginning of the document).
|
||||
# So we choose an arbitrary value (2).
|
||||
indent = 2
|
||||
else:
|
||||
indent = detect_indent(context['stack'][-1].indent,
|
||||
next)
|
||||
else: # 'whatever' or 'consistent'
|
||||
if next.start_mark.column == context['stack'][-1].indent:
|
||||
# key:
|
||||
|
||||
Reference in New Issue
Block a user