Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13a0f11e7c | ||
|
|
43b95e99d1 | ||
|
|
8fa9eb3ced | ||
|
|
da3788e95a | ||
|
|
fb400dc64b |
@@ -1,6 +1,17 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
1.20.0 (2019-12-26)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- Add --no-warnings option to suppress warning messages
|
||||||
|
- Use 'syntax' as rule name upon syntax errors
|
||||||
|
|
||||||
|
1.19.0 (2019-11-19)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- Allow disabling all checks for a file with ``# yamllint disable-file``
|
||||||
|
|
||||||
1.18.0 (2019-10-15)
|
1.18.0 (2019-10-15)
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ return code will be:
|
|||||||
* ``1`` if one or more errors occur
|
* ``1`` if one or more errors occur
|
||||||
* ``2`` if no errors occur, but one or more warnings occur
|
* ``2`` if no errors occur, but one or more warnings occur
|
||||||
|
|
||||||
|
If the script is invoked with the ``--no-warnings`` option, it won't output
|
||||||
|
warning level problems, only error level ones.
|
||||||
|
|
||||||
YAML files extensions
|
YAML files extensions
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|||||||
@@ -73,3 +73,31 @@ It is possible, although not recommend, to disabled **all** rules:
|
|||||||
|
|
||||||
If you need to disable multiple rules, it is allowed to chain rules like this:
|
If you need to disable multiple rules, it is allowed to chain rules like this:
|
||||||
``# yamllint disable rule:hyphens rule:commas rule:indentation``.
|
``# yamllint disable rule:hyphens rule:commas rule:indentation``.
|
||||||
|
|
||||||
|
Disabling all checks for a file
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
To prevent yamllint from reporting problems for a specific file, add the
|
||||||
|
directive comment ``# yamllint disable-file`` as the first line of the file.
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# yamllint disable-file
|
||||||
|
# The following mapping contains the same key twice, but I know what I'm doing:
|
||||||
|
key: value 1
|
||||||
|
key: value 2
|
||||||
|
|
||||||
|
- This line is waaaaaaaaaay too long but yamllint will not report anything about it.
|
||||||
|
This line will be checked by yamllint.
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
.. code-block:: jinja
|
||||||
|
|
||||||
|
# yamllint disable-file
|
||||||
|
# This file is not valid YAML because it is a Jinja template
|
||||||
|
{% if extra_info %}
|
||||||
|
key1: value1
|
||||||
|
{% endif %}
|
||||||
|
key2: value2
|
||||||
|
|||||||
@@ -530,5 +530,40 @@ class CommandLineTestCase(unittest.TestCase):
|
|||||||
out, err = sys.stdout.getvalue(), sys.stderr.getvalue()
|
out, err = sys.stdout.getvalue(), sys.stderr.getvalue()
|
||||||
self.assertEqual(out, (
|
self.assertEqual(out, (
|
||||||
'stdin:2:10: [error] syntax error: '
|
'stdin:2:10: [error] syntax error: '
|
||||||
'mapping values are not allowed here\n'))
|
'mapping values are not allowed here (syntax)\n'))
|
||||||
self.assertEqual(err, '')
|
self.assertEqual(err, '')
|
||||||
|
|
||||||
|
def test_run_no_warnings(self):
|
||||||
|
file = os.path.join(self.wd, 'a.yaml')
|
||||||
|
|
||||||
|
sys.stdout, sys.stderr = StringIO(), StringIO()
|
||||||
|
with self.assertRaises(SystemExit) as ctx:
|
||||||
|
cli.run((file, '--no-warnings', '-f', 'auto'))
|
||||||
|
|
||||||
|
self.assertEqual(ctx.exception.code, 1)
|
||||||
|
|
||||||
|
out, err = sys.stdout.getvalue(), sys.stderr.getvalue()
|
||||||
|
self.assertEqual(out, (
|
||||||
|
'%s\n'
|
||||||
|
' 2:4 error trailing spaces (trailing-spaces)\n'
|
||||||
|
' 3:4 error no new line character at the end of file '
|
||||||
|
'(new-line-at-end-of-file)\n'
|
||||||
|
'\n' % file))
|
||||||
|
self.assertEqual(err, '')
|
||||||
|
|
||||||
|
file = os.path.join(self.wd, 'warn.yaml')
|
||||||
|
|
||||||
|
sys.stdout, sys.stderr = StringIO(), StringIO()
|
||||||
|
with self.assertRaises(SystemExit) as ctx:
|
||||||
|
cli.run((file, '--no-warnings', '-f', 'auto'))
|
||||||
|
|
||||||
|
self.assertEqual(ctx.exception.code, 0)
|
||||||
|
|
||||||
|
def test_run_no_warnings_and_strict(self):
|
||||||
|
file = os.path.join(self.wd, 'warn.yaml')
|
||||||
|
|
||||||
|
sys.stdout, sys.stderr = StringIO(), StringIO()
|
||||||
|
with self.assertRaises(SystemExit) as ctx:
|
||||||
|
cli.run((file, '--no-warnings', '-s'))
|
||||||
|
|
||||||
|
self.assertEqual(ctx.exception.code, 2)
|
||||||
|
|||||||
@@ -302,3 +302,104 @@ class YamllintDirectivesTestCase(RuleTestCase):
|
|||||||
' c: [x]\n',
|
' c: [x]\n',
|
||||||
conf,
|
conf,
|
||||||
problem=(6, 2, 'comments-indentation'))
|
problem=(6, 2, 'comments-indentation'))
|
||||||
|
|
||||||
|
def test_disable_file_directive(self):
|
||||||
|
conf = ('comments: {min-spaces-from-content: 2}\n'
|
||||||
|
'comments-indentation: {}\n')
|
||||||
|
self.check('# yamllint disable-file\n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf)
|
||||||
|
self.check('# yamllint disable-file\n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf)
|
||||||
|
self.check('#yamllint disable-file\n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf)
|
||||||
|
self.check('#yamllint disable-file \n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf)
|
||||||
|
self.check('---\n'
|
||||||
|
'# yamllint disable-file\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf,
|
||||||
|
problem1=(3, 8, 'comments'),
|
||||||
|
problem2=(5, 2, 'comments-indentation'))
|
||||||
|
self.check('# yamllint disable-file: rules cannot be specified\n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf,
|
||||||
|
problem1=(3, 8, 'comments'),
|
||||||
|
problem2=(5, 2, 'comments-indentation'))
|
||||||
|
self.check('AAAA yamllint disable-file\n'
|
||||||
|
'---\n'
|
||||||
|
'- a: 1 # comment too close\n'
|
||||||
|
' b:\n'
|
||||||
|
' # wrong indentation\n'
|
||||||
|
' c: [x]\n',
|
||||||
|
conf,
|
||||||
|
problem1=(1, 1, 'document-start'),
|
||||||
|
problem2=(3, 8, 'comments'),
|
||||||
|
problem3=(5, 2, 'comments-indentation'))
|
||||||
|
|
||||||
|
def test_disable_file_directive_not_at_first_position(self):
|
||||||
|
self.check('# yamllint disable-file\n'
|
||||||
|
'---\n'
|
||||||
|
'- bad : colon and spaces \n',
|
||||||
|
self.conf)
|
||||||
|
self.check('---\n'
|
||||||
|
'# yamllint disable-file\n'
|
||||||
|
'- bad : colon and spaces \n',
|
||||||
|
self.conf,
|
||||||
|
problem1=(3, 7, 'colons'),
|
||||||
|
problem2=(3, 26, 'trailing-spaces'))
|
||||||
|
|
||||||
|
def test_disable_file_directive_with_syntax_error(self):
|
||||||
|
self.check('# This file is not valid YAML (it is a Jinja template)\n'
|
||||||
|
'{% if extra_info %}\n'
|
||||||
|
'key1: value1\n'
|
||||||
|
'{% endif %}\n'
|
||||||
|
'key2: value2\n',
|
||||||
|
self.conf,
|
||||||
|
problem=(2, 2, 'syntax'))
|
||||||
|
self.check('# yamllint disable-file\n'
|
||||||
|
'# This file is not valid YAML (it is a Jinja template)\n'
|
||||||
|
'{% if extra_info %}\n'
|
||||||
|
'key1: value1\n'
|
||||||
|
'{% endif %}\n'
|
||||||
|
'key2: value2\n',
|
||||||
|
self.conf)
|
||||||
|
|
||||||
|
def test_disable_file_directive_with_dos_lines(self):
|
||||||
|
self.check('# yamllint disable-file\r\n'
|
||||||
|
'---\r\n'
|
||||||
|
'- bad : colon and spaces \r\n',
|
||||||
|
self.conf)
|
||||||
|
self.check('# yamllint disable-file\r\n'
|
||||||
|
'# This file is not valid YAML (it is a Jinja template)\r\n'
|
||||||
|
'{% if extra_info %}\r\n'
|
||||||
|
'key1: value1\r\n'
|
||||||
|
'{% endif %}\r\n'
|
||||||
|
'key2: value2\r\n',
|
||||||
|
self.conf)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ indentation, etc."""
|
|||||||
|
|
||||||
|
|
||||||
APP_NAME = 'yamllint'
|
APP_NAME = 'yamllint'
|
||||||
APP_VERSION = '1.18.0'
|
APP_VERSION = '1.20.0'
|
||||||
APP_DESCRIPTION = __doc__
|
APP_DESCRIPTION = __doc__
|
||||||
|
|
||||||
__author__ = u'Adrien Vergé'
|
__author__ = u'Adrien Vergé'
|
||||||
|
|||||||
@@ -84,11 +84,14 @@ class Format(object):
|
|||||||
return line
|
return line
|
||||||
|
|
||||||
|
|
||||||
def show_problems(problems, file, args_format):
|
def show_problems(problems, file, args_format, no_warn):
|
||||||
max_level = 0
|
max_level = 0
|
||||||
first = True
|
first = True
|
||||||
|
|
||||||
for problem in problems:
|
for problem in problems:
|
||||||
|
max_level = max(max_level, PROBLEM_LEVELS[problem.level])
|
||||||
|
if no_warn and (problem.level != 'error'):
|
||||||
|
continue
|
||||||
if args_format == 'parsable':
|
if args_format == 'parsable':
|
||||||
print(Format.parsable(problem, file))
|
print(Format.parsable(problem, file))
|
||||||
elif args_format == 'colored' or \
|
elif args_format == 'colored' or \
|
||||||
@@ -102,7 +105,6 @@ def show_problems(problems, file, args_format):
|
|||||||
print(file)
|
print(file)
|
||||||
first = False
|
first = False
|
||||||
print(Format.standard(problem, file))
|
print(Format.standard(problem, file))
|
||||||
max_level = max(max_level, PROBLEM_LEVELS[problem.level])
|
|
||||||
|
|
||||||
if not first and args_format != 'parsable':
|
if not first and args_format != 'parsable':
|
||||||
print('')
|
print('')
|
||||||
@@ -133,6 +135,9 @@ def run(argv=None):
|
|||||||
action='store_true',
|
action='store_true',
|
||||||
help='return non-zero exit code on warnings '
|
help='return non-zero exit code on warnings '
|
||||||
'as well as errors')
|
'as well as errors')
|
||||||
|
parser.add_argument('--no-warnings',
|
||||||
|
action='store_true',
|
||||||
|
help='output only error level problems')
|
||||||
parser.add_argument('-v', '--version', action='version',
|
parser.add_argument('-v', '--version', action='version',
|
||||||
version='{} {}'.format(APP_NAME, APP_VERSION))
|
version='{} {}'.format(APP_NAME, APP_VERSION))
|
||||||
|
|
||||||
@@ -176,7 +181,8 @@ def run(argv=None):
|
|||||||
except EnvironmentError as e:
|
except EnvironmentError as e:
|
||||||
print(e, file=sys.stderr)
|
print(e, file=sys.stderr)
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
prob_level = show_problems(problems, file, args_format=args.format)
|
prob_level = show_problems(problems, file, args_format=args.format,
|
||||||
|
no_warn=args.no_warnings)
|
||||||
max_level = max(max_level, prob_level)
|
max_level = max(max_level, prob_level)
|
||||||
|
|
||||||
# read yaml from stdin
|
# read yaml from stdin
|
||||||
@@ -186,7 +192,8 @@ def run(argv=None):
|
|||||||
except EnvironmentError as e:
|
except EnvironmentError as e:
|
||||||
print(e, file=sys.stderr)
|
print(e, file=sys.stderr)
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
prob_level = show_problems(problems, 'stdin', args_format=args.format)
|
prob_level = show_problems(problems, 'stdin', args_format=args.format,
|
||||||
|
no_warn=args.no_warnings)
|
||||||
max_level = max(max_level, prob_level)
|
max_level = max(max_level, prob_level)
|
||||||
|
|
||||||
if max_level == PROBLEM_LEVELS['error']:
|
if max_level == PROBLEM_LEVELS['error']:
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ def get_syntax_error(buffer):
|
|||||||
except yaml.error.MarkedYAMLError as e:
|
except yaml.error.MarkedYAMLError as e:
|
||||||
problem = LintProblem(e.problem_mark.line + 1,
|
problem = LintProblem(e.problem_mark.line + 1,
|
||||||
e.problem_mark.column + 1,
|
e.problem_mark.column + 1,
|
||||||
'syntax error: ' + e.problem)
|
'syntax error: ' + e.problem + ' (syntax)')
|
||||||
problem.level = 'error'
|
problem.level = 'error'
|
||||||
return problem
|
return problem
|
||||||
|
|
||||||
@@ -189,6 +189,10 @@ def _run(buffer, conf, filepath):
|
|||||||
assert hasattr(buffer, '__getitem__'), \
|
assert hasattr(buffer, '__getitem__'), \
|
||||||
'_run() argument must be a buffer, not a stream'
|
'_run() argument must be a buffer, not a stream'
|
||||||
|
|
||||||
|
first_line = next(parser.line_generator(buffer)).content
|
||||||
|
if re.match(r'^#\s*yamllint disable-file\s*$', first_line):
|
||||||
|
return
|
||||||
|
|
||||||
# If the document contains a syntax error, save it and yield it at the
|
# If the document contains a syntax error, save it and yield it at the
|
||||||
# right line
|
# right line
|
||||||
syntax_error = get_syntax_error(buffer)
|
syntax_error = get_syntax_error(buffer)
|
||||||
|
|||||||
Reference in New Issue
Block a user