Update ansible-test compile sanity test.

The test has been rewritten to improve error handling and add support for Python 3.10.
pull/74605/head
Matt Clay 4 years ago
parent 35ff4ea95b
commit c2e15f45a6

@ -0,0 +1,2 @@
minor_changes:
- ansible-test - Rewrite the ``compile`` sanity test to improve error handling and support Python 3.10.

@ -3,38 +3,44 @@
from __future__ import (absolute_import, division, print_function) from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import warnings
with warnings.catch_warnings():
# The parser module is deprecated as of Python 3.9.
# This implementation will need to be updated to use another solution.
# Until then, disable the deprecation warnings to prevent test failures.
warnings.simplefilter('ignore', DeprecationWarning)
import parser
import sys import sys
ENCODING = 'utf-8'
ERRORS = 'replace'
Text = type(u'')
def main():
status = 0
def main():
for path in sys.argv[1:] or sys.stdin.read().splitlines(): for path in sys.argv[1:] or sys.stdin.read().splitlines():
with open(path, 'rb') as source_fd: with open(path, 'rb') as source_fd:
if sys.version_info[0] == 3:
source = source_fd.read().decode('utf-8')
else:
source = source_fd.read() source = source_fd.read()
try: try:
parser.suite(source) compile(source, path, 'exec', dont_inherit=True)
except SyntaxError: except SyntaxError as ex:
ex = sys.exc_info()[1] extype, message, lineno, offset = type(ex), ex.text, ex.lineno, ex.offset
status = 1 except BaseException as ex: # pylint: disable=broad-except
message = ex.text.splitlines()[0].strip() extype, message, lineno, offset = type(ex), str(ex), 0, 0
sys.stdout.write("%s:%d:%d: SyntaxError: %s\n" % (path, ex.lineno, ex.offset, message)) else:
sys.stdout.flush() continue
sys.exit(status) result = "%s:%d:%d: %s: %s" % (path, lineno, offset, extype.__name__, safe_message(message))
if sys.version_info <= (3,):
result = result.encode(ENCODING, ERRORS)
print(result)
def safe_message(value):
"""Given an input value as text or bytes, return the first non-empty line as text, ensuring it can be round-tripped as UTF-8."""
if isinstance(value, Text):
value = value.encode(ENCODING, ERRORS)
value = value.decode(ENCODING, ERRORS)
value = value.strip().splitlines()[0].strip()
return value
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save