Update buildbot_steps lint to handle env variables

https://github.com/servo/saltfs/pull/687 added support
for specifying environment variables in `buildbot_steps.yml`.
Update the servo-tidy buildbot_steps.yml linter to reflect this.

Use the voluptuous Python library (BSD 3-clause license) for validation
in lieu of a much larger hand-written implementation.
Update the tidy self tests to take into account the new error messages.
This commit is contained in:
Aneesh Agrawal 2017-06-05 15:59:09 -04:00
parent 753e2bc781
commit d0abd1cdfa
3 changed files with 24 additions and 12 deletions

View file

@ -15,6 +15,7 @@ pep8 == 1.5.7
pyflakes == 0.8.1 pyflakes == 0.8.1
# For buildbot checking # For buildbot checking
voluptuous == 0.10.5
PyYAML == 3.12 PyYAML == 3.12
# For test-webidl # For test-webidl

View file

@ -17,8 +17,10 @@ import re
import StringIO import StringIO
import subprocess import subprocess
import sys import sys
import colorama import colorama
import toml import toml
import voluptuous
import yaml import yaml
from licenseck import MPL, APACHE, COPYRIGHT, licenses_toml, licenses_dep_toml from licenseck import MPL, APACHE, COPYRIGHT, licenses_toml, licenses_dep_toml
@ -775,15 +777,24 @@ def duplicate_key_yaml_constructor(loader, node, deep=False):
def lint_buildbot_steps_yaml(mapping): def lint_buildbot_steps_yaml(mapping):
# Check for well-formedness of contents from voluptuous import Any, Extra, Required, Schema
# A well-formed buildbot_steps.yml should be a map to list of strings
for k in mapping.keys():
if not isinstance(mapping[k], list):
raise ValueError("Key '{}' maps to type '{}', but list expected".format(k, type(mapping[k]).__name__))
# check if value is a list of strings # Note: dictionary keys are optional by default in voluptuous
for item in itertools.ifilter(lambda i: not isinstance(i, str), mapping[k]): env = Schema({Extra: str})
raise ValueError("List mapped to '{}' contains non-string element".format(k)) commands = Schema([str])
schema = Schema({
'env': env,
Extra: Any(
commands,
{
'env': env,
Required('commands'): commands,
},
),
})
# Signals errors via exception throwing
schema(mapping)
class SafeYamlLoader(yaml.SafeLoader): class SafeYamlLoader(yaml.SafeLoader):
@ -811,8 +822,8 @@ def check_yaml(file_name, contents):
yield (line, e) yield (line, e)
except KeyError as e: except KeyError as e:
yield (None, "Duplicated Key ({})".format(e.message)) yield (None, "Duplicated Key ({})".format(e.message))
except ValueError as e: except voluptuous.MultipleInvalid as e:
yield (None, e.message) yield (None, str(e))
def check_for_possible_duplicate_json_keys(key_value_pairs): def check_for_possible_duplicate_json_keys(key_value_pairs):

View file

@ -210,12 +210,12 @@ class CheckTidiness(unittest.TestCase):
def test_non_list_mapped_buildbot_steps(self): def test_non_list_mapped_buildbot_steps(self):
errors = tidy.collect_errors_for_files(iterFile('non_list_mapping_buildbot_steps.yml'), [tidy.check_yaml], [], print_text=False) errors = tidy.collect_errors_for_files(iterFile('non_list_mapping_buildbot_steps.yml'), [tidy.check_yaml], [], print_text=False)
self.assertEqual("Key 'non-list-key' maps to type 'str', but list expected", errors.next()[2]) self.assertEqual("expected a list for dictionary value @ data['non-list-key']", errors.next()[2])
self.assertNoMoreErrors(errors) self.assertNoMoreErrors(errors)
def test_non_string_list_mapping_buildbot_steps(self): def test_non_string_list_mapping_buildbot_steps(self):
errors = tidy.collect_errors_for_files(iterFile('non_string_list_buildbot_steps.yml'), [tidy.check_yaml], [], print_text=False) errors = tidy.collect_errors_for_files(iterFile('non_string_list_buildbot_steps.yml'), [tidy.check_yaml], [], print_text=False)
self.assertEqual("List mapped to 'mapping_key' contains non-string element", errors.next()[2]) self.assertEqual("expected str @ data['mapping_key'][0]", errors.next()[2])
self.assertNoMoreErrors(errors) self.assertNoMoreErrors(errors)
def test_lock(self): def test_lock(self):