Merge pull request #227 from juliangilbey/python3.13-test-fixes
Some checks failed
Build / lint (push) Has been cancelled
Build / test (false, 3.10) (push) Has been cancelled
Build / test (false, 3.11) (push) Has been cancelled
Build / test (false, 3.12) (push) Has been cancelled
Build / test (false, 3.13) (push) Has been cancelled
Build / test (false, 3.7) (push) Has been cancelled
Build / test (false, 3.8) (push) Has been cancelled
Build / test (false, 3.9) (push) Has been cancelled
Build / coverage (push) Has been cancelled

Fix tests so they work with Python 3.12/3.13
This commit is contained in:
Dave Halter
2024-11-22 19:52:17 +00:00
committed by GitHub
3 changed files with 75 additions and 23 deletions

View File

@@ -29,7 +29,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13']
experimental: [false] experimental: [false]
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View File

@@ -29,7 +29,6 @@ FAILING_EXAMPLES = [
'from foo import a,', 'from foo import a,',
'from __future__ import whatever', 'from __future__ import whatever',
'from __future__ import braces', 'from __future__ import braces',
'from .__future__ import whatever',
'def f(x=3, y): pass', 'def f(x=3, y): pass',
'lambda x=3, y: x', 'lambda x=3, y: x',
'__debug__ = 1', '__debug__ = 1',
@@ -216,7 +215,6 @@ FAILING_EXAMPLES = [
'f"{\'\\\'}"', 'f"{\'\\\'}"',
'f"{#}"', 'f"{#}"',
"f'{1!b}'", "f'{1!b}'",
"f'{1:{5:{3}}}'",
"f'{'", "f'{'",
"f'{'", "f'{'",
"f'}'", "f'}'",
@@ -227,8 +225,6 @@ FAILING_EXAMPLES = [
"f'{1;1}'", "f'{1;1}'",
"f'{a;}'", "f'{a;}'",
"f'{b\"\" \"\"}'", "f'{b\"\" \"\"}'",
# f-string expression part cannot include a backslash
r'''f"{'\n'}"''',
'async def foo():\n yield x\n return 1', 'async def foo():\n yield x\n return 1',
'async def foo():\n yield x\n return 1', 'async def foo():\n yield x\n return 1',
@@ -413,3 +409,17 @@ if sys.version_info[:2] >= (3, 8):
FAILING_EXAMPLES += [ FAILING_EXAMPLES += [
"f'{1=!b}'", "f'{1=!b}'",
] ]
if sys.version_info[:2] < (3, 12):
FAILING_EXAMPLES += [
# f-string expression part cannot include a backslash before 3.12
r'''f"{'\n'}"''',
# this compiles successfully but fails when evaluated in 3.12
"f'{1:{5:{3}}}'",
]
if sys.version_info[:2] < (3, 13):
# this compiles successfully but fails when evaluated in 3.13
FAILING_EXAMPLES += [
'from .__future__ import whatever',
]

View File

@@ -118,25 +118,57 @@ def _get_actual_exception(code):
assert False, "The piece of code should raise an exception." assert False, "The piece of code should raise an exception."
# SyntaxError # SyntaxError
if wanted == 'SyntaxError: assignment to keyword': # Some errors have changed error message in later versions of Python,
# and we give a translation table here. We deal with special cases
# below.
translations = {
'SyntaxError: f-string: unterminated string':
'SyntaxError: EOL while scanning string literal',
"SyntaxError: f-string: expecting '}'":
'SyntaxError: EOL while scanning string literal',
'SyntaxError: f-string: empty expression not allowed':
'SyntaxError: invalid syntax',
"SyntaxError: f-string expression part cannot include '#'":
'SyntaxError: invalid syntax',
"SyntaxError: f-string: single '}' is not allowed":
'SyntaxError: invalid syntax',
'SyntaxError: cannot use starred expression here':
"SyntaxError: can't use starred expression here",
'SyntaxError: f-string: cannot use starred expression here':
"SyntaxError: f-string: can't use starred expression here",
'SyntaxError: unterminated string literal':
'SyntaxError: EOL while scanning string literal',
'SyntaxError: parameter without a default follows parameter with a default':
'SyntaxError: non-default argument follows default argument',
"SyntaxError: 'yield from' outside function":
"SyntaxError: 'yield' outside function",
"SyntaxError: f-string: valid expression required before '}'":
'SyntaxError: invalid syntax',
"SyntaxError: '{' was never closed":
'SyntaxError: invalid syntax',
"SyntaxError: f-string: invalid conversion character 'b': expected 's', 'r', or 'a'":
"SyntaxError: f-string: invalid conversion character: expected 's', 'r', or 'a'",
"SyntaxError: (value error) Invalid format specifier ' 5' for object of type 'int'":
'SyntaxError: f-string: expressions nested too deeply',
"SyntaxError: f-string: expecting a valid expression after '{'":
'SyntaxError: f-string: invalid syntax',
"SyntaxError: f-string: expecting '=', or '!', or ':', or '}'":
'SyntaxError: f-string: invalid syntax',
"SyntaxError: f-string: expecting '=', or '!', or ':', or '}'":
'SyntaxError: f-string: invalid syntax',
}
if wanted in translations:
wanted = translations[wanted]
elif wanted == 'SyntaxError: assignment to keyword':
return [wanted, "SyntaxError: can't assign to keyword", return [wanted, "SyntaxError: can't assign to keyword",
'SyntaxError: cannot assign to __debug__'], line_nr 'SyntaxError: cannot assign to __debug__'], line_nr
elif wanted == 'SyntaxError: f-string: unterminated string':
wanted = 'SyntaxError: EOL while scanning string literal'
elif wanted == 'SyntaxError: f-string expression part cannot include a backslash': elif wanted == 'SyntaxError: f-string expression part cannot include a backslash':
return [ return [
wanted, wanted,
"SyntaxError: EOL while scanning string literal", "SyntaxError: EOL while scanning string literal",
"SyntaxError: unexpected character after line continuation character", "SyntaxError: unexpected character after line continuation character",
], line_nr ], line_nr
elif wanted == "SyntaxError: f-string: expecting '}'":
wanted = 'SyntaxError: EOL while scanning string literal'
elif wanted == 'SyntaxError: f-string: empty expression not allowed':
wanted = 'SyntaxError: invalid syntax'
elif wanted == "SyntaxError: f-string expression part cannot include '#'":
wanted = 'SyntaxError: invalid syntax'
elif wanted == "SyntaxError: f-string: single '}' is not allowed":
wanted = 'SyntaxError: invalid syntax'
elif "Maybe you meant '==' instead of '='?" in wanted: elif "Maybe you meant '==' instead of '='?" in wanted:
wanted = wanted.removesuffix(" here. Maybe you meant '==' instead of '='?") wanted = wanted.removesuffix(" here. Maybe you meant '==' instead of '='?")
elif re.match( elif re.match(
@@ -148,18 +180,28 @@ def _get_actual_exception(code):
wanted, wanted,
): ):
wanted = 'SyntaxError: EOF while scanning triple-quoted string literal' wanted = 'SyntaxError: EOF while scanning triple-quoted string literal'
elif wanted == 'SyntaxError: cannot use starred expression here':
wanted = "SyntaxError: can't use starred expression here"
elif wanted == 'SyntaxError: f-string: cannot use starred expression here':
wanted = "SyntaxError: f-string: can't use starred expression here"
elif re.match( elif re.match(
r"IndentationError: expected an indented block after '[^']*' statement on line \d", r"IndentationError: expected an indented block after '[^']*' statement on line \d",
wanted, wanted,
): ):
wanted = 'IndentationError: expected an indented block' wanted = 'IndentationError: expected an indented block'
elif wanted == 'SyntaxError: unterminated string literal': # The following two errors are produced for both some f-strings and
wanted = 'SyntaxError: EOL while scanning string literal' # some non-f-strings in Python 3.13:
return [wanted], line_nr elif wanted == "SyntaxError: can't use starred expression here":
wanted = [
"SyntaxError: can't use starred expression here",
"SyntaxError: f-string: can't use starred expression here"
]
elif wanted == 'SyntaxError: cannot mix bytes and nonbytes literals':
wanted = [
'SyntaxError: cannot mix bytes and nonbytes literals',
'SyntaxError: f-string: cannot mix bytes and nonbytes literals'
]
if isinstance(wanted, list):
return wanted, line_nr
else:
return [wanted], line_nr
def test_default_except_error_postition(): def test_default_except_error_postition():