From da3dab08734b3a778a81eff5035a9691a78a2c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez?= Date: Thu, 5 Dec 2024 23:46:49 -0300 Subject: [PATCH 1/3] Add support in docs for types defined with Python 3.12 type syntax --- manim/utils/docbuild/module_parsing.py | 33 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 57ac9a56aa..3cfe1fa748 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -158,27 +158,36 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict, TypeVarDict]: inner_nodes = [node] for node in inner_nodes: - # If we encounter an assignment annotated as "TypeAlias": - if ( + # Check if this node is a TypeAlias (type = ) + # or an AnnAssign annotated as TypeAlias (: TypeAlias = ). + is_annotated_assignment_with_value = ( type(node) is ast.AnnAssign and type(node.annotation) is ast.Name and node.annotation.id == "TypeAlias" and type(node.target) is ast.Name and node.value is not None - ): - alias_name = node.target.id - def_node = node.value - # If it's an Union, replace it with vertical bar notation + ) + if type(node) is ast.TypeAlias or is_annotated_assignment_with_value: + alias_name = ( + node.target.id + if is_annotated_assignment_with_value + else node.name.id + ) + definition_node = node.value + + # If the definition is an Union, replace with vertical bar notation. + # Instead of "Union[Type1, Type2]", we'll have "Type1 | Type2". if ( - type(def_node) is ast.Subscript - and type(def_node.value) is ast.Name - and def_node.value.id == "Union" + type(definition_node) is ast.Subscript + and type(definition_node.value) is ast.Name + and definition_node.value.id == "Union" ): + union_elements = definition_node.slice.elts definition = " | ".join( - ast.unparse(elem) for elem in def_node.slice.elts + ast.unparse(elem) for elem in union_elements ) else: - definition = ast.unparse(def_node) + definition = ast.unparse(definition_node) definition = definition.replace("npt.", "") if category_dict is None: @@ -188,7 +197,7 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict, TypeVarDict]: alias_info = category_dict[alias_name] continue - # Check if it is a typing.TypeVar + # Check if it is a typing.TypeVar ( = TypeVar(...)). elif ( type(node) is ast.Assign and type(node.targets[0]) is ast.Name From 9dd2c2e7620e978ade931c5ae0ab75c56fc34144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez?= Date: Fri, 6 Dec 2024 00:16:52 -0300 Subject: [PATCH 2/3] Check whether node is ast.TypeAlias only if version is at least 3.12 --- manim/utils/docbuild/module_parsing.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 3cfe1fa748..a11366f7fe 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -3,6 +3,7 @@ from __future__ import annotations import ast +import sys from pathlib import Path from typing_extensions import TypeAlias @@ -160,6 +161,9 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict, TypeVarDict]: for node in inner_nodes: # Check if this node is a TypeAlias (type = ) # or an AnnAssign annotated as TypeAlias (: TypeAlias = ). + is_type_alias = ( + sys.version_info >= (3, 12) and type(node) is ast.TypeAlias + ) is_annotated_assignment_with_value = ( type(node) is ast.AnnAssign and type(node.annotation) is ast.Name @@ -167,12 +171,8 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict, TypeVarDict]: and type(node.target) is ast.Name and node.value is not None ) - if type(node) is ast.TypeAlias or is_annotated_assignment_with_value: - alias_name = ( - node.target.id - if is_annotated_assignment_with_value - else node.name.id - ) + if is_type_alias or is_annotated_assignment_with_value: + alias_name = node.name.id if is_type_alias else node.target.id definition_node = node.value # If the definition is an Union, replace with vertical bar notation. From 7cc11f5a445b3765881d1db80fddd1d6654c6f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez?= Date: Fri, 6 Dec 2024 00:20:32 -0300 Subject: [PATCH 3/3] an Union -> a Union --- manim/utils/docbuild/module_parsing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index a11366f7fe..24e44be215 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -175,7 +175,7 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict, TypeVarDict]: alias_name = node.name.id if is_type_alias else node.target.id definition_node = node.value - # If the definition is an Union, replace with vertical bar notation. + # If the definition is a Union, replace with vertical bar notation. # Instead of "Union[Type1, Type2]", we'll have "Type1 | Type2". if ( type(definition_node) is ast.Subscript