Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fceca2354 | ||
|
|
9403f1f3ec | ||
|
|
0016390e78 | ||
|
|
9e90c777cb | ||
|
|
a2218988ee | ||
|
|
954fdd5e8f | ||
|
|
bbcad943b6 | ||
|
|
30c90dbf70 | ||
|
|
512fe17047 | ||
|
|
278a79f093 | ||
|
|
e98aacf62c | ||
|
|
94c0416f6b | ||
|
|
a54cbce1b6 | ||
|
|
b711fd993e | ||
|
|
d68022b846 | ||
|
|
851d34b9fd |
@@ -1,6 +1,25 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
1.24.1 (2020-07-15)
|
||||
-------------------
|
||||
|
||||
- Revert ``locale`` config option from version 1.24.0 because of a bug
|
||||
|
||||
1.24.0 (2020-07-15)
|
||||
-------------------
|
||||
|
||||
- Specify config with environment variable ``YAMLLINT_CONFIG_FILE``
|
||||
- Fix bug with CRLF in ``new-lines`` and ``require-starting-space``
|
||||
- Do not run linter on directories whose names look like YAML files
|
||||
- Add ``locale`` config option and make ``key-ordering`` locale-aware
|
||||
|
||||
1.23.0 (2020-04-17)
|
||||
-------------------
|
||||
|
||||
- Allow rules to validate their configuration
|
||||
- Add options ``extra-required`` and ``extra-allowed`` to ``quoted-strings``
|
||||
|
||||
1.22.1 (2020-04-15)
|
||||
-------------------
|
||||
|
||||
|
||||
44
CONTRIBUTING.rst
Normal file
44
CONTRIBUTING.rst
Normal file
@@ -0,0 +1,44 @@
|
||||
Contributing
|
||||
============
|
||||
|
||||
Pull requests are the best way to propose changes to the codebase.
|
||||
Contributions are welcome, but they have to meet some criteria.
|
||||
|
||||
Pull Request Process
|
||||
--------------------
|
||||
|
||||
1. Fork this Git repository and create your branch from ``master``.
|
||||
|
||||
2. Make sure the tests pass:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
python setup.py test
|
||||
|
||||
3. If you add code that should be tested, add tests.
|
||||
|
||||
4. Make sure the linters pass:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
flake8 .
|
||||
|
||||
If you added/modified documentation:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
doc8 $(git ls-files '*.rst')
|
||||
|
||||
If you touched YAML files:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
yamllint --strict $(git ls-files '*.yaml' '*.yml')
|
||||
|
||||
5. If relevant, update documentation (either in ``docs`` directly or in rules
|
||||
files themselves).
|
||||
|
||||
6. Write a `good commit message
|
||||
<http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_.
|
||||
|
||||
7. Then, open a pull request.
|
||||
@@ -6,9 +6,9 @@ import sys
|
||||
import os
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
sys.path.insert(0, os.path.abspath('..')) # noqa
|
||||
sys.path.insert(0, os.path.abspath('..'))
|
||||
|
||||
from yamllint import __copyright__, APP_NAME, APP_VERSION
|
||||
from yamllint import __copyright__, APP_NAME, APP_VERSION # noqa
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ following locations (by order of preference):
|
||||
|
||||
- ``.yamllint``, ``.yamllint.yaml`` or ``.yamllint.yml`` in the current working
|
||||
directory
|
||||
- the file referenced by ``$YAMLLINT_CONFIG_FILE``, if set
|
||||
- ``$XDG_CONFIG_HOME/yamllint/config``
|
||||
- ``~/.config/yamllint/config``
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ universal = 1
|
||||
[flake8]
|
||||
import-order-style = pep8
|
||||
application-import-names = yamllint
|
||||
ignore = W503,W504
|
||||
|
||||
[build_sphinx]
|
||||
all-files = 1
|
||||
|
||||
1
setup.py
1
setup.py
@@ -42,6 +42,7 @@ setup(
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Programming Language :: Python :: 3.8',
|
||||
'Topic :: Software Development',
|
||||
'Topic :: Software Development :: Debuggers',
|
||||
'Topic :: Software Development :: Quality Assurance',
|
||||
|
||||
@@ -186,6 +186,27 @@ class CommentsTestCase(RuleTestCase):
|
||||
'inline: comment #\n'
|
||||
'foo: bar\n', conf)
|
||||
|
||||
def test_empty_comment_crlf_dos_newlines(self):
|
||||
conf = ('comments:\n'
|
||||
' require-starting-space: true\n'
|
||||
' min-spaces-from-content: 2\n'
|
||||
'new-lines:\n'
|
||||
' type: dos\n')
|
||||
self.check('---\r\n'
|
||||
'# This is paragraph 1.\r\n'
|
||||
'#\r\n'
|
||||
'# This is paragraph 2.\r\n', conf)
|
||||
|
||||
def test_empty_comment_crlf_disabled_newlines(self):
|
||||
conf = ('comments:\n'
|
||||
' require-starting-space: true\n'
|
||||
' min-spaces-from-content: 2\n'
|
||||
'new-lines: disable\n')
|
||||
self.check('---\r\n'
|
||||
'# This is paragraph 1.\r\n'
|
||||
'#\r\n'
|
||||
'# This is paragraph 2.\r\n', conf)
|
||||
|
||||
def test_first_line(self):
|
||||
conf = ('comments:\n'
|
||||
' require-starting-space: true\n'
|
||||
|
||||
@@ -40,6 +40,16 @@ class NewLinesTestCase(RuleTestCase):
|
||||
self.check('---\ntext\n', conf)
|
||||
self.check('---\r\ntext\r\n', conf, problem=(1, 4))
|
||||
|
||||
def test_unix_type_required_st_sp(self):
|
||||
# If we find a CRLF when looking for Unix newlines, yamllint
|
||||
# should always raise, regardless of logic with
|
||||
# require-starting-space.
|
||||
conf = ('new-line-at-end-of-file: disable\n'
|
||||
'new-lines: {type: unix}\n'
|
||||
'comments:\n'
|
||||
' require-starting-space: true\n')
|
||||
self.check('---\r\n#\r\n', conf, problem=(1, 4))
|
||||
|
||||
def test_dos_type(self):
|
||||
conf = ('new-line-at-end-of-file: disable\n'
|
||||
'new-lines: {type: dos}\n')
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
from tests.common import RuleTestCase
|
||||
|
||||
from yamllint import config
|
||||
|
||||
|
||||
class QuotedTestCase(RuleTestCase):
|
||||
rule_id = 'quoted-strings'
|
||||
@@ -357,3 +359,79 @@ class QuotedTestCase(RuleTestCase):
|
||||
'k5: :wq\n'
|
||||
'k6: ":wq"\n', # fails
|
||||
conf, problem1=(3, 5), problem2=(5, 5), problem3=(7, 5))
|
||||
|
||||
def test_only_when_needed_extras(self):
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: true\n'
|
||||
' extra-allowed: [^http://]\n')
|
||||
self.assertRaises(config.YamlLintConfigError, self.check, '', conf)
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: true\n'
|
||||
' extra-required: [^http://]\n')
|
||||
self.assertRaises(config.YamlLintConfigError, self.check, '', conf)
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: false\n'
|
||||
' extra-allowed: [^http://]\n')
|
||||
self.assertRaises(config.YamlLintConfigError, self.check, '', conf)
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: true\n')
|
||||
self.check('---\n'
|
||||
'- 123\n'
|
||||
'- "123"\n'
|
||||
'- localhost\n' # fails
|
||||
'- "localhost"\n'
|
||||
'- http://localhost\n' # fails
|
||||
'- "http://localhost"\n'
|
||||
'- ftp://localhost\n' # fails
|
||||
'- "ftp://localhost"\n',
|
||||
conf, problem1=(4, 3), problem2=(6, 3), problem3=(8, 3))
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: only-when-needed\n'
|
||||
' extra-allowed: [^ftp://]\n'
|
||||
' extra-required: [^http://]\n')
|
||||
self.check('---\n'
|
||||
'- 123\n'
|
||||
'- "123"\n'
|
||||
'- localhost\n'
|
||||
'- "localhost"\n' # fails
|
||||
'- http://localhost\n' # fails
|
||||
'- "http://localhost"\n'
|
||||
'- ftp://localhost\n'
|
||||
'- "ftp://localhost"\n',
|
||||
conf, problem1=(5, 3), problem2=(6, 3))
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: false\n'
|
||||
' extra-required: [^http://, ^ftp://]\n')
|
||||
self.check('---\n'
|
||||
'- 123\n'
|
||||
'- "123"\n'
|
||||
'- localhost\n'
|
||||
'- "localhost"\n'
|
||||
'- http://localhost\n' # fails
|
||||
'- "http://localhost"\n'
|
||||
'- ftp://localhost\n' # fails
|
||||
'- "ftp://localhost"\n',
|
||||
conf, problem1=(6, 3), problem2=(8, 3))
|
||||
|
||||
conf = ('quoted-strings:\n'
|
||||
' required: only-when-needed\n'
|
||||
' extra-allowed: [^ftp://, ";$", " "]\n')
|
||||
self.check('---\n'
|
||||
'- localhost\n'
|
||||
'- "localhost"\n' # fails
|
||||
'- ftp://localhost\n'
|
||||
'- "ftp://localhost"\n'
|
||||
'- i=i+1\n'
|
||||
'- "i=i+1"\n' # fails
|
||||
'- i=i+2;\n'
|
||||
'- "i=i+2;"\n'
|
||||
'- foo\n'
|
||||
'- "foo"\n' # fails
|
||||
'- foo bar\n'
|
||||
'- "foo bar"\n',
|
||||
conf, problem1=(3, 3), problem2=(7, 3), problem3=(11, 3))
|
||||
|
||||
@@ -24,6 +24,7 @@ import os
|
||||
import pty
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from tests.common import build_temp_workspace
|
||||
@@ -72,6 +73,9 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
# file in dir
|
||||
'sub/ok.yaml': '---\n'
|
||||
'key: value\n',
|
||||
# directory that looks like a yaml file
|
||||
'sub/directory.yaml/not-yaml.txt': '',
|
||||
'sub/directory.yaml/empty.yml': '',
|
||||
# file in very nested dir
|
||||
's/s/s/s/s/s/s/s/s/s/s/s/s/s/s/file.yaml': '---\n'
|
||||
'key: value\n'
|
||||
@@ -107,6 +111,7 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
os.path.join(self.wd, 'dos.yml'),
|
||||
os.path.join(self.wd, 'empty.yml'),
|
||||
os.path.join(self.wd, 's/s/s/s/s/s/s/s/s/s/s/s/s/s/s/file.yaml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/empty.yml'),
|
||||
os.path.join(self.wd, 'sub/ok.yaml'),
|
||||
os.path.join(self.wd, 'warn.yaml')],
|
||||
)
|
||||
@@ -131,6 +136,7 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
self.assertEqual(
|
||||
sorted(cli.find_files_recursively(items, conf)),
|
||||
[os.path.join(self.wd, '/etc/another/file'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/empty.yml'),
|
||||
os.path.join(self.wd, 'sub/ok.yaml')],
|
||||
)
|
||||
|
||||
@@ -151,7 +157,8 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
self.assertEqual(
|
||||
sorted(cli.find_files_recursively([self.wd], conf)),
|
||||
[os.path.join(self.wd, 'dos.yml'),
|
||||
os.path.join(self.wd, 'empty.yml')]
|
||||
os.path.join(self.wd, 'empty.yml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/empty.yml')]
|
||||
)
|
||||
|
||||
conf = config.YamlLintConfig('extends: default\n'
|
||||
@@ -173,6 +180,8 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
os.path.join(self.wd, 'no-yaml.json'),
|
||||
os.path.join(self.wd, 'non-ascii/éçäγλνπ¥/utf-8'),
|
||||
os.path.join(self.wd, 's/s/s/s/s/s/s/s/s/s/s/s/s/s/s/file.yaml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/empty.yml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/not-yaml.txt'),
|
||||
os.path.join(self.wd, 'sub/ok.yaml'),
|
||||
os.path.join(self.wd, 'warn.yaml')]
|
||||
)
|
||||
@@ -190,6 +199,8 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
os.path.join(self.wd, 'no-yaml.json'),
|
||||
os.path.join(self.wd, 'non-ascii/éçäγλνπ¥/utf-8'),
|
||||
os.path.join(self.wd, 's/s/s/s/s/s/s/s/s/s/s/s/s/s/s/file.yaml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/empty.yml'),
|
||||
os.path.join(self.wd, 'sub/directory.yaml/not-yaml.txt'),
|
||||
os.path.join(self.wd, 'sub/ok.yaml'),
|
||||
os.path.join(self.wd, 'warn.yaml')]
|
||||
)
|
||||
@@ -285,6 +296,25 @@ class CommandLineTestCase(unittest.TestCase):
|
||||
cli.run((os.path.join(self.wd, 'a.yaml'), ))
|
||||
self.assertEqual(ctx.returncode, 1)
|
||||
|
||||
def test_run_with_user_yamllint_config_file_in_env(self):
|
||||
self.addCleanup(os.environ.__delitem__, 'YAMLLINT_CONFIG_FILE')
|
||||
|
||||
with tempfile.NamedTemporaryFile('w') as f:
|
||||
os.environ['YAMLLINT_CONFIG_FILE'] = f.name
|
||||
f.write('rules: {trailing-spaces: disable}')
|
||||
f.flush()
|
||||
with RunContext(self) as ctx:
|
||||
cli.run((os.path.join(self.wd, 'a.yaml'), ))
|
||||
self.assertEqual(ctx.returncode, 0)
|
||||
|
||||
with tempfile.NamedTemporaryFile('w') as f:
|
||||
os.environ['YAMLLINT_CONFIG_FILE'] = f.name
|
||||
f.write('rules: {trailing-spaces: enable}')
|
||||
f.flush()
|
||||
with RunContext(self) as ctx:
|
||||
cli.run((os.path.join(self.wd, 'a.yaml'), ))
|
||||
self.assertEqual(ctx.returncode, 1)
|
||||
|
||||
def test_run_version(self):
|
||||
with RunContext(self) as ctx:
|
||||
cli.run(('--version', ))
|
||||
|
||||
@@ -22,7 +22,7 @@ indentation, etc."""
|
||||
|
||||
|
||||
APP_NAME = 'yamllint'
|
||||
APP_VERSION = '1.22.1'
|
||||
APP_VERSION = '1.24.1'
|
||||
APP_DESCRIPTION = __doc__
|
||||
|
||||
__author__ = u'Adrien Vergé'
|
||||
|
||||
@@ -144,8 +144,11 @@ def run(argv=None):
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
if 'YAMLLINT_CONFIG_FILE' in os.environ:
|
||||
user_global_config = os.path.expanduser(
|
||||
os.environ['YAMLLINT_CONFIG_FILE'])
|
||||
# User-global config is supposed to be in ~/.config/yamllint/config
|
||||
if 'XDG_CONFIG_HOME' in os.environ:
|
||||
elif 'XDG_CONFIG_HOME' in os.environ:
|
||||
user_global_config = os.path.join(
|
||||
os.environ['XDG_CONFIG_HOME'], 'yamllint', 'config')
|
||||
else:
|
||||
|
||||
@@ -46,7 +46,7 @@ class YamlLintConfig(object):
|
||||
return self.ignore and self.ignore.match_file(filepath)
|
||||
|
||||
def is_yaml_file(self, filepath):
|
||||
return self.yaml_files.match_file(filepath)
|
||||
return self.yaml_files.match_file(os.path.basename(filepath))
|
||||
|
||||
def enabled_rules(self, filepath):
|
||||
return [yamllint.rules.get(id) for id, val in self.rules.items()
|
||||
@@ -157,11 +157,12 @@ def validate_rule_conf(rule, conf):
|
||||
raise YamlLintConfigError(
|
||||
'invalid config: option "%s" of "%s" should be in %s'
|
||||
% (optkey, rule.ID, options[optkey]))
|
||||
# Example: CONF = {option: ['flag1', 'flag2']}
|
||||
# → {option: [flag1]} → {option: [flag1, flag2]}
|
||||
# Example: CONF = {option: ['flag1', 'flag2', int]}
|
||||
# → {option: [flag1]} → {option: [42, flag1, flag2]}
|
||||
elif isinstance(options[optkey], list):
|
||||
if (type(conf[optkey]) is not list or
|
||||
any(flag not in options[optkey]
|
||||
any(flag not in options[optkey] and
|
||||
type(flag) not in options[optkey]
|
||||
for flag in conf[optkey])):
|
||||
raise YamlLintConfigError(
|
||||
('invalid config: option "%s" of "%s" should only '
|
||||
@@ -177,6 +178,12 @@ def validate_rule_conf(rule, conf):
|
||||
for optkey in options:
|
||||
if optkey not in conf:
|
||||
conf[optkey] = options_default[optkey]
|
||||
|
||||
if hasattr(rule, 'VALIDATE'):
|
||||
res = rule.VALIDATE(conf)
|
||||
if res:
|
||||
raise YamlLintConfigError('invalid config: %s: %s' %
|
||||
(rule.ID, res))
|
||||
else:
|
||||
raise YamlLintConfigError(('invalid config: rule "%s": should be '
|
||||
'either "enable", "disable" or a dict')
|
||||
|
||||
@@ -97,7 +97,9 @@ def check(conf, comment):
|
||||
comment.column_no == 1 and
|
||||
re.match(r'^!\S', comment.buffer[text_start:])):
|
||||
return
|
||||
elif comment.buffer[text_start] not in (' ', '\n', '\0'):
|
||||
# We can test for both \r and \r\n just by checking first char
|
||||
# \r itself is a valid newline on some older OS.
|
||||
elif comment.buffer[text_start] not in {' ', '\n', '\r', '\x00'}:
|
||||
column = comment.column_no + text_start - comment.pointer
|
||||
yield LintProblem(comment.line_no,
|
||||
column,
|
||||
|
||||
@@ -26,6 +26,11 @@ used.
|
||||
* ``required`` defines whether using quotes in string values is required
|
||||
(``true``, default) or not (``false``), or only allowed when really needed
|
||||
(``only-when-needed``).
|
||||
* ``extra-required`` is a list of PCRE regexes to force string values to be
|
||||
quoted, if they match any regex. This option can only be used with
|
||||
``required: false`` and ``required: only-when-needed``.
|
||||
* ``extra-allowed`` is a list of PCRE regexes to allow quoted string values,
|
||||
even if ``required: only-when-needed`` is set.
|
||||
|
||||
**Note**: Multi-line strings (with ``|`` or ``>``) will not be checked.
|
||||
|
||||
@@ -63,8 +68,44 @@ used.
|
||||
::
|
||||
|
||||
foo: 'bar'
|
||||
|
||||
#. With ``quoted-strings: {required: false, extra-required: [^http://,
|
||||
^ftp://]}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
- localhost
|
||||
- "localhost"
|
||||
- "http://localhost"
|
||||
- "ftp://localhost"
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
- http://localhost
|
||||
- ftp://localhost
|
||||
|
||||
#. With ``quoted-strings: {required: only-when-needed, extra-allowed:
|
||||
[^http://, ^ftp://], extra-required: [QUOTED]}``
|
||||
|
||||
the following code snippet would **PASS**:
|
||||
::
|
||||
|
||||
- localhost
|
||||
- "http://localhost"
|
||||
- "ftp://localhost"
|
||||
- "this is a string that needs to be QUOTED"
|
||||
|
||||
the following code snippet would **FAIL**:
|
||||
::
|
||||
|
||||
- "localhost"
|
||||
- this is a string that needs to be QUOTED
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
import yaml
|
||||
|
||||
from yamllint.linter import LintProblem
|
||||
@@ -72,9 +113,23 @@ from yamllint.linter import LintProblem
|
||||
ID = 'quoted-strings'
|
||||
TYPE = 'token'
|
||||
CONF = {'quote-type': ('any', 'single', 'double'),
|
||||
'required': (True, False, 'only-when-needed')}
|
||||
'required': (True, False, 'only-when-needed'),
|
||||
'extra-required': [str],
|
||||
'extra-allowed': [str]}
|
||||
DEFAULT = {'quote-type': 'any',
|
||||
'required': True}
|
||||
'required': True,
|
||||
'extra-required': [],
|
||||
'extra-allowed': []}
|
||||
|
||||
|
||||
def VALIDATE(conf):
|
||||
if conf['required'] is True and len(conf['extra-allowed']) > 0:
|
||||
return 'cannot use both "required: true" and "extra-allowed"'
|
||||
if conf['required'] is True and len(conf['extra-required']) > 0:
|
||||
return 'cannot use both "required: true" and "extra-required"'
|
||||
if conf['required'] is False and len(conf['extra-allowed']) > 0:
|
||||
return 'cannot use both "required: false" and "extra-allowed"'
|
||||
|
||||
|
||||
DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str'
|
||||
|
||||
@@ -125,36 +180,48 @@ def check(conf, token, prev, next, nextnext, context):
|
||||
return
|
||||
|
||||
quote_type = conf['quote-type']
|
||||
required = conf['required']
|
||||
|
||||
# Completely relaxed about quotes (same as the rule being disabled)
|
||||
if required is False and quote_type == 'any':
|
||||
return
|
||||
|
||||
msg = None
|
||||
if required is True:
|
||||
if conf['required'] is True:
|
||||
|
||||
# Quotes are mandatory and need to match config
|
||||
if token.style is None or not _quote_match(quote_type, token.style):
|
||||
msg = "string value is not quoted with %s quotes" % (quote_type)
|
||||
msg = "string value is not quoted with %s quotes" % quote_type
|
||||
|
||||
elif required is False:
|
||||
elif conf['required'] is False:
|
||||
|
||||
# Quotes are not mandatory but when used need to match config
|
||||
if token.style and not _quote_match(quote_type, token.style):
|
||||
msg = "string value is not quoted with %s quotes" % (quote_type)
|
||||
msg = "string value is not quoted with %s quotes" % quote_type
|
||||
|
||||
elif not token.plain:
|
||||
elif not token.style:
|
||||
is_extra_required = any(re.search(r, token.value)
|
||||
for r in conf['extra-required'])
|
||||
if is_extra_required:
|
||||
msg = "string value is not quoted"
|
||||
|
||||
# Quotes are disallowed when not needed
|
||||
if (tag == DEFAULT_SCALAR_TAG and token.value and
|
||||
elif conf['required'] == 'only-when-needed':
|
||||
|
||||
# Quotes are not strictly needed here
|
||||
if (token.style and tag == DEFAULT_SCALAR_TAG and token.value and
|
||||
not _quotes_are_needed(token.value)):
|
||||
msg = "string value is redundantly quoted with %s quotes" % (
|
||||
quote_type)
|
||||
is_extra_required = any(re.search(r, token.value)
|
||||
for r in conf['extra-required'])
|
||||
is_extra_allowed = any(re.search(r, token.value)
|
||||
for r in conf['extra-allowed'])
|
||||
if not (is_extra_required or is_extra_allowed):
|
||||
msg = "string value is redundantly quoted with %s quotes" % (
|
||||
quote_type)
|
||||
|
||||
# But when used need to match config
|
||||
elif token.style and not _quote_match(quote_type, token.style):
|
||||
msg = "string value is not quoted with %s quotes" % (quote_type)
|
||||
msg = "string value is not quoted with %s quotes" % quote_type
|
||||
|
||||
elif not token.style:
|
||||
is_extra_required = len(conf['extra-required']) and any(
|
||||
re.search(r, token.value) for r in conf['extra-required'])
|
||||
if is_extra_required:
|
||||
msg = "string value is not quoted"
|
||||
|
||||
if msg is not None:
|
||||
yield LintProblem(
|
||||
|
||||
Reference in New Issue
Block a user