feat(truthy): Allow explicit types

With this change, we don't require quotes for truthy values that are
explicitly typed. For instance, the following examples are all
considered valid:

    string1: !!str True
    string2: !!str yes
    string3: !!str off
    encoded: !!binary |
               True
               OFF
               pad==  # this decodes as 'N\xbb\x9e8Qii'
    boolean1: !!bool true
    boolean2: !!bool "false"
    boolean3: !!bool FALSE
    boolean4: !!bool True
    boolean5: !!bool off
    boolean6: !!bool NO
pull/24/head
Adrien Vergé 8 years ago
parent 073462a87d
commit 6dae8f5b6e

@ -30,24 +30,39 @@ class TruthyTestCase(RuleTestCase):
def test_enabled(self):
conf = 'truthy: enable\n'
self.check('---\n'
'1: True\n', conf, problem=(2, 4))
self.check('---\n'
'True: 1\n', conf, problem=(2, 1))
self.check('---\n'
'1: "True"\n', conf)
'1: True\n'
'True: 1\n',
conf, problem1=(2, 4), problem2=(3, 1))
self.check('---\n'
'1: "True"\n'
'"True": 1\n', conf)
self.check('---\n'
'[\n'
' true, false,\n'
' "false", "FALSE",\n'
' "true", "True",\n'
' True, FALSE,\n'
' on, OFF,\n'
' NO, Yes\n'
']\n', conf,
problem1=(6, 3), problem2=(6, 9),
problem3=(7, 3), problem4=(7, 7),
problem5=(8, 3), problem6=(8, 7))
def test_explicit_boolean(self):
def test_explicit_types(self):
conf = 'truthy: enable\n'
self.check('---\n'
'!!seq [\n'
' !!bool true, !!bool false,\n'
' !!bool "false", !!bool "FALSE",\n'
' !!bool "true", !!bool "True",\n'
' !!bool "false", !!bool "FALSE",\n'
']\n', conf)
self.check('---\n'
'!!seq [\n'
' !!bool true, !!bool True,\n'
']\n', conf, problem=(3, 23))
'string1: !!str True\n'
'string2: !!str yes\n'
'string3: !!str off\n'
'encoded: !!binary |\n'
' True\n'
' OFF\n'
' pad==\n' # this decodes as 'N\xbb\x9e8Qii'
'boolean1: !!bool true\n'
'boolean2: !!bool "false"\n'
'boolean3: !!bool FALSE\n'
'boolean4: !!bool True\n'
'boolean5: !!bool off\n'
'boolean6: !!bool NO\n',
conf)

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Use this rule to forbid truthy values that are not quoted.
Use this rule to forbid truthy values that are not quoted nor explicitly typed.
This would prevent YAML parsers to tranform ``[yes, FALSE, Off]`` into ``[true,
false, false]`` or ``{y: 1, yes: 2, on: 3, true: 4, True: 5}`` into ``{y: 1,
@ -37,6 +37,21 @@ true: 5}``.
"true": 3
"True": 4
explicit:
string1: !!str True
string2: !!str yes
string3: !!str off
encoded: !!binary |
True
OFF
pad== # this decodes as 'N\xbb\x9e8Qii'
boolean1: !!bool true
boolean2: !!bool "false"
boolean3: !!bool FALSE
boolean4: !!bool True
boolean5: !!bool off
boolean6: !!bool NO
the following code snippet would **FAIL**:
::
@ -68,6 +83,9 @@ TRUTHY = ['YES', 'Yes', 'yes',
def check(conf, token, prev, next, nextnext, context):
if prev and isinstance(prev, yaml.tokens.TagToken):
return
if isinstance(token, yaml.tokens.ScalarToken):
if token.value in TRUTHY and token.style is None:
yield LintProblem(token.start_mark.line + 1,

Loading…
Cancel
Save