From 93e4cbcf404d6f6b631bb29e184cbe2fb5d5f957 Mon Sep 17 00:00:00 2001 From: chopan Date: Fri, 1 Dec 2023 21:52:21 +0100 Subject: [PATCH 01/30] Updated manim.typing and included TypeAliases in docs.source.conf --- docs/source/conf.py | 2 + manim/typing.py | 216 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 170 insertions(+), 48 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 8e0ce1b02e..1226e6fd0d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,6 +11,7 @@ from pathlib import Path import manim +from manim.typing import manim_type_aliases # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, @@ -55,6 +56,7 @@ # generate documentation from type hints autodoc_typehints = "description" +autodoc_type_aliases = {t: t for t in manim_type_aliases} autoclass_content = "both" # controls whether functions documented by the autofunction directive diff --git a/manim/typing.py b/manim/typing.py index 495f199758..b00d865423 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -7,10 +7,71 @@ import numpy.typing as npt from typing_extensions import TypeAlias -# Color Types +manim_type_aliases = [ + # Primitive Data Types + "ManimFloat", + "ManimInt", + # Color Types + "ManimColorDType", + "RGB_Array_Float", + "RGB_Tuple_Float", + "RGB_Array_Int", + "RGB_Tuple_Int", + "RGBA_Array_Float", + "RGBA_Tuple_Float", + "RGBA_Array_Int", + "RGBA_Tuple_Int", + "HSV_Array_Float", + "HSV_Tuple_Float", + "ManimColorInternal", + # Point Types + "PointDType", + "InternalPoint2D", + "Point2D", + "InternalPoint2D_Array", + "Point2D_Array", + "InternalPoint3D", + "Point3D", + "InternalPoint3D_Array", + "Point3D_Array", + # Bezier Types + "QuadraticBezierPoints", + "QuadraticBezierPoints_Array", + "QuadraticBezierPath", + "QuadraticSpline", + "CubicBezierPoints", + "CubicBezierPoints_Array", + "CubicBezierPath", + "CubicSpline", + "BezierPoints", + "BezierPoints_Array", + "BezierPath", + "Spline", + "FlatBezierPoints", + # Vector Types + "Vector2", + "Vector3", + "Vector", + "RowVector", + "ColVector", + "MatrixMN", + "Zeros", + # Function Types + "FunctionOverride", + "PathFuncType", + "MappingFunction", + # Image Types + "Image", + # Path Types + "StrPath", + "StrOrBytesPath", +] +# Primitive Data Types ManimFloat: TypeAlias = np.float64 ManimInt: TypeAlias = np.int64 + +# Color Types ManimColorDType: TypeAlias = ManimFloat RGB_Array_Float: TypeAlias = npt.NDArray[ManimFloat] @@ -37,97 +98,156 @@ InternalPoint2D: TypeAlias = npt.NDArray[PointDType] """ `shape: (2,)` A 2D point. `[float, float]`. -This type alias is mostly made available for internal use and only includes the numpy type. +This type alias is mostly made available for internal use and only includes the NumPy type. """ Point2D: TypeAlias = Union[InternalPoint2D, Tuple[float, float]] """ `shape: (2,)` A 2D point. `[float, float]`. """ +InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] +""" `shape: (N,3)` An array of Point2D: `[[float, float], ...]`. +This type alias is mostly made available for internal use and only includes the NumPy type. +""" + +Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, Tuple[Tuple[float, float], ...]] +""" `shape: (N,2)` An array of Point2D objects: `[[float, float], ...]`. +(Please refer to the documentation of the function you are using for further type information.) +""" + InternalPoint3D: TypeAlias = npt.NDArray[PointDType] """ `shape: (3,)` A 3D point. `[float, float, float]`. -This type alias is mostly made available for internal use and only includes the numpy type. +This type alias is mostly made available for internal use and only includes the NumPy type. """ Point3D: TypeAlias = Union[InternalPoint3D, Tuple[float, float, float]] """ `shape: (3,)` A 3D point. `[float, float, float]` """ -# Bezier Types -QuadraticBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,3)` An Array of Quadratic Bezier Handles `[[float, float, float], [float, float, float], [float, float, float]]`. """ - -QuadraticBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3,3)` An Array of Quadratic Bezier Handles `[[[float, float, float], [float, float, float], [float, float, float]], ...]`. """ - -CubicBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (4,3)` An Array of Cubic Bezier Handles `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]`. """ - -BezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3)` An Array of Cubic Bezier Handles `[[float, float, float], ...]`. -`N` Is always multiples of the degree of the Bezier curve. -(Please refer to the documentation of the function you are using for further type Information) -""" - -FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N)` An Array of Bezier Handles but flattened `[float, ...]`.""" - -Point2D_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,2)` An Array of Points in 2D Space `[[float, float], ...]`. - -(Please refer to the documentation of the function you are using for further type Information) -""" - InternalPoint3D_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3)` An Array of Points in 3D Space `[[float, float, float], ...]`. -This type alias is mostly made available for internal use and only includes the numpy type. +""" `shape: (N,3)` An array of Point3D objects: `[[float, float, float], ...]`. +This type alias is mostly made available for internal use and only includes the NumPy type. """ Point3D_Array: TypeAlias = Union[ InternalPoint3D_Array, Tuple[Tuple[float, float, float], ...] ] -""" `shape: (N,3)` An Array of Points in 3D Space `[[float, float, float], ...]`. - -(Please refer to the documentation of the function you are using for further type Information) -""" +""" `shape: (N,3)` An array of Point3D objects: `[[float, float, float], ...]`. -BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,PPC,3)` An Array of Bezier Handles `[[[float, float, float], ...], ...]`. -`PPC` Is the number of points per bezier curve. `N` Is the number of bezier curves. (Please refer to the documentation of the function you are using for further type Information) """ # Vector Types + Vector3: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,)` A Vector `[float, float, float]`. """ +""" `shape: (3,)` A vector `[float, float, float]`. """ Vector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,)` A Vector `[float, ...]`. """ +""" `shape: (N,)` A vector `[float, ...]`. """ RowVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (1,N)` A Row Vector `[[float, ...]]`. """ +""" `shape: (1,N)` A row vector `[[float, ...]]`. """ ColVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,1)` A Column Vector `[[float], [float], ...]`. """ +""" `shape: (N,1)` A column vector `[[float], [float], ...]`. """ MatrixMN: TypeAlias = npt.NDArray[PointDType] -""" `shape: (M,N)` A Matrix `[[float, ...], [float, ...], ...]`. """ +""" `shape: (M,N)` A matrix `[[float, ...], [float, ...], ...]`. """ Zeros: TypeAlias = npt.NDArray[ManimFloat] -"""A Matrix of Zeros. Typically created with `numpy.zeros((M,N))`""" +"""A matrix of zeros. Typically created with `numpy.zeros((M,N))`.""" + +# Bezier Types + +QuadraticBezierPoints: TypeAlias = npt.NDArray[PointDType] +""" `shape: (3,3)` A Point3D_Array of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]`. """ + +QuadraticBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] +""" `shape: (N,3,3)` An array of N QuadraticBezierPoint objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]`. """ + +QuadraticBezierPath: TypeAlias = npt.NDArray[PointDType] +""" `shape: (3*N, 3)` An array of `3*N` Point3D objects, where every consecutive block of +3 points represents a quadratic Bézier curve: `[[float, float, float], ...], ...]`. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +QuadraticSpline: TypeAlias = npt.NDArray[PointDType] +""" `shape: (3*N, 3)` A special case of QuadraticBezierPath where all the N quadratic Bézier +curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]`. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +CubicBezierPoints: TypeAlias = npt.NDArray[PointDType] +""" `shape: (4,3)` A Point3D_Array of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]`. """ + +CubicBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] +""" `shape: (N,4,3)` An array of N CubicBezierPoint objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]`. +""" + +CubicBezierPath: TypeAlias = npt.NDArray[PointDType] +""" `shape: (4*N, 3)` An array of `4*N` Point3D objects, where every consecutive block of +4 points represents a cubic Bézier curve: `[[float, float, float], ...], ...]`. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +CubicSpline: TypeAlias = npt.NDArray[PointDType] +""" `shape: (4*N, 3)` A special case of CubicBezierPath where all the N cubic Bézier +curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]`. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +BezierPoints: TypeAlias = npt.NDArray[PointDType] +""" `shape: (PPC, 3)` A Point3D_Array of control points for a single n-th degree Bézier curve: `[[float, float, float], ...]`. +`PPC` ("Points Per Curve") is the number of points defining the Bézier curve, which is always 1 plus its degree n. +(Please refer to the documentation of the function you are using for further type information.) +""" + +BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] +""" `shape: (N, PPC, 3)` An array of N BezierPoint objects: `[[[float, float, float], ...], ...]`. +`N` is the number of Bézier curves. +`PPC` ("Points Per Curve") is the number of points per Bézier curve. +(Please refer to the documentation of the function you are using for further type information.) +""" + +BezierPath: TypeAlias = npt.NDArray[PointDType] +""" `shape: (PPC * N, 3)` An array of `PPC * N` Point3D objects, where every consecutive block of +`PPC` points represents a Bézier curve of n-th degree: `[[float, float, float], ...], ...]`. +`PPC` ("Points Per Curve") is the number of points per Bézier curve. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +Spline: TypeAlias = npt.NDArray[PointDType] +""" `shape: (PPC * N, 3)` A special case of BezierPath where all the N Bézier +curves are connected, forming an n-th degree spline: `[[float, float, float], ...], ...]`. +`PPC` ("Points Per Curve") is the number of points per Bézier curve. +`N` is the number of Bézier curves. +(Please refer to the documentation of the function you are using for further type information.) +""" + +FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] +""" `shape: (N)` A flattened array of Bézier control points: `[float, ...]`.""" + +# Function Types # Due to current limitations (see https://github.com/python/mypy/issues/14656 / 8263), we don't specify the first argument type (Mobject). FunctionOverride: TypeAlias = Callable[..., None] """Function type returning an animation for the specified Mobject.""" - -# Misc PathFuncType: TypeAlias = Callable[[Point3D, Point3D, float], Point3D] -"""Function mapping two points and an alpha value to a new point""" +"""Function mapping two Point3D objects and an alpha value to a new Point3D.""" MappingFunction: TypeAlias = Callable[[Point3D], Point3D] -"""A function mapping a Point3D to another Point3D""" +"""A function mapping a Point3D to another Point3D.""" + +# Image Types Image: TypeAlias = np.ndarray -"""An Image""" +"""An image.""" + +# Path Types StrPath: TypeAlias = "str | PathLike[str]" StrOrBytesPath: TypeAlias = "str | bytes | PathLike[str] | PathLike[bytes]" From 74448bbcfd3613d8dea20d1483c4f0b238d8300f Mon Sep 17 00:00:00 2001 From: chopan Date: Sat, 2 Dec 2023 14:14:39 +0100 Subject: [PATCH 02/30] Added Vector2 and reorganized manim_type_aliases --- manim/typing.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index b00d865423..287e2ae181 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -34,6 +34,14 @@ "Point3D", "InternalPoint3D_Array", "Point3D_Array", + # Vector Types + "Vector2", + "Vector3", + "Vector", + "RowVector", + "ColVector", + "MatrixMN", + "Zeros", # Bezier Types "QuadraticBezierPoints", "QuadraticBezierPoints_Array", @@ -48,14 +56,6 @@ "BezierPath", "Spline", "FlatBezierPoints", - # Vector Types - "Vector2", - "Vector3", - "Vector", - "RowVector", - "ColVector", - "MatrixMN", - "Zeros", # Function Types "FunctionOverride", "PathFuncType", @@ -137,6 +137,9 @@ # Vector Types +Vector2: TypeAlias = npt.NDArray[PointDType] +""" `shape: (2,)` A vector `[float, float]`. """ + Vector3: TypeAlias = npt.NDArray[PointDType] """ `shape: (3,)` A vector `[float, float, float]`. """ From a32b7a7c02700271d16863d0ca2fa8a4e4a13dbe Mon Sep 17 00:00:00 2001 From: MrDiver Date: Sun, 10 Dec 2023 02:18:58 +0100 Subject: [PATCH 03/30] Fixed __all__ exports for __all__ of manim --- .../source/reference_index/utilities_misc.rst | 1 + manim/__init__.py | 1 + manim/_config/cli_colors.py | 2 + manim/_config/logger_utils.py | 2 + manim/_config/utils.py | 2 + manim/animation/speedmodifier.py | 2 + manim/cli/cfg/group.py | 11 ++++ manim/cli/checkhealth/checks.py | 2 + manim/cli/checkhealth/commands.py | 2 + manim/cli/init/commands.py | 2 + manim/cli/new/group.py | 2 + manim/cli/plugins/commands.py | 2 + manim/cli/render/commands.py | 2 + manim/cli/render/ease_of_access_options.py | 2 + manim/cli/render/global_options.py | 2 + manim/cli/render/output_options.py | 2 + manim/cli/render/render_options.py | 2 + manim/gui/gui.py | 2 + manim/mobject/opengl/opengl_compatibility.py | 2 + manim/mobject/opengl/opengl_geometry.py | 26 +++++++++ manim/mobject/opengl/opengl_image_mobject.py | 2 + manim/mobject/opengl/opengl_mobject.py | 3 + .../opengl/opengl_point_cloud_mobject.py | 2 + manim/mobject/opengl/opengl_surface.py | 2 + .../mobject/opengl/opengl_three_dimensions.py | 2 + .../opengl/opengl_vectorized_mobject.py | 9 +++ manim/mobject/svg/brace.py | 2 + manim/mobject/text/code_mobject.py | 2 + manim/mobject/text/numbers.py | 2 + manim/mobject/text/text_mobject.py | 2 + manim/mobject/types/image_mobject.py | 2 + manim/mobject/types/point_cloud_mobject.py | 2 + manim/mobject/types/vectorized_mobject.py | 10 ++++ manim/renderer/cairo_renderer.py | 2 + manim/renderer/opengl_renderer.py | 2 + manim/renderer/opengl_renderer_window.py | 2 + manim/renderer/shader_wrapper.py | 2 + .../renderer/vectorized_mobject_rendering.py | 5 ++ manim/scene/section.py | 2 + manim/typing.py | 56 +++++++++++++++++++ manim/utils/caching.py | 2 + manim/utils/color/core.py | 1 - manim/utils/docbuild/autocolor_directive.py | 2 + manim/utils/exceptions.py | 6 ++ manim/utils/family.py | 2 + manim/utils/family_ops.py | 5 ++ manim/utils/hashing.py | 2 + manim/utils/ipython_magic.py | 2 + manim/utils/module_ops.py | 2 + manim/utils/opengl.py | 14 +++++ manim/utils/tex_file_writing.py | 2 + tests/test_scene_rendering/simple_scenes.py | 2 + 52 files changed, 225 insertions(+), 1 deletion(-) diff --git a/docs/source/reference_index/utilities_misc.rst b/docs/source/reference_index/utilities_misc.rst index 1caab7ecd4..a76c5b5467 100644 --- a/docs/source/reference_index/utilities_misc.rst +++ b/docs/source/reference_index/utilities_misc.rst @@ -9,6 +9,7 @@ Module Index .. autosummary:: :toctree: ../reference + typing constants ~utils.bezier ~utils.color diff --git a/manim/__init__.py b/manim/__init__.py index cae45fcc42..b9bde47f03 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -20,6 +20,7 @@ from .utils.commands import * # isort: on +import numpy as np from .animation.animation import * from .animation.changing import * diff --git a/manim/_config/cli_colors.py b/manim/_config/cli_colors.py index 3965a8b81d..e1d9fb02f8 100644 --- a/manim/_config/cli_colors.py +++ b/manim/_config/cli_colors.py @@ -4,6 +4,8 @@ from cloup import Context, HelpFormatter, HelpTheme, Style +__all__ = ["parse_cli_ctx"] + def parse_cli_ctx(parser: configparser.SectionProxy) -> Context: formatter_settings: dict[str, str | int] = { diff --git a/manim/_config/logger_utils.py b/manim/_config/logger_utils.py index 86c4aa636b..e17bc44b8c 100644 --- a/manim/_config/logger_utils.py +++ b/manim/_config/logger_utils.py @@ -26,6 +26,8 @@ if TYPE_CHECKING: from pathlib import Path +__all__ = ["make_logger", "parse_theme", "set_file_logger", "JSONFormatter"] + HIGHLIGHTED_KEYWORDS = [ # these keywords are highlighted specially "Played", "animations", diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 1b91450b48..e571c518be 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -33,6 +33,8 @@ from ..utils.color import ManimColor from ..utils.tex import TexTemplate, TexTemplateFromFile +__all__ = ["config_file_paths", "make_config_parser", "ManimConfig", "ManimFrame"] + def config_file_paths() -> list[Path]: """The paths where ``.cfg`` files will be searched for. diff --git a/manim/animation/speedmodifier.py b/manim/animation/speedmodifier.py index 93685f6426..9df1c9f018 100644 --- a/manim/animation/speedmodifier.py +++ b/manim/animation/speedmodifier.py @@ -13,6 +13,8 @@ from ..mobject.mobject import Mobject, Updater, _AnimationBuilder from ..scene.scene import Scene +__all__ = ["ChangeSpeed"] + class ChangeSpeed(Animation): """Modifies the speed of passed animation. diff --git a/manim/cli/cfg/group.py b/manim/cli/cfg/group.py index bc04f66820..d4aea23e5d 100644 --- a/manim/cli/cfg/group.py +++ b/manim/cli/cfg/group.py @@ -28,6 +28,17 @@ """ RICH_NON_STYLE_ENTRIES: str = ["log.width", "log.height", "log.timestamps"] +__all__ = [ + "value_from_string", + "value_from_string", + "is_valid_style", + "replace_keys", + "cfg", + "write", + "show", + "export", +] + def value_from_string(value: str) -> str | int | bool: """Extracts the literal of proper datatype from a string. diff --git a/manim/cli/checkhealth/checks.py b/manim/cli/checkhealth/checks.py index 600784337b..ad7e71ce39 100644 --- a/manim/cli/checkhealth/checks.py +++ b/manim/cli/checkhealth/checks.py @@ -10,6 +10,8 @@ from ..._config import config +__all__ = ["HEALTH_CHECKS"] + HEALTH_CHECKS = [] diff --git a/manim/cli/checkhealth/commands.py b/manim/cli/checkhealth/commands.py index 5386f5e7e7..d6873755f2 100644 --- a/manim/cli/checkhealth/commands.py +++ b/manim/cli/checkhealth/commands.py @@ -12,6 +12,8 @@ from .checks import HEALTH_CHECKS +__all__ = ["checkhealth"] + @cloup.command( context_settings=None, diff --git a/manim/cli/init/commands.py b/manim/cli/init/commands.py index 67dc751646..0210f0c32d 100644 --- a/manim/cli/init/commands.py +++ b/manim/cli/init/commands.py @@ -30,6 +30,8 @@ "resolution": (854, 480), } +__all__ = ["select_resolution", "update_cfg", "project", "scene"] + def select_resolution(): """Prompts input of type click.Choice from user. Presents options from QUALITIES constant. diff --git a/manim/cli/new/group.py b/manim/cli/new/group.py index 6058102695..82e633fc45 100644 --- a/manim/cli/new/group.py +++ b/manim/cli/new/group.py @@ -23,6 +23,8 @@ "resolution": (854, 480), } +__all__ = ["select_resolution", "update_cfg", "project", "scene"] + def select_resolution(): """Prompts input of type click.Choice from user. Presents options from QUALITIES constant. diff --git a/manim/cli/plugins/commands.py b/manim/cli/plugins/commands.py index 1d34f9431f..7926f01649 100644 --- a/manim/cli/plugins/commands.py +++ b/manim/cli/plugins/commands.py @@ -12,6 +12,8 @@ from ...constants import CONTEXT_SETTINGS, EPILOG from ...plugins.plugins_flags import list_plugins +__all__ = ["plugins"] + @cloup.command( context_settings=CONTEXT_SETTINGS, diff --git a/manim/cli/render/commands.py b/manim/cli/render/commands.py index eca0091660..bf38c05109 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -24,6 +24,8 @@ from .output_options import output_options from .render_options import render_options +__all__ = ["render"] + @cloup.command( context_settings=None, diff --git a/manim/cli/render/ease_of_access_options.py b/manim/cli/render/ease_of_access_options.py index 15cee6f55f..eb5eb39dad 100644 --- a/manim/cli/render/ease_of_access_options.py +++ b/manim/cli/render/ease_of_access_options.py @@ -3,6 +3,8 @@ import click from cloup import option, option_group +__all__ = ["ease_of_access_options"] + ease_of_access_options = option_group( "Ease of access options", option( diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index 17c754e623..08345c56e8 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -11,6 +11,8 @@ if TYPE_CHECKING: from cloup._option_groups import OptionGroupDecorator +__all__ = ["global_options"] + def validate_gui_location(ctx, param, value): if value: diff --git a/manim/cli/render/output_options.py b/manim/cli/render/output_options.py index 33c60b2883..602545d554 100644 --- a/manim/cli/render/output_options.py +++ b/manim/cli/render/output_options.py @@ -3,6 +3,8 @@ import click from cloup import option, option_group +__all__ = ["output_options"] + output_options = option_group( "Output options", option( diff --git a/manim/cli/render/render_options.py b/manim/cli/render/render_options.py index 738f5c310f..e202d80416 100644 --- a/manim/cli/render/render_options.py +++ b/manim/cli/render/render_options.py @@ -9,6 +9,8 @@ from ... import logger +__all__ = ["render_options"] + def validate_scene_range(ctx, param, value): try: diff --git a/manim/gui/gui.py b/manim/gui/gui.py index 9890093666..75ec67312c 100644 --- a/manim/gui/gui.py +++ b/manim/gui/gui.py @@ -13,6 +13,8 @@ from .. import __version__, config from ..utils.module_ops import scene_classes_from_file +__all__ = ["configure_pygui"] + if dearpygui_imported: dpg.create_context() window = dpg.generate_uuid() diff --git a/manim/mobject/opengl/opengl_compatibility.py b/manim/mobject/opengl/opengl_compatibility.py index dc7c020e17..6632175417 100644 --- a/manim/mobject/opengl/opengl_compatibility.py +++ b/manim/mobject/opengl/opengl_compatibility.py @@ -10,6 +10,8 @@ from ...constants import RendererType +__all__ = ["ConvertToOpenGL"] + class ConvertToOpenGL(ABCMeta): """Metaclass for swapping (V)Mobject with its OpenGL counterpart at runtime diff --git a/manim/mobject/opengl/opengl_geometry.py b/manim/mobject/opengl/opengl_geometry.py index 3f9379b14d..3e81f6f6f3 100644 --- a/manim/mobject/opengl/opengl_geometry.py +++ b/manim/mobject/opengl/opengl_geometry.py @@ -28,6 +28,32 @@ DEFAULT_ARROW_TIP_LENGTH = 0.35 DEFAULT_ARROW_TIP_WIDTH = 0.35 +__all__ = [ + "OpenGLTipableVMobject", + "OpenGLArc", + "OpenGLArcBetweenPoints", + "OpenGLCurvedArrow", + "OpenGLCurvedDoubleArrow", + "OpenGLCircle", + "OpenGLDot", + "OpenGLEllipse", + "OpenGLAnnularSector", + "OpenGLSector", + "OpenGLAnnulus", + "OpenGLLine", + "OpenGLDashedLine", + "OpenGLTangentLine", + "OpenGLElbow", + "OpenGLArrow", + "OpenGLVector", + "OpenGLDoubleArrow", + "OpenGLCubicBezier", + "OpenGLPolygon", + "OpenGLRegularPolygon", + "OpenGLTriangle", + "OpenGLArrowTip", +] + class OpenGLTipableVMobject(OpenGLVMobject): """ diff --git a/manim/mobject/opengl/opengl_image_mobject.py b/manim/mobject/opengl/opengl_image_mobject.py index 7f2828712f..84e3ef7ad6 100644 --- a/manim/mobject/opengl/opengl_image_mobject.py +++ b/manim/mobject/opengl/opengl_image_mobject.py @@ -13,6 +13,8 @@ from manim.mobject.opengl.opengl_surface import OpenGLSurface, OpenGLTexturedSurface from manim.utils.images import get_full_raster_image_path +__all__ = ["OpenGLImageMobject"] + class OpenGLImageMobject(OpenGLTexturedSurface): def __init__( diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index a94c3ad391..d64f9c0211 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -56,6 +56,9 @@ def wrapper(self): return wrapper +__all__ = ["OpenGLMobject", "OpenGLGroup", "OpenGLPoint", "_AnimationBuilder"] + + class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. diff --git a/manim/mobject/opengl/opengl_point_cloud_mobject.py b/manim/mobject/opengl/opengl_point_cloud_mobject.py index 6f1d879ae7..0b5a940a7e 100644 --- a/manim/mobject/opengl/opengl_point_cloud_mobject.py +++ b/manim/mobject/opengl/opengl_point_cloud_mobject.py @@ -12,6 +12,8 @@ from manim.utils.config_ops import _Uniforms from manim.utils.iterables import resize_with_interpolation +__all__ = ["OpenGLPMobject", "OpenGLPGroup", "OpenGLPMPoint"] + class OpenGLPMobject(OpenGLMobject): shader_folder = "true_dot" diff --git a/manim/mobject/opengl/opengl_surface.py b/manim/mobject/opengl/opengl_surface.py index adb4fe2d6d..a7132f0bbe 100644 --- a/manim/mobject/opengl/opengl_surface.py +++ b/manim/mobject/opengl/opengl_surface.py @@ -17,6 +17,8 @@ from manim.utils.iterables import listify from manim.utils.space_ops import normalize_along_axis +__all__ = ["OpenGLSurface", "OpenGLTexturedSurface"] + class OpenGLSurface(OpenGLMobject): r"""Creates a Surface. diff --git a/manim/mobject/opengl/opengl_three_dimensions.py b/manim/mobject/opengl/opengl_three_dimensions.py index 097d5739b9..930ff9ef20 100644 --- a/manim/mobject/opengl/opengl_three_dimensions.py +++ b/manim/mobject/opengl/opengl_three_dimensions.py @@ -5,6 +5,8 @@ from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject +__all__ = ["OpenGLSurfaceMesh"] + class OpenGLSurfaceMesh(OpenGLVGroup): def __init__( diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index d0c62d893b..9b9a0dc051 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -34,6 +34,15 @@ z_to_vector, ) +__all__ = [ + "triggers_refreshed_triangulation", + "OpenGLVMobject", + "OpenGLVGroup", + "OpenGLVectorizedPoint", + "OpenGLCurvesAsSubmobjects", + "OpenGLDashedVMobject", +] + def triggers_refreshed_triangulation(func): @wraps(func) diff --git a/manim/mobject/svg/brace.py b/manim/mobject/svg/brace.py index 1e2b84ac6e..788225bb84 100644 --- a/manim/mobject/svg/brace.py +++ b/manim/mobject/svg/brace.py @@ -24,6 +24,8 @@ from ...utils.color import BLACK from ..svg.svg_mobject import VMobjectFromSVGPath +__all__ = ["Brace", "BraceBetweenPoints", "BraceLabel", "ArcBrace"] + class Brace(VMobjectFromSVGPath): """Takes a mobject and draws a brace adjacent to it. diff --git a/manim/mobject/text/code_mobject.py b/manim/mobject/text/code_mobject.py index 9da5624d51..e85f3bf0ba 100644 --- a/manim/mobject/text/code_mobject.py +++ b/manim/mobject/text/code_mobject.py @@ -26,6 +26,8 @@ from manim.mobject.types.vectorized_mobject import VGroup from manim.utils.color import WHITE +__all__ = ["Code"] + class Code(VGroup): """A highlighted source code listing. diff --git a/manim/mobject/text/numbers.py b/manim/mobject/text/numbers.py index 10bf2e7829..ae244e1942 100644 --- a/manim/mobject/text/numbers.py +++ b/manim/mobject/text/numbers.py @@ -18,6 +18,8 @@ string_to_mob_map = {} +__all__ = ["DecimalNumber", "Integer", "Variable"] + class DecimalNumber(VMobject, metaclass=ConvertToOpenGL): """An mobject representing a decimal number. diff --git a/manim/mobject/text/text_mobject.py b/manim/mobject/text/text_mobject.py index 3a2b0bd3df..eab2ba7a36 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -77,6 +77,8 @@ def construct(self): DEFAULT_LINE_SPACING_SCALE = 0.3 TEXT2SVG_ADJUSTMENT_FACTOR = 4.8 +__all__ = ["Text", "Paragraph", "MarkupText", "register_font"] + def remove_invisible_chars(mobject: SVGMobject) -> SVGMobject: """Function to remove unwanted invisible characters from some mobjects. diff --git a/manim/mobject/types/image_mobject.py b/manim/mobject/types/image_mobject.py index cb0248d3a5..09e6917522 100644 --- a/manim/mobject/types/image_mobject.py +++ b/manim/mobject/types/image_mobject.py @@ -19,6 +19,8 @@ from ...utils.color import WHITE, ManimColor, color_to_int_rgb from ...utils.images import change_to_rgba_array, get_full_raster_image_path +__all__ = ["ImageMobject", "ImageMobjectFromCamera"] + class AbstractImageMobject(Mobject): """ diff --git a/manim/mobject/types/point_cloud_mobject.py b/manim/mobject/types/point_cloud_mobject.py index 43e2ff08e2..4f43dbf597 100644 --- a/manim/mobject/types/point_cloud_mobject.py +++ b/manim/mobject/types/point_cloud_mobject.py @@ -23,6 +23,8 @@ ) from ...utils.iterables import stretch_array_to_length +__all__ = ["PMobject", "Mobject1D", "Mobject2D", "PGroup", "PointCloudDot", "Point"] + class PMobject(Mobject, metaclass=ConvertToOpenGL): """A disc made of a cloud of Dots diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 6048fe4c67..8875eb5175 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -74,6 +74,16 @@ # - Think about length of self.points. Always 0 or 1 mod 4? # That's kind of weird. +__all__ = [ + "VMobject", + "VGroup", + "VDict", + "VectorizedPoint", + "CurvesAsSubmobjects", + "VectorizedPoint", + "DashedVMobject", +] + class VMobject(Mobject): """A vectorized mobject. diff --git a/manim/renderer/cairo_renderer.py b/manim/renderer/cairo_renderer.py index f11b7ea7ca..5e383d16a0 100644 --- a/manim/renderer/cairo_renderer.py +++ b/manim/renderer/cairo_renderer.py @@ -17,6 +17,8 @@ if typing.TYPE_CHECKING: from manim.scene.scene import Scene +__all__ = ["CairoRenderer"] + class CairoRenderer: """A renderer using Cairo. diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index aa0bdbebf4..79390be97c 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -39,6 +39,8 @@ render_opengl_vectorized_mobject_stroke, ) +__all__ = ["OpenGLCamera", "OpenGLRenderer"] + class OpenGLCamera(OpenGLMobject): euler_angles = _Data() diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index 14d913899c..610f61646b 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -7,6 +7,8 @@ from .. import __version__, config +__all__ = ["Window"] + class Window(PygletWindow): fullscreen = False diff --git a/manim/renderer/shader_wrapper.py b/manim/renderer/shader_wrapper.py index 6b38b1b53a..00e111aad6 100644 --- a/manim/renderer/shader_wrapper.py +++ b/manim/renderer/shader_wrapper.py @@ -15,6 +15,8 @@ # of a dict holding all the relevant information # to that shader +__all__ = ["ShaderWrapper"] + def get_shader_dir(): return Path(__file__).parent / "shaders" diff --git a/manim/renderer/vectorized_mobject_rendering.py b/manim/renderer/vectorized_mobject_rendering.py index 4cfd582d20..4245d65b0e 100644 --- a/manim/renderer/vectorized_mobject_rendering.py +++ b/manim/renderer/vectorized_mobject_rendering.py @@ -8,6 +8,11 @@ from ..utils.space_ops import cross2d, earclip_triangulation from .shader import Shader +__all__ = [ + "render_opengl_vectorized_mobject_fill", + "render_opengl_vectorized_mobject_stroke", +] + def build_matrix_lists(mob): root_hierarchical_matrix = mob.hierarchical_model_matrix() diff --git a/manim/scene/section.py b/manim/scene/section.py index 860a969ad5..a9e4ba2aba 100644 --- a/manim/scene/section.py +++ b/manim/scene/section.py @@ -8,6 +8,8 @@ from manim import get_video_metadata +__all__ = ["Section", "DefaultSectionType"] + class DefaultSectionType(str, Enum): """The type of a section can be used for third party applications. diff --git a/manim/typing.py b/manim/typing.py index 287e2ae181..47777ba2ad 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -1,3 +1,6 @@ +""" +Typing Module +""" from __future__ import annotations from os import PathLike @@ -7,6 +10,59 @@ import numpy.typing as npt from typing_extensions import TypeAlias +__all__ = [ + "manim_type_aliases", + "ManimFloat", + "ManimInt", + "ManimColorDType", + "RGB_Array_Float", + "RGB_Tuple_Float", + "RGB_Array_Int", + "RGB_Tuple_Int", + "RGBA_Array_Float", + "RGBA_Tuple_Float", + "RGBA_Array_Int", + "RGBA_Tuple_Int", + "HSV_Array_Float", + "HSV_Tuple_Float", + "ManimColorInternal", + "PointDType", + "InternalPoint2D", + "Point2D", + "InternalPoint2D_Array", + "Point2D_Array", + "InternalPoint3D", + "Point3D", + "InternalPoint3D_Array", + "Point3D_Array", + "Vector2", + "Vector3", + "Vector", + "RowVector", + "ColVector", + "MatrixMN", + "Zeros", + "QuadraticBezierPoints", + "QuadraticBezierPoints_Array", + "QuadraticBezierPath", + "QuadraticSpline", + "CubicBezierPoints", + "CubicBezierPoints_Array", + "CubicBezierPath", + "CubicSpline", + "BezierPoints", + "BezierPoints_Array", + "BezierPath", + "Spline", + "FlatBezierPoints", + "FunctionOverride", + "PathFuncType", + "MappingFunction", + "Image", + "StrPath", + "StrOrBytesPath", +] + manim_type_aliases = [ # Primitive Data Types "ManimFloat", diff --git a/manim/utils/caching.py b/manim/utils/caching.py index cabecd6567..d19ba8c0e2 100644 --- a/manim/utils/caching.py +++ b/manim/utils/caching.py @@ -5,6 +5,8 @@ from .. import config, logger from ..utils.hashing import get_hash_from_play_call +__all__ = ["handle_caching_play"] + def handle_caching_play(func: Callable[..., None]): """Decorator that returns a wrapped version of func that will compute diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index cdd75ad9ae..bb9835a1af 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -52,7 +52,6 @@ # import manim._config as _config - re_hex = re.compile("((?<=#)|(?<=0x))[A-F0-9]{6,8}", re.IGNORECASE) diff --git a/manim/utils/docbuild/autocolor_directive.py b/manim/utils/docbuild/autocolor_directive.py index cdd906f164..953dea96cb 100644 --- a/manim/utils/docbuild/autocolor_directive.py +++ b/manim/utils/docbuild/autocolor_directive.py @@ -8,6 +8,8 @@ from manim import ManimColor +__all__ = ["ManimColorModuleDocumenter"] + def setup(app: Sphinx) -> None: app.add_directive("automanimcolormodule", ManimColorModuleDocumenter) diff --git a/manim/utils/exceptions.py b/manim/utils/exceptions.py index a7cc7f5676..c1c2f8f951 100644 --- a/manim/utils/exceptions.py +++ b/manim/utils/exceptions.py @@ -1,5 +1,11 @@ from __future__ import annotations +__all__ = [ + "EndSceneEarlyException", + "RerunSceneException", + "MultiAnimationOverrideException", +] + class EndSceneEarlyException(Exception): pass diff --git a/manim/utils/family.py b/manim/utils/family.py index 3669ed2036..21e100a4b2 100644 --- a/manim/utils/family.py +++ b/manim/utils/family.py @@ -6,6 +6,8 @@ from ..mobject.mobject import Mobject from ..utils.iterables import remove_list_redundancies +__all__ = ["extract_mobject_family_members"] + def extract_mobject_family_members( mobjects: Iterable[Mobject], diff --git a/manim/utils/family_ops.py b/manim/utils/family_ops.py index 4a47e0591d..8d4af9d5a5 100644 --- a/manim/utils/family_ops.py +++ b/manim/utils/family_ops.py @@ -2,6 +2,11 @@ import itertools as it +__all__ = [ + "extract_mobject_family_members", + "restructure_list_to_exclude_certain_family_members", +] + def extract_mobject_family_members(mobject_list, only_those_with_points=False): result = list(it.chain(*(mob.get_family() for mob in mobject_list))) diff --git a/manim/utils/hashing.py b/manim/utils/hashing.py index f8a259b06c..9557ba18f1 100644 --- a/manim/utils/hashing.py +++ b/manim/utils/hashing.py @@ -23,6 +23,8 @@ if typing.TYPE_CHECKING: from manim.scene.scene import Scene +__all__ = ["KEYS_TO_FILTER_OUT", "get_hash_from_play_call", "get_json"] + # Sometimes there are elements that are not suitable for hashing (too long or # run-dependent). This is used to filter them out. KEYS_TO_FILTER_OUT = { diff --git a/manim/utils/ipython_magic.py b/manim/utils/ipython_magic.py index c877cabd7f..7911da9cf3 100644 --- a/manim/utils/ipython_magic.py +++ b/manim/utils/ipython_magic.py @@ -15,6 +15,8 @@ from ..constants import RendererType +__all__ = ["ManimMagic"] + try: from IPython import get_ipython from IPython.core.interactiveshell import InteractiveShell diff --git a/manim/utils/module_ops.py b/manim/utils/module_ops.py index ec588c0ef6..2ff7291470 100644 --- a/manim/utils/module_ops.py +++ b/manim/utils/module_ops.py @@ -12,6 +12,8 @@ from .. import config, console, constants, logger from ..scene.scene_file_writer import SceneFileWriter +__all__ = ["scene_classes_from_file"] + def get_module(file_name: Path): if str(file_name) == "-": diff --git a/manim/utils/opengl.py b/manim/utils/opengl.py index e84642d226..f9844f1b33 100644 --- a/manim/utils/opengl.py +++ b/manim/utils/opengl.py @@ -7,6 +7,20 @@ depth = 20 +__all__ = [ + "matrix_to_shader_input", + "orthographic_projection_matrix", + "perspective_projection_matrix", + "translation_matrix", + "x_rotation_matrix", + "y_rotation_matrix", + "z_rotation_matrix", + "rotate_in_place_matrix", + "rotation_matrix", + "scale_matrix", + "view_matrix", +] + def matrix_to_shader_input(matrix): return tuple(matrix.T.ravel()) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index cc0f48ada3..6d9a186cbe 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -19,6 +19,8 @@ from .. import config, logger +__all__ = ["tex_to_svg_file"] + def tex_hash(expression): id_str = str(expression) diff --git a/tests/test_scene_rendering/simple_scenes.py b/tests/test_scene_rendering/simple_scenes.py index 8dd2b706e0..8f4dd9d434 100644 --- a/tests/test_scene_rendering/simple_scenes.py +++ b/tests/test_scene_rendering/simple_scenes.py @@ -1,5 +1,7 @@ from __future__ import annotations +from enum import Enum + from manim import * From 9f9e98f7c001527bf434a02daecf611da6520442 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Sun, 10 Dec 2023 02:56:43 +0100 Subject: [PATCH 04/30] Update manim/cli/render/global_options.py --- manim/cli/render/global_options.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index dea283a060..4216e25417 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -6,8 +6,6 @@ from ... import logger -if TYPE_CHECKING: - from cloup._option_groups import OptionGroupDecorator __all__ = ["global_options"] From 5d1b37548831ba268fdae7776a9768d114817fd8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 10 Dec 2023 01:57:56 +0000 Subject: [PATCH 05/30] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/cli/render/global_options.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index 4216e25417..42b61ae2d9 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -6,7 +6,6 @@ from ... import logger - __all__ = ["global_options"] From 5f582bc081ca722b170702f413a1375d84f430bb Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 20 Dec 2023 01:15:02 +0100 Subject: [PATCH 06/30] Draft of new typing docs and new autotyping directive --- docs/source/conf.py | 7 +- manim/typing.py | 321 ++--- manim/utils/docbuild/autotyping_directive.py | 57 + poetry.lock | 1128 +++++++++--------- pyproject.toml | 8 +- 5 files changed, 822 insertions(+), 699 deletions(-) create mode 100644 manim/utils/docbuild/autotyping_directive.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 1226e6fd0d..bb397e2ca0 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -45,6 +45,7 @@ "sphinxext.opengraph", "manim.utils.docbuild.manim_directive", "manim.utils.docbuild.autocolor_directive", + "manim.utils.docbuild.autotyping_directive", "sphinx.ext.graphviz", "sphinx.ext.inheritance_diagram", "sphinxcontrib.programoutput", @@ -56,7 +57,11 @@ # generate documentation from type hints autodoc_typehints = "description" -autodoc_type_aliases = {t: t for t in manim_type_aliases} +autodoc_type_aliases = { + alias: f"~manim.typing.{alias}" + for category in manim_type_aliases.values() + for alias in category +} autoclass_content = "both" # controls whether functions documented by the autofunction directive diff --git a/manim/typing.py b/manim/typing.py index 47777ba2ad..ca6d50c4cd 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -1,10 +1,12 @@ -""" -Typing Module +"""Typing Module + +.. autotypingmodule:: manim.typing + """ from __future__ import annotations from os import PathLike -from typing import Callable, Tuple, Union +from typing import Callable, Literal, Tuple, Union import numpy as np import numpy.typing as npt @@ -63,65 +65,71 @@ "StrOrBytesPath", ] -manim_type_aliases = [ - # Primitive Data Types - "ManimFloat", - "ManimInt", - # Color Types - "ManimColorDType", - "RGB_Array_Float", - "RGB_Tuple_Float", - "RGB_Array_Int", - "RGB_Tuple_Int", - "RGBA_Array_Float", - "RGBA_Tuple_Float", - "RGBA_Array_Int", - "RGBA_Tuple_Int", - "HSV_Array_Float", - "HSV_Tuple_Float", - "ManimColorInternal", - # Point Types - "PointDType", - "InternalPoint2D", - "Point2D", - "InternalPoint2D_Array", - "Point2D_Array", - "InternalPoint3D", - "Point3D", - "InternalPoint3D_Array", - "Point3D_Array", - # Vector Types - "Vector2", - "Vector3", - "Vector", - "RowVector", - "ColVector", - "MatrixMN", - "Zeros", - # Bezier Types - "QuadraticBezierPoints", - "QuadraticBezierPoints_Array", - "QuadraticBezierPath", - "QuadraticSpline", - "CubicBezierPoints", - "CubicBezierPoints_Array", - "CubicBezierPath", - "CubicSpline", - "BezierPoints", - "BezierPoints_Array", - "BezierPath", - "Spline", - "FlatBezierPoints", - # Function Types - "FunctionOverride", - "PathFuncType", - "MappingFunction", - # Image Types - "Image", - # Path Types - "StrPath", - "StrOrBytesPath", -] +manim_type_aliases = { + "Primitive data types": ( + "ManimFloat", + "ManimInt", + ), + "Color types": ( + "ManimColorDType", + "RGB_Array_Float", + "RGB_Tuple_Float", + "RGB_Array_Int", + "RGB_Tuple_Int", + "RGBA_Array_Float", + "RGBA_Tuple_Float", + "RGBA_Array_Int", + "RGBA_Tuple_Int", + "HSV_Array_Float", + "HSV_Tuple_Float", + "ManimColorInternal", + ), + "Point types": ( + "PointDType", + "InternalPoint2D", + "Point2D", + "InternalPoint2D_Array", + "Point2D_Array", + "InternalPoint3D", + "Point3D", + "InternalPoint3D_Array", + "Point3D_Array", + ), + "Vector types": ( + "Vector2", + "Vector3", + "Vector", + "RowVector", + "ColVector", + "MatrixMN", + "Zeros", + ), + "Bezier types": ( + "QuadraticBezierPoints", + "QuadraticBezierPoints_Array", + "QuadraticBezierPath", + "QuadraticSpline", + "CubicBezierPoints", + "CubicBezierPoints_Array", + "CubicBezierPath", + "CubicSpline", + "BezierPoints", + "BezierPoints_Array", + "BezierPath", + "Spline", + "FlatBezierPoints", + ), + "Function types": ( + "FunctionOverride", + "PathFuncType", + "MappingFunction", + ), + "Other types": ( + "Image", + "StrPath", + "StrOrBytesPath", + ), +} # Primitive Data Types ManimFloat: TypeAlias = np.float64 @@ -150,156 +158,191 @@ # Point Types PointDType: TypeAlias = ManimFloat -""" DType for all points. """ +"""DType for all points.""" InternalPoint2D: TypeAlias = npt.NDArray[PointDType] -""" `shape: (2,)` A 2D point. `[float, float]`. +"""`shape (2,)` +A 2D point: `[float, float]` This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D: TypeAlias = Union[InternalPoint2D, Tuple[float, float]] -""" `shape: (2,)` A 2D point. `[float, float]`. """ +Point2D: TypeAlias = InternalPoint2D | Tuple[float, float] +"""`shape (2,)` +A 2D point: `[float, float]` +""" InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3)` An array of Point2D: `[[float, float], ...]`. +"""`shape (N, 3)` +An array of Point2D: `[[float, float], ...]` This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, Tuple[Tuple[float, float], ...]] -""" `shape: (N,2)` An array of Point2D objects: `[[float, float], ...]`. +Point2D_Array: TypeAlias = InternalPoint2D_Array | Tuple[Point2D, ...] +"""`shape (N, 2)` +An array of Point2D objects: `[[float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) """ InternalPoint3D: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,)` A 3D point. `[float, float, float]`. +"""`shape (3,)` +A 3D point: `[float, float, float]` This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D: TypeAlias = Union[InternalPoint3D, Tuple[float, float, float]] -""" `shape: (3,)` A 3D point. `[float, float, float]` """ +Point3D: TypeAlias = InternalPoint3D | Tuple[float, float, float] +"""`shape (3,)` +A 3D point: `[float, float, float]` +""" InternalPoint3D_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3)` An array of Point3D objects: `[[float, float, float], ...]`. +"""`shape (N, 3)` +An array of Point3D objects: `[[float, float, float], ...]` This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D_Array: TypeAlias = Union[ - InternalPoint3D_Array, Tuple[Tuple[float, float, float], ...] -] -""" `shape: (N,3)` An array of Point3D objects: `[[float, float, float], ...]`. - -(Please refer to the documentation of the function you are using for further type Information) +Point3D_Array: TypeAlias = InternalPoint3D_Array | Tuple[Point3D, ...] +"""`shape (N, 3)` +An array of Point3D objects: `[[float, float, float], ...]` +(Please refer to the documentation of the function you are using for further type information.) """ # Vector Types -Vector2: TypeAlias = npt.NDArray[PointDType] -""" `shape: (2,)` A vector `[float, float]`. """ +Vector2: TypeAlias = npt.NDArray[PointDType] | Tuple[float, float] +"""`shape (2,)` +A 2D vector: `[float, float]` +""" -Vector3: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,)` A vector `[float, float, float]`. """ +Vector3: TypeAlias = npt.NDArray[PointDType] | Tuple[float, float, float] +"""`shape (3,)` +A 3D vector: `[float, float, float]` +""" -Vector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,)` A vector `[float, ...]`. """ +Vector: TypeAlias = npt.NDArray[PointDType] | Tuple[float, ...] +"""`shape (N,)` +An `N`-D vector: `[float, ...]` +""" -RowVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (1,N)` A row vector `[[float, ...]]`. """ +RowVector: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float, ...]] +"""`shape (1, N)` +A row vector: `[[float, ...]]` +""" -ColVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,1)` A column vector `[[float], [float], ...]`. """ +ColVector: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float], ...] +"""`shape (N, 1)` +A column vector: `[[float], [float], ...]` +""" -MatrixMN: TypeAlias = npt.NDArray[PointDType] -""" `shape: (M,N)` A matrix `[[float, ...], [float, ...], ...]`. """ +MatrixMN: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float, ...], ...] +"""`shape (M, N)` +A matrix: `[[float, ...], [float, ...], ...]` +""" -Zeros: TypeAlias = npt.NDArray[ManimFloat] -"""A matrix of zeros. Typically created with `numpy.zeros((M,N))`.""" +Zeros: TypeAlias = npt.NDArray[ManimFloat] | Tuple[Tuple[Literal[0], ...], ...] +"""A matrix of zeros, typically created with ``numpy.zeros((M, N))``""" # Bezier Types -QuadraticBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,3)` A Point3D_Array of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]`. """ +QuadraticBezierPoints: TypeAlias = ( + npt.NDArray[PointDType] | Tuple[Point3D, Point3D, Point3D] +) +"""`shape (3, 3)` +A `Point3D_Array` of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]` +""" -QuadraticBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,3,3)` An array of N QuadraticBezierPoint objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]`. """ +QuadraticBezierPoints_Array: TypeAlias = ( + npt.NDArray[PointDType] | Tuple[QuadraticBezierPoints, ...] +) +"""`shape (N, 3, 3)` +An array of `N QuadraticBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]` +""" -QuadraticBezierPath: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3*N, 3)` An array of `3*N` Point3D objects, where every consecutive block of -3 points represents a quadratic Bézier curve: `[[float, float, float], ...], ...]`. -`N` is the number of Bézier curves. +QuadraticBezierPath: TypeAlias = Point3D_Array +"""`shape (3*N, 3)` +An array of `3*N Point3D` objects, where each one of the `N` consecutive blocks of +3 points represents a quadratic Bézier curve: `[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -QuadraticSpline: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3*N, 3)` A special case of QuadraticBezierPath where all the N quadratic Bézier -curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]`. -`N` is the number of Bézier curves. +QuadraticSpline: TypeAlias = QuadraticBezierPath +"""`shape (3*N, 3)` +A special case of `QuadraticBezierPath` where all the `N` quadratic Bézier +curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -CubicBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (4,3)` A Point3D_Array of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]`. """ +CubicBezierPoints: TypeAlias = ( + npt.NDArray[PointDType] | Tuple[Point3D, Point3D, Point3D, Point3D] +) +"""`shape (4, 3)` +A `Point3D_Array` of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]` +""" -CubicBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,4,3)` An array of N CubicBezierPoint objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]`. +CubicBezierPoints_Array: TypeAlias = ( + npt.NDArray[PointDType] | Tuple[CubicBezierPoints, ...] +) +"""`shape (N, 4, 3)` +An array of `N CubicBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]` """ -CubicBezierPath: TypeAlias = npt.NDArray[PointDType] -""" `shape: (4*N, 3)` An array of `4*N` Point3D objects, where every consecutive block of -4 points represents a cubic Bézier curve: `[[float, float, float], ...], ...]`. -`N` is the number of Bézier curves. +CubicBezierPath: TypeAlias = Point3D_Array +"""`shape (4*N, 3)` +An array of `4*N Point3D` objects, where each one of the `N` consecutive blocks of +4 points represents a cubic Bézier curve: `[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -CubicSpline: TypeAlias = npt.NDArray[PointDType] -""" `shape: (4*N, 3)` A special case of CubicBezierPath where all the N cubic Bézier -curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]`. -`N` is the number of Bézier curves. +CubicSpline: TypeAlias = CubicBezierPath +"""`shape (4*N, 3)` +A special case of `CubicBezierPath` where all the `N` cubic Bézier +curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -BezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (PPC, 3)` A Point3D_Array of control points for a single n-th degree Bézier curve: `[[float, float, float], ...]`. -`PPC` ("Points Per Curve") is the number of points defining the Bézier curve, which is always 1 plus its degree n. +BezierPoints: TypeAlias = Point3D_Array +"""`shape (PPC, 3)` +A `Point3D_Array` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th +degree Bézier curve: `[[float, float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N, PPC, 3)` An array of N BezierPoint objects: `[[[float, float, float], ...], ...]`. -`N` is the number of Bézier curves. -`PPC` ("Points Per Curve") is the number of points per Bézier curve. +BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] | Tuple[BezierPoints, ...] +"""`shape (N, PPC, 3)` +An array of `N BezierPoints` objects containing `PPC Point3D` objects each: `[[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -BezierPath: TypeAlias = npt.NDArray[PointDType] -""" `shape: (PPC * N, 3)` An array of `PPC * N` Point3D objects, where every consecutive block of -`PPC` points represents a Bézier curve of n-th degree: `[[float, float, float], ...], ...]`. -`PPC` ("Points Per Curve") is the number of points per Bézier curve. -`N` is the number of Bézier curves. +BezierPath: TypeAlias = Point3D_Array +"""`shape (PPC*N, 3)` +An array of `PPC * N Point3D` objects, where where each one of the `N` consecutive blocks of +`PPC = n + 1` ("Points Per Curve") points represents a Bézier curve of `n`-th degree: +`[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -Spline: TypeAlias = npt.NDArray[PointDType] -""" `shape: (PPC * N, 3)` A special case of BezierPath where all the N Bézier -curves are connected, forming an n-th degree spline: `[[float, float, float], ...], ...]`. -`PPC` ("Points Per Curve") is the number of points per Bézier curve. -`N` is the number of Bézier curves. +Spline: TypeAlias = BezierPath +"""`shape (PPC*N, 3)` +A special case of BezierPath where all the `N` Bézier curves consisting of `PPC` ("Points Per Curve") +`Point3D` objects are connected, forming an `n`-th degree spline: `[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) """ -FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N)` A flattened array of Bézier control points: `[float, ...]`.""" +FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] | Tuple[float, ...] +"""`shape (N)` +A flattened array of Bézier control points: `[float, ...]` +""" # Function Types # Due to current limitations (see https://github.com/python/mypy/issues/14656 / 8263), we don't specify the first argument type (Mobject). FunctionOverride: TypeAlias = Callable[..., None] -"""Function type returning an animation for the specified Mobject.""" +"""Function type returning an `Animation` for the specified `Mobject`.""" PathFuncType: TypeAlias = Callable[[Point3D, Point3D, float], Point3D] -"""Function mapping two Point3D objects and an alpha value to a new Point3D.""" +"""Function mapping two `Point3D` objects and an alpha value to a new `Point3D`.""" MappingFunction: TypeAlias = Callable[[Point3D], Point3D] -"""A function mapping a Point3D to another Point3D.""" +"""A function mapping a `Point3D` to another `Point3D`.""" # Image Types diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py new file mode 100644 index 0000000000..938f54784c --- /dev/null +++ b/manim/utils/docbuild/autotyping_directive.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +import inspect + +from docutils import nodes +from docutils.parsers.rst import Directive +from sphinx.application import Sphinx + +from manim import ManimColor + +__all__ = ["TypingModuleDocumenter"] + + +def setup(app: Sphinx) -> None: + app.add_directive("autotypingmodule", TypingModuleDocumenter) + + +class TypingModuleDocumenter(Directive): + objtype = "autotypingmodule" + required_arguments = 1 + has_content = True + + def add_directive_header(self, sig: str) -> None: + super().add_directive_header(sig) + + def run(self) -> List[nodes.Element]: + module_name = self.arguments[0] + try: + import importlib + + module = importlib.import_module(module_name) + except ImportError: + return [ + nodes.error( + None, + nodes.paragraph(text="Failed to import module '%s'" % module_name), + ) + ] + + content = nodes.container() + for category_name, category in module.manim_type_aliases.items(): + category_section = nodes.section( + ids=[category_name.lower().replace(" ", "_")] + ) + category_section += nodes.title(text=category_name) + category_alias_container = nodes.container() + category_section += category_alias_container + + for alias_name in category: + alias = getattr(module, alias_name) + alias_section = nodes.topic(ids=[alias_name.lower().replace(" ", "_")]) + category_alias_container += alias_section + alias_section += nodes.title(text=alias_name) + alias_section += nodes.paragraph(text=str(alias)) + content += category_section + + return [content] diff --git a/poetry.lock b/poetry.lock index 2e76786431..4b05ec6c9b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -13,19 +13,20 @@ files = [ [[package]] name = "anyio" -version = "4.1.0" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = true python-versions = ">=3.8" files = [ - {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, - {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] @@ -182,18 +183,15 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "babel" -version = "2.13.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -setuptools = {version = "*", markers = "python_version >= \"3.12\""} - [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] @@ -217,29 +215,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "23.11.0" +version = "23.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, - {file = "black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, - {file = "black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, - {file = "black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, - {file = "black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, - {file = "black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, - {file = "black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, - {file = "black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, - {file = "black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, - {file = "black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, - {file = "black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, - {file = "black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, - {file = "black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, - {file = "black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, - {file = "black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, - {file = "black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, - {file = "black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, - {file = "black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, + {file = "black-23.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67f19562d367468ab59bd6c36a72b2c84bc2f16b59788690e02bbcb140a77175"}, + {file = "black-23.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbd75d9f28a7283b7426160ca21c5bd640ca7cd8ef6630b4754b6df9e2da8462"}, + {file = "black-23.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:593596f699ca2dcbbbdfa59fcda7d8ad6604370c10228223cd6cf6ce1ce7ed7e"}, + {file = "black-23.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:12d5f10cce8dc27202e9a252acd1c9a426c83f95496c959406c96b785a92bb7d"}, + {file = "black-23.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e73c5e3d37e5a3513d16b33305713237a234396ae56769b839d7c40759b8a41c"}, + {file = "black-23.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba09cae1657c4f8a8c9ff6cfd4a6baaf915bb4ef7d03acffe6a2f6585fa1bd01"}, + {file = "black-23.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace64c1a349c162d6da3cef91e3b0e78c4fc596ffde9413efa0525456148873d"}, + {file = "black-23.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:72db37a2266b16d256b3ea88b9affcdd5c41a74db551ec3dd4609a59c17d25bf"}, + {file = "black-23.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fdf6f23c83078a6c8da2442f4d4eeb19c28ac2a6416da7671b72f0295c4a697b"}, + {file = "black-23.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39dda060b9b395a6b7bf9c5db28ac87b3c3f48d4fdff470fa8a94ab8271da47e"}, + {file = "black-23.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7231670266ca5191a76cb838185d9be59cfa4f5dd401b7c1c70b993c58f6b1b5"}, + {file = "black-23.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:193946e634e80bfb3aec41830f5d7431f8dd5b20d11d89be14b84a97c6b8bc75"}, + {file = "black-23.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcf91b01ddd91a2fed9a8006d7baa94ccefe7e518556470cf40213bd3d44bbbc"}, + {file = "black-23.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:996650a89fe5892714ea4ea87bc45e41a59a1e01675c42c433a35b490e5aa3f0"}, + {file = "black-23.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdbff34c487239a63d86db0c9385b27cdd68b1bfa4e706aa74bb94a435403672"}, + {file = "black-23.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:97af22278043a6a1272daca10a6f4d36c04dfa77e61cbaaf4482e08f3640e9f0"}, + {file = "black-23.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ead25c273adfad1095a8ad32afdb8304933efba56e3c1d31b0fee4143a1e424a"}, + {file = "black-23.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c71048345bdbced456cddf1622832276d98a710196b842407840ae8055ade6ee"}, + {file = "black-23.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a832b6e00eef2c13b3239d514ea3b7d5cc3eaa03d0474eedcbbda59441ba5d"}, + {file = "black-23.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:6a82a711d13e61840fb11a6dfecc7287f2424f1ca34765e70c909a35ffa7fb95"}, + {file = "black-23.12.0-py3-none-any.whl", hash = "sha256:a7c07db8200b5315dc07e331dda4d889a56f6bf4db6a9c2a526fa3166a81614f"}, + {file = "black-23.12.0.tar.gz", hash = "sha256:330a327b422aca0634ecd115985c1c7fd7bdb5b5a2ef8aa9888a82e2ebe9437a"}, ] [package.dependencies] @@ -253,7 +255,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -581,63 +583,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.3.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494"}, + {file = "coverage-7.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523"}, + {file = "coverage-7.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438"}, + {file = "coverage-7.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837"}, + {file = "coverage-7.3.3-cp310-cp310-win32.whl", hash = "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2"}, + {file = "coverage-7.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb"}, + {file = "coverage-7.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc"}, + {file = "coverage-7.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb"}, + {file = "coverage-7.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1"}, + {file = "coverage-7.3.3-cp311-cp311-win32.whl", hash = "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f"}, + {file = "coverage-7.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56"}, + {file = "coverage-7.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85"}, + {file = "coverage-7.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59"}, + {file = "coverage-7.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6"}, + {file = "coverage-7.3.3-cp312-cp312-win32.whl", hash = "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70"}, + {file = "coverage-7.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea"}, + {file = "coverage-7.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394"}, + {file = "coverage-7.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40"}, + {file = "coverage-7.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327"}, + {file = "coverage-7.3.3-cp38-cp38-win32.whl", hash = "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069"}, + {file = "coverage-7.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132"}, + {file = "coverage-7.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a"}, + {file = "coverage-7.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94"}, + {file = "coverage-7.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f"}, + {file = "coverage-7.3.3-cp39-cp39-win32.whl", hash = "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa"}, + {file = "coverage-7.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348"}, + {file = "coverage-7.3.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb"}, + {file = "coverage-7.3.3.tar.gz", hash = "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7"}, ] [package.dependencies] @@ -868,24 +870,24 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "docutils" -version = "0.17.1" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] @@ -978,13 +980,13 @@ pyflakes = ">=3.1.0,<3.2.0" [[package]] name = "flake8-bugbear" -version = "23.11.28" +version = "23.12.2" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-bugbear-23.11.28.tar.gz", hash = "sha256:0ba6c44eaa0e4782da94c5c2607159a0e73569369246cd179cc143a0e16b78ba"}, - {file = "flake8_bugbear-23.11.28-py3-none-any.whl", hash = "sha256:8d0f351d954fd860851710cd8b5b28742b2339c0e58848b103418dd9cddb9aa4"}, + {file = "flake8-bugbear-23.12.2.tar.gz", hash = "sha256:32b2903e22331ae04885dae25756a32a8c666c85142e933f43512a70f342052a"}, + {file = "flake8_bugbear-23.12.2-py3-none-any.whl", hash = "sha256:83324bad4d90fee4bf64dd69c61aff94debf8073fbd807c8b6a36eec7a2f0719"}, ] [package.dependencies] @@ -1101,53 +1103,53 @@ flake8 = ">=3.7" [[package]] name = "fonttools" -version = "4.45.1" +version = "4.46.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"}, - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"}, - {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"}, - {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"}, - {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"}, - {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"}, - {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"}, - {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"}, - {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"}, - {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"}, - {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"}, - {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"}, - {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"}, - {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, + {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, + {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, + {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, + {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, + {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, + {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, + {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, + {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, + {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, + {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, + {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, + {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, ] [package.extras] @@ -1177,19 +1179,19 @@ files = [ [[package]] name = "furo" -version = "2022.9.29" +version = "2023.9.10" description = "A clean customisable Sphinx documentation theme." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "furo-2022.9.29-py3-none-any.whl", hash = "sha256:559ee17999c0f52728481dcf6b1b0cf8c9743e68c5e3a18cb45a7992747869a9"}, - {file = "furo-2022.9.29.tar.gz", hash = "sha256:d4238145629c623609c2deb5384f8d036e2a1ee2a101d64b67b4348112470dbd"}, + {file = "furo-2023.9.10-py3-none-any.whl", hash = "sha256:513092538537dc5c596691da06e3c370714ec99bc438680edc1debffb73e5bfc"}, + {file = "furo-2023.9.10.tar.gz", hash = "sha256:5707530a476d2a63b8cad83b4f961f3739a69f4b058bcf38a03a39fa537195b2"}, ] [package.dependencies] beautifulsoup4 = "*" pygments = ">=2.7" -sphinx = ">=4.0,<6.0" +sphinx = ">=6.0,<8.0" sphinx-basic-ng = "*" [[package]] @@ -1300,13 +1302,13 @@ files = [ [[package]] name = "identify" -version = "2.5.32" +version = "2.5.33" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.32-py2.py3-none-any.whl", hash = "sha256:0b7656ef6cba81664b783352c73f8c24b39cf82f926f78f4550eda928e5e0545"}, - {file = "identify-2.5.32.tar.gz", hash = "sha256:5d9979348ec1a21c768ae07e0a652924538e8bce67313a73cb0f681cf08ba407"}, + {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, + {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, ] [package.extras] @@ -1336,13 +1338,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.9.0" +version = "7.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.9.0-py3-none-any.whl", hash = "sha256:1c8dc6839ddc9771412596926f24cb5a553bbd40624ee2c7e55e531542bed3b8"}, - {file = "importlib_metadata-6.9.0.tar.gz", hash = "sha256:e8acb523c335a91822674e149b46c0399ec4d328c4d1f6e49c273da5ff0201b9"}, + {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, + {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, ] [package.dependencies] @@ -1468,20 +1470,17 @@ arrow = ">=0.15.0" [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "isosurfaces" @@ -1686,13 +1685,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.11.1" +version = "2.12.1" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.11.1-py3-none-any.whl", hash = "sha256:4b3a16e3ed16fd202588890f10b8ca589bd3e29405d128beb95935f059441373"}, - {file = "jupyter_server-2.11.1.tar.gz", hash = "sha256:fe80bab96493acf5f7d6cd9a1575af8fbd253dc2591aa4d015131a1e03b5799a"}, + {file = "jupyter_server-2.12.1-py3-none-any.whl", hash = "sha256:fd030dd7be1ca572e4598203f718df6630c12bd28a599d7f1791c4d7938e1010"}, + {file = "jupyter_server-2.12.1.tar.gz", hash = "sha256:dc77b7dcc5fc0547acba2b2844f01798008667201eea27c6319ff9257d700a6d"}, ] [package.dependencies] @@ -1722,13 +1721,13 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc [[package]] name = "jupyter-server-terminals" -version = "0.4.4" +version = "0.5.0" description = "A Jupyter Server Extension Providing Terminals." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, - {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, + {file = "jupyter_server_terminals-0.5.0-py3-none-any.whl", hash = "sha256:2fc0692c883bfd891f4fba0c4b4a684a37234b0ba472f2e97ed0a3888f46e1e4"}, + {file = "jupyter_server_terminals-0.5.0.tar.gz", hash = "sha256:ebcd68c9afbf98a480a533e6f3266354336e645536953b7abcc7bdeebc0154a3"}, ] [package.dependencies] @@ -1736,8 +1735,8 @@ pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} terminado = ">=0.8.3" [package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] [[package]] name = "jupyterlab" @@ -1969,6 +1968,14 @@ files = [ {file = "mapbox_earcut-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9af9369266bf0ca32f4d401152217c46c699392513f22639c6b1be32bde9c1cc"}, {file = "mapbox_earcut-1.0.1-cp311-cp311-win32.whl", hash = "sha256:ff9a13be4364625697b0e0e04ba6a0f77300148b871bba0a85bfa67e972e85c4"}, {file = "mapbox_earcut-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e736557539c74fa969e866889c2b0149fc12668f35e3ae33667d837ff2880d3"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fe92174410e4120022393013705d77cb856ead5bdf6c81bec614a70df4feb5d"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:082f70a865c6164a60af039aa1c377073901cf1f94fd37b1c5610dfbae2a7369"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43d268ece49d0c9e22cb4f92cd54c2cc64f71bf1c5e10800c189880d923e1292"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7748f1730fd36dd1fcf0809d8f872d7e1ddaa945f66a6a466ad37ef3c552ae93"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a82d10c8dec2a0bd9a6a6c90aca7044017c8dad79f7e209fd0667826f842325"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:01b292588cd3f6bad7d76ee31c004ed1b557a92bbd9602a72d2be15513b755be"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fce236ddc3a56ea7260acc94601a832c260e6ac5619374bb2cec2e73e7414ff0"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:1ce86407353b4f09f5778c436518bbbc6f258f46c5736446f25074fe3d3a3bd8"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:aa6111a18efacb79c081f3d3cdd7d25d0585bb0e9f28896b207ebe1d56efa40e"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2911829d1e6e5e1282fbe2840fadf578f606580f02ed436346c2d51c92f810b"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ff909a7b8405a923abedd701b53633c997cc2b5dc9d5b78462f51c25ec2c33"}, @@ -2022,13 +2029,13 @@ test = ["pytest"] [[package]] name = "markdown-it-py" -version = "2.2.0" +version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, - {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] @@ -2041,7 +2048,7 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -2189,21 +2196,21 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.3.5" +version = "0.4.0" description = "Collection of plugins for markdown-it-py" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mdit-py-plugins-0.3.5.tar.gz", hash = "sha256:eee0adc7195e5827e17e02d2a258a2ba159944a0748f59c5099a4a27f78fcf6a"}, - {file = "mdit_py_plugins-0.3.5-py3-none-any.whl", hash = "sha256:ca9a0714ea59a24b2b044a1831f48d817dd0c817e84339f20e7889f392d77c4e"}, + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, ] [package.dependencies] -markdown-it-py = ">=1.0.0,<3.0.0" +markdown-it-py = ">=1.0.0,<4.0.0" [package.extras] code-style = ["pre-commit"] -rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +rtd = ["myst-parser", "sphinx-book-theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -2301,35 +2308,31 @@ glcontext = ">=2.5.0,<3" [[package]] name = "moderngl-window" -version = "2.4.5" +version = "2.4.1" description = "A cross platform helper library for ModernGL making window creation and resource loading simple" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" files = [ - {file = "moderngl-window-2.4.5.tar.gz", hash = "sha256:2ee6e80b215ce4e7db5bef8d166010a3f2b9060449688652bfe06fa7c904d01b"}, - {file = "moderngl_window-2.4.5-py3-none-any.whl", hash = "sha256:4451c2b4508c6324c93319f1fee9874ac56ae0ae0c45f6b666b75e32731ebe26"}, + {file = "moderngl-window-2.4.1.tar.gz", hash = "sha256:691de764640b87af3d851257be544e1cafddb9cfa47cb144d0c1f1a0ed0a3936"}, + {file = "moderngl_window-2.4.1-py3-none-any.whl", hash = "sha256:5f2aaa6ae8d8a40fcd877febaf7494229c2bf1ef01d3fa9faa3a342075d4126a"}, ] [package.dependencies] moderngl = "<6" numpy = ">=1.16,<2" -Pillow = ">=10.0.1,<10.1.0" -pyglet = ">=2.0.0,<2.1.0" +Pillow = ">=5" +pyglet = ">=1.5.8,<2" pyrr = ">=0.10.3,<1" [package.extras] -dev = ["build", "coverage", "flake8", "mypy", "pytest", "pywavefront", "scipy", "trimesh"] -docs = ["Sphinx (>=7.2.6,<7.3.0)", "doc8", "sphinx-rtd-theme (>=1.3.0,<1.4.0)"] glfw = ["glfw"] -pdf = ["ReportLab (>=1.2)"] pygame = ["pygame (>=2.0.1)"] -pygame-ce = ["pygame-ce (>=2.0.1)"] pyqt5 = ["PyQt5"] pysdl2 = ["PySDL2"] pyside2 = ["PySide2 (<6)"] pywavefront = ["pywavefront (>=1.2.0,<2)"] tk = ["pyopengltk (>=0.0.3)"] -trimesh = ["trimesh (>=3.2.6,<4)"] +trimesh = ["scipy (>=1.3.2)", "trimesh (>=3.2.6,<4)"] [[package]] name = "multipledispatch" @@ -2355,29 +2358,29 @@ files = [ [[package]] name = "myst-parser" -version = "0.17.2" -description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." +version = "2.0.0" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, - {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, ] [package.dependencies] -docutils = ">=0.15,<0.18" +docutils = ">=0.16,<0.21" jinja2 = "*" -markdown-it-py = ">=1.0.0,<3.0.0" -mdit-py-plugins = ">=0.3.0,<0.4.0" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" pyyaml = "*" -sphinx = ">=3.1,<5" -typing-extensions = "*" +sphinx = ">=6,<8" [package.extras] -code-style = ["pre-commit (>=2.12,<3.0)"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] -testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions"] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4.2,<0.5.0)", "sphinx-book-theme (==1.0.0rc2)", "sphinx-copybutton", "sphinx-design2", "sphinx-pyscript", "sphinx-tippy (>=0.3.1)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.8.2,<0.9.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] [[package]] name = "nbclient" @@ -2403,13 +2406,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.11.0" +version = "7.12.0" description = "Converting Jupyter Notebooks" optional = true python-versions = ">=3.8" files = [ - {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, - {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, + {file = "nbconvert-7.12.0-py3-none-any.whl", hash = "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310"}, + {file = "nbconvert-7.12.0.tar.gz", hash = "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0"}, ] [package.dependencies] @@ -2638,13 +2641,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] @@ -2663,65 +2666,65 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.0.1" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] @@ -2730,13 +2733,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "4.0.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -2760,13 +2763,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.5.0" +version = "3.6.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, - {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, + {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, ] [package.dependencies] @@ -2792,13 +2795,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.41" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = true python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -2806,27 +2809,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.6" +version = "5.9.7" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, ] [package.extras] @@ -3000,13 +3003,13 @@ urllib3 = ">=1.26.0" [[package]] name = "pyglet" -version = "2.0.10" +version = "1.5.28" description = "Cross-platform windowing and multimedia library" optional = false python-versions = "*" files = [ - {file = "pyglet-2.0.10-py3-none-any.whl", hash = "sha256:e10a1f1a6a2dcfbf23155913746ff6fbf8ea18c5ee813b6d0e79d273bb2b3c18"}, - {file = "pyglet-2.0.10.zip", hash = "sha256:242beb1b3bd67c5bebdfe5ba11ec56b696ad86b50c6e7f2a317f8d783256b9c9"}, + {file = "pyglet-1.5.28-py3-none-any.whl", hash = "sha256:ea312a553c266a0f45a9c209f565e3c02371c83d89fd8931422c6475ce4ecbae"}, + {file = "pyglet-1.5.28.zip", hash = "sha256:68bff532226b0e8f54dfcc2f6df7d0e463b451fae97fe9fa4af4131d34afbc00"}, ] [[package]] @@ -3072,38 +3075,38 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyobjc-core" -version = "10.0" +version = "10.1" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-core-10.0.tar.gz", hash = "sha256:3dd0a7b3acd7e0b8ffd3f5331b29a3aaebe79a03323e61efeece38627a6020b3"}, - {file = "pyobjc_core-10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:61ea5112a672d21b5b0ed945778707c655b17c400672aef144705674c4b95499"}, - {file = "pyobjc_core-10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:99b72cda4593e0c66037b25a178f2bcc6efffb6d5d9dcd477ecca859a1f9ae8e"}, - {file = "pyobjc_core-10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2843ca32e86a01ccee67d7ad82a325ddd72d754929d1f2c0d96bc8741dc9af09"}, - {file = "pyobjc_core-10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a886b9d2a93210cab4ae72601ab005ca6f627fa2f0cc62c43c03ef1405067a11"}, - {file = "pyobjc_core-10.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:166666b5c380a49e8aa1ad1dda978c581e29a00703d82203216f3c65a3f397a4"}, - {file = "pyobjc_core-10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:198a0360f64e4c0148eed07b42d1de0545f56c498c356d1d5524422bb3352907"}, + {file = "pyobjc-core-10.1.tar.gz", hash = "sha256:1844f1c8e282839e6fdcb9a9722396c1c12fb1e9331eb68828a26f28a3b2b2b1"}, + {file = "pyobjc_core-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2a72a88222539ad07b5c8be411edc52ff9147d7cef311a2c849869d7bb9603fd"}, + {file = "pyobjc_core-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe1b9987b7b0437685fb529832876c2a8463500114960d4e76bb8ae96b6bf208"}, + {file = "pyobjc_core-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9f628779c345d3abd0e20048fb0e256d894c22254577a81a6dcfdb92c3647682"}, + {file = "pyobjc_core-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25a9e5a2de19238787d24cfa7def6b7fbb94bbe89c0e3109f71c1cb108e8ab44"}, + {file = "pyobjc_core-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2d43205d3a784aa87055b84c0ec0dfa76498e5f18d1ad16bdc58a3dcf5a7d5d0"}, + {file = "pyobjc_core-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0aa9799b5996a893944999a2f1afcf1de119cab3551c169ad9f54d12e1d38c99"}, ] [[package]] name = "pyobjc-framework-cocoa" -version = "10.0" +version = "10.1" description = "Wrappers for the Cocoa frameworks on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Cocoa-10.0.tar.gz", hash = "sha256:723421eff4f59e4ca9a9bb8ec6dafbc0f778141236fa85a49fdd86732d58a74c"}, - {file = "pyobjc_framework_Cocoa-10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:80c22a8fc7f085746d9cd222adeca8fe6790e3e6ad7eed5fc70b32aa87c10adb"}, - {file = "pyobjc_framework_Cocoa-10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0187cba228976a45f41116c74aab079b64bacb3ffc3c886a4bd8e472bf9be581"}, - {file = "pyobjc_framework_Cocoa-10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a81dabdc40268591e3196087388e680c6570fed1b521df9b04733cb3ece0414e"}, - {file = "pyobjc_framework_Cocoa-10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a23db9ab99e338e1d8a268d873cc15408f78cec9946308393ca2241820c18b8"}, - {file = "pyobjc_framework_Cocoa-10.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a3c66fe56a5156a818fbf056c589f8140a5fdb1dcb1f1075cb34d3755474d900"}, - {file = "pyobjc_framework_Cocoa-10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bf9020e85ead569021b15272dcd90207aab6c754093f520b11d4210a2efbdd06"}, + {file = "pyobjc-framework-Cocoa-10.1.tar.gz", hash = "sha256:8faaf1292a112e488b777d0c19862d993f3f384f3927dc6eca0d8d2221906a14"}, + {file = "pyobjc_framework_Cocoa-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e82c2e20b89811d92a7e6e487b6980f360b7c142e2576e90f0e7569caf8202b"}, + {file = "pyobjc_framework_Cocoa-10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0860a9beb7e5c72a1f575679a6d1428a398fa19ad710fb116df899972912e304"}, + {file = "pyobjc_framework_Cocoa-10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:34b791ea740e1afce211f19334e45469fea9a48d8fce5072e146199fd19ff49f"}, + {file = "pyobjc_framework_Cocoa-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1398c1a9bebad1a0f2549980e20f4aade00c341b9bac56b4493095a65917d34a"}, + {file = "pyobjc_framework_Cocoa-10.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:22be21226e223d26c9e77645564225787f2b12a750dd17c7ad99c36f428eda14"}, + {file = "pyobjc_framework_Cocoa-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0280561f4fb98a864bd23f2c480d907b0edbffe1048654f5dfab160cea8198e6"}, ] [package.dependencies] -pyobjc-core = ">=10.0" +pyobjc-core = ">=10.1" [[package]] name = "pyparsing" @@ -3334,104 +3337,104 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.1" +version = "25.1.2" description = "Python bindings for 0MQ" optional = true python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, ] [package.dependencies] @@ -3439,13 +3442,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.31.1" +version = "0.32.0" description = "JSON Referencing + Python" optional = true python-versions = ">=3.8" files = [ - {file = "referencing-0.31.1-py3-none-any.whl", hash = "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d"}, - {file = "referencing-0.31.1.tar.gz", hash = "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec"}, + {file = "referencing-0.32.0-py3-none-any.whl", hash = "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99"}, + {file = "referencing-0.32.0.tar.gz", hash = "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161"}, ] [package.dependencies] @@ -3531,110 +3534,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.13.2" +version = "0.15.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = true python-versions = ">=3.8" files = [ - {file = "rpds_py-0.13.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d"}, - {file = "rpds_py-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266"}, - {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea"}, - {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1"}, - {file = "rpds_py-0.13.2-cp310-none-win32.whl", hash = "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc"}, - {file = "rpds_py-0.13.2-cp310-none-win_amd64.whl", hash = "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd"}, - {file = "rpds_py-0.13.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad"}, - {file = "rpds_py-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0"}, - {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e"}, - {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d"}, - {file = "rpds_py-0.13.2-cp311-none-win32.whl", hash = "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7"}, - {file = "rpds_py-0.13.2-cp311-none-win_amd64.whl", hash = "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211"}, - {file = "rpds_py-0.13.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381"}, - {file = "rpds_py-0.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2"}, - {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7"}, - {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60"}, - {file = "rpds_py-0.13.2-cp312-none-win32.whl", hash = "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d"}, - {file = "rpds_py-0.13.2-cp312-none-win_amd64.whl", hash = "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27"}, - {file = "rpds_py-0.13.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1"}, - {file = "rpds_py-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca"}, - {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66"}, - {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b"}, - {file = "rpds_py-0.13.2-cp38-none-win32.whl", hash = "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab"}, - {file = "rpds_py-0.13.2-cp38-none-win_amd64.whl", hash = "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1"}, - {file = "rpds_py-0.13.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c"}, - {file = "rpds_py-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0"}, - {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0"}, - {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468"}, - {file = "rpds_py-0.13.2-cp39-none-win32.whl", hash = "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c"}, - {file = "rpds_py-0.13.2-cp39-none-win_amd64.whl", hash = "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21"}, - {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007"}, - {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9"}, - {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31"}, - {file = "rpds_py-0.13.2.tar.gz", hash = "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f"}, + {file = "rpds_py-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:661afef2dd62aef67726b3b735ae6a93cc3cb24eb97807d0c812c6369e5e376b"}, + {file = "rpds_py-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3742bd1712ed81daa22d871d41c61b8b204ceed78d40e3b914521d41f71b5d10"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba335d9042eea8ca80be16388d4240d27cacba158710912b65f895b4e396b80a"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8303c48c895c0eb222a3c430473e96b6ef17bbafdc5308bef3c0f53353aba7f"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62aee30ddaaf5e5f7cc3aede3e74fc3cc02ee40fef564b7af0c944e91e2c8a9c"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a920897c0fc1e95c7d80d8b21008860f135673ef7e4b711181f76929c834dfa9"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0e667e9c3128b450f163f172abef615eb27b2ee872a590d58c6409139aa0515"}, + {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b20d2233d663576affe82f1c968e8ce40e5c22c1aaf1e41529c678b309cc47c"}, + {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:37b4f175243cfc31e53b3600820ff89afd8c9c8d32de17008c3889ac2021fac7"}, + {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:028d8d294f8378815f559f5af24bc76edd87f57e6252c3d967c6e41a8628ca3b"}, + {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1c488bafe4a94b94a19b4b18af6cb1adac3f46be88164589722d226e23296844"}, + {file = "rpds_py-0.15.1-cp310-none-win32.whl", hash = "sha256:191c6ca4cbe8470bc908524885b99096f68a4da411f7c9bccb3c63b2e897efb9"}, + {file = "rpds_py-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:6002ae0c87fa23cb4cb6bb40f1a9a65efdbb6e20e1ef4dba96a0138ffb82f541"}, + {file = "rpds_py-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac785eff95fe372f9fe0c689613cbbd42d6e0ec467b2782d67f15200c4eb3072"}, + {file = "rpds_py-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec0bc6b2cf5541ed9b016a83f18859c9befdb344fa6abefba960586c98817097"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4288f433bb32fb4a2ddf84c426a0239991cd57597c9e8931a5f66fc8cd18e"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b24c1e528c7828f6953ed052c4b96e4ddf5eb9af4336341110d50417595ea2de"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:802f08d0fe351b2cdb444056b12d221841dbcdaa061cfaaa173495cb6d95efdd"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab777de9b417952da5b69672f8af32c0dbcfbcd488b05a906bcff851316e6842"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e80c4f95acd8532646b2d639f41c56d9b916dc59fc2f1dd88e4207ec10350d1"}, + {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3bb5bab9eb6ba54703cab4b3c00dc4e283ed69ded97d1e66525735bb650c07e"}, + {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91a570f5ba8bf1c37e228ce324495864c392fb6417d2215c87a32f26131062ca"}, + {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2bf1d79a9f6ff14fbcce1eb14fb522be62cef95714de43a30c13eaa4dcd8543a"}, + {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54741ef569d17c83303563327083f44fb3a0031a5b2e7f4565bc255e5471b3f0"}, + {file = "rpds_py-0.15.1-cp311-none-win32.whl", hash = "sha256:6b6be91597fdbd2a38dac5f82d35a53c994a533e7f8dcd4e4560f1f1250252f3"}, + {file = "rpds_py-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:bf802de209a7ae6a4756dac0ac529770bc9b9db2ff8b139c587542733a81d633"}, + {file = "rpds_py-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f87eb9e65ab6f06fdf1eba17362dcb88b7cfb73a037fb0a7af3d41ab606b5e15"}, + {file = "rpds_py-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:268e87d14400019c9bc3f4adfe6ef4f9e7f14a94d61aa376fb3cd093828bfb89"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f9d5bbb165a7fb285f2653e81f2615124c09936b0ef986531f7f18f79b0cc"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:affa82d8b0d339107f9cf463fe6b8dafbee34fb21340f0c268825b7831208323"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d239cc63b5ab9bf019d8b6d9e9792d8858cadef9e7f79308660527cd36243a76"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5a63f5da4c0923c64a2804c80771d6ad80b1098f85796f9d56e551d602daaca"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a4015c71606616356101944785e52acf14880b6cdf6c55bad9ff8f76c09e5c"}, + {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:025dddb8905b8f79b17330382b15bd536f32ef2d3bc40fa91f2bf000a375f92f"}, + {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fde598ff95bc65b278c443100e1c757ea918a9f791f4af38e757084d7d575f03"}, + {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f255de5fde1c88bc6bdc091280edff3c9d213212a231c1d97889dfbe0baccf0b"}, + {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63d0b2ac55f3658e3a279ffa1bdd1118841b6e31424238bd28c60ab4aecc63c9"}, + {file = "rpds_py-0.15.1-cp312-none-win32.whl", hash = "sha256:caf72fb89fd09f621b04fbd473603a0b22c8e09adaafd2319735486dcb1cc3eb"}, + {file = "rpds_py-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:17c44011019e014b468939692ccf3fd57291f825ef0ad00ab092dba458fa14c4"}, + {file = "rpds_py-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cb33b492e06e2afb4535fcdbc5e8a0ec952440b736c1dd8e17808bbfb164fba4"}, + {file = "rpds_py-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a35fde2bc8d4b5088eb3eae83a473c779ecfc4a38e5e6c4ae684b03622a5168"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ddacbb45c54f5b2c1e99393229a67bbacbbfece7340f7b7422dff5f0ec70559"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f3d1cfd5a5e513630f5b30daee5fd08092fa44bc28da23e8be4a582bb900230"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4334405b673e97f2600b0c259186b03450f78b9c415687bd848fc6fd4626041"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b1286e1045c2abc71c12b90d1cfd606f33a97d871a3a8fb1eb9a96e0cb7641"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a6a72c54c4c85e9e6b96c6a058ad1102879395cb8cc3c418228d2bac5b0a06"}, + {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c44319819fcf536e25ac707e2221449f3d90bbf6f74ec6bf62a3e084a55e03d"}, + {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ff2195a037b04193f65725de96c860e031a0976f396293b234381b80e67be62e"}, + {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3eae6feb2e14bffaf7cd418784c53dc897b86bc78abfe4d61f2ce9a84e4aecba"}, + {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c7c9bec29b6112ee09797d5a9b68837b9f6d4945fd4dc1066293a89a5f1c1ed"}, + {file = "rpds_py-0.15.1-cp38-none-win32.whl", hash = "sha256:b93ac65cfdb4e878c3869e15c684dbdc50210d6f2fbbd0f5997dd7a9cbf8bd14"}, + {file = "rpds_py-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:ae7b02f93918ddd2ea1061411034eb48d503365b5e4c00abb515ec36c58cd25d"}, + {file = "rpds_py-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d13d2015a42d785902e594da4ed1eff946aa77196c9fe5c254036e163122510d"}, + {file = "rpds_py-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cabcc98f5513365b0182d12c6e63a320a5efda93f290a4fa9d3b38c538254c82"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace2e662a6f977d707bbb5e4c1b9f52541786f55bf18647862b55819bbb4e7ee"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c14d87ed0778d2e03cf091a6ea8a7c92eb6c9a5116b087d45ffee63bb20b87c2"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a608c54ece2751c823b1b1e1c6db2f077916ef5a51a6e080448efd8786e6c48d"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0135ff4927cb641ca2021a490629e757e51c558f8201d5f10dc171dda522cd1e"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6433ac53339ae7f0b498ccb0ba76a03c6ef040e4e0a2e500f5e091c4533071b"}, + {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3eea0d98e342de862fbeacc0198477eb8ce7a42915cac22be645bc7c2a7def1e"}, + {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:967b73b36aff6d2989f94592ecbf2b58d6251e9d960ba872b75d0c2f6f835d8d"}, + {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49bd96b50b194803f0cd08fc9c9905abe0099ef64d088e1006053191541b97ac"}, + {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2b25a734fad3011d4a4e355d5c208603f44c5e4c69986abaaf78f3e21adefc71"}, + {file = "rpds_py-0.15.1-cp39-none-win32.whl", hash = "sha256:0b8ee0fa3e1d69f7167d7497e27bbaf8fb795cfc7a3fdc313ddc370e29e2dec2"}, + {file = "rpds_py-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:e58e109cb356c2a45d304ea2551251881ffab3a1a06e083e2d68e4538c9d6ad5"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:03add8c266d9b0d075800b7f1219d0e5a3097cd65d268edb77a02694567a2f86"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c0ccfac1a87dd935e630603ad26190a746b8dc2f0f974e741ff0d7d91fefdbd6"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cc956ee19f967b7f0b067b6ab19b1a803f04f3574b2f0e02454505a16ffb8fd"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c53e4b4623c40a91c8f5fa03b5f599e12e87e21c6eb42231a7dbd4db62cd1997"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bdefdc81d90ed47e893717a6781ba952460f2eb08d23ef872e49cf3c97daa5d"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f68f28453e111fe2498414d875f7c25dd906b407ba6f28e81a5ac7e8740163e"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acbeb714db0b723300b0f1053487c28a88aa909874e56c49a27e62499e6b3857"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0a4c3a748e3489def155b1bcc688299ef97d2c1e2e73cc653b3b7c389f2b0c3"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ce73155bc13e0801db281ab38371ea1c34cb11adcba11ffef232fa9f954eeee6"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:238a2be15c00c462c5d1e2d39912828b6c16267e46837badc650c90ac8269669"}, + {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc4f4803e117be3e5032cfc621a3852ad07bd135ec4046c5284667e3d2f6ec7e"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0697ca8b26a4122e7ce7584578c4f1cfe095511c4fc173b75743e63bf4dfa7ea"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1566606cd25c1b68db675a233f43e8064f2468d6552fc5c10cbe7b77cd0292f3"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2326f846009cb7d3e199b3a3e30e36651d42cc464750b9fd298098d487c3fed"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b3e4960adc1e34e554e05ef0540e5c6d0bbdd986bb221d5ba6aabefa0ec6fdd"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d104d9dec9b28904f57ee7903e2707abda0983a65b74ff677c332f64beda5100"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d656a9dbb10dc5f3258c07d671582d081881641328529002674cf2bd33b2beb7"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c202371d9d90eccfe6056bd4206c0633c979e941a026d2893ffacc6ae0f8d49"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68eaa19f67ba9c87faf0a9e03b3d5c5c8507e7e8869ef3ab797b1f438423b784"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b3d85cd1096830ddbc31e7aeca8fd0f290a30b8a008d5603b2b0b0424a097da5"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:6098a1cb5fc841097a27fb130ee3194fe3ec5f8fc5fa427f6b991541241f8913"}, + {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:783240e9c58ff5fb9c4b45cd7953e72870a6dd8c2e65b8975a3b03536b2191e6"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dad949d2dfddb3b08f15d6801e453373ceb1123d3b79df76c2cbe678528e4c42"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:739699de9042d98eea7999a6d760ea45bbf8b63ce43c6406e060e76e735c7a02"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b35664e9abe8430018c69cd0f4434b118e283eb1a98fd298b87242f693a660"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0273b0f088aedc22b5717890d7a17b26791ab02968241830102f91932130473"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:154c8e6c8aa67d7f3f04165ae72fceef02bbedf5b3ab1143213789c570869c48"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b4eeeb90959bc3804fcde37ebed834a6502591d1aa34b95e5617e7a4f9aed6"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b4677b1c30e4cd44a995ad9ee2441dcd396b0d5bc0d981d0fb3176a8cf9c316"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d33e68fcb3163575bf80071c4fec70238be66fb1111bad2088f5792efcb100"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1c0dd3fecd4e47e1b1d63fc39074d0c5a22f963eb2b69835e357efba5c66deac"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8f9141b4fefc63aea19e045792f1e01acb877205faa5e9fda561e4c79f061623"}, + {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e64c6bcbf9e53bd40fb27890754378fa8f40215e2964b75e6a66d04dbc10fb63"}, + {file = "rpds_py-0.15.1.tar.gz", hash = "sha256:1e1068c4501f505ecf49234dd7dfb8ab80b92063474fa550febe532dc301887e"}, ] [[package]] @@ -3834,38 +3837,38 @@ files = [ [[package]] name = "sphinx" -version = "4.5.0" +version = "7.2.6" description = "Python documentation generator" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.21" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools (>=67.0)"] [[package]] name = "sphinx-basic-ng" @@ -3904,45 +3907,54 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.4" +version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, + {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, + {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, + {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.1" +version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, + {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, + {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] @@ -3977,43 +3989,49 @@ Sphinx = ">=1.7.0" [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, + {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, + {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, ] +[package.dependencies] +Sphinx = ">=5" + [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxext-opengraph" -version = "0.9.0" +version = "0.9.1" description = "Sphinx Extension to enable OGP support" optional = false python-versions = ">=3.8" files = [ - {file = "sphinxext-opengraph-0.9.0.tar.gz", hash = "sha256:4e57e25b6d56f47b9c06a5a5d68a2a00ed3577c8a39e459b52118c6bfe5e8c8b"}, - {file = "sphinxext_opengraph-0.9.0-py3-none-any.whl", hash = "sha256:ab1eb2ffb531fb85b695e719dba7b0245b0643f6b6c0d1cc258d15a81e72a9f1"}, + {file = "sphinxext-opengraph-0.9.1.tar.gz", hash = "sha256:dd2868a1e7c9497977fbbf44cc0844a42af39ca65fe1bb0272518af225d06fc5"}, + {file = "sphinxext_opengraph-0.9.1-py3-none-any.whl", hash = "sha256:b3b230cc6a5b5189139df937f0d9c7b23c7c204493b22646273687969dcb760e"}, ] [package.dependencies] @@ -4236,13 +4254,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] @@ -4373,13 +4391,13 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.4" +version = "1.7.0" description = "WebSocket client for Python with low level API options" optional = true python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.4.tar.gz", hash = "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df"}, - {file = "websocket_client-1.6.4-py3-none-any.whl", hash = "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24"}, + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, ] [package.extras] @@ -4488,4 +4506,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "2bf6de26bc264eac94f604bcce74a2cbe0b6de7ffc48238e8e25bb1136e58dde" +content-hash = "fc2e7de5129058e854e871803fb4a18aef41e73a192c8b44236c9799ab09b0d8" diff --git a/pyproject.toml b/pyproject.toml index 82bc1f00be..1ba36a47b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,11 +69,11 @@ flake8-docstrings = "^1.7.0" flake8-pytest-style = "^1.7.2" flake8-simplify = "^0.14.1" flake8-rst-docstrings = "^0.3.0" -furo = "^2022.06.21" +furo = "^2023.09.10" gitpython = "^3" isort = "^5.12.0" matplotlib = "^3.8.2" -myst-parser = "^0.17.2" +myst-parser = "^2.0.0" pre-commit = "^3.5.0" psutil = {version = "^5.8.0", python = "<3.10"} psutil-wheels = {version = "5.8.0", python = ">=3.10"} @@ -81,10 +81,10 @@ pytest = "^7.4.3" pygithub = "^2.1.1" pytest-cov = "^4.1.0" pytest-xdist = "^2.2" # Using latest gives flaky tests -Sphinx = "^4" +Sphinx = "^7.2.6" sphinx-copybutton = "^0.5.2" sphinxcontrib-programoutput = "^0.17" -sphinxext-opengraph = "^0.9.0" +sphinxext-opengraph = "^0.9.1" types-decorator = "^0.1.7" types-Pillow = "^10.1.0.2" types-Pygments = "^2.17.0.0" From 5dc5e0c67179ada78b03ca48c86564b87ebf2917 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 20 Dec 2023 02:14:19 +0100 Subject: [PATCH 07/30] Changed vertical bars to Unions --- manim/typing.py | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index ca6d50c4cd..8945ea3c3b 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -166,7 +166,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D: TypeAlias = InternalPoint2D | Tuple[float, float] +Point2D: TypeAlias = Union[InternalPoint2D, Tuple[float, float]] """`shape (2,)` A 2D point: `[float, float]` """ @@ -177,7 +177,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D_Array: TypeAlias = InternalPoint2D_Array | Tuple[Point2D, ...] +Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, Tuple[Point2D, ...]] """`shape (N, 2)` An array of Point2D objects: `[[float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -189,7 +189,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D: TypeAlias = InternalPoint3D | Tuple[float, float, float] +Point3D: TypeAlias = Union[InternalPoint3D, Tuple[float, float, float]] """`shape (3,)` A 3D point: `[float, float, float]` """ @@ -200,7 +200,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D_Array: TypeAlias = InternalPoint3D_Array | Tuple[Point3D, ...] +Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, Tuple[Point3D, ...]] """`shape (N, 3)` An array of Point3D objects: `[[float, float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -208,51 +208,51 @@ # Vector Types -Vector2: TypeAlias = npt.NDArray[PointDType] | Tuple[float, float] +Vector2: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, float]] """`shape (2,)` A 2D vector: `[float, float]` """ -Vector3: TypeAlias = npt.NDArray[PointDType] | Tuple[float, float, float] +Vector3: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, float, float]] """`shape (3,)` A 3D vector: `[float, float, float]` """ -Vector: TypeAlias = npt.NDArray[PointDType] | Tuple[float, ...] +Vector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, ...]] """`shape (N,)` An `N`-D vector: `[float, ...]` """ -RowVector: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float, ...]] +RowVector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float, ...]]] """`shape (1, N)` A row vector: `[[float, ...]]` """ -ColVector: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float], ...] +ColVector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float], ...]] """`shape (N, 1)` A column vector: `[[float], [float], ...]` """ -MatrixMN: TypeAlias = npt.NDArray[PointDType] | Tuple[Tuple[float, ...], ...] +MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float, ...], ...]] """`shape (M, N)` A matrix: `[[float, ...], [float, ...], ...]` """ -Zeros: TypeAlias = npt.NDArray[ManimFloat] | Tuple[Tuple[Literal[0], ...], ...] +Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], Tuple[Tuple[Literal[0], ...], ...]] """A matrix of zeros, typically created with ``numpy.zeros((M, N))``""" # Bezier Types -QuadraticBezierPoints: TypeAlias = ( - npt.NDArray[PointDType] | Tuple[Point3D, Point3D, Point3D] -) +QuadraticBezierPoints: TypeAlias = Union[ + npt.NDArray[PointDType], Tuple[Point3D, Point3D, Point3D] +] """`shape (3, 3)` A `Point3D_Array` of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]` """ -QuadraticBezierPoints_Array: TypeAlias = ( - npt.NDArray[PointDType] | Tuple[QuadraticBezierPoints, ...] -) +QuadraticBezierPoints_Array: TypeAlias = Union[ + npt.NDArray[PointDType], Tuple[QuadraticBezierPoints, ...] +] """`shape (N, 3, 3)` An array of `N QuadraticBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]` """ @@ -271,16 +271,16 @@ (Please refer to the documentation of the function you are using for further type information.) """ -CubicBezierPoints: TypeAlias = ( - npt.NDArray[PointDType] | Tuple[Point3D, Point3D, Point3D, Point3D] -) +CubicBezierPoints: TypeAlias = Union[ + npt.NDArray[PointDType], Tuple[Point3D, Point3D, Point3D, Point3D] +] """`shape (4, 3)` A `Point3D_Array` of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]` """ -CubicBezierPoints_Array: TypeAlias = ( - npt.NDArray[PointDType] | Tuple[CubicBezierPoints, ...] -) +CubicBezierPoints_Array: TypeAlias = Union[ + npt.NDArray[PointDType], Tuple[CubicBezierPoints, ...] +] """`shape (N, 4, 3)` An array of `N CubicBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]` """ @@ -306,7 +306,7 @@ (Please refer to the documentation of the function you are using for further type information.) """ -BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] | Tuple[BezierPoints, ...] +BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], Tuple[BezierPoints, ...]] """`shape (N, PPC, 3)` An array of `N BezierPoints` objects containing `PPC Point3D` objects each: `[[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -327,7 +327,7 @@ (Please refer to the documentation of the function you are using for further type information.) """ -FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] | Tuple[float, ...] +FlatBezierPoints: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, ...]] """`shape (N)` A flattened array of Bézier control points: `[float, ...]` """ From 232df18e3a99d9b2f69afe8aec7f174f523ccb10 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 20 Dec 2023 02:35:24 +0100 Subject: [PATCH 08/30] Updated poetry.lock --- poetry.lock | 513 ++++++++++++++++++++++++++-------------------------- 1 file changed, 253 insertions(+), 260 deletions(-) diff --git a/poetry.lock b/poetry.lock index 85562cca54..1c554dc1fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -15,7 +15,7 @@ files = [ name = "anyio" version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, @@ -48,7 +48,7 @@ files = [ name = "argon2-cffi" version = "23.1.0" description = "Argon2 for Python" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, @@ -68,7 +68,7 @@ typing = ["mypy"] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, @@ -105,7 +105,7 @@ tests = ["pytest"] name = "arrow" version = "1.3.0" description = "Better dates & times for Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, @@ -263,7 +263,7 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, @@ -710,69 +710,62 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.0.6" +version = "3.0.7" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Cython-3.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fcdfbf6fc7d0bd683d55e617c3d5a5f25b28ce8b405bc1e89054fc7c52a97e5"}, - {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccbee314f8d15ee8ddbe270859dda427e1187123f2c7c41526d1f260eee6c8f7"}, - {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b992f36ffa1294921fca5f6488ea192fadd75770dc64fa25975379382551e9"}, - {file = "Cython-3.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2e90a75d405070f3c41e701bb8005892f14d42322f1d8fd00a61d660bbae7"}, - {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4121c1160bc1bd8828546e8ce45906bd9ff27799d14747ce3fbbc9d67efbb1b8"}, - {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:519814b8f80869ee5f9ee2cb2363e5c310067c0298cbea291c556b22da1ef6ae"}, - {file = "Cython-3.0.6-cp310-cp310-win32.whl", hash = "sha256:b029d8c754ef867ab4d67fc2477dde9782bf0409cb8e4024a7d29cf5aff37530"}, - {file = "Cython-3.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:2262390f453eedf600e084b074144286576ed2a56bb7fbfe15ad8d9499eceb52"}, - {file = "Cython-3.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfe8c7ac60363769ed8d91fca26398aaa9640368ab999a79b0ccb5e788d3bcf8"}, - {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e31a9b18ec6ce57eb3479df920e6093596fe4ba8010dcc372720040386b4bdb"}, - {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca2542f1f34f0141475b13777df040c31f2073a055097734a0a793ac3a4fb72"}, - {file = "Cython-3.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c1c38dad4bd85e142ccbe2f88122807f8d5a75352321e1e4baf2b293df7c6"}, - {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc4b4e76c1414584bb55465dfb6f41dd6bd27fd53fb41ddfcaca9edf00c1f80e"}, - {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:805a2c532feee09aeed064eaeb7b6ee35cbab650569d0a3756975f3cc4f246cf"}, - {file = "Cython-3.0.6-cp311-cp311-win32.whl", hash = "sha256:dcdb9a177c7c385fe0c0709a9a6790b6508847d67dcac76bb65a2c7ea447efe5"}, - {file = "Cython-3.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:b8640b7f6503292c358cef925df5a69adf230045719893ffe20ad98024fdf7ae"}, - {file = "Cython-3.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:16b3b02cc7b3bc42ee1a0118b1465ca46b0f3fb32d003e6f1a3a352a819bb9a3"}, - {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11e1d9b153573c425846b627bef52b3b99cb73d4fbfbb136e500a878d4b5e803"}, - {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a7a406f78c2f297bf82136ff5deac3150288446005ed1e56552a9e3ac1469f"}, - {file = "Cython-3.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88be4fbc760de8f313df89ca8256098c0963c9ec72f3aa88538384b80ef1a6ef"}, - {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea2e5a7c503b41618bfb10e4bc610f780ab1c729280531b5cabb24e05aa21cf2"}, - {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d296b48e1410cab50220a28a834167f2d7ac6c0e7de12834d66e42248a1b0f6"}, - {file = "Cython-3.0.6-cp312-cp312-win32.whl", hash = "sha256:7f19e99c6e334e9e30dfa844c3ca4ac09931b94dbba406c646bde54687aed758"}, - {file = "Cython-3.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:9cae02e26967ffb6503c6e91b77010acbadfb7189a5a11d6158d634fb0f73679"}, - {file = "Cython-3.0.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cb6a54543869a5b0ad009d86eb0ebc0879fab838392bfd253ad6d4f5e0f17d84"}, - {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d2d9e53bf021cc7a5c7b6b537b5b5a7ba466ba7348d498aa17499d0ad12637e"}, - {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d15854b2b363b35c755d22015c1c2fc590b8128202f8c9eb85578461101d9c"}, - {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5548316497a3b8b2d9da575ea143476472db90dee73c67def061621940f78ae"}, - {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9b853e0855e4b3d164c05b24718e5e2df369e5af54f47cb8d923c4f497dfc92c"}, - {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2c77f97f462a40a319dda7e28c1669370cb26f9175f3e8f9bab99d2f8f3f2f09"}, - {file = "Cython-3.0.6-cp36-cp36m-win32.whl", hash = "sha256:3ac8b6734f2cad5640f2da21cd33cf88323547d07e445fb7453ab38ec5033b1f"}, - {file = "Cython-3.0.6-cp36-cp36m-win_amd64.whl", hash = "sha256:8dd5f5f3587909ff71f0562f50e00d4b836c948e56e8f74897b12f38a29e41b9"}, - {file = "Cython-3.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9c0472c6394750469062deb2c166125b10411636f63a0418b5c36a60d0c9a96a"}, - {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97081932c8810bb99cb26b4b0402202a1764b58ee287c8b306071d2848148c24"}, - {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e781b3880dfd0d4d37983c9d414bfd5f26c2141f6d763d20ef1964a0a4cb2405"}, - {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef88c46e91e21772a5d3b6b1e70a6da5fe098154ad4768888129b1c05e93bba7"}, - {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a38b9e7a252ec27dbc21ee8f00f09a896e88285eebb6ed99207b2ff1ea6af28e"}, - {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4975cdaf720d29288ec225b76b4f4471ff03f4f8b51841ba85d6587699ab2ad5"}, - {file = "Cython-3.0.6-cp37-cp37m-win32.whl", hash = "sha256:9b89463ea330318461ca47d3e49b5f606e7e82446b6f37e5c19b60392439674c"}, - {file = "Cython-3.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:0ca8f379b47417bfad98faeb14bf8a3966fc92cf69f8aaf7635cf6885e50d001"}, - {file = "Cython-3.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3dda1e80eb577b9563cee6cf31923a7b88836b9f9be0043ec545b138b95d8e8"}, - {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e34e9a96f98c379100ef4192994a311678fb5c9af34c83ba5230223577581"}, - {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:345d9112fde4ae0347d656f58591fd52017c61a19779c95423bb38735fe4a401"}, - {file = "Cython-3.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25da0e51331ac12ff16cd858d1d836e092c984e1dc45d338166081d3802297c0"}, - {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:eebbf09089b4988b9f398ed46f168892e32fcfeec346b15954fdd818aa103456"}, - {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e3ed0c125556324fa49b9e92bea13be7b158fcae6f72599d63c8733688257788"}, - {file = "Cython-3.0.6-cp38-cp38-win32.whl", hash = "sha256:86e1e5a5c9157a547d0a769de59c98a1fc5e46cfad976f32f60423cc6de11052"}, - {file = "Cython-3.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:0d45a84a315bd84d1515cd3571415a0ee0709eb4e2cd4b13668ede928af344a7"}, - {file = "Cython-3.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a8e788e64b659bb8fe980bc37da3118e1f7285dec40c5fb293adabc74d4205f2"}, - {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a77a174c7fb13d80754c8bf9912efd3f3696d13285b2f568eca17324263b3f7"}, - {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074e84752cd0daf3226823ddbc37cca8bc45f61c94a1db2a34e641f2b9b0797"}, - {file = "Cython-3.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49d5cae02d56e151e1481e614a1af9a0fe659358f2aa5eca7a18f05aa641db61"}, - {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b94610fa49e36db068446cfd149a42e3246f38a4256bbe818512ac181446b4b"}, - {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fabb2d14dd71add618a7892c40ffec584d1dae1e477caa193778e52e06821d83"}, - {file = "Cython-3.0.6-cp39-cp39-win32.whl", hash = "sha256:ce442c0be72ab014c305399d955b78c3d1e69d5a5ce24398122b605691b69078"}, - {file = "Cython-3.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:8a05f79a0761fc76c42e945e5a9cb5d7986aa9e8e526fdf52bd9ca61a12d4567"}, - {file = "Cython-3.0.6-py2.py3-none-any.whl", hash = "sha256:5921a175ea20779d4443ef99276cfa9a1a47de0e32d593be7679be741c9ed93b"}, - {file = "Cython-3.0.6.tar.gz", hash = "sha256:399d185672c667b26eabbdca420c98564583798af3bc47670a8a09e9f19dd660"}, + {file = "Cython-3.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3c0e19bb41de6be9d8afc85795159ca16296be81a586cd9588be0400d44a855"}, + {file = "Cython-3.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e8bf00ec1dd1d92e9ae74d2e6891f087a939e1dfb40c9c7fa5d8d6a26c94f5a"}, + {file = "Cython-3.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd6ae43ef2e596c9a88dbf2a8895be2e32cc2f5bc3c8ba2e7753b69068fc0b2d"}, + {file = "Cython-3.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f674be92673e87dd8ee7cfe553d5960ec4effc5ab15063b9a5e265a51585a31a"}, + {file = "Cython-3.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:861cf254bf5836d47c2aee86aa75dd93d3de00ccd1b077c3c7a2bb22cba358e7"}, + {file = "Cython-3.0.7-cp310-cp310-win32.whl", hash = "sha256:f6d8ff62ad55dc0393686438eac4b457a916e4d1118a0b550746bb52b4c756cc"}, + {file = "Cython-3.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:e13abb14843397b76d0472c7d33cd260d5f262ab05cc27ed423317e645e29643"}, + {file = "Cython-3.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c636c9ab92c7838231a1ba769e519d953af8294612f3f772a54d3a5250ff23f"}, + {file = "Cython-3.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22d2a684122dfb531853d57c8c85c1d5d44be709e12466dca99fa6aee7d8054f"}, + {file = "Cython-3.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1bdf8a107fdf9e174991aa87a0be7504f60de1ec6bfb1ccfb30e33acac818a0"}, + {file = "Cython-3.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a83e04fde663b84905f3a20213a4333d13a07b79434300704b70dc552761f8b"}, + {file = "Cython-3.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e34b4b08d795ccca920fa26b099558f4f1e4e3f794e4ba8d3433c5bc2454d50a"}, + {file = "Cython-3.0.7-cp311-cp311-win32.whl", hash = "sha256:133057ac45b6fa7fe5d7baada9d3545d09339432f75c0545f556e8c6fecc2932"}, + {file = "Cython-3.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:b65abca78aa5ebc8675c8480b9a53006f6efea9910ad099cf32c9fb5617ef251"}, + {file = "Cython-3.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ceac5315fe899c229e874328742154e331fa41337bb03f6f5264636c351c9e"}, + {file = "Cython-3.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea936cf5931297ba07bce121388c4c6266c1b63a9f4d648ae16c92ff090204b"}, + {file = "Cython-3.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fcd9a18ee3ac7f460e0841954feb495102ffbdbec0e6c78562f3495cda000dd"}, + {file = "Cython-3.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7c8d579d13cb81abe704c8b0908d122b81d6e2623265a19c4a6a7377f440debb"}, + {file = "Cython-3.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ef5bb0268bfe5992da3ef9292463a5a895ed8700b134ed2c00008d5471b3ba6e"}, + {file = "Cython-3.0.7-cp312-cp312-win32.whl", hash = "sha256:55f93d3822bc196b37a8bdfa4ec6a35232a399e97f2baa714bd5ed8ea9b0ce68"}, + {file = "Cython-3.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:f3845c4506e0d207c5e268fb02813928f3a1e135de954a379f165ef0d581da47"}, + {file = "Cython-3.0.7-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ad7c2303a338b2c0b6c6c68f101a6768725934538756096cf3388a5c07a7525"}, + {file = "Cython-3.0.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed25959e4025870fdde5f895fcb126196d22affd4f4fad85a2823e0dddc85b0"}, + {file = "Cython-3.0.7-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79868ec74e4907a8a6e63effe13547c6157f196a162920b1de066da5849ffb8e"}, + {file = "Cython-3.0.7-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5e3a038332973b12e72236e8884dc99601a840334c2c46cfbbb5851cb94166eb"}, + {file = "Cython-3.0.7-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f2602a5c97a3d618b3b847514204ef3349fb414c59e1126c0c2c708d2c5680f8"}, + {file = "Cython-3.0.7-cp36-cp36m-win32.whl", hash = "sha256:539ad5a21141e6420035cf616bcba48d999bf878839e52692f97fc7e2f16265c"}, + {file = "Cython-3.0.7-cp36-cp36m-win_amd64.whl", hash = "sha256:848a28ea49166454c3bff927e5a47629eecf1aa755d6fb3290569cba0fc93766"}, + {file = "Cython-3.0.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82f27a0134fc6bb46032ca5f728d8af984f3be94a3cb01cb70ff1224e551b9cf"}, + {file = "Cython-3.0.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f20c61114c7948cf1214585066406cef4b54a9b935160980e0b6e70ada3a69"}, + {file = "Cython-3.0.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d51709e10ad6213b4bf094af7be7ff82bab43216b3c92a07d05b451deeca79"}, + {file = "Cython-3.0.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3f02c7240abab48d59f0d5fef7064f18f01a2a204616165fa6367a8abf5a8832"}, + {file = "Cython-3.0.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:225f8bba6428b8d711ca2d6c738d2e3a4667f6a2ae40f8a7a5256f69f6a3600e"}, + {file = "Cython-3.0.7-cp37-cp37m-win32.whl", hash = "sha256:30eb2d2938b9195e2c82951713429aff3ad1be9f104437d1536a04eb0cb3dc0e"}, + {file = "Cython-3.0.7-cp37-cp37m-win_amd64.whl", hash = "sha256:167b3f3894dcc697cefefac1d198304fae8eb4d5860a7b8bc2459d572e838470"}, + {file = "Cython-3.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c67105f2c6ccf5b3adbcfaecf3c5c9fa8940f9f97955c9ad7d2542151d97d93"}, + {file = "Cython-3.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a1859af761977530df2cd5c36e31d54e8d6708ad2c4656e7125c482364dc216"}, + {file = "Cython-3.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01b94304aab87496e81d1f546e71abf57b430b39be4269df1cd7da9928d70b5b"}, + {file = "Cython-3.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:931aade65f77cf59f2a702ac1f549a4836ce221107c740502cbad18d6d8e9511"}, + {file = "Cython-3.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:812b193c26553f1f375d4f1c50f805c227b24ed2d595bc9cdaf78c992ecc64a4"}, + {file = "Cython-3.0.7-cp38-cp38-win32.whl", hash = "sha256:b227643d8a40b68554dc7d37fcd03fc97b4fb0bd2614aeb5f2e07ab244642d36"}, + {file = "Cython-3.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:0d8a98c7d86ac4d05b251c39faf49423780381aab55fbf2e147f6e006a34a58a"}, + {file = "Cython-3.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:816f5285d596062c7ef22790de7d75354b58d4417a9fc64cba914aeeb900db0b"}, + {file = "Cython-3.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d0dae6dccd349b8ccf197c10ef2d05c711ca36a649c7eddbab1de2c90b63a1"}, + {file = "Cython-3.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13211b67b29f6ed8e87c137496c73d93aff0330d97940b4fbed72eae37a4a2a0"}, + {file = "Cython-3.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1853bc34ced5ff6473e881fcf6de29da83262552c8f268a0df53b49c2b89e2c"}, + {file = "Cython-3.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:51e8164b1270625ff101e95c3c1c234421520c07a0a3a20ded9e9431d98afce7"}, + {file = "Cython-3.0.7-cp39-cp39-win32.whl", hash = "sha256:45319d2471f4dbf19893ca53785a421107266e18b8cccd2054fce1e3f72a85f1"}, + {file = "Cython-3.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:612d83fd1eb5aaa5401a755c1f1aafacd9dab404cd350b90d5f404c98b33e4b3"}, + {file = "Cython-3.0.7-py2.py3-none-any.whl", hash = "sha256:936ec37b261b226d7404eff23a9aad284098338150d42a53d6a9af12b18d3892"}, + {file = "Cython-3.0.7.tar.gz", hash = "sha256:fb299acf3a578573c190c858d49e0cf9d75f4bc49c3f24c5a63804997ef09213"}, ] [[package]] @@ -844,7 +837,7 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, @@ -936,7 +929,7 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "fastjsonschema" version = "2.19.0" description = "Fastest Python implementation of JSON schema" -optional = false +optional = true python-versions = "*" files = [ {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, @@ -1103,59 +1096,59 @@ flake8 = ">=3.7" [[package]] name = "fonttools" -version = "4.46.0" +version = "4.47.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, - {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, - {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, - {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, - {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, - {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, - {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, - {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, - {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, - {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, - {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, - {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, - {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf"}, + {file = "fonttools-4.47.0-cp310-cp310-win32.whl", hash = "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984"}, + {file = "fonttools-4.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11"}, + {file = "fonttools-4.47.0-cp311-cp311-win32.whl", hash = "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982"}, + {file = "fonttools-4.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540"}, + {file = "fonttools-4.47.0-cp312-cp312-win32.whl", hash = "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d"}, + {file = "fonttools-4.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda"}, + {file = "fonttools-4.47.0-cp38-cp38-win32.whl", hash = "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9"}, + {file = "fonttools-4.47.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be"}, + {file = "fonttools-4.47.0-cp39-cp39-win32.whl", hash = "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980"}, + {file = "fonttools-4.47.0-cp39-cp39-win_amd64.whl", hash = "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82"}, + {file = "fonttools-4.47.0-py3-none-any.whl", hash = "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7"}, + {file = "fonttools-4.47.0.tar.gz", hash = "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -1170,7 +1163,7 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] name = "fqdn" version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -optional = false +optional = true python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, @@ -1458,7 +1451,7 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa name = "isoduration" version = "20.11.0" description = "Operations with ISO 8601 durations" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, @@ -1550,7 +1543,7 @@ dev = ["hypothesis"] name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, @@ -1561,7 +1554,7 @@ files = [ name = "jsonschema" version = "4.20.0" description = "An implementation of JSON Schema validation for Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, @@ -1590,7 +1583,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.11.2" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jsonschema_specifications-2023.11.2-py3-none-any.whl", hash = "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93"}, @@ -1604,7 +1597,7 @@ referencing = ">=0.31.0" name = "jupyter-client" version = "8.6.0" description = "Jupyter protocol implementation and client libraries" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, @@ -1625,13 +1618,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.0" +version = "5.5.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, + {file = "jupyter_core-5.5.1-py3-none-any.whl", hash = "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739"}, + {file = "jupyter_core-5.5.1.tar.gz", hash = "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40"}, ] [package.dependencies] @@ -1647,7 +1640,7 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyter-events" version = "0.9.0" description = "Jupyter Event System library" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, @@ -1685,13 +1678,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.11.2" +version = "2.12.1" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.11.2-py3-none-any.whl", hash = "sha256:0c548151b54bcb516ca466ec628f7f021545be137d01b5467877e87f6fff4374"}, - {file = "jupyter_server-2.11.2.tar.gz", hash = "sha256:0c99f9367b0f24141e527544522430176613f9249849be80504c6d2b955004bb"}, + {file = "jupyter_server-2.12.1-py3-none-any.whl", hash = "sha256:fd030dd7be1ca572e4598203f718df6630c12bd28a599d7f1791c4d7938e1010"}, + {file = "jupyter_server-2.12.1.tar.gz", hash = "sha256:dc77b7dcc5fc0547acba2b2844f01798008667201eea27c6319ff9257d700a6d"}, ] [package.dependencies] @@ -1723,7 +1716,7 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc name = "jupyter-server-terminals" version = "0.5.0" description = "A Jupyter Server Extension Providing Terminals." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jupyter_server_terminals-0.5.0-py3-none-any.whl", hash = "sha256:2fc0692c883bfd891f4fba0c4b4a684a37234b0ba472f2e97ed0a3888f46e1e4"}, @@ -1774,7 +1767,7 @@ test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-cons name = "jupyterlab-pygments" version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, @@ -2228,7 +2221,7 @@ files = [ name = "mistune" version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, @@ -2386,7 +2379,7 @@ testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4, name = "nbclient" version = "0.9.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -optional = false +optional = true python-versions = ">=3.8.0" files = [ {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, @@ -2406,13 +2399,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.12.0" +version = "7.13.0" description = "Converting Jupyter Notebooks" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "nbconvert-7.12.0-py3-none-any.whl", hash = "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310"}, - {file = "nbconvert-7.12.0.tar.gz", hash = "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0"}, + {file = "nbconvert-7.13.0-py3-none-any.whl", hash = "sha256:22521cfcc10ba5755e44acb6a70d2bd8a891ce7aed6746481e10cd548b169e19"}, + {file = "nbconvert-7.13.0.tar.gz", hash = "sha256:c6f61c86fca5b28bd17f4f9a308248e59fa2b54919e1589f6cc3575c5dfec2bd"}, ] [package.dependencies] @@ -2439,14 +2432,14 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] webpdf = ["playwright"] [[package]] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, @@ -2595,7 +2588,7 @@ files = [ name = "overrides" version = "7.4.0" description = "A decorator to automatically detect mismatch when overriding a method." -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, @@ -2617,7 +2610,7 @@ files = [ name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, @@ -2783,7 +2776,7 @@ virtualenv = ">=20.10.0" name = "prometheus-client" version = "0.19.0" description = "Python client for the Prometheus monitoring system." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, @@ -2864,7 +2857,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -optional = false +optional = true python-versions = "*" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -3231,7 +3224,7 @@ six = ">=1.5" name = "python-json-logger" version = "2.0.7" description = "A python library adding a json log formatter" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, @@ -3242,7 +3235,7 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -optional = false +optional = true python-versions = "*" files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, @@ -3265,7 +3258,7 @@ files = [ name = "pywinpty" version = "2.0.12" description = "Pseudo terminal support for Windows from Python." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, @@ -3339,7 +3332,7 @@ files = [ name = "pyzmq" version = "25.1.2" description = "Python bindings for 0MQ" -optional = false +optional = true python-versions = ">=3.6" files = [ {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, @@ -3444,7 +3437,7 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "referencing" version = "0.32.0" description = "JSON Referencing + Python" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "referencing-0.32.0-py3-none-any.whl", hash = "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99"}, @@ -3493,7 +3486,7 @@ docutils = ">=0.11,<1.0" name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, @@ -3507,7 +3500,7 @@ six = "*" name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, @@ -3534,110 +3527,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.15.1" +version = "0.15.2" description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "rpds_py-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:661afef2dd62aef67726b3b735ae6a93cc3cb24eb97807d0c812c6369e5e376b"}, - {file = "rpds_py-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3742bd1712ed81daa22d871d41c61b8b204ceed78d40e3b914521d41f71b5d10"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba335d9042eea8ca80be16388d4240d27cacba158710912b65f895b4e396b80a"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8303c48c895c0eb222a3c430473e96b6ef17bbafdc5308bef3c0f53353aba7f"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62aee30ddaaf5e5f7cc3aede3e74fc3cc02ee40fef564b7af0c944e91e2c8a9c"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a920897c0fc1e95c7d80d8b21008860f135673ef7e4b711181f76929c834dfa9"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0e667e9c3128b450f163f172abef615eb27b2ee872a590d58c6409139aa0515"}, - {file = "rpds_py-0.15.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b20d2233d663576affe82f1c968e8ce40e5c22c1aaf1e41529c678b309cc47c"}, - {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:37b4f175243cfc31e53b3600820ff89afd8c9c8d32de17008c3889ac2021fac7"}, - {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:028d8d294f8378815f559f5af24bc76edd87f57e6252c3d967c6e41a8628ca3b"}, - {file = "rpds_py-0.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1c488bafe4a94b94a19b4b18af6cb1adac3f46be88164589722d226e23296844"}, - {file = "rpds_py-0.15.1-cp310-none-win32.whl", hash = "sha256:191c6ca4cbe8470bc908524885b99096f68a4da411f7c9bccb3c63b2e897efb9"}, - {file = "rpds_py-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:6002ae0c87fa23cb4cb6bb40f1a9a65efdbb6e20e1ef4dba96a0138ffb82f541"}, - {file = "rpds_py-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac785eff95fe372f9fe0c689613cbbd42d6e0ec467b2782d67f15200c4eb3072"}, - {file = "rpds_py-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec0bc6b2cf5541ed9b016a83f18859c9befdb344fa6abefba960586c98817097"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4288f433bb32fb4a2ddf84c426a0239991cd57597c9e8931a5f66fc8cd18e"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b24c1e528c7828f6953ed052c4b96e4ddf5eb9af4336341110d50417595ea2de"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:802f08d0fe351b2cdb444056b12d221841dbcdaa061cfaaa173495cb6d95efdd"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab777de9b417952da5b69672f8af32c0dbcfbcd488b05a906bcff851316e6842"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e80c4f95acd8532646b2d639f41c56d9b916dc59fc2f1dd88e4207ec10350d1"}, - {file = "rpds_py-0.15.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3bb5bab9eb6ba54703cab4b3c00dc4e283ed69ded97d1e66525735bb650c07e"}, - {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91a570f5ba8bf1c37e228ce324495864c392fb6417d2215c87a32f26131062ca"}, - {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2bf1d79a9f6ff14fbcce1eb14fb522be62cef95714de43a30c13eaa4dcd8543a"}, - {file = "rpds_py-0.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54741ef569d17c83303563327083f44fb3a0031a5b2e7f4565bc255e5471b3f0"}, - {file = "rpds_py-0.15.1-cp311-none-win32.whl", hash = "sha256:6b6be91597fdbd2a38dac5f82d35a53c994a533e7f8dcd4e4560f1f1250252f3"}, - {file = "rpds_py-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:bf802de209a7ae6a4756dac0ac529770bc9b9db2ff8b139c587542733a81d633"}, - {file = "rpds_py-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f87eb9e65ab6f06fdf1eba17362dcb88b7cfb73a037fb0a7af3d41ab606b5e15"}, - {file = "rpds_py-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:268e87d14400019c9bc3f4adfe6ef4f9e7f14a94d61aa376fb3cd093828bfb89"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f9d5bbb165a7fb285f2653e81f2615124c09936b0ef986531f7f18f79b0cc"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:affa82d8b0d339107f9cf463fe6b8dafbee34fb21340f0c268825b7831208323"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d239cc63b5ab9bf019d8b6d9e9792d8858cadef9e7f79308660527cd36243a76"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5a63f5da4c0923c64a2804c80771d6ad80b1098f85796f9d56e551d602daaca"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a4015c71606616356101944785e52acf14880b6cdf6c55bad9ff8f76c09e5c"}, - {file = "rpds_py-0.15.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:025dddb8905b8f79b17330382b15bd536f32ef2d3bc40fa91f2bf000a375f92f"}, - {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fde598ff95bc65b278c443100e1c757ea918a9f791f4af38e757084d7d575f03"}, - {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f255de5fde1c88bc6bdc091280edff3c9d213212a231c1d97889dfbe0baccf0b"}, - {file = "rpds_py-0.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63d0b2ac55f3658e3a279ffa1bdd1118841b6e31424238bd28c60ab4aecc63c9"}, - {file = "rpds_py-0.15.1-cp312-none-win32.whl", hash = "sha256:caf72fb89fd09f621b04fbd473603a0b22c8e09adaafd2319735486dcb1cc3eb"}, - {file = "rpds_py-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:17c44011019e014b468939692ccf3fd57291f825ef0ad00ab092dba458fa14c4"}, - {file = "rpds_py-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cb33b492e06e2afb4535fcdbc5e8a0ec952440b736c1dd8e17808bbfb164fba4"}, - {file = "rpds_py-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a35fde2bc8d4b5088eb3eae83a473c779ecfc4a38e5e6c4ae684b03622a5168"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ddacbb45c54f5b2c1e99393229a67bbacbbfece7340f7b7422dff5f0ec70559"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f3d1cfd5a5e513630f5b30daee5fd08092fa44bc28da23e8be4a582bb900230"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4334405b673e97f2600b0c259186b03450f78b9c415687bd848fc6fd4626041"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b1286e1045c2abc71c12b90d1cfd606f33a97d871a3a8fb1eb9a96e0cb7641"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a6a72c54c4c85e9e6b96c6a058ad1102879395cb8cc3c418228d2bac5b0a06"}, - {file = "rpds_py-0.15.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c44319819fcf536e25ac707e2221449f3d90bbf6f74ec6bf62a3e084a55e03d"}, - {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ff2195a037b04193f65725de96c860e031a0976f396293b234381b80e67be62e"}, - {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3eae6feb2e14bffaf7cd418784c53dc897b86bc78abfe4d61f2ce9a84e4aecba"}, - {file = "rpds_py-0.15.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c7c9bec29b6112ee09797d5a9b68837b9f6d4945fd4dc1066293a89a5f1c1ed"}, - {file = "rpds_py-0.15.1-cp38-none-win32.whl", hash = "sha256:b93ac65cfdb4e878c3869e15c684dbdc50210d6f2fbbd0f5997dd7a9cbf8bd14"}, - {file = "rpds_py-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:ae7b02f93918ddd2ea1061411034eb48d503365b5e4c00abb515ec36c58cd25d"}, - {file = "rpds_py-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:d13d2015a42d785902e594da4ed1eff946aa77196c9fe5c254036e163122510d"}, - {file = "rpds_py-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cabcc98f5513365b0182d12c6e63a320a5efda93f290a4fa9d3b38c538254c82"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace2e662a6f977d707bbb5e4c1b9f52541786f55bf18647862b55819bbb4e7ee"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c14d87ed0778d2e03cf091a6ea8a7c92eb6c9a5116b087d45ffee63bb20b87c2"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a608c54ece2751c823b1b1e1c6db2f077916ef5a51a6e080448efd8786e6c48d"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0135ff4927cb641ca2021a490629e757e51c558f8201d5f10dc171dda522cd1e"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6433ac53339ae7f0b498ccb0ba76a03c6ef040e4e0a2e500f5e091c4533071b"}, - {file = "rpds_py-0.15.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3eea0d98e342de862fbeacc0198477eb8ce7a42915cac22be645bc7c2a7def1e"}, - {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:967b73b36aff6d2989f94592ecbf2b58d6251e9d960ba872b75d0c2f6f835d8d"}, - {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49bd96b50b194803f0cd08fc9c9905abe0099ef64d088e1006053191541b97ac"}, - {file = "rpds_py-0.15.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2b25a734fad3011d4a4e355d5c208603f44c5e4c69986abaaf78f3e21adefc71"}, - {file = "rpds_py-0.15.1-cp39-none-win32.whl", hash = "sha256:0b8ee0fa3e1d69f7167d7497e27bbaf8fb795cfc7a3fdc313ddc370e29e2dec2"}, - {file = "rpds_py-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:e58e109cb356c2a45d304ea2551251881ffab3a1a06e083e2d68e4538c9d6ad5"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:03add8c266d9b0d075800b7f1219d0e5a3097cd65d268edb77a02694567a2f86"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c0ccfac1a87dd935e630603ad26190a746b8dc2f0f974e741ff0d7d91fefdbd6"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cc956ee19f967b7f0b067b6ab19b1a803f04f3574b2f0e02454505a16ffb8fd"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c53e4b4623c40a91c8f5fa03b5f599e12e87e21c6eb42231a7dbd4db62cd1997"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bdefdc81d90ed47e893717a6781ba952460f2eb08d23ef872e49cf3c97daa5d"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f68f28453e111fe2498414d875f7c25dd906b407ba6f28e81a5ac7e8740163e"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acbeb714db0b723300b0f1053487c28a88aa909874e56c49a27e62499e6b3857"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0a4c3a748e3489def155b1bcc688299ef97d2c1e2e73cc653b3b7c389f2b0c3"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ce73155bc13e0801db281ab38371ea1c34cb11adcba11ffef232fa9f954eeee6"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:238a2be15c00c462c5d1e2d39912828b6c16267e46837badc650c90ac8269669"}, - {file = "rpds_py-0.15.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc4f4803e117be3e5032cfc621a3852ad07bd135ec4046c5284667e3d2f6ec7e"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0697ca8b26a4122e7ce7584578c4f1cfe095511c4fc173b75743e63bf4dfa7ea"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1566606cd25c1b68db675a233f43e8064f2468d6552fc5c10cbe7b77cd0292f3"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2326f846009cb7d3e199b3a3e30e36651d42cc464750b9fd298098d487c3fed"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b3e4960adc1e34e554e05ef0540e5c6d0bbdd986bb221d5ba6aabefa0ec6fdd"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d104d9dec9b28904f57ee7903e2707abda0983a65b74ff677c332f64beda5100"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d656a9dbb10dc5f3258c07d671582d081881641328529002674cf2bd33b2beb7"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c202371d9d90eccfe6056bd4206c0633c979e941a026d2893ffacc6ae0f8d49"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68eaa19f67ba9c87faf0a9e03b3d5c5c8507e7e8869ef3ab797b1f438423b784"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b3d85cd1096830ddbc31e7aeca8fd0f290a30b8a008d5603b2b0b0424a097da5"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:6098a1cb5fc841097a27fb130ee3194fe3ec5f8fc5fa427f6b991541241f8913"}, - {file = "rpds_py-0.15.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:783240e9c58ff5fb9c4b45cd7953e72870a6dd8c2e65b8975a3b03536b2191e6"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dad949d2dfddb3b08f15d6801e453373ceb1123d3b79df76c2cbe678528e4c42"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:739699de9042d98eea7999a6d760ea45bbf8b63ce43c6406e060e76e735c7a02"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b35664e9abe8430018c69cd0f4434b118e283eb1a98fd298b87242f693a660"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0273b0f088aedc22b5717890d7a17b26791ab02968241830102f91932130473"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:154c8e6c8aa67d7f3f04165ae72fceef02bbedf5b3ab1143213789c570869c48"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b4eeeb90959bc3804fcde37ebed834a6502591d1aa34b95e5617e7a4f9aed6"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b4677b1c30e4cd44a995ad9ee2441dcd396b0d5bc0d981d0fb3176a8cf9c316"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d33e68fcb3163575bf80071c4fec70238be66fb1111bad2088f5792efcb100"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1c0dd3fecd4e47e1b1d63fc39074d0c5a22f963eb2b69835e357efba5c66deac"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8f9141b4fefc63aea19e045792f1e01acb877205faa5e9fda561e4c79f061623"}, - {file = "rpds_py-0.15.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e64c6bcbf9e53bd40fb27890754378fa8f40215e2964b75e6a66d04dbc10fb63"}, - {file = "rpds_py-0.15.1.tar.gz", hash = "sha256:1e1068c4501f505ecf49234dd7dfb8ab80b92063474fa550febe532dc301887e"}, + {file = "rpds_py-0.15.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:337a8653fb11d2fbe7157c961cc78cb3c161d98cf44410ace9a3dc2db4fad882"}, + {file = "rpds_py-0.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:813a65f95bfcb7c8f2a70dd6add9b51e9accc3bdb3e03d0ff7a9e6a2d3e174bf"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:082e0e55d73690ffb4da4352d1b5bbe1b5c6034eb9dc8c91aa2a3ee15f70d3e2"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5595c80dd03d7e6c6afb73f3594bf3379a7d79fa57164b591d012d4b71d6ac4c"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb10bb720348fe1647a94eb605accb9ef6a9b1875d8845f9e763d9d71a706387"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53304cc14b1d94487d70086e1cb0cb4c29ec6da994d58ae84a4d7e78c6a6d04d"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d64a657de7aae8db2da60dc0c9e4638a0c3893b4d60101fd564a3362b2bfeb34"}, + {file = "rpds_py-0.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee40206d1d6e95eaa2b7b919195e3689a5cf6ded730632de7f187f35a1b6052c"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1607cda6129f815493a3c184492acb5ae4aa6ed61d3a1b3663aa9824ed26f7ac"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3e6e2e502c4043c52a99316d89dc49f416acda5b0c6886e0dd8ea7bb35859e8"}, + {file = "rpds_py-0.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:044f6f46d62444800402851afa3c3ae50141f12013060c1a3a0677e013310d6d"}, + {file = "rpds_py-0.15.2-cp310-none-win32.whl", hash = "sha256:c827a931c6b57f50f1bb5de400dcfb00bad8117e3753e80b96adb72d9d811514"}, + {file = "rpds_py-0.15.2-cp310-none-win_amd64.whl", hash = "sha256:3bbc89ce2a219662ea142f0abcf8d43f04a41d5b1880be17a794c39f0d609cb0"}, + {file = "rpds_py-0.15.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:1fd0f0b1ccd7d537b858a56355a250108df692102e08aa2036e1a094fd78b2dc"}, + {file = "rpds_py-0.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b414ef79f1f06fb90b5165db8aef77512c1a5e3ed1b4807da8476b7e2c853283"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31272c674f725dfe0f343d73b0abe8c878c646967ec1c6106122faae1efc15b"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6945c2d61c42bb7e818677f43638675b8c1c43e858b67a96df3eb2426a86c9d"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02744236ac1895d7be837878e707a5c35fb8edc5137602f253b63623d7ad5c8c"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2181e86d4e1cdf49a7320cb72a36c45efcb7670d0a88f09fd2d3a7967c0540fd"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a8ff8e809da81363bffca2b965cb6e4bf6056b495fc3f078467d1f8266fe27f"}, + {file = "rpds_py-0.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97532802f14d383f37d603a56e226909f825a83ff298dc1b6697de00d2243999"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:13716e53627ad97babf72ac9e01cf9a7d4af2f75dd5ed7b323a7a9520e948282"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f1f295a5c28cfa74a7d48c95acc1c8a7acd49d7d9072040d4b694fe11cd7166"}, + {file = "rpds_py-0.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8ec464f20fe803ae00419bd1610934e3bda963aeba1e6181dfc9033dc7e8940c"}, + {file = "rpds_py-0.15.2-cp311-none-win32.whl", hash = "sha256:b61d5096e75fd71018b25da50b82dd70ec39b5e15bb2134daf7eb7bbbc103644"}, + {file = "rpds_py-0.15.2-cp311-none-win_amd64.whl", hash = "sha256:9d41ebb471a6f064c0d1c873c4f7dded733d16ca5db7d551fb04ff3805d87802"}, + {file = "rpds_py-0.15.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:13ff62d3561a23c17341b4afc78e8fcfd799ab67c0b1ca32091d71383a98ba4b"}, + {file = "rpds_py-0.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b70b45a40ad0798b69748b34d508259ef2bdc84fb2aad4048bc7c9cafb68ddb3"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ecbba7efd82bd2a4bb88aab7f984eb5470991c1347bdd1f35fb34ea28dba6e"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d38494a8d21c246c535b41ecdb2d562c4b933cf3d68de03e8bc43a0d41be652"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13152dfe7d7c27c40df8b99ac6aab12b978b546716e99f67e8a67a1d441acbc3"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:164fcee32f15d04d61568c9cb0d919e37ff3195919cd604039ff3053ada0461b"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a5122b17a4faf5d7a6d91fa67b479736c0cacc7afe791ddebb7163a8550b799"}, + {file = "rpds_py-0.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:46b4f3d47d1033db569173be62365fbf7808c2bd3fb742314d251f130d90d44c"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c61e42b4ceb9759727045765e87d51c1bb9f89987aca1fcc8a040232138cad1c"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d2aa3ca9552f83b0b4fa6ca8c6ce08da6580f37e3e0ab7afac73a1cfdc230c0e"}, + {file = "rpds_py-0.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec19e823b4ccd87bd69e990879acbce9e961fc7aebe150156b8f4418d4b27b7f"}, + {file = "rpds_py-0.15.2-cp312-none-win32.whl", hash = "sha256:afeabb382c1256a7477b739820bce7fe782bb807d82927102cee73e79b41b38b"}, + {file = "rpds_py-0.15.2-cp312-none-win_amd64.whl", hash = "sha256:422b0901878a31ef167435c5ad46560362891816a76cc0d150683f3868a6f0d1"}, + {file = "rpds_py-0.15.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:baf744e5f9d5ee6531deea443be78b36ed1cd36c65a0b95ea4e8d69fa0102268"}, + {file = "rpds_py-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e072f5da38d6428ba1fc1115d3cc0dae895df671cb04c70c019985e8c7606be"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f138f550b83554f5b344d6be35d3ed59348510edc3cb96f75309db6e9bfe8210"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2a4cd924d0e2f4b1a68034abe4cadc73d69ad5f4cf02db6481c0d4d749f548f"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5eb05b654a41e0f81ab27a7c3e88b6590425eb3e934e1d533ecec5dc88a6ffff"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ee066a64f0d2ba45391cac15b3a70dcb549e968a117bd0500634754cfe0e5fc"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51a899792ee2c696072791e56b2020caff58b275abecbc9ae0cb71af0645c95"}, + {file = "rpds_py-0.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac2ac84a4950d627d84b61f082eba61314373cfab4b3c264b62efab02ababe83"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:62b292fff4739c6be89e6a0240c02bda5a9066a339d90ab191cf66e9fdbdc193"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:98ee201a52a7f65608e5494518932e1473fd43535f12cade0a1b4ab32737fe28"}, + {file = "rpds_py-0.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3d40fb3ca22e3d40f494d577441b263026a3bd8c97ae6ce89b2d3c4b39ac9581"}, + {file = "rpds_py-0.15.2-cp38-none-win32.whl", hash = "sha256:30479a9f1fce47df56b07460b520f49fa2115ec2926d3b1303c85c81f8401ed1"}, + {file = "rpds_py-0.15.2-cp38-none-win_amd64.whl", hash = "sha256:2df3d07a16a3bef0917b28cd564778fbb31f3ffa5b5e33584470e2d1b0f248f0"}, + {file = "rpds_py-0.15.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:56b51ba29a18e5f5810224bcf00747ad931c0716e3c09a76b4a1edd3d4aba71f"}, + {file = "rpds_py-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c11bc5814554b018f6c5d6ae0969e43766f81e995000b53a5d8c8057055e886"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2faa97212b0dc465afeedf49045cdd077f97be1188285e646a9f689cb5dfff9e"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86c01299942b0f4b5b5f28c8701689181ad2eab852e65417172dbdd6c5b3ccc8"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd7d3608589072f63078b4063a6c536af832e76b0b3885f1bfe9e892abe6c207"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:938518a11780b39998179d07f31a4a468888123f9b00463842cd40f98191f4d3"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dccc623725d0b298f557d869a68496a2fd2a9e9c41107f234fa5f7a37d278ac"}, + {file = "rpds_py-0.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d46ee458452727a147d7897bb33886981ae1235775e05decae5d5d07f537695a"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9d7ebcd11ea76ba0feaae98485cd8e31467c3d7985210fab46983278214736b"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8a5f574b92b3ee7d254e56d56e37ec0e1416acb1ae357c4956d76a1788dc58fb"}, + {file = "rpds_py-0.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3db0c998c92b909d7c90b66c965590d4f3cd86157176a6cf14aa1f867b77b889"}, + {file = "rpds_py-0.15.2-cp39-none-win32.whl", hash = "sha256:bbc7421cbd28b4316d1d017db338039a7943f945c6f2bb15e1439b14b5682d28"}, + {file = "rpds_py-0.15.2-cp39-none-win_amd64.whl", hash = "sha256:1c24e30d720c0009b6fb2e1905b025da56103c70a8b31b99138e4ed1c2a6c5b0"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e6fcd0a0f62f2997107f758bb372397b8d5fd5f39cc6dcb86f7cb98a2172d6c"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d800a8e2ac62db1b9ea5d6d1724f1a93c53907ca061de4d05ed94e8dfa79050c"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e09d017e3f4d9bd7d17a30d3f59e4d6d9ba2d2ced280eec2425e84112cf623f"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b88c3ab98556bc351b36d6208a6089de8c8db14a7f6e1f57f82a334bd2c18f0b"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f333bfe782a2d05a67cfaa0cc9cd68b36b39ee6acfe099f980541ed973a7093"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b629db53fe17e6ce478a969d30bd1d0e8b53238c46e3a9c9db39e8b65a9ef973"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485fbdd23becb822804ed05622907ee5c8e8a5f43f6f43894a45f463b2217045"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:893e38d0f4319dfa70c0f36381a37cc418985c87b11d9784365b1fff4fa6973b"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8ffdeb7dbd0160d4e391e1f857477e4762d00aa2199c294eb95dfb9451aa1d9f"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:fc33267d58dfbb2361baed52668c5d8c15d24bc0372cecbb79fed77339b55e0d"}, + {file = "rpds_py-0.15.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2e7e5633577b3bd56bf3af2ef6ae3778bbafb83743989d57f0e7edbf6c0980e4"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8b9650f92251fdef843e74fc252cdfd6e3c700157ad686eeb0c6d7fdb2d11652"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:07a2e1d78d382f7181789713cdf0c16edbad4fe14fe1d115526cb6f0eef0daa3"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03f9c5875515820633bd7709a25c3e60c1ea9ad1c5d4030ce8a8c203309c36fd"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:580182fa5b269c2981e9ce9764367cb4edc81982ce289208d4607c203f44ffde"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa1e626c524d2c7972c0f3a8a575d654a3a9c008370dc2a97e46abd0eaa749b9"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae9d83a81b09ce3a817e2cbb23aabc07f86a3abc664c613cd283ce7a03541e95"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9235be95662559141934fced8197de6fee8c58870f36756b0584424b6d708393"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a72e00826a2b032dda3eb25aa3e3579c6d6773d22d8446089a57a123481cc46c"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ab095edf1d840a6a6a4307e1a5b907a299a94e7b90e75436ee770b8c35d22a25"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b79c63d29101cbaa53a517683557bb550462394fb91044cc5998dd2acff7340"}, + {file = "rpds_py-0.15.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:911e600e798374c0d86235e7ef19109cf865d1336942d398ff313375a25a93ba"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3cd61e759c4075510052d1eca5cddbd297fe1164efec14ef1fce3f09b974dfe4"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9d2ae79f31da5143e020a8d4fc74e1f0cbcb8011bdf97453c140aa616db51406"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e99d6510c8557510c220b865d966b105464740dcbebf9b79ecd4fbab30a13d9"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c43e1b89099279cc03eb1c725c5de12af6edcd2f78e2f8a022569efa639ada3"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7187bee72384b9cfedf09a29a3b2b6e8815cc64c095cdc8b5e6aec81e9fd5f"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3423007fc0661827e06f8a185a3792c73dda41f30f3421562f210cf0c9e49569"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2974e6dff38afafd5ccf8f41cb8fc94600b3f4fd9b0a98f6ece6e2219e3158d5"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:93c18a1696a8e0388ed84b024fe1a188a26ba999b61d1d9a371318cb89885a8c"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c7cd0841a586b7105513a7c8c3d5c276f3adc762a072d81ef7fae80632afad1e"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:709dc11af2f74ba89c68b1592368c6edcbccdb0a06ba77eb28c8fe08bb6997da"}, + {file = "rpds_py-0.15.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:fc066395e6332da1e7525d605b4c96055669f8336600bef8ac569d5226a7c76f"}, + {file = "rpds_py-0.15.2.tar.gz", hash = "sha256:373b76eeb79e8c14f6d82cb1d4d5293f9e4059baec6c1b16dca7ad13b6131b39"}, ] [[package]] @@ -3701,7 +3694,7 @@ pyobjc-framework-Cocoa = {version = "*", markers = "sys_platform == \"darwin\""} name = "send2trash" version = "1.8.2" description = "Send file to trash natively under Mac OS X, Windows and Linux" -optional = false +optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, @@ -3806,7 +3799,7 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, @@ -4081,7 +4074,7 @@ files = [ name = "terminado" version = "0.18.0" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, @@ -4102,7 +4095,7 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, @@ -4131,7 +4124,7 @@ files = [ name = "tornado" version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false +optional = true python-versions = ">= 3.8" files = [ {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, @@ -4171,7 +4164,7 @@ telegram = ["requests"] name = "traitlets" version = "5.14.0" description = "Traitlets Python configuration system" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, @@ -4234,7 +4227,7 @@ types-setuptools = "*" name = "types-python-dateutil" version = "2.8.19.14" description = "Typing stubs for python-dateutil" -optional = false +optional = true python-versions = "*" files = [ {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, @@ -4267,7 +4260,7 @@ files = [ name = "uri-template" version = "1.3.0" description = "RFC 6570 URI Template Processor" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, @@ -4367,7 +4360,7 @@ files = [ name = "webcolors" version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, @@ -4382,7 +4375,7 @@ tests = ["pytest", "pytest-cov"] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -optional = false +optional = true python-versions = "*" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, @@ -4393,7 +4386,7 @@ files = [ name = "websocket-client" version = "1.7.0" description = "WebSocket client for Python with low level API options" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, @@ -4506,4 +4499,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "fc2e7de5129058e854e871803fb4a18aef41e73a192c8b44236c9799ab09b0d8" +content-hash = "f15fa632919381a9b5b2cebc3e89aa307fa8735db2e5cde7a408765b46a3b00f" From dacc6390ed8ab643595ea1398a1f15dd6c290091 Mon Sep 17 00:00:00 2001 From: chopan Date: Sat, 23 Dec 2023 00:35:23 +0100 Subject: [PATCH 09/30] Created custom file parser for manim.typing --- docs/source/conf.py | 9 +- manim/typing.py | 146 ++++++++----------- manim/utils/docbuild/autotyping_directive.py | 27 ++-- manim/utils/docbuild/module_parsing.py | 86 +++++++++++ 4 files changed, 164 insertions(+), 104 deletions(-) create mode 100644 manim/utils/docbuild/module_parsing.py diff --git a/docs/source/conf.py b/docs/source/conf.py index bb397e2ca0..bd165fc790 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,7 +11,7 @@ from pathlib import Path import manim -from manim.typing import manim_type_aliases +from manim.utils.docbuild.module_parsing import get_typing_docs # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, @@ -58,9 +58,10 @@ # generate documentation from type hints autodoc_typehints = "description" autodoc_type_aliases = { - alias: f"~manim.typing.{alias}" - for category in manim_type_aliases.values() - for alias in category + alias_name: f"~manim.typing.{alias_name}" + for category_dict in get_typing_docs().values() + for alias_dict in category_dict.values() + for alias_name in alias_dict.keys() } autoclass_content = "both" diff --git a/manim/typing.py b/manim/typing.py index 8945ea3c3b..de2ea8a7f9 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -1,4 +1,21 @@ -"""Typing Module +"""Custom type definitions used in Manim. + +.. admonition:: Note for developers + :class: important + + Around the source code there are multiple strings which look like this: + + .. code-block:: + + ''' + [CATEGORY] + + ''' + + All type aliases defined under those strings will be automatically + classified under that category. + + If you need to define a new category, respect the format described above. .. autotypingmodule:: manim.typing @@ -6,14 +23,13 @@ from __future__ import annotations from os import PathLike -from typing import Callable, Literal, Tuple, Union +from typing import Annotated, Callable, Literal, Tuple, Union import numpy as np import numpy.typing as npt from typing_extensions import TypeAlias __all__ = [ - "manim_type_aliases", "ManimFloat", "ManimInt", "ManimColorDType", @@ -65,77 +81,21 @@ "StrOrBytesPath", ] -manim_type_aliases = { - "Primitive data types": ( - "ManimFloat", - "ManimInt", - ), - "Color types": ( - "ManimColorDType", - "RGB_Array_Float", - "RGB_Tuple_Float", - "RGB_Array_Int", - "RGB_Tuple_Int", - "RGBA_Array_Float", - "RGBA_Tuple_Float", - "RGBA_Array_Int", - "RGBA_Tuple_Int", - "HSV_Array_Float", - "HSV_Tuple_Float", - "ManimColorInternal", - ), - "Point types": ( - "PointDType", - "InternalPoint2D", - "Point2D", - "InternalPoint2D_Array", - "Point2D_Array", - "InternalPoint3D", - "Point3D", - "InternalPoint3D_Array", - "Point3D_Array", - ), - "Vector types": ( - "Vector2", - "Vector3", - "Vector", - "RowVector", - "ColVector", - "MatrixMN", - "Zeros", - ), - "Bezier types": ( - "QuadraticBezierPoints", - "QuadraticBezierPoints_Array", - "QuadraticBezierPath", - "QuadraticSpline", - "CubicBezierPoints", - "CubicBezierPoints_Array", - "CubicBezierPath", - "CubicSpline", - "BezierPoints", - "BezierPoints_Array", - "BezierPath", - "Spline", - "FlatBezierPoints", - ), - "Function types": ( - "FunctionOverride", - "PathFuncType", - "MappingFunction", - ), - "Other types": ( - "Image", - "StrPath", - "StrOrBytesPath", - ), -} - -# Primitive Data Types + +""" +[CATEGORY] +Primitive data types +""" + ManimFloat: TypeAlias = np.float64 ManimInt: TypeAlias = np.int64 -# Color Types + +""" +[CATEGORY] +Color types +""" + ManimColorDType: TypeAlias = ManimFloat RGB_Array_Float: TypeAlias = npt.NDArray[ManimFloat] @@ -155,14 +115,16 @@ ManimColorInternal: TypeAlias = npt.NDArray[ManimColorDType] -# Point Types + +""" +[CATEGORY] +Point types +""" PointDType: TypeAlias = ManimFloat -"""DType for all points.""" InternalPoint2D: TypeAlias = npt.NDArray[PointDType] -"""`shape (2,)` -A 2D point: `[float, float]` +""" `shape: (2,)` A 2D point: `[float, float]`. This type alias is mostly made available for internal use and only includes the NumPy type. """ @@ -206,7 +168,11 @@ (Please refer to the documentation of the function you are using for further type information.) """ -# Vector Types + +""" +[CATEGORY] +Vector types +""" Vector2: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, float]] """`shape (2,)` @@ -241,7 +207,11 @@ Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], Tuple[Tuple[Literal[0], ...], ...]] """A matrix of zeros, typically created with ``numpy.zeros((M, N))``""" -# Bezier Types + +""" +[CATEGORY] +Bézier types +""" QuadraticBezierPoints: TypeAlias = Union[ npt.NDArray[PointDType], Tuple[Point3D, Point3D, Point3D] @@ -332,7 +302,11 @@ A flattened array of Bézier control points: `[float, ...]` """ -# Function Types + +""" +[CATEGORY] +Function types +""" # Due to current limitations (see https://github.com/python/mypy/issues/14656 / 8263), we don't specify the first argument type (Mobject). FunctionOverride: TypeAlias = Callable[..., None] @@ -344,12 +318,20 @@ MappingFunction: TypeAlias = Callable[[Point3D], Point3D] """A function mapping a `Point3D` to another `Point3D`.""" -# Image Types + +""" +[CATEGORY] +Image types +""" Image: TypeAlias = np.ndarray """An image.""" -# Path Types -StrPath: TypeAlias = "str | PathLike[str]" -StrOrBytesPath: TypeAlias = "str | bytes | PathLike[str] | PathLike[bytes]" +""" +[CATEGORY] +Path types +""" + +StrPath: TypeAlias = Union[str, PathLike[str]] +StrOrBytesPath: TypeAlias = Union[str, bytes, PathLike[str], PathLike[bytes]] diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index 938f54784c..849463df0f 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -7,6 +7,7 @@ from sphinx.application import Sphinx from manim import ManimColor +from manim.utils.docbuild.module_parsing import get_typing_docs __all__ = ["TypingModuleDocumenter"] @@ -17,28 +18,17 @@ def setup(app: Sphinx) -> None: class TypingModuleDocumenter(Directive): objtype = "autotypingmodule" - required_arguments = 1 + required_arguments = 0 has_content = True def add_directive_header(self, sig: str) -> None: super().add_directive_header(sig) def run(self) -> List[nodes.Element]: - module_name = self.arguments[0] - try: - import importlib - - module = importlib.import_module(module_name) - except ImportError: - return [ - nodes.error( - None, - nodes.paragraph(text="Failed to import module '%s'" % module_name), - ) - ] - content = nodes.container() - for category_name, category in module.manim_type_aliases.items(): + + typing_docs_dict = get_typing_docs() + for category_name, category_dict in typing_docs_dict.items(): category_section = nodes.section( ids=[category_name.lower().replace(" ", "_")] ) @@ -46,12 +36,13 @@ def run(self) -> List[nodes.Element]: category_alias_container = nodes.container() category_section += category_alias_container - for alias_name in category: - alias = getattr(module, alias_name) + for alias_name, alias_dict in category_dict.items(): alias_section = nodes.topic(ids=[alias_name.lower().replace(" ", "_")]) category_alias_container += alias_section alias_section += nodes.title(text=alias_name) - alias_section += nodes.paragraph(text=str(alias)) + alias_section += nodes.paragraph(text=alias_dict["definition"]) + if "doc" in alias_dict: + alias_section += nodes.paragraph(text=alias_dict["doc"]) content += category_section return [content] diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py new file mode 100644 index 0000000000..20b44ef5da --- /dev/null +++ b/manim/utils/docbuild/module_parsing.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +import ast +from pathlib import Path + +from manim import typing + +__all__ = ["get_typing_docs"] + + +def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: + """Read the manim/typing.py file, generate an Abstract Syntax Tree + from it, and extract useful information about the type aliases + defined in the file: the category they belong to, their definition + and their description. + + Returns + ------- + typing_docs_dict : dict[str, dict[str, dict[str, str]] + A dictionary containing the information from all the type + aliases. Each key is the name of a category of types, and + its corresponding value is another subdictionary containing + information about the type aliases under that category: + + - The keys of this subdictionary are the names of the type + aliases, and the values are subsubdictionaries containing + field-value pairs with information about the type alias. + """ + + with open(typing.__file__) as typing_file: + typing_file_content = typing_file.read() + + typing_docs_dict: dict[str, dict[str, dict[str, str]]] = {} + category_dict: dict[str, dict[str, str]] | None = None + alias_dict: dict[str, str] | None = None + + for node in ast.walk(ast.parse(typing_file_content)): + if ( + type(node) is ast.Expr + and type(node.value) is ast.Constant + and type(node.value.value) is str + ): + string = node.value.value.strip() + # It can be the start of a category + if string[:10] == "[CATEGORY]": + category_name = string[10:].strip() + typing_docs_dict[category_name] = {} + category_dict = typing_docs_dict[category_name] + alias_dict = None + # or a docstring of the alias defined before + elif alias_dict: + alias_dict["doc"] = string + + elif category_dict is None: + continue + + if ( + 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(def_node) is ast.Subscript + and type(def_node.value) is ast.Name + and def_node.value.id == "Union" + ): + definition = " | ".join( + ast.unparse(elem) for elem in def_node.slice.elts + ) + else: + definition = ast.unparse(def_node) + # for subnode in ast.walk(node.value): + # print(ast.dump(subnode, indent=4), end="\n\n") + definition = definition.replace("npt.", "") + category_dict[alias_name] = {"definition": definition} + alias_dict = category_dict[alias_name] + + else: + alias_dict = None + + return typing_docs_dict From 1710faf1175db2bf00e8f6df2153e8586260cc9f Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Fri, 22 Dec 2023 22:38:58 -0500 Subject: [PATCH 10/30] Got reST parser going --- manim/utils/docbuild/autotyping_directive.py | 23 ++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index 849463df0f..8469c7faff 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -1,12 +1,10 @@ from __future__ import annotations -import inspect - from docutils import nodes +from docutils.statemachine import ViewList from docutils.parsers.rst import Directive from sphinx.application import Sphinx -from manim import ManimColor from manim.utils.docbuild.module_parsing import get_typing_docs __all__ = ["TypingModuleDocumenter"] @@ -21,11 +19,9 @@ class TypingModuleDocumenter(Directive): required_arguments = 0 has_content = True - def add_directive_header(self, sig: str) -> None: - super().add_directive_header(sig) - - def run(self) -> List[nodes.Element]: + def run(self) -> list[nodes.Element]: content = nodes.container() + typing_docs_dict = get_typing_docs() for category_name, category_dict in typing_docs_dict.items(): @@ -37,12 +33,21 @@ def run(self) -> List[nodes.Element]: category_section += category_alias_container for alias_name, alias_dict in category_dict.items(): + result = ViewList() alias_section = nodes.topic(ids=[alias_name.lower().replace(" ", "_")]) category_alias_container += alias_section alias_section += nodes.title(text=alias_name) - alias_section += nodes.paragraph(text=alias_dict["definition"]) + + doc = nodes.paragraph() # one paragraph for both + # add | to keep on different lines + # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) + result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) if "doc" in alias_dict: - alias_section += nodes.paragraph(text=alias_dict["doc"]) + result.append("| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10) + + # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest + self.state.nested_parse(result, 0, doc) + alias_section += doc content += category_section return [content] From 3764d74e4f1756b395a220604b375aad32cdd921 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Fri, 22 Dec 2023 23:04:00 -0500 Subject: [PATCH 11/30] Updated autotyping and parsing --- manim/utils/docbuild/autotyping_directive.py | 4 +++- manim/utils/docbuild/module_parsing.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index 8469c7faff..d19d323eaa 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -38,10 +38,12 @@ def run(self) -> list[nodes.Element]: category_alias_container += alias_section alias_section += nodes.title(text=alias_name) + alias_section += nodes.literal_block(text=alias_dict["definition"]) + doc = nodes.paragraph() # one paragraph for both # add | to keep on different lines # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) - result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) + # result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) if "doc" in alias_dict: result.append("| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 20b44ef5da..8f0ac135ae 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -42,7 +42,7 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: ): string = node.value.value.strip() # It can be the start of a category - if string[:10] == "[CATEGORY]": + if string.startswith("[CATEGORY]"): category_name = string[10:].strip() typing_docs_dict[category_name] = {} category_dict = typing_docs_dict[category_name] From 9d65c9f2ae554c704fa47df25a35f0234cf3973f Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 23 Dec 2023 21:54:48 -0500 Subject: [PATCH 12/30] Update parsing --- manim/utils/docbuild/module_parsing.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 8f0ac135ae..d75e0c1900 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -42,8 +42,9 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: ): string = node.value.value.strip() # It can be the start of a category - if string.startswith("[CATEGORY]"): - category_name = string[10:].strip() + section_str = "[CATEGORY]" + if string.startswith(section_str): + category_name = string[len(section_str):].strip() typing_docs_dict[category_name] = {} category_dict = typing_docs_dict[category_name] alias_dict = None From 14253881f1d05be6341db9c6c78e3a9b92d0fcd4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 02:58:03 +0000 Subject: [PATCH 13/30] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/utils/docbuild/autotyping_directive.py | 9 +++++---- manim/utils/docbuild/module_parsing.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index d19d323eaa..b5e82c86e6 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -1,8 +1,8 @@ from __future__ import annotations from docutils import nodes -from docutils.statemachine import ViewList from docutils.parsers.rst import Directive +from docutils.statemachine import ViewList from sphinx.application import Sphinx from manim.utils.docbuild.module_parsing import get_typing_docs @@ -21,7 +21,6 @@ class TypingModuleDocumenter(Directive): def run(self) -> list[nodes.Element]: content = nodes.container() - typing_docs_dict = get_typing_docs() for category_name, category_dict in typing_docs_dict.items(): @@ -40,12 +39,14 @@ def run(self) -> list[nodes.Element]: alias_section += nodes.literal_block(text=alias_dict["definition"]) - doc = nodes.paragraph() # one paragraph for both + doc = nodes.paragraph() # one paragraph for both # add | to keep on different lines # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) # result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) if "doc" in alias_dict: - result.append("| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10) + result.append( + "| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10 + ) # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest self.state.nested_parse(result, 0, doc) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index d75e0c1900..dce60252c3 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -44,7 +44,7 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: # It can be the start of a category section_str = "[CATEGORY]" if string.startswith(section_str): - category_name = string[len(section_str):].strip() + category_name = string[len(section_str) :].strip() typing_docs_dict[category_name] = {} category_dict = typing_docs_dict[category_name] alias_dict = None From 1d5050346129fd74e6fcdad9340f1722d5022424 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 23 Dec 2023 22:04:27 -0500 Subject: [PATCH 14/30] Added code_block toggle --- manim/utils/docbuild/autotyping_directive.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index b5e82c86e6..f5072ac877 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -21,6 +21,7 @@ class TypingModuleDocumenter(Directive): def run(self) -> list[nodes.Element]: content = nodes.container() + definition_in_code_block = True typing_docs_dict = get_typing_docs() for category_name, category_dict in typing_docs_dict.items(): @@ -37,12 +38,15 @@ def run(self) -> list[nodes.Element]: category_alias_container += alias_section alias_section += nodes.title(text=alias_name) - alias_section += nodes.literal_block(text=alias_dict["definition"]) - doc = nodes.paragraph() # one paragraph for both - # add | to keep on different lines - # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) - # result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) + doc = nodes.paragraph() # one paragraph for both + if definition_in_code_block: + alias_section += nodes.literal_block(text=alias_dict["definition"]) + else: + # add | to keep on different lines + # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) + # Last argument is line number... not quite sure which line number though! + result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) if "doc" in alias_dict: result.append( "| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10 From 8d8e07abbf596be4d572d5cde1beeb3bdbbb1531 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 24 Dec 2023 03:09:52 +0000 Subject: [PATCH 15/30] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/utils/docbuild/autotyping_directive.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index f5072ac877..e4811635aa 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -38,15 +38,16 @@ def run(self) -> list[nodes.Element]: category_alias_container += alias_section alias_section += nodes.title(text=alias_name) - - doc = nodes.paragraph() # one paragraph for both + doc = nodes.paragraph() # one paragraph for both if definition_in_code_block: alias_section += nodes.literal_block(text=alias_dict["definition"]) else: # add | to keep on different lines # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) # Last argument is line number... not quite sure which line number though! - result.append(f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10) + result.append( + f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10 + ) if "doc" in alias_dict: result.append( "| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10 From a31c69703fb22f503075a714d9e480a0eba753a4 Mon Sep 17 00:00:00 2001 From: chopan Date: Sun, 24 Dec 2023 09:59:18 +0100 Subject: [PATCH 16/30] Added typings to directives --- docs/source/conf.py | 7 +- manim/utils/docbuild/autocolor_directive.py | 9 ++- manim/utils/docbuild/autotyping_directive.py | 85 ++++++++++++++------ manim/utils/docbuild/manim_directive.py | 18 +++-- manim/utils/docbuild/module_parsing.py | 22 +++-- 5 files changed, 94 insertions(+), 47 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index bd165fc790..2b31726d6f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,7 +11,7 @@ from pathlib import Path import manim -from manim.utils.docbuild.module_parsing import get_typing_docs +from manim.utils.docbuild.module_parsing import get_manim_typing_docs # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, @@ -59,9 +59,8 @@ autodoc_typehints = "description" autodoc_type_aliases = { alias_name: f"~manim.typing.{alias_name}" - for category_dict in get_typing_docs().values() - for alias_dict in category_dict.values() - for alias_name in alias_dict.keys() + for category_dict in get_manim_typing_docs().values() + for alias_name in category_dict.keys() } autoclass_content = "both" diff --git a/manim/utils/docbuild/autocolor_directive.py b/manim/utils/docbuild/autocolor_directive.py index 953dea96cb..e3f2e62468 100644 --- a/manim/utils/docbuild/autocolor_directive.py +++ b/manim/utils/docbuild/autocolor_directive.py @@ -1,13 +1,16 @@ from __future__ import annotations import inspect +from typing import TYPE_CHECKING from docutils import nodes from docutils.parsers.rst import Directive -from sphinx.application import Sphinx from manim import ManimColor +if TYPE_CHECKING: + from sphinx.application import Sphinx + __all__ = ["ManimColorModuleDocumenter"] @@ -23,9 +26,7 @@ class ManimColorModuleDocumenter(Directive): def add_directive_header(self, sig: str) -> None: super().add_directive_header(sig) - def run( - self, - ) -> None: + def run(self) -> list[nodes.Element]: module_name = self.arguments[0] try: import importlib diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index e4811635aa..9d354076fb 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -1,19 +1,60 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from docutils import nodes from docutils.parsers.rst import Directive from docutils.statemachine import ViewList -from sphinx.application import Sphinx -from manim.utils.docbuild.module_parsing import get_typing_docs +from manim.utils.docbuild.module_parsing import get_manim_typing_docs + +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.environment import BuildEnvironment + +__all__ = ["TypingModuleDocumenter", "resolve_type_aliases"] + -__all__ = ["TypingModuleDocumenter"] +MANIM_TYPING_DOCS = get_manim_typing_docs() +MANIM_TYPE_ALIASES = [ + alias_name + for category_dict in MANIM_TYPING_DOCS.values() + for alias_name in category_dict.keys() +] +# This is to prevent issues when replacing text +MANIM_TYPE_ALIASES.sort(key=lambda alias: len(alias), reverse=True) def setup(app: Sphinx) -> None: + app.connect("missing-reference", resolve_type_aliases) app.add_directive("autotypingmodule", TypingModuleDocumenter) +def resolve_type_aliases( + app: Sphinx, + env: BuildEnvironment, + node: nodes.Element, + contnode: nodes.Element, +) -> nodes.Element | None: + """Resolve :class: references to type aliases as :attr: instead. + From https://github.com/sphinx-doc/sphinx/issues/10785 + """ + if ( + node["refdomain"] == "py" + and node["reftype"] == "class" + and node["reftarget"] in MANIM_TYPE_ALIASES + ): + return app.env.get_domain("py").resolve_xref( + env, + node["refdoc"], + app.builder, + "attr", + node["reftarget"], + node, + contnode, + ) + + class TypingModuleDocumenter(Directive): objtype = "autotypingmodule" required_arguments = 0 @@ -21,10 +62,7 @@ class TypingModuleDocumenter(Directive): def run(self) -> list[nodes.Element]: content = nodes.container() - definition_in_code_block = True - - typing_docs_dict = get_typing_docs() - for category_name, category_dict in typing_docs_dict.items(): + for category_name, category_dict in MANIM_TYPING_DOCS.items(): category_section = nodes.section( ids=[category_name.lower().replace(" ", "_")] ) @@ -33,29 +71,28 @@ def run(self) -> list[nodes.Element]: category_section += category_alias_container for alias_name, alias_dict in category_dict.items(): - result = ViewList() - alias_section = nodes.topic(ids=[alias_name.lower().replace(" ", "_")]) + alias_section = nodes.section(ids=[alias_name]) category_alias_container += alias_section + alias_section += nodes.title(text=alias_name) + alias_paragraph = nodes.paragraph() + alias_section += alias_paragraph - doc = nodes.paragraph() # one paragraph for both - if definition_in_code_block: - alias_section += nodes.literal_block(text=alias_dict["definition"]) - else: - # add | to keep on different lines - # TODO: Figure out where to log sphinx errors (/tmp/sphinx-errs not availiable for non-linux) - # Last argument is line number... not quite sure which line number though! - result.append( - f'| ``{alias_dict["definition"]}``', "/tmp/sphinx-errs.log", 10 - ) + alias_def = alias_dict["definition"] + # for A in MANIM_TYPE_ALIASES: + # alias_def = alias_def.replace(A, f":ref:`{A}`") + alias_paragraph += nodes.literal_block(text=alias_def) + result = ViewList() if "doc" in alias_dict: - result.append( - "| %s" % alias_dict["doc"], "/tmp/sphinx-errs.log", 10 - ) + alias_doc = alias_dict["doc"] + # for A in MANIM_TYPE_ALIASES: + # alias_doc = alias_doc.replace(A, f":ref:`{A}`") + # add | to keep on different lines + result.append("| %s" % alias_doc, "/tmp/sphinx-errs.log", 10) # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest - self.state.nested_parse(result, 0, doc) - alias_section += doc + self.state.nested_parse(result, 0, alias_paragraph) + content += category_section return [content] diff --git a/manim/utils/docbuild/manim_directive.py b/manim/utils/docbuild/manim_directive.py index ebd4b09acf..1e11b17d5a 100644 --- a/manim/utils/docbuild/manim_directive.py +++ b/manim/utils/docbuild/manim_directive.py @@ -88,6 +88,7 @@ def construct(self): import textwrap from pathlib import Path from timeit import timeit +from typing import TYPE_CHECKING, Any import jinja2 from docutils import nodes @@ -97,6 +98,9 @@ def construct(self): from manim import QUALITIES from manim import __version__ as manim_version +if TYPE_CHECKING: + from sphinx.application import Sphinx + classnamedict = {} @@ -110,13 +114,13 @@ class SkipManimNode(nodes.Admonition, nodes.Element): pass -def visit(self, node, name=""): +def visit(self: SkipManimNode, node: nodes.Element, name: str = "") -> None: self.visit_admonition(node, name) if not isinstance(node[0], nodes.title): node.insert(0, nodes.title("skip-manim", "Example Placeholder")) -def depart(self, node): +def depart(self: SkipManimNode, node: nodes.Element) -> None: self.depart_admonition(node) @@ -162,7 +166,7 @@ class ManimDirective(Directive): } final_argument_whitespace = True - def run(self): + def run(self) -> list[nodes.Element]: # Rendering is skipped if the tag skip-manim is present, # or if we are making the pot-files should_skip = ( @@ -341,7 +345,7 @@ def run(self): rendering_times_file_path = Path("../rendering_times.csv") -def _write_rendering_stats(scene_name, run_time, file_name): +def _write_rendering_stats(scene_name: str, run_time: str, file_name: str) -> None: with rendering_times_file_path.open("a") as file: csv.writer(file).writerow( [ @@ -352,7 +356,7 @@ def _write_rendering_stats(scene_name, run_time, file_name): ) -def _log_rendering_times(*args): +def _log_rendering_times(*args: tuple[Any]) -> None: if rendering_times_file_path.exists(): with rendering_times_file_path.open() as file: data = list(csv.reader(file)) @@ -381,12 +385,12 @@ def _log_rendering_times(*args): print("") -def _delete_rendering_times(*args): +def _delete_rendering_times(*args: tuple[Any]) -> None: if rendering_times_file_path.exists(): rendering_times_file_path.unlink() -def setup(app): +def setup(app: Sphinx) -> dict[str, Any]: app.add_node(SkipManimNode, html=(visit, depart)) setup.app = app diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index dce60252c3..b1d42ad8bb 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -5,18 +5,21 @@ from manim import typing -__all__ = ["get_typing_docs"] +__all__ = ["get_manim_typing_docs"] -def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: - """Read the manim/typing.py file, generate an Abstract Syntax Tree +MANIM_TYPING_DOCS: dict[str, dict[str, dict[str, str]]] = {} + + +def get_manim_typing_docs() -> dict[str, dict[str, dict[str, str]]]: + """Read the ``manim/typing.py`` file, generate an Abstract Syntax Tree from it, and extract useful information about the type aliases defined in the file: the category they belong to, their definition and their description. Returns ------- - typing_docs_dict : dict[str, dict[str, dict[str, str]] + MANIM_TYPING_DOCS : dict[str, dict[str, dict[str, str]] A dictionary containing the information from all the type aliases. Each key is the name of a category of types, and its corresponding value is another subdictionary containing @@ -26,11 +29,14 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: aliases, and the values are subsubdictionaries containing field-value pairs with information about the type alias. """ + global MANIM_TYPING_DOCS + + if MANIM_TYPING_DOCS: + return MANIM_TYPING_DOCS with open(typing.__file__) as typing_file: typing_file_content = typing_file.read() - typing_docs_dict: dict[str, dict[str, dict[str, str]]] = {} category_dict: dict[str, dict[str, str]] | None = None alias_dict: dict[str, str] | None = None @@ -45,8 +51,8 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: section_str = "[CATEGORY]" if string.startswith(section_str): category_name = string[len(section_str) :].strip() - typing_docs_dict[category_name] = {} - category_dict = typing_docs_dict[category_name] + MANIM_TYPING_DOCS[category_name] = {} + category_dict = MANIM_TYPING_DOCS[category_name] alias_dict = None # or a docstring of the alias defined before elif alias_dict: @@ -84,4 +90,4 @@ def get_typing_docs() -> dict[str, dict[str, dict[str, str]]]: else: alias_dict = None - return typing_docs_dict + return MANIM_TYPING_DOCS From b1dee771508f79fa7eb9165e8238969b17193103 Mon Sep 17 00:00:00 2001 From: chopan Date: Sun, 24 Dec 2023 10:13:18 +0100 Subject: [PATCH 17/30] Renamed Tuple to tuple in manim.typings --- manim/typing.py | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index de2ea8a7f9..0d0fa9ca7e 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -23,7 +23,7 @@ from __future__ import annotations from os import PathLike -from typing import Annotated, Callable, Literal, Tuple, Union +from typing import Annotated, Callable, Literal, Union import numpy as np import numpy.typing as npt @@ -99,16 +99,16 @@ ManimColorDType: TypeAlias = ManimFloat RGB_Array_Float: TypeAlias = npt.NDArray[ManimFloat] -RGB_Tuple_Float: TypeAlias = Tuple[float, float, float] +RGB_Tuple_Float: TypeAlias = tuple[float, float, float] RGB_Array_Int: TypeAlias = npt.NDArray[ManimInt] -RGB_Tuple_Int: TypeAlias = Tuple[int, int, int] +RGB_Tuple_Int: TypeAlias = tuple[int, int, int] RGBA_Array_Float: TypeAlias = npt.NDArray[ManimFloat] -RGBA_Tuple_Float: TypeAlias = Tuple[float, float, float, float] +RGBA_Tuple_Float: TypeAlias = tuple[float, float, float, float] RGBA_Array_Int: TypeAlias = npt.NDArray[ManimInt] -RGBA_Tuple_Int: TypeAlias = Tuple[int, int, int, int] +RGBA_Tuple_Int: TypeAlias = tuple[int, int, int, int] HSV_Array_Float: TypeAlias = RGB_Array_Float HSV_Tuple_Float: TypeAlias = RGB_Tuple_Float @@ -128,7 +128,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D: TypeAlias = Union[InternalPoint2D, Tuple[float, float]] +Point2D: TypeAlias = Union[InternalPoint2D, tuple[float, float]] """`shape (2,)` A 2D point: `[float, float]` """ @@ -139,7 +139,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, Tuple[Point2D, ...]] +Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, tuple[Point2D, ...]] """`shape (N, 2)` An array of Point2D objects: `[[float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -151,7 +151,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D: TypeAlias = Union[InternalPoint3D, Tuple[float, float, float]] +Point3D: TypeAlias = Union[InternalPoint3D, tuple[float, float, float]] """`shape (3,)` A 3D point: `[float, float, float]` """ @@ -162,7 +162,7 @@ This type alias is mostly made available for internal use and only includes the NumPy type. """ -Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, Tuple[Point3D, ...]] +Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, tuple[Point3D, ...]] """`shape (N, 3)` An array of Point3D objects: `[[float, float, float], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -174,37 +174,37 @@ Vector types """ -Vector2: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, float]] +Vector2: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] """`shape (2,)` A 2D vector: `[float, float]` """ -Vector3: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, float, float]] +Vector3: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] """`shape (3,)` A 3D vector: `[float, float, float]` """ -Vector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, ...]] +Vector: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """`shape (N,)` An `N`-D vector: `[float, ...]` """ -RowVector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float, ...]]] +RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] """`shape (1, N)` A row vector: `[[float, ...]]` """ -ColVector: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float], ...]] +ColVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float], ...]] """`shape (N, 1)` A column vector: `[[float], [float], ...]` """ -MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], Tuple[Tuple[float, ...], ...]] +MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...], ...]] """`shape (M, N)` A matrix: `[[float, ...], [float, ...], ...]` """ -Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], Tuple[Tuple[Literal[0], ...], ...]] +Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], tuple[tuple[Literal[0], ...], ...]] """A matrix of zeros, typically created with ``numpy.zeros((M, N))``""" @@ -214,14 +214,14 @@ """ QuadraticBezierPoints: TypeAlias = Union[ - npt.NDArray[PointDType], Tuple[Point3D, Point3D, Point3D] + npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D] ] """`shape (3, 3)` A `Point3D_Array` of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]` """ QuadraticBezierPoints_Array: TypeAlias = Union[ - npt.NDArray[PointDType], Tuple[QuadraticBezierPoints, ...] + npt.NDArray[PointDType], tuple[QuadraticBezierPoints, ...] ] """`shape (N, 3, 3)` An array of `N QuadraticBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]` @@ -242,14 +242,14 @@ """ CubicBezierPoints: TypeAlias = Union[ - npt.NDArray[PointDType], Tuple[Point3D, Point3D, Point3D, Point3D] + npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D, Point3D] ] """`shape (4, 3)` A `Point3D_Array` of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]` """ CubicBezierPoints_Array: TypeAlias = Union[ - npt.NDArray[PointDType], Tuple[CubicBezierPoints, ...] + npt.NDArray[PointDType], tuple[CubicBezierPoints, ...] ] """`shape (N, 4, 3)` An array of `N CubicBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]` @@ -276,7 +276,7 @@ (Please refer to the documentation of the function you are using for further type information.) """ -BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], Tuple[BezierPoints, ...]] +BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[BezierPoints, ...]] """`shape (N, PPC, 3)` An array of `N BezierPoints` objects containing `PPC Point3D` objects each: `[[[float, float, float], ...], ...]` (Please refer to the documentation of the function you are using for further type information.) @@ -297,7 +297,7 @@ (Please refer to the documentation of the function you are using for further type information.) """ -FlatBezierPoints: TypeAlias = Union[npt.NDArray[PointDType], Tuple[float, ...]] +FlatBezierPoints: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """`shape (N)` A flattened array of Bézier control points: `[float, ...]` """ From 4e78940dccde7acacc24df397baecb30d91847f6 Mon Sep 17 00:00:00 2001 From: chopan Date: Tue, 26 Dec 2023 22:25:26 +0100 Subject: [PATCH 18/30] Added missing docs for type aliases --- manim/typing.py | 236 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 167 insertions(+), 69 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index 0d0fa9ca7e..1e06f840f4 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -88,7 +88,15 @@ """ ManimFloat: TypeAlias = np.float64 +"""A double-precision floating-point value (64 bits, or 8 bytes), according to +the IEEE 754 standard. +""" + ManimInt: TypeAlias = np.int64 +r"""A long integer (64 bits, or 8 bytes). It can take values between +:math:`-2^63` and :math:`+2^63 - 1`, which expressed in base 10 is a range +between around :math:`-9.223 \cdot 10^18` and :math:`+9.223 \cdot 10^18`. +""" """ @@ -97,23 +105,76 @@ """ ManimColorDType: TypeAlias = ManimFloat +"""Default type for color array elements: a double-precision float between +0 and 1. +""" + +RGB_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] +"""``shape: (3,)`` +A NumPy ndarray of 3 floats between 0 and 1, representing a color in RGB format. +Its components represent, in order, amounts of: Red light, Green light and Blue light. +""" -RGB_Array_Float: TypeAlias = npt.NDArray[ManimFloat] RGB_Tuple_Float: TypeAlias = tuple[float, float, float] +"""``shape: (3,)`` +A tuple of 3 floats between 0 and 1, representing a color in RGB format. +Its components represent, in order, amounts of: Red light, Green light and Blue light. +""" RGB_Array_Int: TypeAlias = npt.NDArray[ManimInt] +"""``shape: (3,)`` +A NumPy ndarray of 3 integers between 0 and 255, representing a color in RGB format. +Its components represent, in order, amounts of: Red light, Green light and Blue light. +""" + RGB_Tuple_Int: TypeAlias = tuple[int, int, int] +"""``shape: (3,)`` +A tuple of 3 integers between 0 and 255, representing a color in RGB format. +Its components represent, in order, amounts of: Red light, Green light and Blue light. +""" + +RGBA_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] +"""``shape: (4,)`` +A NumPy ndarray of 4 floats between 0 and 1, representing a color in RGBA format. +Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). +""" -RGBA_Array_Float: TypeAlias = npt.NDArray[ManimFloat] RGBA_Tuple_Float: TypeAlias = tuple[float, float, float, float] +"""``shape: (4,)`` +A tuple of 4 floats between 0 and 1, representing a color in RGBA format. +Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). +""" RGBA_Array_Int: TypeAlias = npt.NDArray[ManimInt] +"""``shape: (4,)`` +A NumPy ndarray of 4 integers between 0 and 255, representing a color in RGBA format. +Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). +""" + RGBA_Tuple_Int: TypeAlias = tuple[int, int, int, int] +"""``shape: (4,)`` +A tuple of 4 integers between 0 and 255, representing a color in RGBA format. +Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). +""" HSV_Array_Float: TypeAlias = RGB_Array_Float +"""``shape: (3,)`` +A NumPy ndarray of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. +Its components represent, in order: Hue, Saturation and Value (or Brightness). +""" + HSV_Tuple_Float: TypeAlias = RGB_Tuple_Float +"""``shape: (3,)`` +A tuple of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. +Its components represent, in order: Hue, Saturation and Value (or Brightness). +""" -ManimColorInternal: TypeAlias = npt.NDArray[ManimColorDType] +ManimColorInternal: TypeAlias = RGBA_Array_Float +"""``shape: (4,)`` +Internal color representation used by `ManimColor`, following the RGBA format. +It consists of 4 floats between 0 and 1, representing in order: +Red light, Green light, Blue light, and Alpha (opacity). +""" """ @@ -122,49 +183,51 @@ """ PointDType: TypeAlias = ManimFloat +"""Default type for arrays representing points: a double-precision floating point value.""" InternalPoint2D: TypeAlias = npt.NDArray[PointDType] -""" `shape: (2,)` A 2D point: `[float, float]`. -This type alias is mostly made available for internal use and only includes the NumPy type. +"""``shape: (2,)`` +A 2D point: ``[float, float]``. +This type alias is mostly made available for internal use, and only includes the NumPy type. """ Point2D: TypeAlias = Union[InternalPoint2D, tuple[float, float]] -"""`shape (2,)` -A 2D point: `[float, float]` +"""``shape: (2,)`` +A 2D point: ``[float, float]``. """ InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] -"""`shape (N, 3)` -An array of Point2D: `[[float, float], ...]` -This type alias is mostly made available for internal use and only includes the NumPy type. +"""``shape: (N, 3)`` +An array of `Point2D` objects: ``[[float, float], ...]``. +This type alias is mostly made available for internal use, and only includes the NumPy type. """ Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, tuple[Point2D, ...]] -"""`shape (N, 2)` -An array of Point2D objects: `[[float, float], ...]` +"""``shape: (N, 2)`` +An array of `Point2D` objects: ``[[float, float], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ InternalPoint3D: TypeAlias = npt.NDArray[PointDType] -"""`shape (3,)` -A 3D point: `[float, float, float]` -This type alias is mostly made available for internal use and only includes the NumPy type. +"""``shape: (3,)`` +A 3D point: ``[float, float, float]``. +This type alias is mostly made available for internal use, and only includes the NumPy type. """ Point3D: TypeAlias = Union[InternalPoint3D, tuple[float, float, float]] -"""`shape (3,)` -A 3D point: `[float, float, float]` +"""``shape: (3,)`` +A 3D point: ``[float, float, float]``. """ InternalPoint3D_Array: TypeAlias = npt.NDArray[PointDType] -"""`shape (N, 3)` -An array of Point3D objects: `[[float, float, float], ...]` -This type alias is mostly made available for internal use and only includes the NumPy type. +"""``shape: (N, 3)`` +An array of :class:`~Point3D`: objects: ``[[float, float, float], ...]``. +This type alias is mostly made available for internal use, and only includes the NumPy type. """ Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, tuple[Point3D, ...]] -"""`shape (N, 3)` -An array of Point3D objects: `[[float, float, float], ...]` +"""``shape: (N, 3)`` +An array of :data:`~Point3D`: objects: ``[[float, float, float], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ @@ -175,37 +238,44 @@ """ Vector2: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] -"""`shape (2,)` -A 2D vector: `[float, float]` +"""``shape: (2,)`` +A 2D vector: `[float, float]`. """ Vector3: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] -"""`shape (3,)` -A 3D vector: `[float, float, float]` +"""``shape: (3,)`` +A 3D vector: `[float, float, float]`. """ Vector: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] -"""`shape (N,)` -An `N`-D vector: `[float, ...]` +"""``shape (N,)`` +An `N`-D vector: ``}[float, ...]``. """ RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] -"""`shape (1, N)` -A row vector: `[[float, ...]]` +"""``shape: (1, N)`` +A row vector: ``[[float, ...]]``. """ ColVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float], ...]] -"""`shape (N, 1)` -A column vector: `[[float], [float], ...]` +"""``shape: (N, 1)`` +A column vector: ``[[float], [float], ...]``. +""" + + +""" +[CATEGORY] +Matrix types """ MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...], ...]] -"""`shape (M, N)` -A matrix: `[[float, ...], [float, ...], ...]` +"""``shape: (M, N)`` +A matrix: ``[[float, ...], [float, ...], ...]``. """ Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], tuple[tuple[Literal[0], ...], ...]] -"""A matrix of zeros, typically created with ``numpy.zeros((M, N))``""" +"""``shape: (M, N)`` +A `MatrixMN` filled with zeros, typically created with ``numpy.zeros((M, N))``.""" """ @@ -216,90 +286,90 @@ QuadraticBezierPoints: TypeAlias = Union[ npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D] ] -"""`shape (3, 3)` -A `Point3D_Array` of control points for a single quadratic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float]]` +"""``shape: (3, 3)`` +A `Point3D_Array` of 3 control points for a single quadratic Bézier curve: ``[[float, float, float], [float, float, float], [float, float, float]]``. """ QuadraticBezierPoints_Array: TypeAlias = Union[ npt.NDArray[PointDType], tuple[QuadraticBezierPoints, ...] ] -"""`shape (N, 3, 3)` -An array of `N QuadraticBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float]], ...]` +"""``shape: (N, 3, 3)`` +An array of `N` `QuadraticBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. """ QuadraticBezierPath: TypeAlias = Point3D_Array -"""`shape (3*N, 3)` -An array of `3*N Point3D` objects, where each one of the `N` consecutive blocks of -3 points represents a quadratic Bézier curve: `[[float, float, float], ...], ...]` +"""``shape: (3*N, 3)`` +A `Point3D_Array` of `3*N` points, where each one of the `N` consecutive blocks of +3 points represents a quadratic Bézier curve: ``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ QuadraticSpline: TypeAlias = QuadraticBezierPath -"""`shape (3*N, 3)` +"""``shape: (3*N, 3)`` A special case of `QuadraticBezierPath` where all the `N` quadratic Bézier -curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]` +curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ CubicBezierPoints: TypeAlias = Union[ npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D, Point3D] ] -"""`shape (4, 3)` -A `Point3D_Array` of control points for a single cubic Bézier curve: `[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]` +"""``shape: (4, 3)`` +A `Point3D_Array` of 4 control points for a single cubic Bézier curve: ``[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]``. """ CubicBezierPoints_Array: TypeAlias = Union[ npt.NDArray[PointDType], tuple[CubicBezierPoints, ...] ] -"""`shape (N, 4, 3)` -An array of `N CubicBezierPoints` objects: `[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]` +"""``shape: (N, 4, 3)`` +An array of `N` `CubicBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]``. """ CubicBezierPath: TypeAlias = Point3D_Array -"""`shape (4*N, 3)` -An array of `4*N Point3D` objects, where each one of the `N` consecutive blocks of -4 points represents a cubic Bézier curve: `[[float, float, float], ...], ...]` +"""``shape: (4*N, 3)`` +A `Point3D_Array` of `4*N` points, where each one of the `N` consecutive blocks of +4 points represents a cubic Bézier curve: ``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ CubicSpline: TypeAlias = CubicBezierPath -"""`shape (4*N, 3)` +"""``shape: (4*N, 3)`` A special case of `CubicBezierPath` where all the `N` cubic Bézier -curves are connected, forming a quadratic spline: `[[float, float, float], ...], ...]` +curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ BezierPoints: TypeAlias = Point3D_Array -"""`shape (PPC, 3)` -A `Point3D_Array` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th -degree Bézier curve: `[[float, float, float], ...]` +"""``shape: (PPC, 3)`` +A ``Point3D_Array`` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th +degree Bézier curve: ``[[float, float, float], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[BezierPoints, ...]] -"""`shape (N, PPC, 3)` -An array of `N BezierPoints` objects containing `PPC Point3D` objects each: `[[[float, float, float], ...], ...]` +"""``shape: (N, PPC, 3)`` +An array of `N BezierPoints` objects containing `PPC Point3D` objects each: ``[[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ BezierPath: TypeAlias = Point3D_Array -"""`shape (PPC*N, 3)` -An array of `PPC * N Point3D` objects, where where each one of the `N` consecutive blocks of +"""``shape: (PPC*N, 3)`` +A `Point3D_Array` of `PPC * N` points, where where each one of the `N` consecutive blocks of `PPC = n + 1` ("Points Per Curve") points represents a Bézier curve of `n`-th degree: -`[[float, float, float], ...], ...]` +``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ Spline: TypeAlias = BezierPath -"""`shape (PPC*N, 3)` -A special case of BezierPath where all the `N` Bézier curves consisting of `PPC` ("Points Per Curve") -`Point3D` objects are connected, forming an `n`-th degree spline: `[[float, float, float], ...], ...]` +"""``shape: (PPC*N, 3)`` +A special case of `BezierPath` where all the `N` Bézier curves consisting of `PPC` ("Points Per Curve") +`Point3D` objects are connected, forming an `n`-th degree spline: ``[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ FlatBezierPoints: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] -"""`shape (N)` -A flattened array of Bézier control points: `[float, ...]` +"""``shape: (N,)`` +A flattened array of Bézier control points: ``[float, ...]``. """ @@ -310,7 +380,7 @@ # Due to current limitations (see https://github.com/python/mypy/issues/14656 / 8263), we don't specify the first argument type (Mobject). FunctionOverride: TypeAlias = Callable[..., None] -"""Function type returning an `Animation` for the specified `Mobject`.""" +"""Function type returning an :class:`~.Animation` for the specified :class:`~.Mobject`.""" PathFuncType: TypeAlias = Callable[[Point3D, Point3D, float], Point3D] """Function mapping two `Point3D` objects and an alpha value to a new `Point3D`.""" @@ -324,8 +394,31 @@ Image types """ -Image: TypeAlias = np.ndarray -"""An image.""" +Image: TypeAlias = npt.NDArray[ManimInt] +"""``shape: (height, width) | (height, width, 3) | (height, width, 4)``. +A rasterized image with a height of ``height`` pixels and a width of ``width`` +pixels. Every value in the array is an integer from 0 to 255. Every pixel is +represented either by a single integer indicating its lightness (for greyscale +images), an `RGB_Array_Int` or an `RGBA_Array_Int`. +""" + +GrayscaleImage: TypeAlias = Image +"""``shape: (height, width)`` +A 100% opaque grayscale `Image`, where every pixel value is a single integer +from 0 to 255 indicating its lightness (black -> gray -> white). +""" + +RGBImage: TypeAlias = Image +"""``shape: (height, width, 3)`` +A 100% opaque `Image` in color, where every pixel value is an `RGB_Array_Int` +object. +""" + +RGBAImage: TypeAlias = Image +"""``shape: (height, width, 4)`` +An `Image` in color where pixels can be transparent. Every pixel value is an +`RGBA_Array_Int` object. +""" """ @@ -334,4 +427,9 @@ """ StrPath: TypeAlias = Union[str, PathLike[str]] +"""A string or :class:`os.PathLike` representing a path to a directory or file.""" + StrOrBytesPath: TypeAlias = Union[str, bytes, PathLike[str], PathLike[bytes]] +"""A string, bytes or :class:`os.PathLike` object representing a path to a +directory or file. +""" From 9fca6ede1915c1628d9869427aecd541e772af27 Mon Sep 17 00:00:00 2001 From: chopan Date: Tue, 26 Dec 2023 22:59:50 +0100 Subject: [PATCH 19/30] Fixed exponent typo in ManimInt --- manim/typing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index 1e06f840f4..e9c3df830e 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -94,8 +94,8 @@ ManimInt: TypeAlias = np.int64 r"""A long integer (64 bits, or 8 bytes). It can take values between -:math:`-2^63` and :math:`+2^63 - 1`, which expressed in base 10 is a range -between around :math:`-9.223 \cdot 10^18` and :math:`+9.223 \cdot 10^18`. +:math:`-2^{63}` and :math:`+2^{63} - 1`, which expressed in base 10 is a range +between around :math:`-9.223 \cdot 10^{18}` and :math:`+9.223 \cdot 10^{18}`. """ From e56b793d68d3ba2c27ccd44857cdb26001c8a4b1 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 27 Dec 2023 12:58:23 +0100 Subject: [PATCH 20/30] Hyperlinks to types work - removed Module Attributes section --- docs/source/_templates/autosummary/module.rst | 2 +- manim/typing.py | 31 ++++---- manim/utils/docbuild/autotyping_directive.py | 73 +++++++------------ 3 files changed, 44 insertions(+), 62 deletions(-) diff --git a/docs/source/_templates/autosummary/module.rst b/docs/source/_templates/autosummary/module.rst index d0a10c34cb..8f3d4d6769 100644 --- a/docs/source/_templates/autosummary/module.rst +++ b/docs/source/_templates/autosummary/module.rst @@ -5,7 +5,7 @@ .. automodule:: {{ fullname }} {% block attributes %} - {% if attributes %} + {% if attributes and fullname != 'manim.typing' %} .. rubric:: Module Attributes .. autosummary:: diff --git a/manim/typing.py b/manim/typing.py index e9c3df830e..2b197e35bf 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -77,6 +77,9 @@ "PathFuncType", "MappingFunction", "Image", + "GrayscaleImage", + "RGBImage", + "RGBAImage", "StrPath", "StrOrBytesPath", ] @@ -105,8 +108,8 @@ """ ManimColorDType: TypeAlias = ManimFloat -"""Default type for color array elements: a double-precision float between -0 and 1. +"""Data type used in :class:`~.ManimColorInternal`: a double-precision float +between 0 and 1. """ RGB_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] @@ -171,7 +174,7 @@ ManimColorInternal: TypeAlias = RGBA_Array_Float """``shape: (4,)`` -Internal color representation used by `ManimColor`, following the RGBA format. +Internal color representation used by :class:`~.ManimColor`, following the RGBA format. It consists of 4 floats between 0 and 1, representing in order: Red light, Green light, Blue light, and Alpha (opacity). """ @@ -221,13 +224,13 @@ InternalPoint3D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 3)`` -An array of :class:`~Point3D`: objects: ``[[float, float, float], ...]``. +An array of `Point3D` objects: ``[[float, float, float], ...]``. This type alias is mostly made available for internal use, and only includes the NumPy type. """ Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, tuple[Point3D, ...]] """``shape: (N, 3)`` -An array of :data:`~Point3D`: objects: ``[[float, float, float], ...]``. +An array of `Point3D` objects: ``[[float, float, float], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ @@ -239,17 +242,17 @@ Vector2: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] """``shape: (2,)`` -A 2D vector: `[float, float]`. +A 2D vector: ``[float, float]``. """ Vector3: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] """``shape: (3,)`` -A 3D vector: `[float, float, float]`. +A 3D vector: ``[float, float, float]``. """ Vector: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """``shape (N,)`` -An `N`-D vector: ``}[float, ...]``. +An `N`-D vector: ``[float, ...]``. """ RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] @@ -273,7 +276,7 @@ A matrix: ``[[float, ...], [float, ...], ...]``. """ -Zeros: TypeAlias = Union[npt.NDArray[ManimFloat], tuple[tuple[Literal[0], ...], ...]] +Zeros: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[Literal[0], ...], ...]] """``shape: (M, N)`` A `MatrixMN` filled with zeros, typically created with ``numpy.zeros((M, N))``.""" @@ -341,14 +344,14 @@ BezierPoints: TypeAlias = Point3D_Array """``shape: (PPC, 3)`` -A ``Point3D_Array`` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th +A `Point3D_Array` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th degree Bézier curve: ``[[float, float, float], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[BezierPoints, ...]] """``shape: (N, PPC, 3)`` -An array of `N BezierPoints` objects containing `PPC Point3D` objects each: ``[[[float, float, float], ...], ...]``. +An array of `N` `BezierPoints` objects containing `PPC Point3D` objects each: ``[[[float, float, float], ...], ...]``. (Please refer to the documentation of the function you are using for further type information.) """ @@ -395,7 +398,7 @@ """ Image: TypeAlias = npt.NDArray[ManimInt] -"""``shape: (height, width) | (height, width, 3) | (height, width, 4)``. +"""``shape: (height, width) | (height, width, 3) | (height, width, 4)`` A rasterized image with a height of ``height`` pixels and a width of ``width`` pixels. Every value in the array is an integer from 0 to 255. Every pixel is represented either by a single integer indicating its lightness (for greyscale @@ -404,8 +407,8 @@ GrayscaleImage: TypeAlias = Image """``shape: (height, width)`` -A 100% opaque grayscale `Image`, where every pixel value is a single integer -from 0 to 255 indicating its lightness (black -> gray -> white). +A 100% opaque grayscale `Image`, where every pixel value is a `ManimInt` +indicating its lightness (black -> gray -> white). """ RGBImage: TypeAlias = Image diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index 9d354076fb..bac5726221 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -1,5 +1,6 @@ from __future__ import annotations +import re from typing import TYPE_CHECKING from docutils import nodes @@ -10,51 +11,22 @@ if TYPE_CHECKING: from sphinx.application import Sphinx - from sphinx.environment import BuildEnvironment -__all__ = ["TypingModuleDocumenter", "resolve_type_aliases"] +__all__ = ["TypingModuleDocumenter"] MANIM_TYPING_DOCS = get_manim_typing_docs() -MANIM_TYPE_ALIASES = [ +ALIAS_LIST = [ alias_name for category_dict in MANIM_TYPING_DOCS.values() for alias_name in category_dict.keys() ] -# This is to prevent issues when replacing text -MANIM_TYPE_ALIASES.sort(key=lambda alias: len(alias), reverse=True) def setup(app: Sphinx) -> None: - app.connect("missing-reference", resolve_type_aliases) app.add_directive("autotypingmodule", TypingModuleDocumenter) -def resolve_type_aliases( - app: Sphinx, - env: BuildEnvironment, - node: nodes.Element, - contnode: nodes.Element, -) -> nodes.Element | None: - """Resolve :class: references to type aliases as :attr: instead. - From https://github.com/sphinx-doc/sphinx/issues/10785 - """ - if ( - node["refdomain"] == "py" - and node["reftype"] == "class" - and node["reftarget"] in MANIM_TYPE_ALIASES - ): - return app.env.get_domain("py").resolve_xref( - env, - node["refdoc"], - app.builder, - "attr", - node["reftarget"], - node, - contnode, - ) - - class TypingModuleDocumenter(Directive): objtype = "autotypingmodule" required_arguments = 0 @@ -71,27 +43,34 @@ def run(self) -> list[nodes.Element]: category_section += category_alias_container for alias_name, alias_dict in category_dict.items(): - alias_section = nodes.section(ids=[alias_name]) - category_alias_container += alias_section + unparsed = ViewList( + [ + f".. class:: {alias_name}", + "", + " .. code-block::", + "", + f" {alias_dict['definition']}", + "", + ] + ) - alias_section += nodes.title(text=alias_name) - alias_paragraph = nodes.paragraph() - alias_section += alias_paragraph - - alias_def = alias_dict["definition"] - # for A in MANIM_TYPE_ALIASES: - # alias_def = alias_def.replace(A, f":ref:`{A}`") - alias_paragraph += nodes.literal_block(text=alias_def) - result = ViewList() if "doc" in alias_dict: alias_doc = alias_dict["doc"] - # for A in MANIM_TYPE_ALIASES: - # alias_doc = alias_doc.replace(A, f":ref:`{A}`") - # add | to keep on different lines - result.append("| %s" % alias_doc, "/tmp/sphinx-errs.log", 10) + for A in ALIAS_LIST: + alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") + doc_lines = alias_doc.split("\n") + if ( + len(doc_lines) >= 2 + and doc_lines[0].startswith("``shape:") + and doc_lines[1].strip() != "" + ): + doc_lines.insert(1, "") + unparsed.extend(ViewList([f" {line}" for line in doc_lines])) # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest - self.state.nested_parse(result, 0, alias_paragraph) + alias_section = nodes.container() + self.state.nested_parse(unparsed, 0, alias_section) + category_alias_container += alias_section content += category_section From 67f902e791b19fc914f69fb899eacf0975568b80 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 27 Dec 2023 13:17:00 -0500 Subject: [PATCH 21/30] Removed Unused Import Remove ``import re`` --- manim/utils/docbuild/autotyping_directive.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py index bac5726221..2c579e0751 100644 --- a/manim/utils/docbuild/autotyping_directive.py +++ b/manim/utils/docbuild/autotyping_directive.py @@ -1,6 +1,5 @@ from __future__ import annotations -import re from typing import TYPE_CHECKING from docutils import nodes From 7580490ff2f3c1d1023a9bf173eaa79555f32687 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 27 Dec 2023 14:00:55 -0500 Subject: [PATCH 22/30] Added freeglut-devel to workflows for Linux Hopefully (?) fix the GLU import error --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e449e6205d..c193153816 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: if: runner.os == 'Linux' uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: python3-opengl libpango1.0-dev xvfb + packages: python3-opengl libpango1.0-dev xvfb freeglut-devel version: 1.0 - name: Install Texlive (Linux) From 8f2391a6b10395fe71c9aa8edd95dfcb94b931c9 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 27 Dec 2023 14:02:28 -0500 Subject: [PATCH 23/30] Fix package name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c193153816..3e132c1f8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: if: runner.os == 'Linux' uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: python3-opengl libpango1.0-dev xvfb freeglut-devel + packages: python3-opengl libpango1.0-dev xvfb freeglut3-dev version: 1.0 - name: Install Texlive (Linux) From 86f9760d4508a07a5875eaf54f69d36d7c3ab1a4 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 27 Dec 2023 20:37:35 +0100 Subject: [PATCH 24/30] Add support for Type Aliases section in every module - Renaming of Vector types --- docs/source/_templates/autosummary/module.rst | 11 +- docs/source/conf.py | 10 +- manim/_config/utils.py | 12 +- manim/constants.py | 30 ++-- manim/mobject/geometry/arc.py | 6 +- manim/mobject/geometry/line.py | 14 +- manim/mobject/geometry/tips.py | 4 +- manim/mobject/graphing/coordinate_systems.py | 12 +- manim/mobject/mobject.py | 59 +++--- manim/mobject/three_d/three_d_utils.py | 8 +- manim/mobject/three_d/three_dimensions.py | 8 +- manim/mobject/types/vectorized_mobject.py | 20 +-- manim/typing.py | 18 +- manim/utils/color/core.py | 7 +- .../utils/docbuild/autoaliasattr_directive.py | 105 +++++++++++ manim/utils/docbuild/autotyping_directive.py | 77 -------- manim/utils/docbuild/module_parsing.py | 168 +++++++++++------- manim/utils/space_ops.py | 9 +- 18 files changed, 321 insertions(+), 257 deletions(-) create mode 100644 manim/utils/docbuild/autoaliasattr_directive.py delete mode 100644 manim/utils/docbuild/autotyping_directive.py diff --git a/docs/source/_templates/autosummary/module.rst b/docs/source/_templates/autosummary/module.rst index 8f3d4d6769..e5b8a89883 100644 --- a/docs/source/_templates/autosummary/module.rst +++ b/docs/source/_templates/autosummary/module.rst @@ -4,16 +4,7 @@ .. automodule:: {{ fullname }} - {% block attributes %} - {% if attributes and fullname != 'manim.typing' %} - .. rubric:: Module Attributes - - .. autosummary:: - {% for item in attributes %} - {{ item }} - {%- endfor %} - {% endif %} - {% endblock %} + .. autoaliasattr:: {{ fullname }} {% block classes %} {% if classes %} diff --git a/docs/source/conf.py b/docs/source/conf.py index 2b31726d6f..e488dc9dbc 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,7 +11,7 @@ from pathlib import Path import manim -from manim.utils.docbuild.module_parsing import get_manim_typing_docs +from manim.utils.docbuild.module_parsing import parse_module_attributes # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, @@ -45,7 +45,7 @@ "sphinxext.opengraph", "manim.utils.docbuild.manim_directive", "manim.utils.docbuild.autocolor_directive", - "manim.utils.docbuild.autotyping_directive", + "manim.utils.docbuild.autoaliasattr_directive", "sphinx.ext.graphviz", "sphinx.ext.inheritance_diagram", "sphinxcontrib.programoutput", @@ -56,10 +56,12 @@ autosummary_generate = True # generate documentation from type hints +ALIAS_DOCS_DICT = parse_module_attributes()[0] autodoc_typehints = "description" autodoc_type_aliases = { - alias_name: f"~manim.typing.{alias_name}" - for category_dict in get_manim_typing_docs().values() + alias_name: f"~manim.{module}.{alias_name}" + for module, module_dict in ALIAS_DOCS_DICT.items() + for category_dict in module_dict.values() for alias_name in category_dict.keys() } autoclass_content = "both" diff --git a/manim/_config/utils.py b/manim/_config/utils.py index e571c518be..88444e9e5f 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -29,7 +29,7 @@ from .. import constants from ..constants import RendererType -from ..typing import StrPath, Vector3 +from ..typing import StrPath, Vector3D from ..utils.color import ManimColor from ..utils.tex import TexTemplate, TexTemplateFromFile @@ -1147,22 +1147,22 @@ def frame_x_radius(self, value: float) -> None: ) @property - def top(self) -> Vector3: + def top(self) -> Vector3D: """Coordinate at the center top of the frame.""" return self.frame_y_radius * constants.UP @property - def bottom(self) -> Vector3: + def bottom(self) -> Vector3D: """Coordinate at the center bottom of the frame.""" return self.frame_y_radius * constants.DOWN @property - def left_side(self) -> Vector3: + def left_side(self) -> Vector3D: """Coordinate at the middle left of the frame.""" return self.frame_x_radius * constants.LEFT @property - def right_side(self) -> Vector3: + def right_side(self) -> Vector3D: """Coordinate at the middle right of the frame.""" return self.frame_x_radius * constants.RIGHT @@ -1803,7 +1803,7 @@ class ManimFrame(Mapping): "left_side", "right_side", } - _CONSTANTS: ClassVar[dict[str, Vector3]] = { + _CONSTANTS: ClassVar[dict[str, Vector3D]] = { "UP": np.array((0.0, 1.0, 0.0)), "DOWN": np.array((0.0, -1.0, 0.0)), "RIGHT": np.array((1.0, 0.0, 0.0)), diff --git a/manim/constants.py b/manim/constants.py index 30a20e050b..3f3fae19de 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -10,7 +10,7 @@ from cloup import Context from PIL.Image import Resampling -from manim.typing import Vector3 +from manim.typing import Vector3D __all__ = [ "SCENE_NOT_FOUND_MESSAGE", @@ -123,43 +123,43 @@ } # Geometry: directions -ORIGIN: Vector3 = np.array((0.0, 0.0, 0.0)) +ORIGIN: Vector3D = np.array((0.0, 0.0, 0.0)) """The center of the coordinate system.""" -UP: Vector3 = np.array((0.0, 1.0, 0.0)) +UP: Vector3D = np.array((0.0, 1.0, 0.0)) """One unit step in the positive Y direction.""" -DOWN: Vector3 = np.array((0.0, -1.0, 0.0)) +DOWN: Vector3D = np.array((0.0, -1.0, 0.0)) """One unit step in the negative Y direction.""" -RIGHT: Vector3 = np.array((1.0, 0.0, 0.0)) +RIGHT: Vector3D = np.array((1.0, 0.0, 0.0)) """One unit step in the positive X direction.""" -LEFT: Vector3 = np.array((-1.0, 0.0, 0.0)) +LEFT: Vector3D = np.array((-1.0, 0.0, 0.0)) """One unit step in the negative X direction.""" -IN: Vector3 = np.array((0.0, 0.0, -1.0)) +IN: Vector3D = np.array((0.0, 0.0, -1.0)) """One unit step in the negative Z direction.""" -OUT: Vector3 = np.array((0.0, 0.0, 1.0)) +OUT: Vector3D = np.array((0.0, 0.0, 1.0)) """One unit step in the positive Z direction.""" # Geometry: axes -X_AXIS: Vector3 = np.array((1.0, 0.0, 0.0)) -Y_AXIS: Vector3 = np.array((0.0, 1.0, 0.0)) -Z_AXIS: Vector3 = np.array((0.0, 0.0, 1.0)) +X_AXIS: Vector3D = np.array((1.0, 0.0, 0.0)) +Y_AXIS: Vector3D = np.array((0.0, 1.0, 0.0)) +Z_AXIS: Vector3D = np.array((0.0, 0.0, 1.0)) # Geometry: useful abbreviations for diagonals -UL: Vector3 = UP + LEFT +UL: Vector3D = UP + LEFT """One step up plus one step left.""" -UR: Vector3 = UP + RIGHT +UR: Vector3D = UP + RIGHT """One step up plus one step right.""" -DL: Vector3 = DOWN + LEFT +DL: Vector3D = DOWN + LEFT """One step down plus one step left.""" -DR: Vector3 = DOWN + RIGHT +DR: Vector3D = DOWN + RIGHT """One step down plus one step right.""" # Geometry diff --git a/manim/mobject/geometry/arc.py b/manim/mobject/geometry/arc.py index 9b724482c5..c979f798de 100644 --- a/manim/mobject/geometry/arc.py +++ b/manim/mobject/geometry/arc.py @@ -67,7 +67,7 @@ def construct(self): from manim.mobject.mobject import Mobject from manim.mobject.text.tex_mobject import SingleStringMathTex, Tex from manim.mobject.text.text_mobject import Text - from manim.typing import CubicBezierPoints, Point3D, QuadraticBezierPoints, Vector + from manim.typing import CubicBezierPoints, Point3D, QuadraticBezierPoints, Vector3D class TipableVMobject(VMobject, metaclass=ConvertToOpenGL): @@ -91,12 +91,12 @@ class TipableVMobject(VMobject, metaclass=ConvertToOpenGL): def __init__( self, tip_length: float = DEFAULT_ARROW_TIP_LENGTH, - normal_vector: Vector = OUT, + normal_vector: Vector3D = OUT, tip_style: dict = {}, **kwargs, ) -> None: self.tip_length: float = tip_length - self.normal_vector: Vector = normal_vector + self.normal_vector: Vector3D = normal_vector self.tip_style: dict = tip_style super().__init__(**kwargs) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index b958e55e19..a0a9ddf0a0 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -31,7 +31,7 @@ from manim.utils.space_ops import angle_of_vector, line_intersection, normalize if TYPE_CHECKING: - from manim.typing import Point2D, Point3D, Vector + from manim.typing import Point2D, Point3D, Vector3D from manim.utils.color import ParsableManimColor from ..matrix import Matrix # Avoid circular import @@ -107,7 +107,7 @@ def _set_start_and_end_attrs(self, start: Point3D, end: Point3D) -> None: def _pointify( self, mob_or_point: Mobject | Point3D, - direction: Vector | None = None, + direction: Vector3D | None = None, ) -> Point3D: """Transforms a mobject into its corresponding point. Does nothing if a point is passed. @@ -163,16 +163,16 @@ def construct(self): self.generate_points() return super().put_start_and_end_on(start, end) - def get_vector(self) -> Vector: + def get_vector(self) -> Vector3D: return self.get_end() - self.get_start() - def get_unit_vector(self) -> Vector: + def get_unit_vector(self) -> Vector3D: return normalize(self.get_vector()) def get_angle(self) -> float: return angle_of_vector(self.get_vector()) - def get_projection(self, point: Point3D) -> Vector: + def get_projection(self, point: Point3D) -> Vector3D: """Returns the projection of a point onto a line. Parameters @@ -579,7 +579,7 @@ def scale(self, factor: float, scale_tips: bool = False, **kwargs) -> Self: self.add_tip(tip=old_tips[1], at_start=True) return self - def get_normal_vector(self) -> Vector: + def get_normal_vector(self) -> Vector3D: """Returns the normal of a vector. Examples @@ -654,7 +654,7 @@ def construct(self): self.add(plane, vector_1, vector_2) """ - def __init__(self, direction: Vector = RIGHT, buff: float = 0, **kwargs) -> None: + def __init__(self, direction: Vector3D = RIGHT, buff: float = 0, **kwargs) -> None: self.buff = buff if len(direction) == 2: direction = np.hstack([direction, 0]) diff --git a/manim/mobject/geometry/tips.py b/manim/mobject/geometry/tips.py index 385093b765..725e9535ab 100644 --- a/manim/mobject/geometry/tips.py +++ b/manim/mobject/geometry/tips.py @@ -25,7 +25,7 @@ from manim.utils.space_ops import angle_of_vector if TYPE_CHECKING: - from manim.typing import Point3D, Vector + from manim.typing import Point3D, Vector3D class ArrowTip(VMobject, metaclass=ConvertToOpenGL): @@ -149,7 +149,7 @@ def tip_point(self) -> Point3D: return self.points[0] @property - def vector(self) -> Vector: + def vector(self) -> Vector3D: r"""The vector pointing from the base point to the tip point. Examples diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index e58d22fc1f..9f773626c1 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -55,7 +55,7 @@ if TYPE_CHECKING: from manim.mobject.mobject import Mobject - from manim.typing import ManimFloat, Point2D, Point3D, Vector3 + from manim.typing import ManimFloat, Point2D, Point3D, Vector3D LineType = TypeVar("LineType", bound=Line) @@ -2342,7 +2342,7 @@ def __init__( y_length: float | None = config.frame_height + 2.5, z_length: float | None = config.frame_height - 1.5, z_axis_config: dict[str, Any] | None = None, - z_normal: Vector3 = DOWN, + z_normal: Vector3D = DOWN, num_axis_pieces: int = 20, light_source: Sequence[float] = 9 * DOWN + 7 * LEFT + 10 * OUT, # opengl stuff (?) @@ -2433,7 +2433,7 @@ def get_y_axis_label( direction: Sequence[float] = UR, buff: float = SMALL_BUFF, rotation: float = PI / 2, - rotation_axis: Vector3 = OUT, + rotation_axis: Vector3D = OUT, **kwargs, ) -> Mobject: """Generate a y-axis label. @@ -2480,11 +2480,11 @@ def construct(self): def get_z_axis_label( self, label: float | str | Mobject, - edge: Vector3 = OUT, - direction: Vector3 = RIGHT, + edge: Vector3D = OUT, + direction: Vector3D = RIGHT, buff: float = SMALL_BUFF, rotation: float = PI / 2, - rotation_axis: Vector3 = RIGHT, + rotation_axis: Vector3D = RIGHT, **kwargs: Any, ) -> Mobject: """Generate a z-axis label. diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index eaf7fa1b73..1b5eed0d58 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -56,8 +56,7 @@ PathFuncType, Point3D, Point3D_Array, - Vector, - Vector3, + Vector3D, ) from ..animation.animation import Animation @@ -1154,7 +1153,7 @@ def apply_to_family(self, func: Callable[[Mobject], None]) -> None: for mob in self.family_members_with_points(): func(mob) - def shift(self, *vectors: Vector3) -> Self: + def shift(self, *vectors: Vector3D) -> Self: """Shift by the given vectors. Parameters @@ -1226,14 +1225,14 @@ def construct(self): ) return self - def rotate_about_origin(self, angle: float, axis: Vector3 = OUT, axes=[]) -> Self: + def rotate_about_origin(self, angle: float, axis: Vector3D = OUT, axes=[]) -> Self: """Rotates the :class:`~.Mobject` about the ORIGIN, which is at [0,0,0].""" return self.rotate(angle, axis, about_point=ORIGIN) def rotate( self, angle: float, - axis: Vector3 = OUT, + axis: Vector3D = OUT, about_point: Point3D | None = None, **kwargs, ) -> Self: @@ -1244,7 +1243,7 @@ def rotate( ) return self - def flip(self, axis: Vector3 = UP, **kwargs) -> Self: + def flip(self, axis: Vector3D = UP, **kwargs) -> Self: """Flips/Mirrors an mobject about its center. Examples @@ -1390,7 +1389,7 @@ def center(self) -> Self: return self def align_on_border( - self, direction: Vector3, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER + self, direction: Vector3D, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Direction just needs to be a vector pointing towards side or corner in the 2d plane. @@ -1407,7 +1406,7 @@ def align_on_border( return self def to_corner( - self, corner: Vector3 = DL, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER + self, corner: Vector3D = DL, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Moves this :class:`~.Mobject` to the given corner of the screen. @@ -1435,7 +1434,7 @@ def construct(self): return self.align_on_border(corner, buff) def to_edge( - self, edge: Vector3 = LEFT, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER + self, edge: Vector3D = LEFT, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Moves this :class:`~.Mobject` to the given edge of the screen, without affecting its position in the other dimension. @@ -1467,12 +1466,12 @@ def construct(self): def next_to( self, mobject_or_point: Mobject | Point3D, - direction: Vector3 = RIGHT, + direction: Vector3D = RIGHT, buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, - aligned_edge: Vector3 = ORIGIN, + aligned_edge: Vector3D = ORIGIN, submobject_to_align: Mobject | None = None, index_of_submobject_to_align: int | None = None, - coor_mask: Vector3 = np.array([1, 1, 1]), + coor_mask: Vector3D = np.array([1, 1, 1]), ) -> Self: """Move this :class:`~.Mobject` next to another's :class:`~.Mobject` or Point3D. @@ -1664,22 +1663,22 @@ def stretch_to_fit_depth(self, depth: float, **kwargs) -> Self: return self.rescale_to_fit(depth, 2, stretch=True, **kwargs) - def set_coord(self, value, dim: int, direction: Vector3 = ORIGIN) -> Self: + def set_coord(self, value, dim: int, direction: Vector3D = ORIGIN) -> Self: curr = self.get_coord(dim, direction) shift_vect = np.zeros(self.dim) shift_vect[dim] = value - curr self.shift(shift_vect) return self - def set_x(self, x: float, direction: Vector3 = ORIGIN) -> Self: + def set_x(self, x: float, direction: Vector3D = ORIGIN) -> Self: """Set x value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(x, 0, direction) - def set_y(self, y: float, direction: Vector3 = ORIGIN) -> Self: + def set_y(self, y: float, direction: Vector3D = ORIGIN) -> Self: """Set y value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(y, 1, direction) - def set_z(self, z: float, direction: Vector3 = ORIGIN) -> Self: + def set_z(self, z: float, direction: Vector3D = ORIGIN) -> Self: """Set z value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(z, 2, direction) @@ -1692,8 +1691,8 @@ def space_out_submobjects(self, factor: float = 1.5, **kwargs) -> Self: def move_to( self, point_or_mobject: Point3D | Mobject, - aligned_edge: Vector3 = ORIGIN, - coor_mask: Vector3 = np.array([1, 1, 1]), + aligned_edge: Vector3D = ORIGIN, + coor_mask: Vector3D = np.array([1, 1, 1]), ) -> Self: """Move center of the :class:`~.Mobject` to certain Point3D.""" if isinstance(point_or_mobject, Mobject): @@ -1998,7 +1997,7 @@ def get_extremum_along_dim( else: return np.max(values) - def get_critical_point(self, direction: Vector3) -> Point3D: + def get_critical_point(self, direction: Vector3D) -> Point3D: """Picture a box bounding the :class:`~.Mobject`. Such a box has 9 'critical points': 4 corners, 4 edge center, the center. This returns one of them, along the given direction. @@ -2027,11 +2026,11 @@ def get_critical_point(self, direction: Vector3) -> Point3D: # Pseudonyms for more general get_critical_point method - def get_edge_center(self, direction: Vector3) -> Point3D: + def get_edge_center(self, direction: Vector3D) -> Point3D: """Get edge Point3Ds for certain direction.""" return self.get_critical_point(direction) - def get_corner(self, direction: Vector3) -> Point3D: + def get_corner(self, direction: Vector3D) -> Point3D: """Get corner Point3Ds for certain direction.""" return self.get_critical_point(direction) @@ -2042,7 +2041,7 @@ def get_center(self) -> Point3D: def get_center_of_mass(self) -> Point3D: return np.apply_along_axis(np.mean, 0, self.get_all_points()) - def get_boundary_point(self, direction: Vector3) -> Point3D: + def get_boundary_point(self, direction: Vector3D) -> Point3D: all_points = self.get_points_defining_boundary() index = np.argmax(np.dot(all_points, np.array(direction).T)) return all_points[index] @@ -2101,19 +2100,19 @@ def length_over_dim(self, dim: int) -> float: dim, ) - self.reduce_across_dimension(min, dim) - def get_coord(self, dim: int, direction: Vector3 = ORIGIN): + def get_coord(self, dim: int, direction: Vector3D = ORIGIN): """Meant to generalize ``get_x``, ``get_y`` and ``get_z``""" return self.get_extremum_along_dim(dim=dim, key=direction[dim]) - def get_x(self, direction: Vector3 = ORIGIN) -> ManimFloat: + def get_x(self, direction: Vector3D = ORIGIN) -> ManimFloat: """Returns x Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(0, direction) - def get_y(self, direction: Vector3 = ORIGIN) -> ManimFloat: + def get_y(self, direction: Vector3D = ORIGIN) -> ManimFloat: """Returns y Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(1, direction) - def get_z(self, direction: Vector3 = ORIGIN) -> ManimFloat: + def get_z(self, direction: Vector3D = ORIGIN) -> ManimFloat: """Returns z Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(2, direction) @@ -2184,7 +2183,7 @@ def match_depth(self, mobject: Mobject, **kwargs) -> Self: return self.match_dim_size(mobject, 2, **kwargs) def match_coord( - self, mobject: Mobject, dim: int, direction: Vector3 = ORIGIN + self, mobject: Mobject, dim: int, direction: Vector3D = ORIGIN ) -> Self: """Match the Point3Ds with the Point3Ds of another :class:`~.Mobject`.""" return self.set_coord( @@ -2208,7 +2207,7 @@ def match_z(self, mobject: Mobject, direction=ORIGIN) -> Self: def align_to( self, mobject_or_point: Mobject | Point3D, - direction: Vector3 = ORIGIN, + direction: Vector3D = ORIGIN, ) -> Self: """Aligns mobject to another :class:`~.Mobject` in a certain direction. @@ -2263,7 +2262,7 @@ def family_members_with_points(self) -> list[Self]: def arrange( self, - direction: Vector3 = RIGHT, + direction: Vector3D = RIGHT, buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, center: bool = True, **kwargs, @@ -2296,7 +2295,7 @@ def arrange_in_grid( rows: int | None = None, cols: int | None = None, buff: float | tuple[float, float] = MED_SMALL_BUFF, - cell_alignment: Vector3 = ORIGIN, + cell_alignment: Vector3D = ORIGIN, row_alignments: str | None = None, # "ucd" col_alignments: str | None = None, # "lcr" row_heights: Iterable[float | None] | None = None, diff --git a/manim/mobject/three_d/three_d_utils.py b/manim/mobject/three_d/three_d_utils.py index ec3af9ac05..0a9ccb8a2d 100644 --- a/manim/mobject/three_d/three_d_utils.py +++ b/manim/mobject/three_d/three_d_utils.py @@ -22,7 +22,7 @@ from manim.utils.space_ops import get_unit_normal if TYPE_CHECKING: - from manim.typing import Point3D, Vector + from manim.typing import Point3D, Vector3D def get_3d_vmob_gradient_start_and_end_points(vmob) -> tuple[Point3D, Point3D]: @@ -52,7 +52,7 @@ def get_3d_vmob_end_corner(vmob) -> Point3D: return vmob.points[get_3d_vmob_end_corner_index(vmob)] -def get_3d_vmob_unit_normal(vmob, point_index: int) -> Vector: +def get_3d_vmob_unit_normal(vmob, point_index: int) -> Vector3D: n_points = vmob.get_num_points() if len(vmob.get_anchors()) <= 2: return np.array(UP) @@ -68,9 +68,9 @@ def get_3d_vmob_unit_normal(vmob, point_index: int) -> Vector: return unit_normal -def get_3d_vmob_start_corner_unit_normal(vmob) -> Vector: +def get_3d_vmob_start_corner_unit_normal(vmob) -> Vector3D: return get_3d_vmob_unit_normal(vmob, get_3d_vmob_start_corner_index(vmob)) -def get_3d_vmob_end_corner_unit_normal(vmob) -> Vector: +def get_3d_vmob_end_corner_unit_normal(vmob) -> Vector3D: return get_3d_vmob_unit_normal(vmob, get_3d_vmob_end_corner_index(vmob)) diff --git a/manim/mobject/three_d/three_dimensions.py b/manim/mobject/three_d/three_dimensions.py index 1be9edf7dd..07877e26ff 100644 --- a/manim/mobject/three_d/three_dimensions.py +++ b/manim/mobject/three_d/three_dimensions.py @@ -2,7 +2,7 @@ from __future__ import annotations -from manim.typing import Point3D, Vector3 +from manim.typing import Point3D, Vector3D from manim.utils.color import BLUE, BLUE_D, BLUE_E, LIGHT_GREY, WHITE, interpolate_color __all__ = [ @@ -953,7 +953,7 @@ def set_start_and_end_attrs( def pointify( self, mob_or_point: Mobject | Point3D, - direction: Vector3 = None, + direction: Vector3D = None, ) -> np.ndarray: """Gets a point representing the center of the :class:`Mobjects <.Mobject>`. @@ -1001,7 +1001,7 @@ def get_end(self) -> np.ndarray: def parallel_to( cls, line: Line3D, - point: Vector3 = ORIGIN, + point: Vector3D = ORIGIN, length: float = 5, **kwargs, ) -> Line3D: @@ -1049,7 +1049,7 @@ def construct(self): def perpendicular_to( cls, line: Line3D, - point: Vector3 = ORIGIN, + point: Vector3D = ORIGIN, length: float = 5, **kwargs, ) -> Line3D: diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 2b89924090..ac9058ddd9 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -62,7 +62,7 @@ Point3D_Array, QuadraticBezierPoints, RGBA_Array_Float, - Vector3, + Vector3D, Zeros, ) @@ -124,7 +124,7 @@ def __init__( background_stroke_width: float = 0, sheen_factor: float = 0.0, joint_type: LineJointType | None = None, - sheen_direction: Vector3 = UL, + sheen_direction: Vector3D = UL, close_new_points: bool = False, pre_function_handle_to_anchor_scale_factor: float = 0.01, make_smooth_after_applying_functions: bool = False, @@ -149,7 +149,7 @@ def __init__( self.joint_type: LineJointType = ( LineJointType.AUTO if joint_type is None else joint_type ) - self.sheen_direction: Vector3 = sheen_direction + self.sheen_direction: Vector3D = sheen_direction self.close_new_points: bool = close_new_points self.pre_function_handle_to_anchor_scale_factor: float = ( pre_function_handle_to_anchor_scale_factor @@ -396,7 +396,7 @@ def set_style( background_stroke_width: float | None = None, background_stroke_opacity: float | None = None, sheen_factor: float | None = None, - sheen_direction: Vector3 | None = None, + sheen_direction: Vector3D | None = None, background_image: Image | str | None = None, family: bool = True, ) -> Self: @@ -563,7 +563,7 @@ def get_color(self) -> ManimColor: color = property(get_color, set_color) - def set_sheen_direction(self, direction: Vector3, family: bool = True) -> Self: + def set_sheen_direction(self, direction: Vector3D, family: bool = True) -> Self: """Sets the direction of the applied sheen. Parameters @@ -588,11 +588,11 @@ def set_sheen_direction(self, direction: Vector3, family: bool = True) -> Self: for submob in self.get_family(): submob.sheen_direction = direction else: - self.sheen_direction: Vector3 = direction + self.sheen_direction: Vector3D = direction return self def rotate_sheen_direction( - self, angle: float, axis: Vector3 = OUT, family: bool = True + self, angle: float, axis: Vector3D = OUT, family: bool = True ) -> Self: """Rotates the direction of the applied sheen. @@ -625,7 +625,7 @@ def rotate_sheen_direction( return self def set_sheen( - self, factor: float, direction: Vector3 | None = None, family: bool = True + self, factor: float, direction: Vector3D | None = None, family: bool = True ) -> Self: """Applies a color gradient from a direction. @@ -663,7 +663,7 @@ def construct(self): self.set_fill(self.get_fill_color(), family=family) return self - def get_sheen_direction(self) -> Vector3: + def get_sheen_direction(self) -> Vector3D: return np.array(self.sheen_direction) def get_sheen_factor(self) -> float: @@ -1038,7 +1038,7 @@ def apply_function(self, function: MappingFunction) -> Self: def rotate( self, angle: float, - axis: Vector3 = OUT, + axis: Vector3D = OUT, about_point: Point3D | None = None, **kwargs, ) -> Self: diff --git a/manim/typing.py b/manim/typing.py index 2b197e35bf..cbda5095fc 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -16,14 +16,12 @@ classified under that category. If you need to define a new category, respect the format described above. - -.. autotypingmodule:: manim.typing - """ + from __future__ import annotations from os import PathLike -from typing import Annotated, Callable, Literal, Union +from typing import Callable, Literal, Union import numpy as np import numpy.typing as npt @@ -53,9 +51,9 @@ "Point3D", "InternalPoint3D_Array", "Point3D_Array", - "Vector2", - "Vector3", - "Vector", + "Vector2D", + "Vector3D", + "VectorND", "RowVector", "ColVector", "MatrixMN", @@ -240,17 +238,17 @@ Vector types """ -Vector2: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] +Vector2D: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] """``shape: (2,)`` A 2D vector: ``[float, float]``. """ -Vector3: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] +Vector3D: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] """``shape: (3,)`` A 3D vector: ``[float, float, float]``. """ -Vector: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] +VectorND: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """``shape (N,)`` An `N`-D vector: ``[float, ...]``. """ diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index bb9835a1af..13fdd4773c 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -714,14 +714,17 @@ def __xor__(self, other: ManimColor) -> ManimColor: RGBA_Array_Int, RGBA_Array_Float, ] -"""ParsableManimColor is the representation for all types that are parsable to a color in manim""" +""":class:`ParsableManimColor` represents all the types which can be +parsed to a color in Manim. +""" ManimColorT = TypeVar("ManimColorT", bound=ManimColor) def color_to_rgb(color: ParsableManimColor) -> RGB_Array_Float: - """Helper function for use in functional style programming refer to :meth:`to_rgb` in :class:`ManimColor` + """Helper function for use in functional style programming. + Refer to :meth:`to_rgb` in :class:`ManimColor`. Parameters ---------- diff --git a/manim/utils/docbuild/autoaliasattr_directive.py b/manim/utils/docbuild/autoaliasattr_directive.py new file mode 100644 index 0000000000..f139ed78db --- /dev/null +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from docutils import nodes +from docutils.parsers.rst import Directive +from docutils.statemachine import ViewList + +from manim.utils.docbuild.module_parsing import parse_module_attributes + +if TYPE_CHECKING: + from sphinx.application import Sphinx + +__all__ = ["AliasAttrDocumenter"] + + +ALIAS_DOCS_DICT, DATA_DICT = parse_module_attributes() +ALIAS_LIST = [ + alias_name + for module_dict in ALIAS_DOCS_DICT.values() + for category_dict in module_dict.values() + for alias_name in category_dict.keys() +] + + +def setup(app: Sphinx) -> None: + app.add_directive("autoaliasattr", AliasAttrDocumenter) + + +class AliasAttrDocumenter(Directive): + objtype = "autotype" + required_arguments = 1 + has_content = True + + def run(self) -> list[nodes.Element]: + module_name = self.arguments[0] + module_alias_dict = ALIAS_DOCS_DICT.get(module_name[6:], None) + module_attrs_list = DATA_DICT.get(module_name[6:], None) + + content = nodes.container() + + # Add "Type Aliases" section + if module_alias_dict is not None: + module_alias_section = nodes.section(ids=[f"{module_name}.alias"]) + content += module_alias_section + + module_alias_section += nodes.rubric(text="Type Aliases") + + for category_name, category_dict in module_alias_dict.items(): + category_section = nodes.section( + ids=[category_name.lower().replace(" ", "_")] + ) + module_alias_section += category_section + if category_name: + category_section += nodes.title(text=category_name) + + category_alias_container = nodes.container() + category_section += category_alias_container + + for alias_name, alias_subdict in category_dict.items(): + unparsed = ViewList( + [ + f".. class:: {alias_name}", + "", + " .. code-block::", + "", + f" {alias_subdict['definition']}", + "", + ] + ) + + if "doc" in alias_subdict: + alias_doc = alias_subdict["doc"] + for A in ALIAS_LIST: + alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") + doc_lines = alias_doc.split("\n") + if ( + len(doc_lines) >= 2 + and doc_lines[0].startswith("``shape:") + and doc_lines[1].strip() != "" + ): + doc_lines.insert(1, "") + unparsed.extend(ViewList([f" {line}" for line in doc_lines])) + + # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest + alias_container = nodes.container() + self.state.nested_parse(unparsed, 0, alias_container) + category_alias_container += alias_container + + if module_attrs_list is not None: + module_attrs_section = nodes.section(ids=[f"{module_name}.data"]) + content += module_attrs_section + + module_attrs_section += nodes.rubric(text="Module Attributes") + unparsed = ViewList( + [ + ".. autosummary::", + *(f" {attr}" for attr in module_attrs_list), + ] + ) + data_container = nodes.container() + self.state.nested_parse(unparsed, 0, data_container) + module_attrs_section += data_container + + return [content] diff --git a/manim/utils/docbuild/autotyping_directive.py b/manim/utils/docbuild/autotyping_directive.py deleted file mode 100644 index bac5726221..0000000000 --- a/manim/utils/docbuild/autotyping_directive.py +++ /dev/null @@ -1,77 +0,0 @@ -from __future__ import annotations - -import re -from typing import TYPE_CHECKING - -from docutils import nodes -from docutils.parsers.rst import Directive -from docutils.statemachine import ViewList - -from manim.utils.docbuild.module_parsing import get_manim_typing_docs - -if TYPE_CHECKING: - from sphinx.application import Sphinx - -__all__ = ["TypingModuleDocumenter"] - - -MANIM_TYPING_DOCS = get_manim_typing_docs() -ALIAS_LIST = [ - alias_name - for category_dict in MANIM_TYPING_DOCS.values() - for alias_name in category_dict.keys() -] - - -def setup(app: Sphinx) -> None: - app.add_directive("autotypingmodule", TypingModuleDocumenter) - - -class TypingModuleDocumenter(Directive): - objtype = "autotypingmodule" - required_arguments = 0 - has_content = True - - def run(self) -> list[nodes.Element]: - content = nodes.container() - for category_name, category_dict in MANIM_TYPING_DOCS.items(): - category_section = nodes.section( - ids=[category_name.lower().replace(" ", "_")] - ) - category_section += nodes.title(text=category_name) - category_alias_container = nodes.container() - category_section += category_alias_container - - for alias_name, alias_dict in category_dict.items(): - unparsed = ViewList( - [ - f".. class:: {alias_name}", - "", - " .. code-block::", - "", - f" {alias_dict['definition']}", - "", - ] - ) - - if "doc" in alias_dict: - alias_doc = alias_dict["doc"] - for A in ALIAS_LIST: - alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") - doc_lines = alias_doc.split("\n") - if ( - len(doc_lines) >= 2 - and doc_lines[0].startswith("``shape:") - and doc_lines[1].strip() != "" - ): - doc_lines.insert(1, "") - unparsed.extend(ViewList([f" {line}" for line in doc_lines])) - - # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest - alias_section = nodes.container() - self.state.nested_parse(unparsed, 0, alias_section) - category_alias_container += alias_section - - content += category_section - - return [content] diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index b1d42ad8bb..20028342c1 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -2,17 +2,22 @@ import ast from pathlib import Path +from typing import TypeAlias -from manim import typing +__all__ = ["parse_module_attributes"] -__all__ = ["get_manim_typing_docs"] +MANIM_ROOT = Path(__file__).resolve().parent.parent.parent -MANIM_TYPING_DOCS: dict[str, dict[str, dict[str, str]]] = {} +AliasDocsDict: TypeAlias = dict[str, dict[str, dict[str, str]]] +DataDict: TypeAlias = dict[str, list[str]] +ALIAS_DOCS_DICT: AliasDocsDict = {} +DATA_DICT: DataDict = {} -def get_manim_typing_docs() -> dict[str, dict[str, dict[str, str]]]: - """Read the ``manim/typing.py`` file, generate an Abstract Syntax Tree + +def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: + """Read all files, generate an Abstract Syntax Tree from it, and extract useful information about the type aliases defined in the file: the category they belong to, their definition and their description. @@ -29,65 +34,102 @@ def get_manim_typing_docs() -> dict[str, dict[str, dict[str, str]]]: aliases, and the values are subsubdictionaries containing field-value pairs with information about the type alias. """ - global MANIM_TYPING_DOCS - - if MANIM_TYPING_DOCS: - return MANIM_TYPING_DOCS - - with open(typing.__file__) as typing_file: - typing_file_content = typing_file.read() - - category_dict: dict[str, dict[str, str]] | None = None - alias_dict: dict[str, str] | None = None - - for node in ast.walk(ast.parse(typing_file_content)): - if ( - type(node) is ast.Expr - and type(node.value) is ast.Constant - and type(node.value.value) is str - ): - string = node.value.value.strip() - # It can be the start of a category - section_str = "[CATEGORY]" - if string.startswith(section_str): - category_name = string[len(section_str) :].strip() - MANIM_TYPING_DOCS[category_name] = {} - category_dict = MANIM_TYPING_DOCS[category_name] - alias_dict = None - # or a docstring of the alias defined before - elif alias_dict: - alias_dict["doc"] = string - - elif category_dict is None: - continue - - if ( - 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 + global ALIAS_DOCS_DICT + global DATA_DICT + + if ALIAS_DOCS_DICT or DATA_DICT: + return ALIAS_DOCS_DICT, DATA_DICT + + for module_path in MANIM_ROOT.rglob("*.py"): + module_name = module_path.resolve().relative_to(MANIM_ROOT) + module_name = list(module_name.parts) + module_name[-1] = module_name[-1][:-3] # remove .py + module_name = ".".join(module_name) + + module_content = module_path.read_text() + + # For storing TypeAliases + module_dict: dict[str, dict[str, dict[str, str]]] = {} + category_dict: dict[str, dict[str, str]] | None = None + alias_dict: dict[str, str] | None = None + + # For storing regular module attributes + data_list: list[str] = [] + data_name: str | None = None + + for node in ast.iter_child_nodes(ast.parse(module_content)): + # If we encounter a string: if ( - type(def_node) is ast.Subscript - and type(def_node.value) is ast.Name - and def_node.value.id == "Union" + type(node) is ast.Expr + and type(node.value) is ast.Constant + and type(node.value.value) is str ): - definition = " | ".join( - ast.unparse(elem) for elem in def_node.slice.elts - ) - else: - definition = ast.unparse(def_node) - # for subnode in ast.walk(node.value): - # print(ast.dump(subnode, indent=4), end="\n\n") - definition = definition.replace("npt.", "") - category_dict[alias_name] = {"definition": definition} - alias_dict = category_dict[alias_name] - - else: + string = node.value.value.strip() + # It can be the start of a category + section_str = "[CATEGORY]" + if string.startswith(section_str): + category_name = string[len(section_str) :].strip() + module_dict[category_name] = {} + category_dict = module_dict[category_name] + alias_dict = None + # or a docstring of the alias defined before + elif alias_dict: + alias_dict["doc"] = string + # or a docstring of the module attribute defined before + elif data_name: + data_list.append(data_name) + continue + + # If we encounter an assignment annotated as "TypeAlias": + if ( + 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(def_node) is ast.Subscript + and type(def_node.value) is ast.Name + and def_node.value.id == "Union" + ): + definition = " | ".join( + ast.unparse(elem) for elem in def_node.slice.elts + ) + else: + definition = ast.unparse(def_node) + # for subnode in ast.walk(node.value): + # print(ast.dump(subnode, indent=4), end="\n\n") + definition = definition.replace("npt.", "") + if category_dict is None: + module_dict[""] = {} + category_dict = module_dict[""] + category_dict[alias_name] = {"definition": definition} + alias_dict = category_dict[alias_name] + continue + + # The node is not a TypeAlias definition alias_dict = None - return MANIM_TYPING_DOCS + # It could still be a module attribute definition + if type(node) is ast.AnnAssign: + target = node.target + elif type(node) is ast.Assign and len(node.targets) == 1: + target = node.targets[0] + else: + target = None + + if type(target) is ast.Name: + data_name = target.id + else: + data_name = None + + if len(module_dict) > 0: + ALIAS_DOCS_DICT[module_name] = module_dict + if len(data_list) > 0: + DATA_DICT[module_name] = data_list + + return ALIAS_DOCS_DICT, DATA_DICT diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index 60bfd0e894..5737786d78 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -2,7 +2,7 @@ from __future__ import annotations -from manim.typing import Point3D_Array, Vector, Vector3 +from manim.typing import Point3D_Array, Vector3D, VectorND __all__ = [ "quaternion_mult", @@ -53,7 +53,7 @@ def norm_squared(v: float) -> float: return np.dot(v, v) -def cross(v1: Vector3, v2: Vector3) -> Vector3: +def cross(v1: Vector3D, v2: Vector3D) -> Vector3D: return np.array( [ v1[1] * v2[2] - v1[2] * v2[1], @@ -369,7 +369,7 @@ def normalize_along_axis(array: np.ndarray, axis: np.ndarray) -> np.ndarray: return array -def get_unit_normal(v1: Vector3, v2: Vector3, tol: float = 1e-6) -> Vector3: +def get_unit_normal(v1: Vector3D, v2: Vector3D, tol: float = 1e-6) -> Vector3D: """Gets the unit normal of the vectors. Parameters @@ -654,7 +654,8 @@ def shoelace_direction(x_y: np.ndarray) -> str: def cross2d( - a: Sequence[Vector] | Vector, b: Sequence[Vector] | Vector + a: VectorND | Sequence[VectorND], + b: VectorND | Sequence[VectorND], ) -> Sequence[float] | float: """Compute the determinant(s) of the passed vector (sequences). From 3ccfee1400539cf125a7a9a3133041563af6ab5f Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 27 Dec 2023 21:44:33 +0100 Subject: [PATCH 25/30] Add/fix docs for directive, parser and others --- docs/source/_templates/autosummary/module.rst | 2 + manim/_config/utils.py | 20 +++--- manim/mobject/geometry/boolean_ops.py | 22 +++--- manim/typing.py | 30 +++++++- manim/utils/color/core.py | 4 +- .../utils/docbuild/autoaliasattr_directive.py | 57 +++++++++++++-- manim/utils/docbuild/module_parsing.py | 72 +++++++++++++------ manim/utils/space_ops.py | 40 ++++++----- 8 files changed, 182 insertions(+), 65 deletions(-) diff --git a/docs/source/_templates/autosummary/module.rst b/docs/source/_templates/autosummary/module.rst index e5b8a89883..967138e560 100644 --- a/docs/source/_templates/autosummary/module.rst +++ b/docs/source/_templates/autosummary/module.rst @@ -4,6 +4,8 @@ .. automodule:: {{ fullname }} + {# SEE manim.utils.docbuild.autoaliasattr_directive #} + {# FOR INFORMATION ABOUT THE CUSTOM autoaliasattr DIRECTIVE! #} .. autoaliasattr:: {{ fullname }} {% block classes %} diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 88444e9e5f..f4eeda69a7 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -20,18 +20,22 @@ import re import sys from collections.abc import Mapping, MutableMapping -from enum import EnumMeta from pathlib import Path -from typing import Any, ClassVar, Iterable, Iterator, NoReturn +from typing import TYPE_CHECKING, Any, ClassVar, Iterable, Iterator, NoReturn import numpy as np -from typing_extensions import Self -from .. import constants -from ..constants import RendererType -from ..typing import StrPath, Vector3D -from ..utils.color import ManimColor -from ..utils.tex import TexTemplate, TexTemplateFromFile +from manim import constants +from manim.constants import RendererType +from manim.utils.color import ManimColor +from manim.utils.tex import TexTemplate, TexTemplateFromFile + +if TYPE_CHECKING: + from enum import EnumMeta + + from typing_extensions import Self + + from manim.typing import StrPath, Vector3D __all__ = ["config_file_paths", "make_config_parser", "ManimConfig", "ManimFrame"] diff --git a/manim/mobject/geometry/boolean_ops.py b/manim/mobject/geometry/boolean_ops.py index 0bc33d70b0..c17cf86cbb 100644 --- a/manim/mobject/geometry/boolean_ops.py +++ b/manim/mobject/geometry/boolean_ops.py @@ -2,6 +2,8 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import numpy as np from pathops import Path as SkiaPath from pathops import PathVerb, difference, intersection, union, xor @@ -9,7 +11,9 @@ from manim import config from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VMobject -from manim.typing import Point2D_Array + +if TYPE_CHECKING: + from manim.typing import Point2D_Array, Point3D_Array from ...constants import RendererType @@ -26,21 +30,21 @@ def _convert_2d_to_3d_array( self, points: Point2D_Array, z_dim: float = 0.0, - ) -> list[np.ndarray]: - """Converts an iterable with coordinates in 2d to 3d by adding - :attr:`z_dim` as the z coordinate. + ) -> Point3D_Array: + """Converts an iterable with coordinates in 2D to 3D by adding + :attr:`z_dim` as the Z coordinate. Parameters ---------- points: - An iterable which has the coordinates. + An iterable of points. z_dim: - The default value of z coordinate. + Default value for the Z coordinate. Returns ------- - Point2D_Array - A list of array converted to 3d. + Point3D_Array + A list of the points converted to 3D. Example ------- @@ -66,7 +70,7 @@ def _convert_vmobject_to_skia_path(self, vmobject: VMobject) -> SkiaPath: Returns ------- - SkiaPath: + SkiaPath The converted path. """ path = SkiaPath() diff --git a/manim/typing.py b/manim/typing.py index cbda5095fc..3b869967a1 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -52,8 +52,11 @@ "InternalPoint3D_Array", "Point3D_Array", "Vector2D", + "Vector2D_Array", "Vector3D", + "Vector3D_Array", "VectorND", + "VectorND_Array", "RowVector", "ColVector", "MatrixMN", @@ -195,6 +198,8 @@ Point2D: TypeAlias = Union[InternalPoint2D, tuple[float, float]] """``shape: (2,)`` A 2D point: ``[float, float]``. +Normally a function or method which expects a `Point2D` as a parameter can handle being +passed a `Point3D` instead. """ InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] @@ -206,6 +211,8 @@ Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, tuple[Point2D, ...]] """``shape: (N, 2)`` An array of `Point2D` objects: ``[[float, float], ...]``. +Normally a function or method which expects a `Point2D_Array` as a parameter can handle being +passed a `Point3D_Array` instead. (Please refer to the documentation of the function you are using for further type information.) """ @@ -238,21 +245,40 @@ Vector types """ -Vector2D: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float]] +Vector2D: TypeAlias = Point2D """``shape: (2,)`` A 2D vector: ``[float, float]``. +Normally a function or method which expects a `Vector2D` as a parameter can handle being +passed a `Vector3D` instead. """ -Vector3D: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, float, float]] +Vector2D_Array: TypeAlias = Point2D_Array +"""``shape: (M, 2)`` +An array of 2D vectors: ``[[float, float], ...]``. +Normally a function or method which expects a `Vector2D_Array` as a parameter can handle being +passed a `Vector3D_Array` instead. +""" + +Vector3D: TypeAlias = Point3D """``shape: (3,)`` A 3D vector: ``[float, float, float]``. """ +Vector3D_Array: TypeAlias = Point3D_Array +"""``shape: (M, 3)`` +An array of 3D vectors: ``[[float, float, float], ...]``. +""" + VectorND: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """``shape (N,)`` An `N`-D vector: ``[float, ...]``. """ +VectorND_Array: TypeAlias = tuple[VectorND, ...] +"""``shape (M, N)`` +An array of `N`-D vectors: ``[[float, ...], ...]``. +""" + RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] """``shape: (1, N)`` A row vector: ``[[float, ...]]``. diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index 13fdd4773c..bb86b9064d 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -714,8 +714,8 @@ def __xor__(self, other: ManimColor) -> ManimColor: RGBA_Array_Int, RGBA_Array_Float, ] -""":class:`ParsableManimColor` represents all the types which can be -parsed to a color in Manim. +"""`ParsableManimColor` represents all the types which can be parsed +to a color in Manim. """ diff --git a/manim/utils/docbuild/autoaliasattr_directive.py b/manim/utils/docbuild/autoaliasattr_directive.py index f139ed78db..e65356de2f 100644 --- a/manim/utils/docbuild/autoaliasattr_directive.py +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -28,12 +28,33 @@ def setup(app: Sphinx) -> None: class AliasAttrDocumenter(Directive): - objtype = "autotype" + """Directive which replaces Sphinx's Autosummary for module-level + attributes: instead, it manually crafts a new "Type Aliases" + section, where all the module-level attributes which are explicitly + annotated as :class:`TypeAlias` are considered as such, for their + use all around the Manim docs. + + These type aliases are separated from the "regular" module-level + attributes, which get their traditional "Module Attributes" + section autogenerated with Sphinx's Autosummary under "Type + Aliases". + + See ``docs/source/_templates/autosummary/module.rst`` to watch + this directive in action. + + See :func:`~.parse_module_attributes` for more information on how + the modules are parsed to obtain the :class:`TypeAlias` information + and separate it from the other attributes. + """ + + objtype = "autoaliasattr" required_arguments = 1 has_content = True def run(self) -> list[nodes.Element]: module_name = self.arguments[0] + # Slice module_name[6:] to remove the "manim." prefix which is + # not present in the keys of the DICTs module_alias_dict = ALIAS_DOCS_DICT.get(module_name[6:], None) module_attrs_list = DATA_DICT.get(module_name[6:], None) @@ -44,60 +65,86 @@ def run(self) -> list[nodes.Element]: module_alias_section = nodes.section(ids=[f"{module_name}.alias"]) content += module_alias_section + # Use a rubric (title-like), just like in `module.rst` module_alias_section += nodes.rubric(text="Type Aliases") + # category_name: str + # category_dict: AliasCategoryDict = dict[str, AliasInfo] for category_name, category_dict in module_alias_dict.items(): category_section = nodes.section( ids=[category_name.lower().replace(" ", "_")] ) module_alias_section += category_section + # category_name can be possibly "" for uncategorized aliases if category_name: category_section += nodes.title(text=category_name) category_alias_container = nodes.container() category_section += category_alias_container - for alias_name, alias_subdict in category_dict.items(): + # alias_name: str + # alias_info: AliasInfo = dict[str, str] + # Contains "definition": str + # Can possibly contain "doc": str + for alias_name, alias_info in category_dict.items(): + # Using the `.. class::` directive is CRUCIAL, since + # function/method parameters are always annotated via + # classes - therefore Sphinx expects a class unparsed = ViewList( [ f".. class:: {alias_name}", "", " .. code-block::", "", - f" {alias_subdict['definition']}", + f" {alias_info['definition']}", "", ] ) - if "doc" in alias_subdict: - alias_doc = alias_subdict["doc"] + if "doc" in alias_info: + alias_doc = alias_info["doc"] + # Replace all occurrences of type aliases in the docs for + # automatic cross-referencing! for A in ALIAS_LIST: alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") doc_lines = alias_doc.split("\n") + # Some type aliases in Manim start with a ``shape: ...` line. + # This allows that line to have more space and a better format. if ( len(doc_lines) >= 2 and doc_lines[0].startswith("``shape:") and doc_lines[1].strip() != "" ): doc_lines.insert(1, "") + # Add all the lines with 4 spaces behind, to consider all the + # documentation as a paragraph INSIDE the `.. class::` block unparsed.extend(ViewList([f" {line}" for line in doc_lines])) + # Parse the reST text into a fresh container # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest alias_container = nodes.container() self.state.nested_parse(unparsed, 0, alias_container) category_alias_container += alias_container + # Then, add the traditional "Module Attributes" section if module_attrs_list is not None: module_attrs_section = nodes.section(ids=[f"{module_name}.data"]) content += module_attrs_section + # Use the same rubric (title-like) as in `module.rst` module_attrs_section += nodes.rubric(text="Module Attributes") + # Let Sphinx Autosummary do its thing as always + # Add all the attribute names with 4 spaces behind, so that + # they're considered as INSIDE the `.. autosummary::` block unparsed = ViewList( [ ".. autosummary::", *(f" {attr}" for attr in module_attrs_list), ] ) + + # Parse the reST text into a fresh container + # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest data_container = nodes.container() self.state.nested_parse(unparsed, 0, data_container) module_attrs_section += data_container diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 20028342c1..26af9d7256 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -7,32 +7,56 @@ __all__ = ["parse_module_attributes"] -MANIM_ROOT = Path(__file__).resolve().parent.parent.parent +AliasInfo: TypeAlias = dict[str, str] +"""Dictionary with a `definition` key containing the definition of +a :class:`TypeAlias` as a string, and optionally a `doc` key containing +the documentation for that alias, if it exists. +""" + +AliasCategoryDict: TypeAlias = dict[str, AliasInfo] +"""Dictionary which holds an `AliasInfo` for every alias name in a same +category. +""" + +ModuleLevelAliasDict: TypeAlias = dict[str, AliasCategoryDict] +"""Dictionary containing every :class:`TypeAlias` defined in a module, +classified by category in different `AliasCategoryDict` objects. +""" + +AliasDocsDict: TypeAlias = dict[str, AliasDocsDict] +"""Dictionary which, for every module in Manim, contains documentation +about their module-level attributes which are explicitly defined as +:class:`TypeAlias`, separating them from the rest of attributes. +""" -AliasDocsDict: TypeAlias = dict[str, dict[str, dict[str, str]]] DataDict: TypeAlias = dict[str, list[str]] +"""Type for a dictionary which, for every module, contains a list with +the names of all their DOCUMENTED module-level attributes (identified +by Sphinx via the ``data`` role, hence the name) which are NOT +explicitly defined as :class:`TypeAlias`. +""" ALIAS_DOCS_DICT: AliasDocsDict = {} DATA_DICT: DataDict = {} +MANIM_ROOT = Path(__file__).resolve().parent.parent.parent + def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: - """Read all files, generate an Abstract Syntax Tree - from it, and extract useful information about the type aliases - defined in the file: the category they belong to, their definition - and their description. + """Read all files, generate Abstract Syntax Trees from them, and + extract useful information about the type aliases defined in the + files: the category they belong to, their definition and their + description, separating them from the "regular" module attributes. Returns ------- - MANIM_TYPING_DOCS : dict[str, dict[str, dict[str, str]] + ALIAS_DOCS_DICT : `AliasDocsDict` A dictionary containing the information from all the type - aliases. Each key is the name of a category of types, and - its corresponding value is another subdictionary containing - information about the type aliases under that category: + aliases in Manim. See `AliasDocsDict` for more information. - - The keys of this subdictionary are the names of the type - aliases, and the values are subsubdictionaries containing - field-value pairs with information about the type alias. + DATA_DICT : `DataDict` + A dictionary containing the names of all DOCUMENTED + module-level attributes which are not a :class:`TypeAlias`. """ global ALIAS_DOCS_DICT global DATA_DICT @@ -49,9 +73,9 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: module_content = module_path.read_text() # For storing TypeAliases - module_dict: dict[str, dict[str, dict[str, str]]] = {} - category_dict: dict[str, dict[str, str]] | None = None - alias_dict: dict[str, str] | None = None + module_dict: ModuleLevelAliasDict = {} + category_dict: AliasCategoryDict | None = None + alias_info: AliasInfo | None = None # For storing regular module attributes data_list: list[str] = [] @@ -71,10 +95,10 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: category_name = string[len(section_str) :].strip() module_dict[category_name] = {} category_dict = module_dict[category_name] - alias_dict = None + alias_info = None # or a docstring of the alias defined before - elif alias_dict: - alias_dict["doc"] = string + elif alias_info: + alias_info["doc"] = string # or a docstring of the module attribute defined before elif data_name: data_list.append(data_name) @@ -108,13 +132,15 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: module_dict[""] = {} category_dict = module_dict[""] category_dict[alias_name] = {"definition": definition} - alias_dict = category_dict[alias_name] + alias_info = category_dict[alias_name] continue - # The node is not a TypeAlias definition - alias_dict = None + # If here, the node is not a TypeAlias definition + alias_info = None - # It could still be a module attribute definition + # It could still be a module attribute definition. + # Does the assignment have a target of type Name? Then + # it could be considered a definition of a module attribute. if type(node) is ast.AnnAssign: target = node.target elif type(node) is ast.Assign and len(node.targets) == 1: diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index 5737786d78..973502aafc 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -2,7 +2,26 @@ from __future__ import annotations -from manim.typing import Point3D_Array, Vector3D, VectorND +import itertools as it +from typing import TYPE_CHECKING, Sequence + +import numpy as np +from mapbox_earcut import triangulate_float32 as earcut +from scipy.spatial.transform import Rotation + +from manim.constants import DOWN, OUT, PI, RIGHT, TAU, UP, RendererType +from manim.utils.iterables import adjacent_pairs + +if TYPE_CHECKING: + import numpy.typing as npt + + from manim.typing import ( + ManimFloat, + Point3D_Array, + Vector2D, + Vector2D_Array, + Vector3D, + ) __all__ = [ "quaternion_mult", @@ -38,17 +57,6 @@ ] -import itertools as it -from typing import Sequence - -import numpy as np -from mapbox_earcut import triangulate_float32 as earcut -from scipy.spatial.transform import Rotation - -from ..constants import DOWN, OUT, PI, RIGHT, TAU, UP, RendererType -from ..utils.iterables import adjacent_pairs - - def norm_squared(v: float) -> float: return np.dot(v, v) @@ -114,7 +122,7 @@ def quaternion_from_angle_axis( Returns ------- - List[float] + list[float] Gives back a quaternion from the angle and axis """ if not axis_normalized: @@ -654,9 +662,9 @@ def shoelace_direction(x_y: np.ndarray) -> str: def cross2d( - a: VectorND | Sequence[VectorND], - b: VectorND | Sequence[VectorND], -) -> Sequence[float] | float: + a: Vector2D | Vector2D_Array, + b: Vector2D | Vector2D_Array, +) -> ManimFloat | npt.NDArray[ManimFloat]: """Compute the determinant(s) of the passed vector (sequences). From 1a8016bd3af1888095b3df781321843ab4065142 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 27 Dec 2023 21:47:48 +0100 Subject: [PATCH 26/30] Fixed alias typo in module_parsing --- 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 26af9d7256..5ff384b916 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -23,7 +23,7 @@ classified by category in different `AliasCategoryDict` objects. """ -AliasDocsDict: TypeAlias = dict[str, AliasDocsDict] +AliasDocsDict: TypeAlias = dict[str, ModuleLevelAliasDict] """Dictionary which, for every module in Manim, contains documentation about their module-level attributes which are explicitly defined as :class:`TypeAlias`, separating them from the rest of attributes. From f2dd4bf5f37a8a97451a68112f75e56bbe70a458 Mon Sep 17 00:00:00 2001 From: chopan Date: Wed, 27 Dec 2023 22:13:16 +0100 Subject: [PATCH 27/30] Fix decode/import bugs, fix minor details in docs --- manim/utils/docbuild/autoaliasattr_directive.py | 1 + manim/utils/docbuild/manim_directive.py | 5 ++++- manim/utils/docbuild/module_parsing.py | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/manim/utils/docbuild/autoaliasattr_directive.py b/manim/utils/docbuild/autoaliasattr_directive.py index e65356de2f..74f4133ea2 100644 --- a/manim/utils/docbuild/autoaliasattr_directive.py +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -10,6 +10,7 @@ if TYPE_CHECKING: from sphinx.application import Sphinx + from typing_extensions import TypeAlias __all__ = ["AliasAttrDocumenter"] diff --git a/manim/utils/docbuild/manim_directive.py b/manim/utils/docbuild/manim_directive.py index 1e11b17d5a..9ed5d0566c 100644 --- a/manim/utils/docbuild/manim_directive.py +++ b/manim/utils/docbuild/manim_directive.py @@ -101,7 +101,10 @@ def construct(self): if TYPE_CHECKING: from sphinx.application import Sphinx -classnamedict = {} +__all__ = ["ManimDirective"] + + +classnamedict: dict[str, int] = {} class SkipManimNode(nodes.Admonition, nodes.Element): diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 5ff384b916..a38f1964b8 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -2,7 +2,8 @@ import ast from pathlib import Path -from typing import TypeAlias + +from typing_extensions import TypeAlias __all__ = ["parse_module_attributes"] @@ -70,7 +71,7 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: module_name[-1] = module_name[-1][:-3] # remove .py module_name = ".".join(module_name) - module_content = module_path.read_text() + module_content = module_path.read_text(encoding="utf-8") # For storing TypeAliases module_dict: ModuleLevelAliasDict = {} @@ -125,8 +126,7 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: ) else: definition = ast.unparse(def_node) - # for subnode in ast.walk(node.value): - # print(ast.dump(subnode, indent=4), end="\n\n") + definition = definition.replace("npt.", "") if category_dict is None: module_dict[""] = {} From be40a7d537d350eabc144d8cf98fed77b1bf540a Mon Sep 17 00:00:00 2001 From: chopan Date: Thu, 28 Dec 2023 17:43:21 +0100 Subject: [PATCH 28/30] Added missing docs for utils.docbuild and utils.testing --- docs/source/contributing/development.rst | 2 ++ .../source/reference_index/utilities_misc.rst | 7 ++++--- manim/utils/docbuild/__init__.py | 21 +++++++++++++++++++ .../utils/docbuild/autoaliasattr_directive.py | 2 ++ manim/utils/docbuild/autocolor_directive.py | 2 ++ manim/utils/docbuild/module_parsing.py | 2 ++ manim/utils/testing/__init__.py | 17 +++++++++++++++ 7 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docs/source/contributing/development.rst b/docs/source/contributing/development.rst index 828b6c2c87..b41592716d 100644 --- a/docs/source/contributing/development.rst +++ b/docs/source/contributing/development.rst @@ -159,6 +159,8 @@ Develop your contribution As far as development on your local machine goes, these are the main steps you should follow. +.. _polishing-changes-and-submitting-a-pull-request: + Polishing Changes and Submitting a Pull Request ----------------------------------------------- diff --git a/docs/source/reference_index/utilities_misc.rst b/docs/source/reference_index/utilities_misc.rst index a76c5b5467..0fa372dd87 100644 --- a/docs/source/reference_index/utilities_misc.rst +++ b/docs/source/reference_index/utilities_misc.rst @@ -9,15 +9,16 @@ Module Index .. autosummary:: :toctree: ../reference - typing constants - ~utils.bezier + typing ~utils.color + ~utils.docbuild + ~utils.testing + ~utils.bezier ~utils.commands ~utils.config_ops ~utils.deprecation ~utils.debug - ~utils.docbuild ~utils.hashing ~utils.ipython_magic ~utils.images diff --git a/manim/utils/docbuild/__init__.py b/manim/utils/docbuild/__init__.py index e69de29bb2..967f615495 100644 --- a/manim/utils/docbuild/__init__.py +++ b/manim/utils/docbuild/__init__.py @@ -0,0 +1,21 @@ +"""Utilities for building the Manim documentation. + +For more information about the Manim documentation building, see: + +- :doc:`/contributing/development`, specifically the ``Documentation`` + bullet point under :ref:`polishing-changes-and-submitting-a-pull-request` +- :doc:`/contributing/docstrings` +- :doc:`/contributing/references` +- :doc:`/contributing/examples` +- :doc:`/contributing/typings` +- :doc:`/contributing/admonitions` + +.. autosummary:: + :toctree: ../reference + + autoaliasattr_directive + autocolor_directive + manim_directive + module_parsing + +""" diff --git a/manim/utils/docbuild/autoaliasattr_directive.py b/manim/utils/docbuild/autoaliasattr_directive.py index 74f4133ea2..cb282951b4 100644 --- a/manim/utils/docbuild/autoaliasattr_directive.py +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -1,3 +1,5 @@ +"""A directive for documenting type aliases and other module-level attributes.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/manim/utils/docbuild/autocolor_directive.py b/manim/utils/docbuild/autocolor_directive.py index e3f2e62468..37c63efb29 100644 --- a/manim/utils/docbuild/autocolor_directive.py +++ b/manim/utils/docbuild/autocolor_directive.py @@ -1,3 +1,5 @@ +"""A directive for documenting colors in Manim.""" + from __future__ import annotations import inspect diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index a38f1964b8..46c31d41d0 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -1,3 +1,5 @@ +"""Read and parse all the Manim modules and extract documentation from them.""" + from __future__ import annotations import ast diff --git a/manim/utils/testing/__init__.py b/manim/utils/testing/__init__.py index e69de29bb2..f8d47040ed 100644 --- a/manim/utils/testing/__init__.py +++ b/manim/utils/testing/__init__.py @@ -0,0 +1,17 @@ +"""Utilities for Manim tests using `pytest `_. + +For more information about Manim testing, see: + +- :doc:`/contributing/development`, specifically the ``Tests`` bullet + point under :ref:`polishing-changes-and-submitting-a-pull-request` +- :doc:`/contributing/testing` + +.. autosummary:: + :toctree: ../reference + + frames_comparison + _frames_testers + _show_diff + _test_class_makers + +""" From 1980e7bbd742956f7ed19dfb23567dc0b32e140d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Thu, 28 Dec 2023 19:03:27 +0100 Subject: [PATCH 29/30] Sort alphabetically entries in utilities_misc.rst --- docs/source/reference_index/utilities_misc.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/source/reference_index/utilities_misc.rst b/docs/source/reference_index/utilities_misc.rst index 0fa372dd87..1fe9962079 100644 --- a/docs/source/reference_index/utilities_misc.rst +++ b/docs/source/reference_index/utilities_misc.rst @@ -9,25 +9,25 @@ Module Index .. autosummary:: :toctree: ../reference - constants - typing - ~utils.color - ~utils.docbuild - ~utils.testing ~utils.bezier + ~utils.color ~utils.commands ~utils.config_ops - ~utils.deprecation + constants ~utils.debug + ~utils.deprecation + ~utils.docbuild ~utils.hashing - ~utils.ipython_magic ~utils.images + ~utils.ipython_magic ~utils.iterables ~utils.paths ~utils.rate_functions ~utils.simple_functions ~utils.sounds ~utils.space_ops + ~utils.testing ~utils.tex - ~utils.tex_templates ~utils.tex_file_writing + ~utils.tex_templates + typing From 600e6160bf6008b42d53dc046388282536f1caff Mon Sep 17 00:00:00 2001 From: chopan Date: Fri, 29 Dec 2023 16:08:36 +0100 Subject: [PATCH 30/30] Address review comments, add notes about Vector and hyperlinks inside definition blocks --- manim/mobject/geometry/line.py | 5 + manim/typing.py | 381 +++++++++++++----- .../utils/docbuild/autoaliasattr_directive.py | 68 +++- 3 files changed, 335 insertions(+), 119 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index a0a9ddf0a0..93b0d73bf0 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -632,6 +632,11 @@ def _set_stroke_width_from_length(self) -> Self: class Vector(Arrow): """A vector specialized for use in graphs. + .. caution:: + Do not confuse with the :class:`~.Vector2D`, + :class:`~.Vector3D` or :class:`~.VectorND` type aliases, + which are not Mobjects! + Parameters ---------- direction diff --git a/manim/typing.py b/manim/typing.py index 3b869967a1..a6c3e2e1d5 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -92,14 +92,16 @@ """ ManimFloat: TypeAlias = np.float64 -"""A double-precision floating-point value (64 bits, or 8 bytes), according to -the IEEE 754 standard. +"""A double-precision floating-point value (64 bits, or 8 bytes), +according to the IEEE 754 standard. """ ManimInt: TypeAlias = np.int64 -r"""A long integer (64 bits, or 8 bytes). It can take values between -:math:`-2^{63}` and :math:`+2^{63} - 1`, which expressed in base 10 is a range -between around :math:`-9.223 \cdot 10^{18}` and :math:`+9.223 \cdot 10^{18}`. +r"""A long integer (64 bits, or 8 bytes). + +It can take values between :math:`-2^{63}` and :math:`+2^{63} - 1`, +which expressed in base 10 is a range between around +:math:`-9.223 \cdot 10^{18}` and :math:`+9.223 \cdot 10^{18}`. """ @@ -109,75 +111,119 @@ """ ManimColorDType: TypeAlias = ManimFloat -"""Data type used in :class:`~.ManimColorInternal`: a double-precision float -between 0 and 1. +"""Data type used in :class:`~.ManimColorInternal`: a +double-precision float between 0 and 1. """ RGB_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (3,)`` -A NumPy ndarray of 3 floats between 0 and 1, representing a color in RGB format. -Its components represent, in order, amounts of: Red light, Green light and Blue light. + +A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a +color in RGB format. + +Its components describe, in order, the intensity of Red, Green, and +Blue in the represented color. """ RGB_Tuple_Float: TypeAlias = tuple[float, float, float] """``shape: (3,)`` -A tuple of 3 floats between 0 and 1, representing a color in RGB format. -Its components represent, in order, amounts of: Red light, Green light and Blue light. + +A tuple of 3 floats between 0 and 1, representing a color in RGB +format. + +Its components describe, in order, the intensity of Red, Green, and +Blue in the represented color. """ RGB_Array_Int: TypeAlias = npt.NDArray[ManimInt] """``shape: (3,)`` -A NumPy ndarray of 3 integers between 0 and 255, representing a color in RGB format. -Its components represent, in order, amounts of: Red light, Green light and Blue light. + +A :class:`numpy.ndarray` of 3 integers between 0 and 255, +representing a color in RGB format. + +Its components describe, in order, the intensity of Red, Green, and +Blue in the represented color. """ RGB_Tuple_Int: TypeAlias = tuple[int, int, int] """``shape: (3,)`` -A tuple of 3 integers between 0 and 255, representing a color in RGB format. -Its components represent, in order, amounts of: Red light, Green light and Blue light. + +A tuple of 3 integers between 0 and 255, representing a color in RGB +format. + +Its components describe, in order, the intensity of Red, Green, and +Blue in the represented color. """ RGBA_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (4,)`` -A NumPy ndarray of 4 floats between 0 and 1, representing a color in RGBA format. -Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). + +A :class:`numpy.ndarray` of 4 floats between 0 and 1, representing a +color in RGBA format. + +Its components describe, in order, the intensity of Red, Green, Blue +and Alpha (opacity) in the represented color. """ RGBA_Tuple_Float: TypeAlias = tuple[float, float, float, float] """``shape: (4,)`` -A tuple of 4 floats between 0 and 1, representing a color in RGBA format. -Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). + +A tuple of 4 floats between 0 and 1, representing a color in RGBA +format. + +Its components describe, in order, the intensity of Red, Green, Blue +and Alpha (opacity) in the represented color. """ RGBA_Array_Int: TypeAlias = npt.NDArray[ManimInt] """``shape: (4,)`` -A NumPy ndarray of 4 integers between 0 and 255, representing a color in RGBA format. -Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). + +A :class:`numpy.ndarray` of 4 integers between 0 and 255, +representing a color in RGBA format. + +Its components describe, in order, the intensity of Red, Green, Blue +and Alpha (opacity) in the represented color. """ RGBA_Tuple_Int: TypeAlias = tuple[int, int, int, int] """``shape: (4,)`` -A tuple of 4 integers between 0 and 255, representing a color in RGBA format. -Its components represent, in order: Red light, Green light, Blue light, and Alpha (opacity). + +A tuple of 4 integers between 0 and 255, representing a color in RGBA +format. + +Its components describe, in order, the intensity of Red, Green, Blue +and Alpha (opacity) in the represented color. """ HSV_Array_Float: TypeAlias = RGB_Array_Float """``shape: (3,)`` -A NumPy ndarray of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. -Its components represent, in order: Hue, Saturation and Value (or Brightness). + +A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a +color in HSV (or HSB) format. + +Its components describe, in order, the Hue, Saturation and Value (or +Brightness) in the represented color. """ HSV_Tuple_Float: TypeAlias = RGB_Tuple_Float """``shape: (3,)`` -A tuple of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. -Its components represent, in order: Hue, Saturation and Value (or Brightness). + +A tuple of 3 floats between 0 and 1, representing a color in HSV (or +HSB) format. + +Its components describe, in order, the Hue, Saturation and Value (or +Brightness) in the represented color. """ ManimColorInternal: TypeAlias = RGBA_Array_Float """``shape: (4,)`` -Internal color representation used by :class:`~.ManimColor`, following the RGBA format. -It consists of 4 floats between 0 and 1, representing in order: -Red light, Green light, Blue light, and Alpha (opacity). + +Internal color representation used by :class:`~.ManimColor`, +following the RGBA format. + +It is a :class:`numpy.ndarray` consisting of 4 floats between 0 and +1, describing respectively the intensities of Red, Green, Blue and +Alpha (opacity) in the represented color. """ @@ -187,56 +233,84 @@ """ PointDType: TypeAlias = ManimFloat -"""Default type for arrays representing points: a double-precision floating point value.""" +"""Default type for arrays representing points: a double-precision +floating point value. +""" InternalPoint2D: TypeAlias = npt.NDArray[PointDType] """``shape: (2,)`` -A 2D point: ``[float, float]``. -This type alias is mostly made available for internal use, and only includes the NumPy type. + +A 2-dimensional point: ``[float, float]``. + +.. note:: + This type alias is mostly made available for internal use, and + only includes the NumPy type. """ Point2D: TypeAlias = Union[InternalPoint2D, tuple[float, float]] """``shape: (2,)`` -A 2D point: ``[float, float]``. -Normally a function or method which expects a `Point2D` as a parameter can handle being -passed a `Point3D` instead. + +A 2-dimensional point: ``[float, float]``. + +Normally, a function or method which expects a `Point2D` as a +parameter can handle being passed a `Point3D` instead. """ InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 3)`` + An array of `Point2D` objects: ``[[float, float], ...]``. -This type alias is mostly made available for internal use, and only includes the NumPy type. + +.. note:: + This type alias is mostly made available for internal use, and + only includes the NumPy type. """ Point2D_Array: TypeAlias = Union[InternalPoint2D_Array, tuple[Point2D, ...]] """``shape: (N, 2)`` + An array of `Point2D` objects: ``[[float, float], ...]``. -Normally a function or method which expects a `Point2D_Array` as a parameter can handle being -passed a `Point3D_Array` instead. -(Please refer to the documentation of the function you are using for further type information.) + +Normally, a function or method which expects a `Point2D_Array` as a +parameter can handle being passed a `Point3D_Array` instead. + +Please refer to the documentation of the function you are using for +further type information. """ InternalPoint3D: TypeAlias = npt.NDArray[PointDType] """``shape: (3,)`` -A 3D point: ``[float, float, float]``. -This type alias is mostly made available for internal use, and only includes the NumPy type. + +A 3-dimensional point: ``[float, float, float]``. + +.. note:: + This type alias is mostly made available for internal use, and + only includes the NumPy type. """ Point3D: TypeAlias = Union[InternalPoint3D, tuple[float, float, float]] """``shape: (3,)`` -A 3D point: ``[float, float, float]``. + +A 3-dimensional point: ``[float, float, float]``. """ InternalPoint3D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 3)`` + An array of `Point3D` objects: ``[[float, float, float], ...]``. -This type alias is mostly made available for internal use, and only includes the NumPy type. + +.. note:: + This type alias is mostly made available for internal use, and + only includes the NumPy type. """ Point3D_Array: TypeAlias = Union[InternalPoint3D_Array, tuple[Point3D, ...]] """``shape: (N, 3)`` + An array of `Point3D` objects: ``[[float, float, float], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +Please refer to the documentation of the function you are using for +further type information. """ @@ -247,45 +321,68 @@ Vector2D: TypeAlias = Point2D """``shape: (2,)`` -A 2D vector: ``[float, float]``. -Normally a function or method which expects a `Vector2D` as a parameter can handle being -passed a `Vector3D` instead. + +A 2-dimensional vector: ``[float, float]``. + +Normally, a function or method which expects a `Vector2D` as a +parameter can handle being passed a `Vector3D` instead. + +.. caution:: + Do not confuse with the :class:`~.Vector` or :class:`~.Arrow` + VMobjects! """ Vector2D_Array: TypeAlias = Point2D_Array """``shape: (M, 2)`` -An array of 2D vectors: ``[[float, float], ...]``. -Normally a function or method which expects a `Vector2D_Array` as a parameter can handle being -passed a `Vector3D_Array` instead. + +An array of `Vector2D` objects: ``[[float, float], ...]``. + +Normally, a function or method which expects a `Vector2D_Array` as a +parameter can handle being passed a `Vector3D_Array` instead. """ Vector3D: TypeAlias = Point3D """``shape: (3,)`` -A 3D vector: ``[float, float, float]``. + +A 3-dimensional vector: ``[float, float, float]``. + +.. caution:: + Do not confuse with the :class:`~.Vector` or :class:`~.Arrow3D` + VMobjects! """ Vector3D_Array: TypeAlias = Point3D_Array """``shape: (M, 3)`` -An array of 3D vectors: ``[[float, float, float], ...]``. + +An array of `Vector3D` objects: ``[[float, float, float], ...]``. """ VectorND: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] """``shape (N,)`` -An `N`-D vector: ``[float, ...]``. + +An :math:`N`-dimensional vector: ``[float, ...]``. + +.. caution:: + Do not confuse with the :class:`~.Vector` VMobject! This type alias + is named "VectorND" instead of "Vector" to avoid potential name + collisions. """ -VectorND_Array: TypeAlias = tuple[VectorND, ...] +VectorND_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[VectorND, ...]] """``shape (M, N)`` -An array of `N`-D vectors: ``[[float, ...], ...]``. + +An array of `VectorND` objects: ``[[float, ...], ...]``. """ RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] """``shape: (1, N)`` + A row vector: ``[[float, ...]]``. """ ColVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float], ...]] """``shape: (N, 1)`` + A column vector: ``[[float], [float], ...]``. """ @@ -297,12 +394,16 @@ MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...], ...]] """``shape: (M, N)`` + A matrix: ``[[float, ...], [float, ...], ...]``. """ Zeros: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[Literal[0], ...], ...]] """``shape: (M, N)`` -A `MatrixMN` filled with zeros, typically created with ``numpy.zeros((M, N))``.""" + +A `MatrixMN` filled with zeros, typically created with +``numpy.zeros((M, N))``. +""" """ @@ -314,89 +415,141 @@ npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D] ] """``shape: (3, 3)`` -A `Point3D_Array` of 3 control points for a single quadratic Bézier curve: ``[[float, float, float], [float, float, float], [float, float, float]]``. + +A `Point3D_Array` of 3 control points for a single quadratic Bézier +curve: +``[[float, float, float], [float, float, float], [float, float, float]]``. """ QuadraticBezierPoints_Array: TypeAlias = Union[ npt.NDArray[PointDType], tuple[QuadraticBezierPoints, ...] ] """``shape: (N, 3, 3)`` -An array of `N` `QuadraticBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. + +An array of :math:`N` `QuadraticBezierPoints` objects: +``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. """ QuadraticBezierPath: TypeAlias = Point3D_Array """``shape: (3*N, 3)`` -A `Point3D_Array` of `3*N` points, where each one of the `N` consecutive blocks of -3 points represents a quadratic Bézier curve: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +A `Point3D_Array` of :math:`3N` points, where each one of the +:math:`N` consecutive blocks of 3 points represents a quadratic +Bézier curve: +``[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ QuadraticSpline: TypeAlias = QuadraticBezierPath """``shape: (3*N, 3)`` -A special case of `QuadraticBezierPath` where all the `N` quadratic Bézier -curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +A special case of `QuadraticBezierPath` where all the :math:`N` +quadratic Bézier curves are connected, forming a quadratic spline: +``[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ CubicBezierPoints: TypeAlias = Union[ npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D, Point3D] ] """``shape: (4, 3)`` -A `Point3D_Array` of 4 control points for a single cubic Bézier curve: ``[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]``. + +A `Point3D_Array` of 4 control points for a single cubic Bézier +curve: +``[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]``. """ CubicBezierPoints_Array: TypeAlias = Union[ npt.NDArray[PointDType], tuple[CubicBezierPoints, ...] ] """``shape: (N, 4, 3)`` -An array of `N` `CubicBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]``. + +An array of :math:`N` `CubicBezierPoints` objects: +``[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]``. """ CubicBezierPath: TypeAlias = Point3D_Array """``shape: (4*N, 3)`` -A `Point3D_Array` of `4*N` points, where each one of the `N` consecutive blocks of -4 points represents a cubic Bézier curve: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +A `Point3D_Array` of :math:`4N` points, where each one of the +:math:`N` consecutive blocks of 4 points represents a cubic Bézier +curve: +``[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ CubicSpline: TypeAlias = CubicBezierPath """``shape: (4*N, 3)`` -A special case of `CubicBezierPath` where all the `N` cubic Bézier -curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +A special case of `CubicBezierPath` where all the :math:`N` cubic +Bézier curves are connected, forming a quadratic spline: +``[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ BezierPoints: TypeAlias = Point3D_Array -"""``shape: (PPC, 3)`` -A `Point3D_Array` of `PPC = n + 1` ("Points Per Curve") control points for a single `n`-th -degree Bézier curve: ``[[float, float, float], ...]``. -(Please refer to the documentation of the function you are using for further type information.) +r"""``shape: (PPC, 3)`` + +A `Point3D_Array` of :math:`\text{PPC}` control points +(:math:`\text{PPC: Points Per Curve} = n + 1`) for a single +:math:`n`-th degree Bézier curve: +``[[float, float, float], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ BezierPoints_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[BezierPoints, ...]] -"""``shape: (N, PPC, 3)`` -An array of `N` `BezierPoints` objects containing `PPC Point3D` objects each: ``[[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) +r"""``shape: (N, PPC, 3)`` + +An array of :math:`N` `BezierPoints` objects containing +:math:`\text{PPC}` `Point3D` objects each +(:math:`\text{PPC: Points Per Curve} = n + 1`): +``[[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ BezierPath: TypeAlias = Point3D_Array -"""``shape: (PPC*N, 3)`` -A `Point3D_Array` of `PPC * N` points, where where each one of the `N` consecutive blocks of -`PPC = n + 1` ("Points Per Curve") points represents a Bézier curve of `n`-th degree: +r"""``shape: (PPC*N, 3)`` + +A `Point3D_Array` of :math:`\text{PPC} \cdot N` points, where each +one of the :math:`N` consecutive blocks of :math:`\text{PPC}` control +points (:math:`\text{PPC: Points Per Curve} = n + 1`) represents a +Bézier curve of :math:`n`-th degree: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) + +Please refer to the documentation of the function you are using for +further type information. """ Spline: TypeAlias = BezierPath -"""``shape: (PPC*N, 3)`` -A special case of `BezierPath` where all the `N` Bézier curves consisting of `PPC` ("Points Per Curve") -`Point3D` objects are connected, forming an `n`-th degree spline: ``[[float, float, float], ...], ...]``. -(Please refer to the documentation of the function you are using for further type information.) +r"""``shape: (PPC*N, 3)`` + +A special case of `BezierPath` where all the :math:`N` Bézier curves +consisting of :math:`\text{PPC}` `Point3D` objects +(:math:`\text{PPC: Points Per Curve} = n + 1`) are connected, forming +an :math:`n`-th degree spline: +``[[float, float, float], ...], ...]``. + +Please refer to the documentation of the function you are using for +further type information. """ FlatBezierPoints: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] -"""``shape: (N,)`` -A flattened array of Bézier control points: ``[float, ...]``. +"""``shape: (3*PPC*N,)`` + +A flattened array of Bézier control points: +``[float, ...]``. """ @@ -405,12 +558,18 @@ Function types """ -# Due to current limitations (see https://github.com/python/mypy/issues/14656 / 8263), we don't specify the first argument type (Mobject). +# Due to current limitations +# (see https://github.com/python/mypy/issues/14656 / 8263), +# we don't specify the first argument type (Mobject). FunctionOverride: TypeAlias = Callable[..., None] -"""Function type returning an :class:`~.Animation` for the specified :class:`~.Mobject`.""" +"""Function type returning an :class:`~.Animation` for the specified +:class:`~.Mobject`. +""" PathFuncType: TypeAlias = Callable[[Point3D, Point3D, float], Point3D] -"""Function mapping two `Point3D` objects and an alpha value to a new `Point3D`.""" +"""Function mapping two `Point3D` objects and an alpha value to a new +`Point3D`. +""" MappingFunction: TypeAlias = Callable[[Point3D], Point3D] """A function mapping a `Point3D` to another `Point3D`.""" @@ -423,28 +582,36 @@ Image: TypeAlias = npt.NDArray[ManimInt] """``shape: (height, width) | (height, width, 3) | (height, width, 4)`` -A rasterized image with a height of ``height`` pixels and a width of ``width`` -pixels. Every value in the array is an integer from 0 to 255. Every pixel is -represented either by a single integer indicating its lightness (for greyscale -images), an `RGB_Array_Int` or an `RGBA_Array_Int`. + +A rasterized image with a height of ``height`` pixels and a width of +``width`` pixels. + +Every value in the array is an integer from 0 to 255. + +Every pixel is represented either by a single integer indicating its +lightness (for greyscale images), an `RGB_Array_Int` or an +`RGBA_Array_Int`. """ GrayscaleImage: TypeAlias = Image """``shape: (height, width)`` -A 100% opaque grayscale `Image`, where every pixel value is a `ManimInt` -indicating its lightness (black -> gray -> white). + +A 100% opaque grayscale `Image`, where every pixel value is a +`ManimInt` indicating its lightness (black -> gray -> white). """ RGBImage: TypeAlias = Image """``shape: (height, width, 3)`` -A 100% opaque `Image` in color, where every pixel value is an `RGB_Array_Int` -object. + +A 100% opaque `Image` in color, where every pixel value is an +`RGB_Array_Int` object. """ RGBAImage: TypeAlias = Image """``shape: (height, width, 4)`` -An `Image` in color where pixels can be transparent. Every pixel value is an -`RGBA_Array_Int` object. + +An `Image` in color where pixels can be transparent. Every pixel +value is an `RGBA_Array_Int` object. """ @@ -454,9 +621,11 @@ """ StrPath: TypeAlias = Union[str, PathLike[str]] -"""A string or :class:`os.PathLike` representing a path to a directory or file.""" +"""A string or :class:`os.PathLike` representing a path to a +directory or file. +""" StrOrBytesPath: TypeAlias = Union[str, bytes, PathLike[str], PathLike[bytes]] -"""A string, bytes or :class:`os.PathLike` object representing a path to a -directory or file. +"""A string, bytes or :class:`os.PathLike` object representing a path +to a directory or file. """ diff --git a/manim/utils/docbuild/autoaliasattr_directive.py b/manim/utils/docbuild/autoaliasattr_directive.py index cb282951b4..6dd645a9fd 100644 --- a/manim/utils/docbuild/autoaliasattr_directive.py +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -26,6 +26,49 @@ ] +def smart_replace(base: str, alias: str, substitution: str) -> str: + """Auxiliary function for substituting type aliases into a base + string, when there are overlaps between the aliases themselves. + + Parameters + ---------- + base + The string in which the type aliases will be located and + replaced. + alias + The substring to be substituted. + substitution + The string which will replace every occurrence of ``alias``. + + Returns + ------- + str + The new string after the alias substitution. + """ + + occurrences = [] + len_alias = len(alias) + len_base = len(base) + condition = lambda char: (not char.isalnum()) and char != "_" + + start = 0 + i = 0 + while True: + i = base.find(alias, start) + if i == -1: + break + if (i == 0 or condition(base[i - 1])) and ( + i + len_alias == len_base or condition(base[i + len_alias]) + ): + occurrences.append(i) + start = i + len_alias + + for o in occurrences[::-1]: + base = base[:o] + substitution + base[o + len_alias :] + + return base + + def setup(app: Sphinx) -> None: app.add_directive("autoaliasattr", AliasAttrDocumenter) @@ -90,6 +133,12 @@ def run(self) -> list[nodes.Element]: # Contains "definition": str # Can possibly contain "doc": str for alias_name, alias_info in category_dict.items(): + # Replace all occurrences of type aliases in the + # definition for automatic cross-referencing! + alias_def = alias_info["definition"] + for A in ALIAS_LIST: + alias_def = smart_replace(alias_def, A, f":class:`~.{A}`") + # Using the `.. class::` directive is CRUCIAL, since # function/method parameters are always annotated via # classes - therefore Sphinx expects a class @@ -97,30 +146,23 @@ def run(self) -> list[nodes.Element]: [ f".. class:: {alias_name}", "", - " .. code-block::", + " .. parsed-literal::", "", - f" {alias_info['definition']}", + f" {alias_def}", "", ] ) if "doc" in alias_info: + # Replace all occurrences of type aliases in + # the docs for automatic cross-referencing! alias_doc = alias_info["doc"] - # Replace all occurrences of type aliases in the docs for - # automatic cross-referencing! for A in ALIAS_LIST: alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") - doc_lines = alias_doc.split("\n") - # Some type aliases in Manim start with a ``shape: ...` line. - # This allows that line to have more space and a better format. - if ( - len(doc_lines) >= 2 - and doc_lines[0].startswith("``shape:") - and doc_lines[1].strip() != "" - ): - doc_lines.insert(1, "") + # Add all the lines with 4 spaces behind, to consider all the # documentation as a paragraph INSIDE the `.. class::` block + doc_lines = alias_doc.split("\n") unparsed.extend(ViewList([f" {line}" for line in doc_lines])) # Parse the reST text into a fresh container