Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type annotation work in manim/mobject/geometry/ #3961

Open
wants to merge 13 commits into
base: main
Choose a base branch
from

Conversation

henrikmidtiby
Copy link

Overview: What does this pull request change?

The pull request is meant as a first step towards getting the automatic type annotations (mypy) to work on the codebase.

Motivation and Explanation: Why and how do your changes improve the library?

I found this issue listed as as "good first issue"
#2121

This lead to this issue
#3375

Further Information and Comments

The main issue that I am struggling with at the moment, are type errors like the one listed below

manim/mobject/geometry/arc.py:180: error: Unsupported left operand type for - ("tuple[float, float, float]")  [operator]
manim/mobject/geometry/arc.py:180: note: Both left and right operands are unions

The issue is that mypy do not think that two Point3D objects can be subtracted from each other.
This operation is performed in multiple locations of the codebase, e.g. line 180 in arc.py

angles = cartesian_to_spherical(handle - anchor)

Reviewer Checklist

  • The PR title is descriptive enough for the changelog, and the PR is labeled correctly
  • If applicable: newly added non-private functions and classes have a docstring including a short summary and a PARAMETERS section
  • If applicable: newly added functions and classes are tested

The following four errors are removed with the commit.
manim/mobject/geometry/labeled.py:63: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/labeled.py:70: error: Incompatible default for argument "frame_fill_color" (default has type "None", argument has type "ManimColor | int | str | tuple[int, int, int] | tuple[float, float, float] | <6 more items>")  [assignment]
manim/mobject/geometry/labeled.py:82: error: Incompatible types in assignment (expression has type "MathTex | Text", variable has type "MathTex")  [assignment]
manim/mobject/geometry/labeled.py:150: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
The following errors are removed with the commit.
manim/mobject/geometry/tips.py:115: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:208: error: Function is missing a type annotation  [no-untyped-def]
manim/mobject/geometry/tips.py:232: error: Function is missing a return type annotation  [no-untyped-def]
manim/mobject/geometry/tips.py:245: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:273: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:282: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:301: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:310: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/tips.py:333: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]

The following errors are still present:
manim/mobject/geometry/tips.py:167: error: Unsupported left operand type for - ("tuple[float, float, float]")  [operator]
manim/mobject/geometry/tips.py:167: note: Both left and right operands are unions
manim/mobject/geometry/tips.py:230: error: Argument 1 to "scale" of "Mobject" has incompatible type "floating[Any]"; expected "float"  [arg-type]
@JasonGrace2282
Copy link
Member

Hey thanks for helping out with the typing!

The issue is that mypy do not think that two Point3D objects can be subtracted from each other.

Most likely, you shouldn't be using the Point3D hint, but rather the InternalPoint3D type hint which only includes numpy arrays :)

@henrikmidtiby
Copy link
Author

Thanks for the tip about InternalPoint3D.
It enabled me to reduce the number of errors reported by mypy in the mobject directory to 1707.
For reference my first run of mypy yesterday listed 1921 errors.

My plan is to focus on getting rid of most of these errors:

  • Function is missing a type annotation for one or more arguments
  • Function is missing a return type annotation
  • Function is missing a type annotation

Now the type of errors reported by mypy for the files in mobject/geometry looks like shown below.
This seems more difficult to handle. Any ideas of how to proceed?

$ mypy | egrep "(mobject/geometry/|Found)"
manim/mobject/geometry/tips.py:152: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]]"  [no-any-return]
manim/mobject/geometry/tips.py:233: error: Argument 1 to "scale" of "Mobject" has incompatible type "floating[Any]"; expected "float"  [arg-type]
manim/mobject/geometry/shape_matchers.py:116: error: Signature of "set_style" incompatible with supertype "VMobject"  [override]
manim/mobject/geometry/shape_matchers.py:116: note:      Superclass:
manim/mobject/geometry/shape_matchers.py:116: note:          def set_style(self, fill_color: ManimColor | int | str | tuple[int, int, int] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | ndarray[Any, dtype[signedinteger[_64Bit]]] | ndarray[Any, dtype[floating[_64Bit]]] | None = ..., fill_opacity: float | None = ..., stroke_color: ManimColor | int | str | tuple[int, int, int] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | ndarray[Any, dtype[signedinteger[_64Bit]]] | ndarray[Any, dtype[floating[_64Bit]]] | None = ..., stroke_width: float | None = ..., stroke_opacity: float | None = ..., background_stroke_color: ManimColor | int | str | tuple[int, int, int] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | ndarray[Any, dtype[signedinteger[_64Bit]]] | ndarray[Any, dtype[floating[_64Bit]]] | None = ..., background_stroke_width: float | None = ..., background_stroke_opacity: float | None = ..., sheen_factor: float | None = ..., sheen_direction: ndarray[Any, dtype[floating[_64Bit]]] | None = ..., background_image: Image | str | None = ..., family: bool = ...) -> BackgroundRectangle
manim/mobject/geometry/shape_matchers.py:116: note:      Subclass:
manim/mobject/geometry/shape_matchers.py:116: note:          def set_style(self, fill_opacity: float, **kwargs: Any) -> BackgroundRectangle
manim/mobject/geometry/shape_matchers.py:133: error: Returning Any from function declared to return "ManimColor"  [no-any-return]
manim/mobject/geometry/shape_matchers.py:133: error: Cannot determine type of "color"  [has-type]
manim/mobject/geometry/polygram.py:90: error: Incompatible types in assignment (expression has type "list[Any]", variable has type "ndarray[Any, dtype[floating[_64Bit]]]")  [assignment]
manim/mobject/geometry/polygram.py:117: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/polygram.py:119: error: "ndarray" expects 2 type arguments, but 1 given  [type-arg]
manim/mobject/geometry/polygram.py:218: error: Need type annotation for "new_points" (hint: "new_points: list[<type>] = ...")  [var-annotated]
manim/mobject/geometry/polygram.py:287: error: Argument 1 to "set_points" of "VMobject" has incompatible type "list[Any]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...]"  [arg-type]
manim/mobject/geometry/polygram.py:323: error: Argument 1 to "__init__" of "Polygram" has incompatible type "tuple[ndarray[Any, dtype[floating[_64Bit]]], ...]"; expected "ndarray[Any, dtype[floating[_64Bit]]]"  [arg-type]
manim/mobject/geometry/polygram.py:414: error: Argument 1 to "__init__" of "Polygram" has incompatible type "*list[list[Any]]"; expected "ndarray[Any, dtype[floating[_64Bit]]]"  [arg-type]
manim/mobject/geometry/polygram.py:699: error: Incompatible return value type (got "floating[Any]", expected "float")  [return-value]
manim/mobject/geometry/polygram.py:778: error: Argument 1 to "force_direction" of "VMobject" has incompatible type "str"; expected "Literal['CW', 'CCW']"  [arg-type]
manim/mobject/geometry/line.py:101: error: Return value expected  [return-value]
manim/mobject/geometry/line.py:105: error: Unsupported operand types for > ("float" and "object")  [operator]
manim/mobject/geometry/line.py:106: error: Return value expected  [return-value]
manim/mobject/geometry/line.py:107: error: Unsupported operand types for / ("float" and "object")  [operator]
manim/mobject/geometry/line.py:144: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/line.py:146: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/line.py:154: error: Argument 1 of "put_start_and_end_on" is incompatible with supertype "Mobject"; supertype defines the argument type as "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"  [override]
manim/mobject/geometry/line.py:154: note: This violates the Liskov substitution principle
manim/mobject/geometry/line.py:154: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
manim/mobject/geometry/line.py:154: error: Argument 2 of "put_start_and_end_on" is incompatible with supertype "Mobject"; supertype defines the argument type as "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"  [override]
manim/mobject/geometry/line.py:206: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]]"  [no-any-return]
manim/mobject/geometry/line.py:209: error: Returning Any from function declared to return "float"  [no-any-return]
manim/mobject/geometry/line.py:223: error: Argument 1 to "scale" of "Mobject" has incompatible type "floating[Any]"; expected "float"  [arg-type]
manim/mobject/geometry/line.py:305: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/line.py:320: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/line.py:334: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]]"  [no-any-return]
manim/mobject/geometry/line.py:346: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]]"  [no-any-return]
manim/mobject/geometry/line.py:398: error: Argument 1 to "scale" of "Mobject" has incompatible type "floating[Any]"; expected "float"  [arg-type]
manim/mobject/geometry/line.py:539: error: "__init__" of "Line" gets multiple values for keyword argument "buff"  [misc]
manim/mobject/geometry/line.py:546: error: Signature of "scale" incompatible with supertype "Mobject"  [override]
manim/mobject/geometry/line.py:546: note:      Superclass:
manim/mobject/geometry/line.py:546: note:          def scale(self, scale_factor: float, **kwargs: Any) -> Arrow
manim/mobject/geometry/line.py:546: note:      Subclass:
manim/mobject/geometry/line.py:546: note:          def scale(self, factor: float, scale_tips: bool = ..., **kwargs: Any) -> Arrow
manim/mobject/geometry/line.py:626: error: Incompatible return value type (got "SupportsDunderLT[Any] | SupportsDunderGT[Any]", expected "float")  [return-value]
manim/mobject/geometry/line.py:632: error: Unexpected keyword argument "recurse" for "set_stroke" of "VMobject"  [call-arg]
manim/mobject/geometry/line.py:63: error: Argument "path_arc" to "set_points_by_ends" of "Line" has incompatible type "float | None"; expected "float"  [arg-type]
manim/mobject/geometry/line.py:90: error: Argument "angle" to "ArcBetweenPoints" has incompatible type "float | None"; expected "float"  [arg-type]
manim/mobject/geometry/line.py:93: error: Argument 1 to "set_points_as_corners" of "VMobject" has incompatible type "list[ndarray[Any, dtype[floating[_64Bit]]]]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...]"  [arg-type]
manim/mobject/geometry/line.py:607: error: Unsupported left operand type for - ("tuple[float, float, float]")  [operator]
manim/mobject/geometry/line.py:607: note: Both left and right operands are unions
manim/mobject/geometry/line.py:633: error: Argument "width" to "set_stroke" of "VMobject" has incompatible type "SupportsDunderLT[Any] | SupportsDunderGT[Any]"; expected "float | None"  [arg-type]
manim/mobject/geometry/line.py:638: error: Argument "width" to "set_stroke" of "VMobject" has incompatible type "SupportsDunderLT[Any] | SupportsDunderGT[Any]"; expected "float | None"  [arg-type]
manim/mobject/geometry/line.py:983: error: Incompatible types in assignment (expression has type "Arc", variable has type "Elbow")  [assignment]
manim/mobject/geometry/boolean_ops.py:8: error: Skipping analyzing "pathops": module is installed, but missing library stubs or py.typed marker  [import-untyped]
manim/mobject/geometry/boolean_ops.py:8: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
manim/mobject/geometry/boolean_ops.py:56: error: Incompatible types in assignment (expression has type "list[Any]", variable has type "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float], ...]")  [assignment]
manim/mobject/geometry/boolean_ops.py:59: error: Unsupported target for indexed assignment ("ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float], ...]")  [index]
manim/mobject/geometry/boolean_ops.py:60: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float], ...]", expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...]")  [return-value]
manim/mobject/geometry/boolean_ops.py:98: error: Incompatible types in assignment (expression has type "Generator[ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...], None, None]", variable has type "list[ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ...]]")  [assignment]
manim/mobject/geometry/boolean_ops.py:106: error: Argument 1 to "consider_points_equals_2d" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:106: error: Argument 2 to "consider_points_equals_2d" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:130: error: Incompatible types in assignment (expression has type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", variable has type "ndarray[Any, dtype[Any]]")  [assignment]
manim/mobject/geometry/boolean_ops.py:135: error: Argument 1 to "add_cubic_bezier_curve_to" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:135: error: Argument 2 to "add_cubic_bezier_curve_to" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:135: error: Argument 3 to "add_cubic_bezier_curve_to" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:143: error: Argument 1 to "add_quadratic_bezier_curve_to" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:143: error: Argument 2 to "add_quadratic_bezier_curve_to" of "VMobject" has incompatible type "Any | ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float], ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]]"  [arg-type]
manim/mobject/geometry/boolean_ops.py:180: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/boolean_ops.py:219: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/boolean_ops.py:261: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/boolean_ops.py:314: error: Function is missing a type annotation for one or more arguments  [no-untyped-def]
manim/mobject/geometry/arc.py:186: error: Argument 1 to "cartesian_to_spherical" has incompatible type "ndarray[Any, dtype[floating[Any]]]"; expected "Sequence[float]"  [arg-type]
manim/mobject/geometry/arc.py:265: error: Returning Any from function declared to return "VMobject"  [no-any-return]
manim/mobject/geometry/arc.py:271: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"  [no-any-return]
manim/mobject/geometry/arc.py:274: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"  [no-any-return]
manim/mobject/geometry/arc.py:278: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/arc.py:280: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/arc.py:284: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/arc.py:286: error: Incompatible return value type (got "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]", expected "ndarray[Any, dtype[floating[_64Bit]]]")  [return-value]
manim/mobject/geometry/arc.py:330: error: Argument 1 to "shift" of "Mobject" has incompatible type "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]]"  [arg-type]
manim/mobject/geometry/arc.py:344: error: Argument 1 to "shift" of "Mobject" has incompatible type "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]]"  [arg-type]
manim/mobject/geometry/arc.py:479: error: Incompatible types in assignment (expression has type "floating[Any]", variable has type "float")  [assignment]
manim/mobject/geometry/arc.py:652: error: Argument 1 to "perpendicular_bisector" has incompatible type "ndarray[Any, dtype[Any]]"; expected "Sequence[ndarray[Any, Any]]"  [arg-type]
manim/mobject/geometry/arc.py:653: error: Argument 1 to "perpendicular_bisector" has incompatible type "ndarray[Any, dtype[Any]]"; expected "Sequence[ndarray[Any, Any]]"  [arg-type]
manim/mobject/geometry/arc.py:656: error: Argument "radius" to "Circle" has incompatible type "floating[Any]"; expected "float | None"  [arg-type]
manim/mobject/geometry/arc.py:774: error: Incompatible types in assignment (expression has type "SingleStringMathTex | Text", variable has type "MathTex")  [assignment]
manim/mobject/geometry/arc.py:964: error: Incompatible types in assignment (expression has type "float | None", variable has type "float")  [assignment]
manim/mobject/geometry/arc.py:970: error: Argument 1 to "shift" of "Mobject" has incompatible type "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]]"  [arg-type]
manim/mobject/geometry/arc.py:1109: error: Incompatible types in assignment (expression has type "list[dict[Any, Any]]", variable has type "repeat[dict[str, float]]")  [assignment]
manim/mobject/geometry/arc.py:1112: error: Argument 2 to "ArcBetweenPoints" has incompatible type "**dict[str, float]"; expected "ndarray[Any, dtype[floating[_64Bit]]] | tuple[float, float, float]"  [arg-type]
Found 1707 errors in 40 files (checked 163 source files)

@JasonGrace2282
Copy link
Member

JasonGrace2282 commented Oct 19, 2024

A lot of those are quite difficult (mostly because Manim was not designed with typing in mind!)

I would just # type: ignore a lot of the ones are related to the Liskov substitution principle or mismatches between parent and child classes.

For ones about returning Any, you might have to track down why it thinks the return value is `Any.

If it's being annoying about numpy arrays being a Sequence you can type ignore that. If you have like "list[...] expected NDArray[...]" I might try using np.asarray(...) to get it to fit properly.

If you need any more help or the PR is ready to review feel free to tag me :)

P.S. this might be useful https://docs.manim.community/en/latest/contributing/docs/types.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: 🆕 New
Development

Successfully merging this pull request may close these issues.

2 participants