diff --git a/tests/rules/test_truthy.py b/tests/rules/test_truthy.py index 949fdd4..b0402ed 100644 --- a/tests/rules/test_truthy.py +++ b/tests/rules/test_truthy.py @@ -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) diff --git a/yamllint/rules/truthy.py b/yamllint/rules/truthy.py index 23d69d6..8b541a7 100644 --- a/yamllint/rules/truthy.py +++ b/yamllint/rules/truthy.py @@ -15,7 +15,7 @@ # along with this program. If not, see . """ -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,