truthy: add check-keys option

This commit is contained in:
ilyam8 2020-04-04 23:44:55 +03:00 committed by Adrien Vergé
parent 542ae758f5
commit 6ce11dedb4
2 changed files with 51 additions and 2 deletions

View File

@ -114,3 +114,29 @@ class TruthyTestCase(RuleTestCase):
'boolean5: !!bool off\n' 'boolean5: !!bool off\n'
'boolean6: !!bool NO\n', 'boolean6: !!bool NO\n',
conf) conf)
def test_check_keys_disabled(self):
conf = ('truthy:\n'
' allowed-values: []\n'
' check-keys: false\n'
'key-duplicates: disable\n')
self.check('---\n'
'YES: 0\n'
'Yes: 0\n'
'yes: 0\n'
'No: 0\n'
'No: 0\n'
'no: 0\n'
'TRUE: 0\n'
'True: 0\n'
'true: 0\n'
'FALSE: 0\n'
'False: 0\n'
'false: 0\n'
'ON: 0\n'
'On: 0\n'
'on: 0\n'
'OFF: 0\n'
'Off: 0\n'
'off: 0\n',
conf)

View File

@ -30,6 +30,9 @@ This can be useful to prevent surprises from YAML parsers transforming
``'False'``, ``'false'``, ``'YES'``, ``'Yes'``, ``'yes'``, ``'NO'``, ``'False'``, ``'false'``, ``'YES'``, ``'Yes'``, ``'yes'``, ``'NO'``,
``'No'``, ``'no'``, ``'ON'``, ``'On'``, ``'on'``, ``'OFF'``, ``'Off'``, ``'No'``, ``'no'``, ``'ON'``, ``'On'``, ``'on'``, ``'OFF'``, ``'Off'``,
``'off'``. ``'off'``.
* ``check-keys`` disables verification for keys in mappings. By default,
``truthy`` rule applies to both keys and values. Set this option to ``false``
to prevent this.
.. rubric:: Examples .. rubric:: Examples
@ -92,6 +95,22 @@ This can be useful to prevent surprises from YAML parsers transforming
- false - false
- on - on
- off - off
#. With ``truthy: {check-keys: false}``
the following code snippet would **PASS**:
::
yes: 1
on: 2
true: 3
the following code snippet would **FAIL**:
::
yes: Yes
on: On
true: True
""" """
import yaml import yaml
@ -109,14 +128,18 @@ TRUTHY = ['YES', 'Yes', 'yes',
ID = 'truthy' ID = 'truthy'
TYPE = 'token' TYPE = 'token'
CONF = {'allowed-values': list(TRUTHY)} CONF = {'allowed-values': list(TRUTHY), 'check-keys': bool}
DEFAULT = {'allowed-values': ['true', 'false']} DEFAULT = {'allowed-values': ['true', 'false'], 'check-keys': True}
def check(conf, token, prev, next, nextnext, context): def check(conf, token, prev, next, nextnext, context):
if prev and isinstance(prev, yaml.tokens.TagToken): if prev and isinstance(prev, yaml.tokens.TagToken):
return return
if (not conf['check-keys'] and isinstance(prev, yaml.tokens.KeyToken) and
isinstance(token, yaml.tokens.ScalarToken)):
return
if isinstance(token, yaml.tokens.ScalarToken): if isinstance(token, yaml.tokens.ScalarToken):
if (token.value in (set(TRUTHY) - set(conf['allowed-values'])) and if (token.value in (set(TRUTHY) - set(conf['allowed-values'])) and
token.style is None): token.style is None):