backport: bug 1970223 - python3.14 support

This commit is contained in:
Alex Kontos
2025-11-06 12:12:24 +00:00
parent a135615752
commit abee1a0b69
6 changed files with 22 additions and 21 deletions

View File

@@ -292,14 +292,14 @@ class DecoratorVisitor(ast.NodeVisitor):
kwarg_dict = {}
for name, arg in zip(["command", "subcommand"], decorator.args):
kwarg_dict[name] = arg.s
kwarg_dict[name] = arg.value
for keyword in decorator.keywords:
if keyword.arg not in relevant_kwargs:
# We only care about these 3 kwargs, so we can safely skip the rest
continue
kwarg_dict[keyword.arg] = getattr(keyword.value, "s", "")
kwarg_dict[keyword.arg] = keyword.value.value
command = kwarg_dict.pop("command")
self.results.setdefault(command, {})

View File

@@ -289,16 +289,14 @@ class CommandAction(argparse.Action):
group = parser.add_argument_group(title, description)
description = handler.description
group.add_argument(command, help=description, action="store_true")
group.add_argument(command, help=description)
if disabled_commands and "disabled" in r.categories:
title, description, _priority = r.categories["disabled"]
group = parser.add_argument_group(title, description)
if verbose:
for c in disabled_commands:
group.add_argument(
c["command"], help=c["description"], action="store_true"
)
group.add_argument(c["command"], help=c["description"])
parser.print_help()
@@ -405,9 +403,7 @@ class CommandAction(argparse.Action):
subhandlers,
key=by_decl_order if handler.order == "declaration" else by_name,
):
group.add_argument(
subcommand, help=subhandler.description, action="store_true"
)
group.add_argument(subcommand, help=subhandler.description)
if handler.docstring:
parser.description = format_docstring(handler.docstring)

View File

@@ -470,7 +470,7 @@ class TemplateFunction:
return c(
ast.Subscript(
value=c(ast.Name(id=self._global_name, ctx=ast.Load())),
slice=c(ast.Index(value=c(ast.Str(s=node.id)))),
slice=c(ast.Index(value=c(ast.Constant(value=node.id)))),
ctx=node.ctx,
)
)
@@ -1039,8 +1039,8 @@ class BuildReader:
else:
# Others
assert isinstance(target.slice, ast.Index)
assert isinstance(target.slice.value, ast.Str)
key = target.slice.value.s
assert isinstance(target.slice.value, ast.Constant)
key = target.slice.value.value
elif isinstance(target, ast.Attribute):
assert isinstance(target.attr, str)
key = target.attr
@@ -1051,11 +1051,11 @@ class BuildReader:
value = node.value
if isinstance(value, ast.List):
for v in value.elts:
assert isinstance(v, ast.Str)
yield v.s
assert isinstance(v, ast.Constant)
yield v.value
else:
assert isinstance(value, ast.Str)
yield value.s
assert isinstance(value, ast.Constant)
yield value.value
assignments = []

View File

@@ -327,15 +327,13 @@ def assignment_node_to_source_filename_list(code, node):
"""
if isinstance(node.value, ast.List) and "elts" in node.value._fields:
for f in node.value.elts:
if not isinstance(f, ast.Constant) and not isinstance(f, ast.Str):
if not isinstance(f, ast.Constant):
log(
"Found non-constant source file name in list: ",
ast_get_source_segment(code, f),
)
return []
return [
f.value if isinstance(f, ast.Constant) else f.s for f in node.value.elts
]
return [f.value for f in node.value.elts]
elif isinstance(node.value, ast.ListComp):
# SOURCES += [f for f in foo if blah]
log("Could not find the files for " + ast_get_source_segment(code, node.value))

View File

@@ -40,6 +40,10 @@ EXCLUDED_PACKAGES = {
# modified 'dummy' version of it so that the dependency checks still succeed, but
# if it ever is attempted to be used, it will fail gracefully.
"ansicon",
# jsonschema 4.17.3 is incompatible with Python 3.14+,
# but later versions use a dependency with Rust components, which we thus can't vendor.
# For now we apply the minimal patch to jsonschema to make it work again.
"jsonschema",
}

View File

@@ -875,8 +875,11 @@ class RefResolver:
return None
uri, fragment = urldefrag(url)
for subschema in subschemas:
id = subschema["$id"]
if not isinstance(id, str):
continue
target_uri = self._urljoin_cache(
self.resolution_scope, subschema["$id"],
self.resolution_scope, id,
)
if target_uri.rstrip("/") == uri.rstrip("/"):
if fragment: