Update ansible-test compile sanity test.
The test has been rewritten to improve error handling and add support for Python 3.10.
This commit is contained in:
parent
35ff4ea95b
commit
c2e15f45a6
2 changed files with 31 additions and 23 deletions
2
changelogs/fragments/ansible-test-sanity-compile.yml
Normal file
2
changelogs/fragments/ansible-test-sanity-compile.yml
Normal file
|
@ -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():
|
def main():
|
||||||
status = 0
|
|
||||||
|
|
||||||
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()
|
||||||
source = source_fd.read().decode('utf-8')
|
|
||||||
else:
|
|
||||||
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…
Reference in a new issue