diff --git a/tests/rules/test_quoted_strings.py b/tests/rules/test_quoted_strings.py index 0fdba71..5f148c0 100644 --- a/tests/rules/test_quoted_strings.py +++ b/tests/rules/test_quoted_strings.py @@ -344,3 +344,24 @@ class QuotedTestCase(RuleTestCase): ' "word 1\\\n' ' word 2"\n', conf, problem1=(9, 3)) + + def test_needed_extra_regex(self): + conf1 = 'quoted-strings: {quote-type: single, ' + \ + 'required: only-when-needed, ' + \ + 'needed-extra-regex: ""}\n' + + self.check('---\n' + 'string1: foo\n' + 'string2: \'foo\'\n' # fails + 'string3: \'%foo\'\n', # fails + conf1, problem1=(3, 10), problem2=(4, 10)) + + conf2 = 'quoted-strings: {quote-type: single, ' + \ + 'required: only-when-needed, ' + \ + 'needed-extra-regex: ^%.*$}\n' + + self.check('---\n' + 'string1: foo\n' + 'string2: \'foo\'\n' # fails + 'string3: \'%foo\'\n', + conf2, problem1=(3, 10)) diff --git a/yamllint/rules/quoted_strings.py b/yamllint/rules/quoted_strings.py index aaa635d..91c1623 100644 --- a/yamllint/rules/quoted_strings.py +++ b/yamllint/rules/quoted_strings.py @@ -65,6 +65,7 @@ used. foo: 'bar' """ +import re import yaml from yamllint.linter import LintProblem @@ -72,9 +73,11 @@ 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'), + 'needed-extra-regex': str} DEFAULT = {'quote-type': 'any', - 'required': True} + 'required': True, + 'needed-extra-regex': ''} DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' START_TOKENS = {'#', '*', '!', '?', '@', '`', '&', @@ -132,8 +135,11 @@ def check(conf, token, prev, next, nextnext, context): # Quotes are disallowed when not needed if (tag == DEFAULT_SCALAR_TAG and token.value and token.value[0] not in START_TOKENS): - msg = "string value is redundantly quoted with %s quotes" % ( - quote_type) + extra_regex = conf['needed-extra-regex'] + + if extra_regex == '' or not re.match(extra_regex, token.value): + 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):