From cac608bf2aa9882773aac25a4ef1ccbd7d8d66cf Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Sun, 17 Dec 2023 17:32:38 +0100 Subject: [PATCH 01/77] follow-up to #3491, made errors more consistent. fixes #3527 --- manim/animation/animation.py | 3 ++- manim/animation/composition.py | 7 ++++--- tests/module/animation/test_composition.py | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/manim/animation/animation.py b/manim/animation/animation.py index 75629ecb55..cb8fcaddfe 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -193,7 +193,8 @@ def begin(self) -> None: """ if self.run_time <= 0: raise ValueError( - f"{self} has a runtime of <= 0 seconds, which cannot be rendered correctly! please set a runtime > 0" + f"{self} has a run_time of <= 0 seconds, this cannot be rendered correctly. " + "Please set the run_time to be positive" ) self.starting_mobject = self.create_starting_mobject() if self.suspend_mobject_updating: diff --git a/manim/animation/composition.py b/manim/animation/composition.py index ee26eb504f..ff219405f2 100644 --- a/manim/animation/composition.py +++ b/manim/animation/composition.py @@ -86,12 +86,13 @@ def get_all_mobjects(self) -> Sequence[Mobject]: def begin(self) -> None: if self.run_time <= 0: tmp = ( - "please set a runtime > 0" + "Please set the run_time to be positive" if len(self.animations) != 0 - else "Please add at least one Animation" + else "Please add at least one Animation with positive run_time" ) raise ValueError( - f"{self} has a runtime of 0 seconds. Which cannot be rendered correctly! {tmp}." + f"{self} has a run_time of 0 seconds, this cannot be " + f"rendered correctly. {tmp}." ) if self.suspend_mobject_updating: self.group.suspend_updating() diff --git a/tests/module/animation/test_composition.py b/tests/module/animation/test_composition.py index 1f6d6bf5c1..6837699fdf 100644 --- a/tests/module/animation/test_composition.py +++ b/tests/module/animation/test_composition.py @@ -172,10 +172,10 @@ def test_animationgroup_is_passing_remover_to_nested_animationgroups(): def test_empty_animation_group_fails(): - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Please add at least one Animation"): AnimationGroup().begin() def test_empty_animation_fails(): - with pytest.raises(ValueError): + with pytest.raises(ValueError, match="Please set the run_time to be positive"): FadeIn(None, run_time=0).begin() From 196fa1fa2fe505163ab879df15669766345c4d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9rome=20Eertmans?= Date: Sun, 17 Dec 2023 17:37:01 +0100 Subject: [PATCH 02/77] chore(docs): add some words about Cairo 1.18 (#3530) * chore(docs): add some words about Cairo 1.18 Closes #3521 * fix(docs): typo * Update testing.rst * Update testing.rst --- docs/source/contributing/testing.rst | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/source/contributing/testing.rst b/docs/source/contributing/testing.rst index 059e2ba30e..dfc6a225f8 100644 --- a/docs/source/contributing/testing.rst +++ b/docs/source/contributing/testing.rst @@ -5,6 +5,24 @@ If you are adding new features to manim, you should add appropriate tests for th manim from breaking at each change by checking that no other feature has been broken and/or been unintentionally modified. +.. warning:: + + The full tests suite requires Cairo 1.18 in order to run all tests. + However, Cairo 1.18 may not be available from your package manager, + like ``apt``, and it is very likely that you have an older version installed, + e.g., 1.16. If you run tests with a version prior to 1.18, + many tests will be skipped. Those tests are not skipped in the online CI. + + If you want to run all tests locally, you need to install Cairo 1.18 or above. + You can do so by compiling Cairo from source: + + 1. download ``cairo-1.18.0.tar.xz`` from + `here `_. + and uncompress it; + 2. open the INSTALL file and follow the instructions (you might need to install + ``meson`` and ``ninja``); + 3. run the tests suite and verify that the Cairo version is correct. + How Manim tests --------------- From 8ea8f25576848c8e1caae53a1e6db603e7a4b80f Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Wed, 20 Dec 2023 19:33:56 -0500 Subject: [PATCH 03/77] Fix formatting of ``MoveAlongPath`` docs (#3541) * Remove wag method from Mobject * Fixed MoveAlongPath * Revert remove wag Created a new branch with the wrong base, sorry ;) --- manim/animation/movement.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manim/animation/movement.py b/manim/animation/movement.py index 816f714477..4533eeeb70 100644 --- a/manim/animation/movement.py +++ b/manim/animation/movement.py @@ -136,8 +136,7 @@ def interpolate_mobject(self, alpha: float) -> None: class MoveAlongPath(Animation): """Make one mobject move along the path of another mobject. - Example - -------- + .. manim:: MoveAlongPathExample class MoveAlongPathExample(Scene): From dd327a37ca7876b7e68c6633a8f76d3cc3c1842c Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Wed, 20 Dec 2023 20:37:24 -0500 Subject: [PATCH 04/77] Fixed Animate Type-hint (#3543) --- manim/mobject/mobject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 3051b161e6..0b4dbbc787 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -238,7 +238,7 @@ def construct(self): cls.__init__ = cls._original__init__ @property - def animate(self) -> _AnimationBuilder | T: + def animate(self: T) -> _AnimationBuilder | T: """Used to animate the application of any method of :code:`self`. Any method called on :code:`animate` is converted to an animation of applying From 3037f0e713144601a18794bb89b425aa02f565df Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Fri, 22 Dec 2023 16:01:59 -0500 Subject: [PATCH 05/77] Remove wag method from Mobject (#3539) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> --- manim/mobject/mobject.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 0b4dbbc787..eaf7fa1b73 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1337,20 +1337,6 @@ def R3_func(point): return self.apply_function(R3_func) - def wag( - self, direction: Vector3 = RIGHT, axis: Vector3 = DOWN, wag_factor: float = 1.0 - ) -> Self: - for mob in self.family_members_with_points(): - alphas = np.dot(mob.points, np.transpose(axis)) - alphas -= min(alphas) - alphas /= max(alphas) - alphas = alphas**wag_factor - mob.points += np.dot( - alphas.reshape((len(alphas), 1)), - np.array(direction).reshape((1, mob.dim)), - ) - return self - def reverse_points(self) -> Self: for mob in self.family_members_with_points(): mob.apply_over_attr_arrays(lambda arr: np.array(list(reversed(arr)))) From 34e7d68644671b427c86cb9ea9a83ac539609853 Mon Sep 17 00:00:00 2001 From: yuan Date: Sat, 23 Dec 2023 22:58:07 +0800 Subject: [PATCH 06/77] Fix typo of `get_y_axis_label` docstring (#3547) --- manim/mobject/graphing/coordinate_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 170a0f5778..e58d22fc1f 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -305,7 +305,7 @@ def get_y_axis_label( label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. edge - The edge of the x-axis to which the label will be added, by default ``UR``. + The edge of the y-axis to which the label will be added, by default ``UR``. direction Allows for further positioning of the label from an edge, by default ``UR`` buff From 9b18a861f392b5368719887799da1c3459731b51 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Sun, 24 Dec 2023 12:33:45 -0500 Subject: [PATCH 07/77] Finish TODO's in ``contributing/typings.rst`` (#3545) * Updated typing docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added link for protocols * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added object vs Any * Fix Typo * Rephrase TypeVar Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Compare between tuple vs list Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * typing -> collections.abc Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * typing -> collections.abc Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * change method to attr Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * clarify object typehint Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Fix code typo Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Added if TYPE_CHECKING section * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix reST for inline code * Elaborate on if TYPE_CHECKING Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * functions -> collections Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> --- docs/source/contributing/typings.rst | 52 +++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/docs/source/contributing/typings.rst b/docs/source/contributing/typings.rst index 9880bfb3b7..748cff1e02 100644 --- a/docs/source/contributing/typings.rst +++ b/docs/source/contributing/typings.rst @@ -40,6 +40,9 @@ Typing guidelines pending shape support, using the correct type aliases will help users understand which shape should be used. +* For typings of generic collections, check out `this `_ + link. + * Always use a type hint of ``None`` for functions that does not return a value (this also applies to ``__init__``), e.g.: @@ -57,6 +60,8 @@ Typing guidelines * Following `PEP 484 `_, use ``float`` instead of ``int | float``. +* Use ``x | y`` instead of ``Union[x, y]`` + * Mobjects have the typehint ``Mobject``, e.g.: .. code:: py @@ -66,16 +71,55 @@ Typing guidelines return self.set_color(mobject.get_color()) * Always parametrize generics (``list[int]`` instead of ``list``, - ``type[Any]`` instead of ``type``, etc.). This also applies to callables: + ``type[Any]`` instead of ``type``, etc.). This also applies to callables. .. code:: py rate_func: Callable[[float], float] = lambda t: smooth(1 - t) +* Use ``TypeVar`` when you want to "link" type hints as being the same type. + Consider ``Mobject.copy``, which returns a new instance of the same class. + It would be type-hinted as: + +.. code:: py + + T = TypeVar("T") + + + def copy(self: T) -> T: + ... + +* Use ``typing.Iterable`` whenever the function works with *any* iterable, not a specific type. + +* If the function returns a container of a specific length each time, consider using ``tuple`` instead of ``list``. + +.. code:: py + + def foo() -> tuple[float, float, float]: + return (0, 0, 0) + +* If a function works with a parameter as long as said parameter has a ``__getitem__``, ``__iter___`` and ``__len__`` method, + the typehint of the parameter should be ``collections.abc.Mapping``. If it also supports ``__setitem__`` and/or ``__delitem__``, it + should be marked as ``collections.abc.MutableMapping``. + +* Typehinting something as ``object`` means that only attributes available on every Python object should be accessed, + like ``__str__`` and so on. On the other hand, literally any attribute can be accessed on a variable with the ``Any`` typehint - + it's more freeing than the ``object`` typehint, and makes mypy stop typechecking the variable. Note that whenever possible, + try to keep typehints as specific as possible. + +* If objects are imported purely for type hint purposes, keep it under an ``if typing.TYPE_CHECKING`` guard, to prevent them from + being imported at runtime (helps library performance). Do not forget to use the ``from __future__ import annotations`` import to avoid having runtime ``NameError`` exceptions. + +.. code:: py + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from manim.typing import Vector3 + # type stuff with Vector3 + Missing Sections for typehints are: ----------------------------------- * Mypy and numpy import errors: https://realpython.com/python-type-checking/#running-mypy -* When to use ``object`` vs ``Any`` -* The use of a TypeVar on the type hints for ``copy()``. -* The definition and use of Protocols (like ``Sized``, ``Sequence``, ``Iterable``...) +* Explain ``mypy.ini`` (see above link) From 472eaae6fee467981f22ab9cd3d42b788ad04344 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Tue, 26 Dec 2023 16:36:26 -0500 Subject: [PATCH 08/77] Fix use of `Mobject`'s deprecated `get_*()` and `set_*()` methods in Cairo tests (#3549) * Fix Deprecation warnings in cairo tests * Fix animation/specialized.py --- manim/animation/specialized.py | 2 +- manim/animation/transform_matching_parts.py | 2 +- manim/mobject/graphing/number_line.py | 2 +- manim/mobject/svg/svg_mobject.py | 4 ++-- manim/mobject/text/text_mobject.py | 2 +- manim/mobject/value_tracker.py | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manim/animation/specialized.py b/manim/animation/specialized.py index 2c9ed5c617..adc44ea1f1 100644 --- a/manim/animation/specialized.py +++ b/manim/animation/specialized.py @@ -84,7 +84,7 @@ def __init__( mob.move_to(self.focal_point) mob.save_state() - mob.set_width(self.initial_width) + mob.set(width=self.initial_width) if fill_o: mob.set_opacity(self.initial_opacity) diff --git a/manim/animation/transform_matching_parts.py b/manim/animation/transform_matching_parts.py index 8c97643860..dbf5dd294e 100644 --- a/manim/animation/transform_matching_parts.py +++ b/manim/animation/transform_matching_parts.py @@ -225,7 +225,7 @@ def get_mobject_parts(mobject: Mobject) -> list[Mobject]: def get_mobject_key(mobject: Mobject) -> int: mobject.save_state() mobject.center() - mobject.set_height(1) + mobject.set(height=1) result = hash(np.round(mobject.points, 3).tobytes()) mobject.restore() return result diff --git a/manim/mobject/graphing/number_line.py b/manim/mobject/graphing/number_line.py index aec3bfb533..3d70ca530b 100644 --- a/manim/mobject/graphing/number_line.py +++ b/manim/mobject/graphing/number_line.py @@ -475,7 +475,7 @@ def get_number_mobject( num_mob.next_to(self.number_to_point(x), direction=direction, buff=buff) if x < 0 and self.label_direction[0] == 0: # Align without the minus sign - num_mob.shift(num_mob[0].get_width() * LEFT / 2) + num_mob.shift(num_mob[0].width * LEFT / 2) return num_mob def get_number_mobjects(self, *numbers, **kwargs) -> VGroup: diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 18d0a54aa9..87cad3bda0 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -441,9 +441,9 @@ def move_into_position(self) -> None: if self.should_center: self.center() if self.svg_height is not None: - self.set_height(self.svg_height) + self.set(height=self.svg_height) if self.svg_width is not None: - self.set_width(self.svg_width) + self.set(width=self.svg_width) class VMobjectFromSVGPath(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/mobject/text/text_mobject.py b/manim/mobject/text/text_mobject.py index 1110258c4e..a0b32bfaeb 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -352,7 +352,7 @@ def construct(self): ) text6.scale(1.3).shift(DOWN) self.add(text1, text2, text3, text4, text5 , text6) - Group(*self.mobjects).arrange(DOWN, buff=.8).set_height(config.frame_height-LARGE_BUFF) + Group(*self.mobjects).arrange(DOWN, buff=.8).set(height=config.frame_height-LARGE_BUFF) .. manim:: TextMoreCustomization :save_last_frame: diff --git a/manim/mobject/value_tracker.py b/manim/mobject/value_tracker.py index b60d89887e..9941698e90 100644 --- a/manim/mobject/value_tracker.py +++ b/manim/mobject/value_tracker.py @@ -71,7 +71,7 @@ def construct(self): def __init__(self, value=0, **kwargs): super().__init__(**kwargs) - self.set_points(np.zeros((1, 3))) + self.set(points=np.zeros((1, 3))) self.set_value(value) def get_value(self) -> float: @@ -132,7 +132,7 @@ def interpolate(self, mobject1, mobject2, alpha, path_func=straight_path()): Turns self into an interpolation between mobject1 and mobject2. """ - self.set_points(path_func(mobject1.points, mobject2.points, alpha)) + self.set(points=path_func(mobject1.points, mobject2.points, alpha)) return self From 4a963c45ab6173c9c04cc99892ad24b4ae559458 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 28 Dec 2023 12:57:21 -0500 Subject: [PATCH 09/77] add note in docstring of ManimColor about class constructors (#3554) --- manim/utils/color/core.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index cdd75ad9ae..042ed7555d 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -75,19 +75,33 @@ class ManimColor: Be careful when passing strings to ManimColor it can create a big overhead for the color processing. If you want to parse a list of colors use the function :meth:`parse` in :class:`ManimColor` which assumes that - you are going to pass a list of color so arrays will not bei interpreted as a single color. + you are going to pass a list of color so arrays will not be interpreted as a single color. .. warning:: If you pass an array of numbers to :meth:`parse` it will interpret the r,g,b,a numbers in that array as colors so instead of the expect singular color you get and array with 4 colors. - For conversion behaviors see the _internal functions for further documentation + For conversion behaviors see the ``_internal`` functions for further documentation + + You can create a ``ManimColor`` instance via its classmethods. See the respective methods for more info. + + .. code-block:: python + + mycolor = ManimColor.from_rgb((0, 1, 0.4, 0.5)) + myothercolor = ManimColor.from_rgb((153, 255, 255)) + + You can also convert between different color spaces: + + .. code-block:: python + + mycolor_hex = mycolor.to_hex() + myoriginalcolor = ManimColor.from_hex(mycolor_hex).to_hsv() Parameters ---------- value Some representation of a color (e.g., a string or - a suitable tuple). + a suitable tuple). The default ``None`` is ``BLACK``. alpha The opacity of the color. By default, colors are fully opaque (value 1.0). From 02391d71ac5e80f80312369fcebc5f7032a9bd5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:04:31 +0100 Subject: [PATCH 10/77] Added support for Manim type aliases in Sphinx docs + Added new TypeAliases (#3484) * Updated manim.typing and included TypeAliases in docs.source.conf * Added Vector2 and reorganized manim_type_aliases * Fixed __all__ exports for __all__ of manim * Update manim/cli/render/global_options.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Draft of new typing docs and new autotyping directive * Changed vertical bars to Unions * Updated poetry.lock * Created custom file parser for manim.typing * Got reST parser going * Updated autotyping and parsing * Update parsing * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added code_block toggle * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added typings to directives * Renamed Tuple to tuple in manim.typings * Added missing docs for type aliases * Fixed exponent typo in ManimInt * Hyperlinks to types work - removed Module Attributes section * Removed Unused Import Remove ``import re`` * Added freeglut-devel to workflows for Linux Hopefully (?) fix the GLU import error * Fix package name * Add support for Type Aliases section in every module - Renaming of Vector types * Add/fix docs for directive, parser and others * Fixed alias typo in module_parsing * Fix decode/import bugs, fix minor details in docs * Added missing docs for utils.docbuild and utils.testing * Sort alphabetically entries in utilities_misc.rst * Address review comments, add notes about Vector and hyperlinks inside definition blocks --------- Co-authored-by: MrDiver Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JasonGrace2282 --- .github/workflows/ci.yml | 2 +- docs/source/_templates/autosummary/module.rst | 13 +- docs/source/conf.py | 9 + docs/source/contributing/development.rst | 2 + .../source/reference_index/utilities_misc.rst | 10 +- manim/__init__.py | 1 + manim/_config/cli_colors.py | 2 + manim/_config/logger_utils.py | 2 + manim/_config/utils.py | 32 +- 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/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/constants.py | 30 +- manim/gui/gui.py | 2 + manim/mobject/geometry/arc.py | 6 +- manim/mobject/geometry/boolean_ops.py | 22 +- manim/mobject/geometry/line.py | 19 +- manim/mobject/geometry/tips.py | 4 +- manim/mobject/graphing/coordinate_systems.py | 12 +- manim/mobject/mobject.py | 59 +- 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/three_d/three_d_utils.py | 8 +- manim/mobject/three_d/three_dimensions.py | 8 +- manim/mobject/types/image_mobject.py | 2 + manim/mobject/types/point_cloud_mobject.py | 2 + manim/mobject/types/vectorized_mobject.py | 30 +- 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 | 636 +++++++- manim/utils/caching.py | 2 + manim/utils/color/core.py | 8 +- manim/utils/docbuild/__init__.py | 21 + .../utils/docbuild/autoaliasattr_directive.py | 197 +++ manim/utils/docbuild/autocolor_directive.py | 13 +- manim/utils/docbuild/manim_directive.py | 23 +- manim/utils/docbuild/module_parsing.py | 163 ++ 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/space_ops.py | 43 +- manim/utils/testing/__init__.py | 17 + manim/utils/tex_file_writing.py | 2 + poetry.lock | 1333 +++++++++-------- pyproject.toml | 8 +- tests/test_scene_rendering/simple_scenes.py | 2 + 72 files changed, 1992 insertions(+), 888 deletions(-) create mode 100644 manim/utils/docbuild/autoaliasattr_directive.py create mode 100644 manim/utils/docbuild/module_parsing.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e449e6205d..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 + packages: python3-opengl libpango1.0-dev xvfb freeglut3-dev version: 1.0 - name: Install Texlive (Linux) diff --git a/docs/source/_templates/autosummary/module.rst b/docs/source/_templates/autosummary/module.rst index d0a10c34cb..967138e560 100644 --- a/docs/source/_templates/autosummary/module.rst +++ b/docs/source/_templates/autosummary/module.rst @@ -4,16 +4,9 @@ .. automodule:: {{ fullname }} - {% block attributes %} - {% if attributes %} - .. rubric:: Module Attributes - - .. autosummary:: - {% for item in attributes %} - {{ item }} - {%- endfor %} - {% endif %} - {% endblock %} + {# SEE manim.utils.docbuild.autoaliasattr_directive #} + {# FOR INFORMATION ABOUT THE CUSTOM autoaliasattr DIRECTIVE! #} + .. autoaliasattr:: {{ fullname }} {% block classes %} {% if classes %} diff --git a/docs/source/conf.py b/docs/source/conf.py index 8e0ce1b02e..e488dc9dbc 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,6 +11,7 @@ from pathlib import Path import manim +from manim.utils.docbuild.module_parsing import parse_module_attributes # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, @@ -44,6 +45,7 @@ "sphinxext.opengraph", "manim.utils.docbuild.manim_directive", "manim.utils.docbuild.autocolor_directive", + "manim.utils.docbuild.autoaliasattr_directive", "sphinx.ext.graphviz", "sphinx.ext.inheritance_diagram", "sphinxcontrib.programoutput", @@ -54,7 +56,14 @@ 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.{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" # controls whether functions documented by the autofunction directive 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 1caab7ecd4..1fe9962079 100644 --- a/docs/source/reference_index/utilities_misc.rst +++ b/docs/source/reference_index/utilities_misc.rst @@ -9,23 +9,25 @@ Module Index .. autosummary:: :toctree: ../reference - constants ~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 diff --git a/manim/__init__.py b/manim/__init__.py index 5669b0ea24..a4034ed134 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -16,6 +16,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..f4eeda69a7 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -20,18 +20,24 @@ 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, Vector3 -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"] def config_file_paths() -> list[Path]: @@ -1145,22 +1151,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 @@ -1801,7 +1807,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/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 56626a0607..b35e5eb378 100644 --- a/manim/cli/cfg/group.py +++ b/manim/cli/cfg/group.py @@ -26,6 +26,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 8623e7a5a9..33fac1b1d3 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/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 9f4fb8c67f..3ad340ed5e 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -26,6 +26,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 f2a9b2d69d..ac5e78f6a7 100644 --- a/manim/cli/render/ease_of_access_options.py +++ b/manim/cli/render/ease_of_access_options.py @@ -2,6 +2,8 @@ from cloup import Choice, 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 69452c04b9..42b61ae2d9 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -6,6 +6,8 @@ from ... import logger +__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 5eebfe2fa6..a7613f1565 100644 --- a/manim/cli/render/output_options.py +++ b/manim/cli/render/output_options.py @@ -2,6 +2,8 @@ from cloup import IntRange, Path, 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 73750a9e75..fffdce36cb 100644 --- a/manim/cli/render/render_options.py +++ b/manim/cli/render/render_options.py @@ -8,6 +8,8 @@ from ... import logger +__all__ = ["render_options"] + def validate_scene_range(ctx, param, value): try: 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/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/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/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/mobject/geometry/line.py b/manim/mobject/geometry/line.py index b958e55e19..93b0d73bf0 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 @@ -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 @@ -654,7 +659,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/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 96e2bdb4d6..5d37f1eed2 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 a0b32bfaeb..32f5e4dc25 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -79,6 +79,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/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/image_mobject.py b/manim/mobject/types/image_mobject.py index 990fb67686..db0304b502 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 9e8c97358b..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, ) @@ -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. @@ -114,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, @@ -139,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 @@ -386,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: @@ -553,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 @@ -578,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. @@ -615,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. @@ -653,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: @@ -1028,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/renderer/cairo_renderer.py b/manim/renderer/cairo_renderer.py index e9d79b109f..156523755b 100644 --- a/manim/renderer/cairo_renderer.py +++ b/manim/renderer/cairo_renderer.py @@ -20,6 +20,8 @@ from manim.animation.animation import Animation 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 495f199758..a6c3e2e1d5 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -1,133 +1,631 @@ +"""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. +""" + from __future__ import annotations from os import PathLike -from typing import Callable, Tuple, Union +from typing import Callable, Literal, Union import numpy as np import numpy.typing as npt from typing_extensions import TypeAlias -# Color Types +__all__ = [ + "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", + "Vector2D", + "Vector2D_Array", + "Vector3D", + "Vector3D_Array", + "VectorND", + "VectorND_Array", + "RowVector", + "ColVector", + "MatrixMN", + "Zeros", + "QuadraticBezierPoints", + "QuadraticBezierPoints_Array", + "QuadraticBezierPath", + "QuadraticSpline", + "CubicBezierPoints", + "CubicBezierPoints_Array", + "CubicBezierPath", + "CubicSpline", + "BezierPoints", + "BezierPoints_Array", + "BezierPath", + "Spline", + "FlatBezierPoints", + "FunctionOverride", + "PathFuncType", + "MappingFunction", + "Image", + "GrayscaleImage", + "RGBImage", + "RGBAImage", + "StrPath", + "StrOrBytesPath", +] + + +""" +[CATEGORY] +Primitive data types +""" 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}`. +""" + + +""" +[CATEGORY] +Color types +""" + ManimColorDType: TypeAlias = ManimFloat +"""Data type used in :class:`~.ManimColorInternal`: a +double-precision float between 0 and 1. +""" + +RGB_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] +"""``shape: (3,)`` + +A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a +color in RGB format. -RGB_Array_Float: TypeAlias = npt.NDArray[ManimFloat] -RGB_Tuple_Float: TypeAlias = Tuple[float, float, float] +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 describe, in order, the intensity of Red, Green, and +Blue in the represented color. +""" RGB_Array_Int: TypeAlias = npt.NDArray[ManimInt] -RGB_Tuple_Int: TypeAlias = Tuple[int, int, int] +"""``shape: (3,)`` + +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 describe, in order, the intensity of Red, Green, and +Blue in the represented color. +""" + +RGBA_Array_Float: TypeAlias = npt.NDArray[ManimColorDType] +"""``shape: (4,)`` -RGBA_Array_Float: TypeAlias = npt.NDArray[ManimFloat] -RGBA_Tuple_Float: TypeAlias = Tuple[float, float, float, float] +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 describe, in order, the intensity of Red, Green, Blue +and Alpha (opacity) in the represented color. +""" RGBA_Array_Int: TypeAlias = npt.NDArray[ManimInt] -RGBA_Tuple_Int: TypeAlias = Tuple[int, int, int, int] +"""``shape: (4,)`` + +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 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 :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. -ManimColorInternal: TypeAlias = npt.NDArray[ManimColorDType] +Its components describe, in order, the Hue, Saturation and Value (or +Brightness) in the represented color. +""" -# Point Types +ManimColorInternal: TypeAlias = RGBA_Array_Float +"""``shape: (4,)`` + +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. +""" + + +""" +[CATEGORY] +Point types +""" PointDType: TypeAlias = ManimFloat -""" DType for all points. """ +"""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 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]`. """ +Point2D: TypeAlias = Union[InternalPoint2D, tuple[float, float]] +"""``shape: (2,)`` -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 2-dimensional point: ``[float, float]``. + +Normally, a function or method which expects a `Point2D` as a +parameter can handle being passed a `Point3D` instead. """ -Point3D: TypeAlias = Union[InternalPoint3D, Tuple[float, float, float]] -""" `shape: (3,)` A 3D point. `[float, float, float]` """ +InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] +"""``shape: (N, 3)`` -# 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]]`. """ +An array of `Point2D` objects: ``[[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]], ...]`. """ +.. 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], ...]``. -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]]`. """ +Normally, a function or method which expects a `Point2D_Array` as a +parameter can handle being passed a `Point3D_Array` instead. -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) +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, ...]`.""" +InternalPoint3D: TypeAlias = npt.NDArray[PointDType] +"""``shape: (3,)`` + +A 3-dimensional point: ``[float, float, float]``. + +.. note:: + This type alias is mostly made available for internal use, and + only includes the NumPy type. +""" -Point2D_Array: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,2)` An Array of Points in 2D Space `[[float, float], ...]`. +Point3D: TypeAlias = Union[InternalPoint3D, tuple[float, float, float]] +"""``shape: (3,)`` -(Please refer to the documentation of the function you are using for further type Information) +A 3-dimensional point: ``[float, float, float]``. """ 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], ...]``. + +.. 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. """ -Point3D_Array: TypeAlias = Union[ - InternalPoint3D_Array, Tuple[Tuple[float, float, float], ...] + +""" +[CATEGORY] +Vector types +""" + +Vector2D: TypeAlias = Point2D +"""``shape: (2,)`` + +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 `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 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 `Vector3D` objects: ``[[float, float, float], ...]``. +""" + +VectorND: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] +"""``shape (N,)`` + +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 = Union[npt.NDArray[PointDType], tuple[VectorND, ...]] +"""``shape (M, N)`` + +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], ...]``. +""" + + +""" +[CATEGORY] +Matrix types +""" + +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))``. +""" + + +""" +[CATEGORY] +Bézier types +""" + +QuadraticBezierPoints: TypeAlias = Union[ + npt.NDArray[PointDType], tuple[Point3D, Point3D, Point3D] ] -""" `shape: (N,3)` An Array of Points in 3D Space `[[float, float, float], ...]`. +"""``shape: (3, 3)`` -(Please refer to the documentation of the function you are using for further type Information) +A `Point3D_Array` of 3 control points for a single quadratic Bézier +curve: +``[[float, float, float], [float, float, float], [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) +QuadraticBezierPoints_Array: TypeAlias = Union[ + npt.NDArray[PointDType], tuple[QuadraticBezierPoints, ...] +] +"""``shape: (N, 3, 3)`` + +An array of :math:`N` `QuadraticBezierPoints` objects: +``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. """ -# Vector Types -Vector3: TypeAlias = npt.NDArray[PointDType] -""" `shape: (3,)` A Vector `[float, float, float]`. """ +QuadraticBezierPath: TypeAlias = Point3D_Array +"""``shape: (3*N, 3)`` -Vector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,)` A Vector `[float, ...]`. """ +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], ...], ...]``. -RowVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (1,N)` A Row Vector `[[float, ...]]`. """ +Please refer to the documentation of the function you are using for +further type information. +""" -ColVector: TypeAlias = npt.NDArray[PointDType] -""" `shape: (N,1)` A Column Vector `[[float], [float], ...]`. """ +QuadraticSpline: TypeAlias = QuadraticBezierPath +"""``shape: (3*N, 3)`` -MatrixMN: TypeAlias = npt.NDArray[PointDType] -""" `shape: (M,N)` A Matrix `[[float, ...], [float, ...], ...]`. """ +A special case of `QuadraticBezierPath` where all the :math:`N` +quadratic Bézier curves are connected, forming a quadratic spline: +``[[float, float, float], ...], ...]``. -Zeros: TypeAlias = npt.NDArray[ManimFloat] -"""A Matrix of Zeros. Typically created with `numpy.zeros((M,N))`""" +Please refer to the documentation of the function you are using for +further type information. +""" -# 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.""" +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]]``. +""" + +CubicBezierPoints_Array: TypeAlias = Union[ + npt.NDArray[PointDType], tuple[CubicBezierPoints, ...] +] +"""``shape: (N, 4, 3)`` + +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 :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 :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 +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, ...]] +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 +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. +""" + +Spline: TypeAlias = BezierPath +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: (3*PPC*N,)`` + +A flattened array of Bézier control points: +``[float, ...]``. +""" + + +""" +[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] +"""Function type returning an :class:`~.Animation` for the specified +:class:`~.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: TypeAlias = np.ndarray -"""An Image""" -StrPath: TypeAlias = "str | PathLike[str]" -StrOrBytesPath: TypeAlias = "str | bytes | PathLike[str] | PathLike[bytes]" +""" +[CATEGORY] +Image types +""" + +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 +`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. +""" + +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. +""" + + +""" +[CATEGORY] +Path types +""" + +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. +""" 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 042ed7555d..f4c2e94593 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) @@ -729,14 +728,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""" +"""`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/__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 new file mode 100644 index 0000000000..6dd645a9fd --- /dev/null +++ b/manim/utils/docbuild/autoaliasattr_directive.py @@ -0,0 +1,197 @@ +"""A directive for documenting type aliases and other module-level attributes.""" + +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 + from typing_extensions import TypeAlias + +__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 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) + + +class AliasAttrDocumenter(Directive): + """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) + + 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 + + # 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 + + # 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(): + # 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 + unparsed = ViewList( + [ + f".. class:: {alias_name}", + "", + " .. parsed-literal::", + "", + 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"] + for A in ALIAS_LIST: + alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") + + # 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 + # 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 + + return [content] diff --git a/manim/utils/docbuild/autocolor_directive.py b/manim/utils/docbuild/autocolor_directive.py index cdd906f164..37c63efb29 100644 --- a/manim/utils/docbuild/autocolor_directive.py +++ b/manim/utils/docbuild/autocolor_directive.py @@ -1,13 +1,20 @@ +"""A directive for documenting colors in Manim.""" + 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"] + def setup(app: Sphinx) -> None: app.add_directive("automanimcolormodule", ManimColorModuleDocumenter) @@ -21,9 +28,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/manim_directive.py b/manim/utils/docbuild/manim_directive.py index ebd4b09acf..9ed5d0566c 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,7 +98,13 @@ def construct(self): from manim import QUALITIES from manim import __version__ as manim_version -classnamedict = {} +if TYPE_CHECKING: + from sphinx.application import Sphinx + +__all__ = ["ManimDirective"] + + +classnamedict: dict[str, int] = {} class SkipManimNode(nodes.Admonition, nodes.Element): @@ -110,13 +117,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 +169,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 +348,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 +359,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 +388,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 new file mode 100644 index 0000000000..46c31d41d0 --- /dev/null +++ b/manim/utils/docbuild/module_parsing.py @@ -0,0 +1,163 @@ +"""Read and parse all the Manim modules and extract documentation from them.""" + +from __future__ import annotations + +import ast +from pathlib import Path + +from typing_extensions import TypeAlias + +__all__ = ["parse_module_attributes"] + + +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, 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. +""" + +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 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 + ------- + ALIAS_DOCS_DICT : `AliasDocsDict` + A dictionary containing the information from all the type + aliases in Manim. See `AliasDocsDict` for more information. + + 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 + + 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(encoding="utf-8") + + # For storing TypeAliases + module_dict: ModuleLevelAliasDict = {} + category_dict: AliasCategoryDict | None = None + alias_info: AliasInfo | 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(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() + module_dict[category_name] = {} + category_dict = module_dict[category_name] + alias_info = None + # or a docstring of the alias defined before + elif alias_info: + alias_info["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) + + definition = definition.replace("npt.", "") + if category_dict is None: + module_dict[""] = {} + category_dict = module_dict[""] + category_dict[alias_name] = {"definition": definition} + alias_info = category_dict[alias_name] + continue + + # If here, the node is not a TypeAlias definition + alias_info = None + + # 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: + 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/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/space_ops.py b/manim/utils/space_ops.py index 60bfd0e894..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, Vector, Vector3 +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,22 +57,11 @@ ] -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) -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], @@ -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: @@ -369,7 +377,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,8 +662,9 @@ def shoelace_direction(x_y: np.ndarray) -> str: def cross2d( - a: Sequence[Vector] | Vector, b: Sequence[Vector] | Vector -) -> Sequence[float] | float: + a: Vector2D | Vector2D_Array, + b: Vector2D | Vector2D_Array, +) -> ManimFloat | npt.NDArray[ManimFloat]: """Compute the determinant(s) of the passed vector (sequences). 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 + +""" 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/poetry.lock b/poetry.lock index e89abe7707..1c554dc1fe 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 = false +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"] @@ -47,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"}, @@ -67,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"}, @@ -104,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"}, @@ -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)"] @@ -261,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"}, @@ -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] @@ -708,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]] @@ -842,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"}, @@ -868,24 +863,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]] @@ -934,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"}, @@ -978,13 +973,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,59 +1096,59 @@ flake8 = ">=3.7" [[package]] name = "fonttools" -version = "4.45.1" +version = "4.47.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.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"] @@ -1168,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"}, @@ -1177,19 +1172,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 +1295,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 +1331,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] @@ -1456,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"}, @@ -1468,20 +1463,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" @@ -1551,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"}, @@ -1562,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"}, @@ -1591,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"}, @@ -1605,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"}, @@ -1626,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] @@ -1648,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"}, @@ -1686,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] @@ -1722,13 +1714,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 = false +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 +1728,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" @@ -1775,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"}, @@ -2030,13 +2022,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] @@ -2049,7 +2041,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]] @@ -2197,21 +2189,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]] @@ -2229,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"}, @@ -2309,35 +2301,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" @@ -2363,35 +2351,35 @@ 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" 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"}, @@ -2411,13 +2399,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.11.0" +version = "7.13.0" description = "Converting Jupyter Notebooks" -optional = false +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.13.0-py3-none-any.whl", hash = "sha256:22521cfcc10ba5755e44acb6a70d2bd8a891ce7aed6746481e10cd548b169e19"}, + {file = "nbconvert-7.13.0.tar.gz", hash = "sha256:c6f61c86fca5b28bd17f4f9a308248e59fa2b54919e1589f6cc3575c5dfec2bd"}, ] [package.dependencies] @@ -2444,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"}, @@ -2600,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"}, @@ -2622,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"}, @@ -2646,13 +2634,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]] @@ -2671,65 +2659,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] @@ -2738,13 +2726,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] @@ -2768,13 +2756,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] @@ -2788,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"}, @@ -2800,13 +2788,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] @@ -2814,27 +2802,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] @@ -2869,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"}, @@ -3008,13 +2996,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]] @@ -3080,38 +3068,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" @@ -3236,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"}, @@ -3247,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"}, @@ -3270,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"}, @@ -3342,104 +3330,104 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.1" +version = "25.1.2" description = "Python bindings for 0MQ" -optional = false +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] @@ -3447,13 +3435,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.31.1" +version = "0.32.0" description = "JSON Referencing + Python" -optional = false +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] @@ -3498,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"}, @@ -3512,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"}, @@ -3539,110 +3527,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.13.2" +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.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.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]] @@ -3706,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"}, @@ -3811,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"}, @@ -3842,38 +3830,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" @@ -3912,45 +3900,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"] @@ -3985,43 +3982,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] @@ -4071,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"}, @@ -4092,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"}, @@ -4121,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"}, @@ -4161,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"}, @@ -4224,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"}, @@ -4244,20 +4247,20 @@ 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]] 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"}, @@ -4357,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"}, @@ -4372,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"}, @@ -4381,13 +4384,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 = false +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] @@ -4496,4 +4499,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "2bf6de26bc264eac94f604bcce74a2cbe0b6de7ffc48238e8e25bb1136e58dde" +content-hash = "f15fa632919381a9b5b2cebc3e89aa307fa8735db2e5cde7a408765b46a3b00f" 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" 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 286f366a3584ae84d29d13c2a2c1f70b43752f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Sat, 30 Dec 2023 00:22:24 +0100 Subject: [PATCH 11/77] Improve documentation section about contributing to docs (#3555) * Improve section in docs about contributing to docs * Add note about doc build command depending on the OS * Improve section in docs about contributing to docs * Add note about doc build command depending on the OS * Fix wrong toctree path in docs/source/contributing/docs.rst --- docs/source/contributing.rst | 8 +- docs/source/contributing/development.rst | 5 +- docs/source/contributing/docs.rst | 83 +++++++++++++++++++ .../contributing/{ => docs}/admonitions.rst | 0 .../contributing/{ => docs}/docstrings.rst | 0 .../contributing/{ => docs}/examples.rst | 0 .../contributing/{ => docs}/references.rst | 0 .../contributing/{ => docs}/typings.rst | 0 manim/utils/docbuild/__init__.py | 6 +- 9 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 docs/source/contributing/docs.rst rename docs/source/contributing/{ => docs}/admonitions.rst (100%) rename docs/source/contributing/{ => docs}/docstrings.rst (100%) rename docs/source/contributing/{ => docs}/examples.rst (100%) rename docs/source/contributing/{ => docs}/references.rst (100%) rename docs/source/contributing/{ => docs}/typings.rst (100%) diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index a9f7037d28..d472985721 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -38,14 +38,10 @@ To get an overview of what our community is currently working on, check out Contributing can be confusing, so here are a few guides: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 contributing/development - contributing/docstrings - contributing/references - contributing/examples - contributing/typings - contributing/admonitions + contributing/docs contributing/testing contributing/performance contributing/internationalization diff --git a/docs/source/contributing/development.rst b/docs/source/contributing/development.rst index b41592716d..03de21642d 100644 --- a/docs/source/contributing/development.rst +++ b/docs/source/contributing/development.rst @@ -147,7 +147,7 @@ Develop your contribution Update the docstrings (the text in triple quotation marks) of any functions or classes you change and include them with any new functions you add. - See the :doc:`documentation guide ` for more information about how we + See the :doc:`documentation guide ` for more information about how we prefer our code to be documented. The content of the docstrings will be rendered in the :doc:`reference manual <../reference>`. @@ -245,7 +245,8 @@ sticks to our coding conventions. a look at the built HTML files to see whether the formatting of the documentation you added looks as you intended. You can build the documentation locally by running ``make html`` from the ``docs`` directory. Make sure you have `Graphviz `_ - installed locally in order to build the inheritance diagrams. + installed locally in order to build the inheritance diagrams. See :doc:`docs` for + more information. Finally, if the pipeline passes and you are satisfied with your changes: wait for feedback and iterate over any requested changes. You will likely be asked to diff --git a/docs/source/contributing/docs.rst b/docs/source/contributing/docs.rst new file mode 100644 index 0000000000..a8bb61c535 --- /dev/null +++ b/docs/source/contributing/docs.rst @@ -0,0 +1,83 @@ +==================== +Adding Documentation +==================== + +Building the documentation +-------------------------- + +When you clone the Manim repository from GitHub, you can access the +``docs/`` folder which contains the necessary files to build the +documentation. + +To build the docs locally, open a CLI, enter the ``docs/`` folder with the +``cd`` command and execute the following depending on your OS: + +- Windows: ``./make.bat html`` +- macOS and Linux: ``make html`` + +The first time you build the docs, the process will take several +minutes because it needs to generate all the ``.rst`` (reST: +reStructured Text) files from scratch by reading and parsing all the +Manim content. The process becomes much shorter the next time, as it +rebuilds only the parts which have changed. + + +Sphinx library and extensions +----------------------------- + +Manim uses `Sphinx `_ for building the +docs. It also makes use of Sphinx extensions such as: + +- `Autodoc: `_ + imports Manim's Python source code, extracts its docstrings and + generates documentation from them. +- `Autosummary: `_ + a complement to Autodoc which adds a special directive ``autosummary``, + used in Manim to automatically document classes, methods, + attributes, functions, module-level variables and exceptions. + Autosummary makes use of `Jinja templates `_, + which Manim defines for autosummarizing classes and modules + inside ``docs/source/_templates/``. +- `Graphviz extension for Sphinx: `_ + embeds graphs generated by the `Graphviz `_ + module, which must be installed in order to render the + inheritance diagrams in the :doc:`/reference`. +- `Napoleon: `_ + enables Sphinx to read Google style docstrings and, in + particular for Manim, `NumPy style docstrings `_ + - see :doc:`docs/docstrings` for more information. + + +Sphinx theme +------------ + +The theme used for this website is `Furo `_. + + +Custom Sphinx directives +------------------------ + +Manim implements **custom directives** for use with Autodoc and Autosummary, which +are defined in :mod:`~.docbuild`: + +.. currentmodule:: manim.utils.docbuild + +.. autosummary:: + + :toctree: ../reference + autoaliasattr_directive + autocolor_directive + manim_directive + + +Index +----- + +.. toctree:: + :maxdepth: 2 + + docs/admonitions + docs/docstrings + docs/examples + docs/references + docs/typings diff --git a/docs/source/contributing/admonitions.rst b/docs/source/contributing/docs/admonitions.rst similarity index 100% rename from docs/source/contributing/admonitions.rst rename to docs/source/contributing/docs/admonitions.rst diff --git a/docs/source/contributing/docstrings.rst b/docs/source/contributing/docs/docstrings.rst similarity index 100% rename from docs/source/contributing/docstrings.rst rename to docs/source/contributing/docs/docstrings.rst diff --git a/docs/source/contributing/examples.rst b/docs/source/contributing/docs/examples.rst similarity index 100% rename from docs/source/contributing/examples.rst rename to docs/source/contributing/docs/examples.rst diff --git a/docs/source/contributing/references.rst b/docs/source/contributing/docs/references.rst similarity index 100% rename from docs/source/contributing/references.rst rename to docs/source/contributing/docs/references.rst diff --git a/docs/source/contributing/typings.rst b/docs/source/contributing/docs/typings.rst similarity index 100% rename from docs/source/contributing/typings.rst rename to docs/source/contributing/docs/typings.rst diff --git a/manim/utils/docbuild/__init__.py b/manim/utils/docbuild/__init__.py index 967f615495..dee15b8283 100644 --- a/manim/utils/docbuild/__init__.py +++ b/manim/utils/docbuild/__init__.py @@ -4,11 +4,7 @@ - :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` +- :doc:`/contributing/docs` .. autosummary:: :toctree: ../reference From 3b496ea2e6f1a6ab7829398590b41e17bfbd34c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Volhejn?= <8401624+vvolhejn@users.noreply.github.com> Date: Wed, 3 Jan 2024 00:30:53 +0100 Subject: [PATCH 12/77] Add helpful hints to `VGroup.add()` error message (#3561) * Improve VGroup creation error message * Use .__name__ for the type Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> --- manim/mobject/types/vectorized_mobject.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index ac9058ddd9..8312b74459 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -2003,8 +2003,14 @@ def construct(self): (gr-circle_red).animate.shift(RIGHT) ) """ - if not all(isinstance(m, (VMobject, OpenGLVMobject)) for m in vmobjects): - raise TypeError("All submobjects must be of type VMobject") + for m in vmobjects: + if not isinstance(m, (VMobject, OpenGLVMobject)): + raise TypeError( + f"All submobjects of {self.__class__.__name__} must be of type VMobject. " + f"Got {repr(m)} ({type(m).__name__}) instead. " + "You can try using `Group` instead." + ) + return super().add(*vmobjects) def __add__(self, vmobject: VMobject) -> Self: From 4e3cfd207a16458b8781c10b88405657f44913ac Mon Sep 17 00:00:00 2001 From: Hydromel Victor Doledji Date: Thu, 11 Jan 2024 13:23:49 +0000 Subject: [PATCH 13/77] exception add if new_rings is none (#3574) * exception add if new_rings is none * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/utils/space_ops.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index 973502aafc..3e90deef21 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -755,9 +755,14 @@ def earclip_triangulation(verts: np.ndarray, ring_ends: list) -> list: # Move the ring which j belongs to from the # attached list to the detached list - new_ring = next(filter(lambda ring: ring[0] <= j < ring[-1], detached_rings)) - detached_rings.remove(new_ring) - attached_rings.append(new_ring) + new_ring = next( + (ring for ring in detached_rings if ring[0] <= j < ring[-1]), None + ) + if new_ring is not None: + detached_rings.remove(new_ring) + attached_rings.append(new_ring) + else: + raise Exception("Could not find a ring to attach") # Setup linked list after = [] From 9a84ec6a45f2ff4254d2243116f84bac074db551 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Sat, 13 Jan 2024 12:39:40 -0500 Subject: [PATCH 14/77] Fix typing of `Animation` (#3568) --- manim/animation/animation.py | 4 +++- manim/typing.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/manim/animation/animation.py b/manim/animation/animation.py index cb8fcaddfe..90290eee3e 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -18,6 +18,8 @@ from copy import deepcopy from typing import TYPE_CHECKING, Callable, Iterable, Sequence +from typing_extensions import Self + if TYPE_CHECKING: from manim.scene.scene import Scene @@ -112,7 +114,7 @@ def __new__( *args, use_override=True, **kwargs, - ): + ) -> Self: if isinstance(mobject, Mobject) and use_override: func = mobject.animation_override_for(cls) if func is not None: diff --git a/manim/typing.py b/manim/typing.py index a6c3e2e1d5..6f16bad905 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -561,7 +561,9 @@ # 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] +# Nor are we able to specify the return type (Animation) since we cannot import +# that here. +FunctionOverride: TypeAlias = Callable """Function type returning an :class:`~.Animation` for the specified :class:`~.Mobject`. """ From a57fb69f680046254584ca1e96c644070b501f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Mon, 15 Jan 2024 19:07:50 +0100 Subject: [PATCH 15/77] Add 'to be used in the future' TODOs to ManimFrame (#3553) --- manim/_config/__init__.py | 2 ++ manim/_config/utils.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/manim/_config/__init__.py b/manim/_config/__init__.py index d0b91e56d2..4f0bef5179 100644 --- a/manim/_config/__init__.py +++ b/manim/_config/__init__.py @@ -36,6 +36,8 @@ logging.getLogger("matplotlib").setLevel(logging.INFO) config = ManimConfig().digest_parser(parser) +# TODO: to be used in the future - see PR #620 +# https://github.com/ManimCommunity/manim/pull/620 frame = ManimFrame(config) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index f4eeda69a7..be9eb113aa 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -1793,6 +1793,8 @@ def plugins(self, value: list[str]): self._d["plugins"] = value +# TODO: to be used in the future - see PR #620 +# https://github.com/ManimCommunity/manim/pull/620 class ManimFrame(Mapping): _OPTS: ClassVar[set[str]] = { "pixel_width", From 68bd79093e1ebc1ed9f8051942ffe6e72a9e66a7 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Mon, 15 Jan 2024 19:39:03 +0100 Subject: [PATCH 16/77] Refactor `TexTemplate` (#3520) * Refactor `TexTemplate` * Add tests, refactor some things * Fixed Some tests * Move typing imports * Fix remaining tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: JasonGrace2282 Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/_config/utils.py | 12 +- manim/utils/tex.py | 320 +++++++----------- .../logs_data/bad_tex_scene_BadTex.txt | 4 +- tests/module/mobject/text/test_texmobject.py | 20 +- tests/module/utils/test_tex.py | 118 +++++++ tests/opengl/test_texmobject_opengl.py | 6 +- 6 files changed, 263 insertions(+), 217 deletions(-) create mode 100644 tests/module/utils/test_tex.py diff --git a/manim/_config/utils.py b/manim/_config/utils.py index be9eb113aa..814db08a3e 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -28,7 +28,7 @@ from manim import constants from manim.constants import RendererType from manim.utils.color import ManimColor -from manim.utils.tex import TexTemplate, TexTemplateFromFile +from manim.utils.tex import TexTemplate if TYPE_CHECKING: from enum import EnumMeta @@ -833,7 +833,7 @@ def digest_args(self, args: argparse.Namespace) -> Self: # Handle --tex_template if args.tex_template: - self.tex_template = TexTemplateFromFile(tex_filename=args.tex_template) + self.tex_template = TexTemplate.from_file(args.tex_template) if ( self.renderer == RendererType.OPENGL @@ -1756,19 +1756,19 @@ def tex_template(self) -> TexTemplate: if not hasattr(self, "_tex_template") or not self._tex_template: fn = self._d["tex_template_file"] if fn: - self._tex_template = TexTemplateFromFile(tex_filename=fn) + self._tex_template = TexTemplate.from_file(fn) else: self._tex_template = TexTemplate() return self._tex_template @tex_template.setter - def tex_template(self, val: TexTemplateFromFile | TexTemplate) -> None: - if isinstance(val, (TexTemplateFromFile, TexTemplate)): + def tex_template(self, val: TexTemplate) -> None: + if isinstance(val, TexTemplate): self._tex_template = val @property def tex_template_file(self) -> Path: - """File to read Tex template from (no flag). See :class:`.TexTemplateFromFile`.""" + """File to read Tex template from (no flag). See :class:`.TexTemplate`.""" return self._d["tex_template_file"] @tex_template_file.setter diff --git a/manim/utils/tex.py b/manim/utils/tex.py index cd0944dcdc..f642abad72 100644 --- a/manim/utils/tex.py +++ b/manim/utils/tex.py @@ -4,162 +4,132 @@ __all__ = [ "TexTemplate", - "TexTemplateFromFile", ] import copy -import os import re +import warnings +from dataclasses import dataclass, field from pathlib import Path +from typing import TYPE_CHECKING, Any +if TYPE_CHECKING: + from typing_extensions import Self -class TexTemplate: - """TeX templates are used for creating Tex() and MathTex() objects. - - Parameters - ---------- - tex_compiler - The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex`` - output_format - The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf`` - documentclass - The command defining the documentclass, e.g. ``\\documentclass[preview]{standalone}`` - preamble - The document's preamble, i.e. the part between ``\\documentclass`` and ``\\begin{document}`` - placeholder_text - Text in the document that will be replaced by the expression to be rendered - post_doc_commands - Text (definitions, commands) to be inserted at right after ``\\begin{document}``, e.g. ``\\boldmath`` - - Attributes - ---------- - tex_compiler : :class:`str` - The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex`` - output_format : :class:`str` - The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf`` - documentclass : :class:`str` - The command defining the documentclass, e.g. ``\\documentclass[preview]{standalone}`` - preamble : :class:`str` - The document's preamble, i.e. the part between ``\\documentclass`` and ``\\begin{document}`` - placeholder_text : :class:`str` - Text in the document that will be replaced by the expression to be rendered - post_doc_commands : :class:`str` - Text (definitions, commands) to be inserted at right after ``\\begin{document}``, e.g. ``\\boldmath`` - """ + from manim.typing import StrPath - default_documentclass = r"\documentclass[preview]{standalone}" - default_preamble = r""" -\usepackage[english]{babel} +_DEFAULT_PREAMBLE = r"""\usepackage[english]{babel} \usepackage{amsmath} -\usepackage{amssymb} -""" - default_placeholder_text = "YourTextHere" - default_tex_compiler = "latex" - default_output_format = ".dvi" - default_post_doc_commands = "" - - def __init__( - self, - tex_compiler: str | None = None, - output_format: str | None = None, - documentclass: str | None = None, - preamble: str | None = None, - placeholder_text: str | None = None, - post_doc_commands: str | None = None, - **kwargs, - ): - self.tex_compiler = ( - tex_compiler - if tex_compiler is not None - else TexTemplate.default_tex_compiler - ) - self.output_format = ( - output_format - if output_format is not None - else TexTemplate.default_output_format - ) - self.documentclass = ( - documentclass - if documentclass is not None - else TexTemplate.default_documentclass - ) - self.preamble = ( - preamble if preamble is not None else TexTemplate.default_preamble - ) - self.placeholder_text = ( - placeholder_text - if placeholder_text is not None - else TexTemplate.default_placeholder_text - ) - self.post_doc_commands = ( - post_doc_commands - if post_doc_commands is not None - else TexTemplate.default_post_doc_commands - ) - self._rebuild() - - def __eq__(self, other: TexTemplate) -> bool: - return ( - self.body == other.body - and self.tex_compiler == other.tex_compiler - and self.output_format == other.output_format - and self.post_doc_commands == other.post_doc_commands - ) +\usepackage{amssymb}""" + +_BEGIN_DOCUMENT = r"\begin{document}" +_END_DOCUMENT = r"\end{document}" + - def _rebuild(self): - """Rebuilds the entire TeX template text from ``\\documentclass`` to ``\\end{document}`` according to all settings and choices.""" - self.body = ( - self.documentclass - + "\n" - + self.preamble - + "\n" - + r"\begin{document}" - + "\n" - + self.post_doc_commands - + "\n" - + self.placeholder_text - + "\n" - + "\n" - + r"\end{document}" - + "\n" +@dataclass(eq=True) +class TexTemplate: + """TeX templates are used to create ``Tex`` and ``MathTex`` objects.""" + + _body: str = field(default="", init=False) + """A custom body, can be set from a file.""" + + tex_compiler: str = "latex" + """The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex``.""" + + output_format: str = ".dvi" + """The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf``.""" + + documentclass: str = r"\documentclass[preview]{standalone}" + r"""The command defining the documentclass, e.g. ``\documentclass[preview]{standalone}``.""" + + preamble: str = _DEFAULT_PREAMBLE + r"""The document's preamble, i.e. the part between ``\documentclass`` and ``\begin{document}``.""" + + placeholder_text: str = "YourTextHere" + """Text in the document that will be replaced by the expression to be rendered.""" + + post_doc_commands: str = "" + r"""Text (definitions, commands) to be inserted at right after ``\begin{document}``, e.g. ``\boldmath``.""" + + @property + def body(self) -> str: + """The entire TeX template.""" + return self._body or "\n".join( + filter( + None, + [ + self.documentclass, + self.preamble, + _BEGIN_DOCUMENT, + self.post_doc_commands, + self.placeholder_text, + _END_DOCUMENT, + ], + ) ) - def add_to_preamble(self, txt: str, prepend: bool = False): - """Adds stuff to the TeX template's preamble (e.g. definitions, packages). Text can be inserted at the beginning or at the end of the preamble. + @body.setter + def body(self, value: str) -> None: + self._body = value + + @classmethod + def from_file(cls, file: StrPath = "tex_template.tex", **kwargs: Any) -> Self: + """Create an instance by reading the content of a file. + + Using the ``add_to_preamble`` and ``add_to_document`` methods on this instance + will have no effect, as the body is read from the file. + """ + instance = cls(**kwargs) + instance.body = Path(file).read_text(encoding="utf-8") + return instance + + def add_to_preamble(self, txt: str, prepend: bool = False) -> Self: + r"""Adds text to the TeX template's preamble (e.g. definitions, packages). Text can be inserted at the beginning or at the end of the preamble. Parameters ---------- txt - String containing the text to be added, e.g. ``\\usepackage{hyperref}`` + String containing the text to be added, e.g. ``\usepackage{hyperref}``. prepend - Whether the text should be added at the beginning of the preamble, i.e. right after ``\\documentclass``. Default is to add it at the end of the preamble, i.e. right before ``\\begin{document}`` + Whether the text should be added at the beginning of the preamble, i.e. right after ``\documentclass``. + Default is to add it at the end of the preamble, i.e. right before ``\begin{document}``. """ + if self._body: + warnings.warn( + "This TeX template was created with a fixed body, trying to add text the preamble will have no effect.", + UserWarning, + stacklevel=2, + ) if prepend: self.preamble = txt + "\n" + self.preamble else: self.preamble += "\n" + txt - self._rebuild() return self - def add_to_document(self, txt: str): - """Adds txt to the TeX template just after \\begin{document}, e.g. ``\\boldmath`` + def add_to_document(self, txt: str) -> Self: + r"""Adds text to the TeX template just after \begin{document}, e.g. ``\boldmath``. Parameters ---------- txt String containing the text to be added. """ - self.post_doc_commands += "\n" + txt + "\n" - self._rebuild() + if self._body: + warnings.warn( + "This TeX template was created with a fixed body, trying to add text the document will have no effect.", + UserWarning, + stacklevel=2, + ) + self.post_doc_commands += txt return self - def get_texcode_for_expression(self, expression: str): - """Inserts expression verbatim into TeX template. + def get_texcode_for_expression(self, expression: str) -> str: + r"""Inserts expression verbatim into TeX template. Parameters ---------- expression - The string containing the expression to be typeset, e.g. ``$\\sqrt{2}$`` + The string containing the expression to be typeset, e.g. ``$\sqrt{2}$`` Returns ------- @@ -168,102 +138,60 @@ def get_texcode_for_expression(self, expression: str): """ return self.body.replace(self.placeholder_text, expression) - def _texcode_for_environment(self, environment: str): - """Processes the tex_environment string to return the correct ``\\begin{environment}[extra]{extra}`` and - ``\\end{environment}`` strings - - Parameters - ---------- - environment - The tex_environment as a string. Acceptable formats include: - ``{align*}``, ``align*``, ``{tabular}[t]{cccl}``, ``tabular}{cccl``, ``\\begin{tabular}[t]{cccl}``. - - Returns - ------- - Tuple[:class:`str`, :class:`str`] - A pair of strings representing the opening and closing of the tex environment, e.g. - ``\\begin{tabular}{cccl}`` and ``\\end{tabular}`` - """ - - # If the environment starts with \begin, remove it - if environment[0:6] == r"\begin": - environment = environment[6:] - - # If environment begins with { strip it - if environment[0] == r"{": - environment = environment[1:] - - # The \begin command takes everything and closes with a brace - begin = r"\begin{" + environment - if ( - begin[-1] != r"}" and begin[-1] != r"]" - ): # If it doesn't end on } or ], assume missing } - begin += r"}" - - # While the \end command terminates at the first closing brace - split_at_brace = re.split(r"}", environment, 1) - end = r"\end{" + split_at_brace[0] + r"}" - - return begin, end - - def get_texcode_for_expression_in_env(self, expression: str, environment: str): - r"""Inserts expression into TeX template wrapped in \begin{environment} and \end{environment} + def get_texcode_for_expression_in_env( + self, expression: str, environment: str + ) -> str: + r"""Inserts expression into TeX template wrapped in ``\begin{environment}`` and ``\end{environment}``. Parameters ---------- expression - The string containing the expression to be typeset, e.g. ``$\\sqrt{2}$`` + The string containing the expression to be typeset, e.g. ``$\sqrt{2}$``. environment - The string containing the environment in which the expression should be typeset, e.g. ``align*`` + The string containing the environment in which the expression should be typeset, e.g. ``align*``. Returns ------- :class:`str` LaTeX code based on template, containing the given expression inside its environment, ready for typesetting """ - begin, end = self._texcode_for_environment(environment) - return self.body.replace(self.placeholder_text, f"{begin}\n{expression}\n{end}") + begin, end = _texcode_for_environment(environment) + return self.body.replace( + self.placeholder_text, "\n".join([begin, expression, end]) + ) - def copy(self) -> TexTemplate: + def copy(self) -> Self: + """Create a deep copy of the TeX template instance.""" return copy.deepcopy(self) -class TexTemplateFromFile(TexTemplate): - """A TexTemplate object created from a template file (default: tex_template.tex) +def _texcode_for_environment(environment: str) -> tuple[str, str]: + r"""Processes the tex_environment string to return the correct ``\begin{environment}[extra]{extra}`` and + ``\end{environment}`` strings. Parameters ---------- - tex_filename - Path to a valid TeX template file - kwargs - Arguments for :class:`~.TexTemplate`. - - Attributes - ---------- - template_file : :class:`str` - Path to a valid TeX template file - body : :class:`str` - Content of the TeX template file - tex_compiler : :class:`str` - The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex`` - output_format : :class:`str` - The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf`` + environment + The tex_environment as a string. Acceptable formats include: + ``{align*}``, ``align*``, ``{tabular}[t]{cccl}``, ``tabular}{cccl``, ``\begin{tabular}[t]{cccl}``. + + Returns + ------- + Tuple[:class:`str`, :class:`str`] + A pair of strings representing the opening and closing of the tex environment, e.g. + ``\begin{tabular}{cccl}`` and ``\end{tabular}`` """ - def __init__( - self, *, tex_filename: str | os.PathLike = "tex_template.tex", **kwargs - ): - self.template_file = Path(tex_filename) - super().__init__(**kwargs) - - def _rebuild(self): - self.body = self.template_file.read_text() + environment.removeprefix(r"\begin").removeprefix("{") - def file_not_mutable(self): - raise Exception("Cannot modify TexTemplate when using a template file.") + # The \begin command takes everything and closes with a brace + begin = r"\begin{" + environment + # If it doesn't end on } or ], assume missing } + if not begin.endswith(("}", "]")): + begin += "}" - def add_to_preamble(self, txt, prepend=False): - self.file_not_mutable() + # While the \end command terminates at the first closing brace + split_at_brace = re.split("}", environment, 1) + end = r"\end{" + split_at_brace[0] + "}" - def add_to_document(self, txt): - self.file_not_mutable() + return begin, end diff --git a/tests/control_data/logs_data/bad_tex_scene_BadTex.txt b/tests/control_data/logs_data/bad_tex_scene_BadTex.txt index 06d833f1bf..02c8813969 100644 --- a/tests/control_data/logs_data/bad_tex_scene_BadTex.txt +++ b/tests/control_data/logs_data/bad_tex_scene_BadTex.txt @@ -1,8 +1,8 @@ {"levelname": "INFO", "module": "logger_utils", "message": "Log file will be saved in <>"} {"levelname": "INFO", "module": "tex_file_writing", "message": "Writing <> to <>"} {"levelname": "ERROR", "module": "tex_file_writing", "message": "LaTeX compilation error: LaTeX Error: File `notapackage.sty' not found.\n"} -{"levelname": "ERROR", "module": "tex_file_writing", "message": "Context of error: \n\\documentclass[preview]{standalone}\n-> \\usepackage{notapackage}\n\\begin{document}\n\n\\begin{center}\n"} +{"levelname": "ERROR", "module": "tex_file_writing", "message": "Context of error: \n\\documentclass[preview]{standalone}\n-> \\usepackage{notapackage}\n\\begin{document}\n\\begin{center}\n\\frac{1}{0}\n"} {"levelname": "INFO", "module": "tex_file_writing", "message": "You do not have package notapackage.sty installed."} {"levelname": "INFO", "module": "tex_file_writing", "message": "Install notapackage.sty it using your LaTeX package manager, or check for typos."} {"levelname": "ERROR", "module": "tex_file_writing", "message": "LaTeX compilation error: Emergency stop.\n"} -{"levelname": "ERROR", "module": "tex_file_writing", "message": "Context of error: \n\\documentclass[preview]{standalone}\n-> \\usepackage{notapackage}\n\\begin{document}\n\n\\begin{center}\n"} +{"levelname": "ERROR", "module": "tex_file_writing", "message": "Context of error: \n\\documentclass[preview]{standalone}\n-> \\usepackage{notapackage}\n\\begin{document}\n\\begin{center}\n\\frac{1}{0}\n"} diff --git a/tests/module/mobject/text/test_texmobject.py b/tests/module/mobject/text/test_texmobject.py index a3cf26c355..9f487be4e8 100644 --- a/tests/module/mobject/text/test_texmobject.py +++ b/tests/module/mobject/text/test_texmobject.py @@ -12,12 +12,12 @@ def test_MathTex(): MathTex("a^2 + b^2 = c^2") - assert Path(config.media_dir, "Tex", "eb38bdba08f46c80.svg").exists() + assert Path(config.media_dir, "Tex", "e4be163a00cf424f.svg").exists() def test_SingleStringMathTex(): SingleStringMathTex("test") - assert Path(config.media_dir, "Tex", "5b2faa68ebf42d1e.svg").exists() + assert Path(config.media_dir, "Tex", "8ce17c7f5013209f.svg").exists() @pytest.mark.parametrize( # : PT006 @@ -31,7 +31,7 @@ def test_double_braces_testing(text_input, length_sub): def test_tex(): Tex("The horse does not eat cucumber salad.") - assert Path(config.media_dir, "Tex", "f2e45e6e82d750e6.svg").exists() + assert Path(config.media_dir, "Tex", "c3945e23e546c95a.svg").exists() def test_tex_temp_directory(tmpdir, monkeypatch): @@ -44,12 +44,12 @@ def test_tex_temp_directory(tmpdir, monkeypatch): with tempconfig({"media_dir": "media"}): Tex("The horse does not eat cucumber salad.") assert Path("media", "Tex").exists() - assert Path("media", "Tex", "f2e45e6e82d750e6.svg").exists() + assert Path("media", "Tex", "c3945e23e546c95a.svg").exists() def test_percent_char_rendering(): Tex(r"\%") - assert Path(config.media_dir, "Tex", "3f48edf8ebaf82c8.tex").exists() + assert Path(config.media_dir, "Tex", "4a583af4d19a3adf.tex").exists() def test_tex_whitespace_arg(): @@ -219,10 +219,10 @@ def test_tex_garbage_collection(tmpdir, monkeypatch): Path(tmpdir, "media").mkdir() with tempconfig({"media_dir": "media"}): - tex_without_log = Tex("Hello World!") # f7bc61042256dea9.tex - assert Path("media", "Tex", "f7bc61042256dea9.tex").exists() - assert not Path("media", "Tex", "f7bc61042256dea9.log").exists() + tex_without_log = Tex("Hello World!") # d771330b76d29ffb.tex + assert Path("media", "Tex", "d771330b76d29ffb.tex").exists() + assert not Path("media", "Tex", "d771330b76d29ffb.log").exists() with tempconfig({"media_dir": "media", "no_latex_cleanup": True}): - tex_with_log = Tex("Hello World, again!") # 3ef79eaaa2d0b15b.tex - assert Path("media", "Tex", "3ef79eaaa2d0b15b.log").exists() + tex_with_log = Tex("Hello World, again!") # da27670a37b08799.tex + assert Path("media", "Tex", "da27670a37b08799.log").exists() diff --git a/tests/module/utils/test_tex.py b/tests/module/utils/test_tex.py new file mode 100644 index 0000000000..51666168e0 --- /dev/null +++ b/tests/module/utils/test_tex.py @@ -0,0 +1,118 @@ +import pytest + +from manim.utils.tex import TexTemplate + +DEFAULT_BODY = r"""\documentclass[preview]{standalone} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\begin{document} +YourTextHere +\end{document}""" + +BODY_WITH_ADDED_PREAMBLE = r"""\documentclass[preview]{standalone} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{testpackage} +\begin{document} +YourTextHere +\end{document}""" + +BODY_WITH_PREPENDED_PREAMBLE = r"""\documentclass[preview]{standalone} +\usepackage{testpackage} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\begin{document} +YourTextHere +\end{document}""" + +BODY_WITH_ADDED_DOCUMENT = r"""\documentclass[preview]{standalone} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\begin{document} +\boldmath +YourTextHere +\end{document}""" + +BODY_REPLACE = r"""\documentclass[preview]{standalone} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\begin{document} +\sqrt{2} +\end{document}""" + +BODY_REPLACE_IN_ENV = r"""\documentclass[preview]{standalone} +\usepackage[english]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\begin{document} +\begin{align} +\sqrt{2} +\end{align} +\end{document}""" + + +def test_tex_template_default_body(): + template = TexTemplate() + assert template.body == DEFAULT_BODY + + +def test_tex_template_preamble(): + template = TexTemplate() + + template.add_to_preamble(r"\usepackage{testpackage}") + assert template.body == BODY_WITH_ADDED_PREAMBLE + + +def test_tex_template_preprend_preamble(): + template = TexTemplate() + + template.add_to_preamble(r"\usepackage{testpackage}", prepend=True) + assert template.body == BODY_WITH_PREPENDED_PREAMBLE + + +def test_tex_template_document(): + template = TexTemplate() + + template.add_to_document(r"\boldmath") + assert template.body == BODY_WITH_ADDED_DOCUMENT + + +def test_tex_template_texcode_for_expression(): + template = TexTemplate() + + assert template.get_texcode_for_expression(r"\sqrt{2}") == BODY_REPLACE + + +def test_tex_template_texcode_for_expression_in_env(): + template = TexTemplate() + + assert ( + template.get_texcode_for_expression_in_env(r"\sqrt{2}", environment="align") + == BODY_REPLACE_IN_ENV + ) + + +def test_tex_template_fixed_body(): + template = TexTemplate() + + # Usually set when calling `from_file` + template.body = "dummy" + + assert template.body == "dummy" + + with pytest.warns( + UserWarning, + match="This TeX template was created with a fixed body, trying to add text the preamble will have no effect.", + ): + template.add_to_preamble("dummys") + + with pytest.warns( + UserWarning, + match="This TeX template was created with a fixed body, trying to add text the document will have no effect.", + ): + template.add_to_document("dummy") diff --git a/tests/opengl/test_texmobject_opengl.py b/tests/opengl/test_texmobject_opengl.py index 392513ccbe..4fe5a76f81 100644 --- a/tests/opengl/test_texmobject_opengl.py +++ b/tests/opengl/test_texmobject_opengl.py @@ -9,12 +9,12 @@ def test_MathTex(using_opengl_renderer): MathTex("a^2 + b^2 = c^2") - assert Path(config.media_dir, "Tex", "eb38bdba08f46c80.svg").exists() + assert Path(config.media_dir, "Tex", "e4be163a00cf424f.svg").exists() def test_SingleStringMathTex(using_opengl_renderer): SingleStringMathTex("test") - assert Path(config.media_dir, "Tex", "5b2faa68ebf42d1e.svg").exists() + assert Path(config.media_dir, "Tex", "8ce17c7f5013209f.svg").exists() @pytest.mark.parametrize( # : PT006 @@ -28,7 +28,7 @@ def test_double_braces_testing(using_opengl_renderer, text_input, length_sub): def test_tex(using_opengl_renderer): Tex("The horse does not eat cucumber salad.") - assert Path(config.media_dir, "Tex", "f2e45e6e82d750e6.svg").exists() + assert Path(config.media_dir, "Tex", "c3945e23e546c95a.svg").exists() def test_tex_whitespace_arg(using_opengl_renderer): From 775482bc203762d3ebb92aed551df974366e8fd9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:21:21 +0100 Subject: [PATCH 17/77] Bump github/codeql-action from 2 to 3 (#3567) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 057d471a24..2ba46fee14 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,16 +27,16 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" From 9d880c2f800145cbd070b0d0c90158a927a5c867 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:21:47 +0100 Subject: [PATCH 18/77] Bump actions/upload-artifact from 3 to 4 (#3566) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/python-publish.yml | 2 +- .github/workflows/release-publish-documentation.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 99ae512bbb..9502d47704 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -30,7 +30,7 @@ jobs: poetry build - name: Store artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist/*.tar.gz name: manim.tar.gz diff --git a/.github/workflows/release-publish-documentation.yml b/.github/workflows/release-publish-documentation.yml index a167942db0..40f5e9df39 100644 --- a/.github/workflows/release-publish-documentation.yml +++ b/.github/workflows/release-publish-documentation.yml @@ -40,7 +40,7 @@ jobs: tar -czvf ../html-docs.tar.gz * - name: Store artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: ${{ github.workspace }}/docs/build/html-docs.tar.gz name: html-docs.tar.gz From 9289a5c68d192545d1c0297ab481347be7688d5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:22:51 +0100 Subject: [PATCH 19/77] Bump actions/setup-python from 4 to 5 (#3565) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- .github/workflows/python-publish.yml | 2 +- .github/workflows/release-publish-documentation.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e132c1f8a..52477aae02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: poetry config virtualenvs.prefer-active-python true - name: Setup Python ${{ matrix.python }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} cache: "poetry" diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 9502d47704..ebc70c8878 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v4 - name: Set up Python 3.11 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.11 diff --git a/.github/workflows/release-publish-documentation.yml b/.github/workflows/release-publish-documentation.yml index 40f5e9df39..1e2dd5ea17 100644 --- a/.github/workflows/release-publish-documentation.yml +++ b/.github/workflows/release-publish-documentation.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v4 - name: Set up Python 3.11 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.11 From 8264595e3bad5272b91d069f99d0b51d2c9014f9 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Wed, 24 Jan 2024 21:07:17 +0100 Subject: [PATCH 20/77] updated several packages (pillow, jupyterlab, notebook, jupyterlab-lsp, jinja2, gitpython) (#3593) --- poetry.lock | 1434 ++++++++++++++++++++++++++------------------------- 1 file changed, 734 insertions(+), 700 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1c554dc1fe..b5fd7d925a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] @@ -165,21 +165,22 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" @@ -197,51 +198,54 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "black" -version = "23.12.0" +version = "23.12.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, ] [package.dependencies] @@ -478,13 +482,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cloup" -version = "3.0.3" +version = "3.0.4" description = "Adds features to Click: option groups, constraints, subcommand sections and help themes." optional = false python-versions = ">=3.7" files = [ - {file = "cloup-3.0.3-py2.py3-none-any.whl", hash = "sha256:4076e2d1b4e6e54e8e0b990b79aacca3d672910b9c8b409fbd553e238b489455"}, - {file = "cloup-3.0.3.tar.gz", hash = "sha256:e5bd7789d17c0de97139ac5eb8af8c2f8d96a2d8363e8411224df625a6858d21"}, + {file = "cloup-3.0.4-py2.py3-none-any.whl", hash = "sha256:57604639a754a501ce4168faeb629e2ca523942e0ae4e180d832a953cf87ea84"}, + {file = "cloup-3.0.4.tar.gz", hash = "sha256:658111e2f49b8256a822dac5fa0205bf64109fdefc435f39923490a32b13ec09"}, ] [package.dependencies] @@ -503,13 +507,13 @@ files = [ [[package]] name = "comm" -version = "0.2.0" +version = "0.2.1" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = true python-versions = ">=3.8" files = [ - {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, - {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, ] [package.dependencies] @@ -583,63 +587,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.3" +version = "7.4.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, + {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, + {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, + {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, + {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, + {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, + {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, + {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, + {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, + {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, + {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, + {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, + {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, ] [package.dependencies] @@ -650,47 +654,56 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.7" +version = "42.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"}, - {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"}, - {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"}, - {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"}, - {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"}, - {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"}, - {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"}, - {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"}, - {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"}, - {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"}, + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"}, + {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"}, + {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"}, + {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"}, + {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"}, + {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"}, + {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"}, + {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"}, + {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"}, + {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"}, + {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"}, + {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"}, + {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"}, + {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -710,62 +723,69 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.0.7" +version = "3.0.8" 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.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"}, + {file = "Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f"}, + {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782"}, + {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd"}, + {file = "Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12"}, + {file = "Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539"}, + {file = "Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1"}, + {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b"}, + {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795"}, + {file = "Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871"}, + {file = "Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02"}, + {file = "Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717"}, + {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658"}, + {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388"}, + {file = "Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c"}, + {file = "Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a"}, + {file = "Cython-3.0.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0"}, + {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6"}, + {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93"}, + {file = "Cython-3.0.8-cp36-cp36m-win32.whl", hash = "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7"}, + {file = "Cython-3.0.8-cp36-cp36m-win_amd64.whl", hash = "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c"}, + {file = "Cython-3.0.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc"}, + {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0"}, + {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f"}, + {file = "Cython-3.0.8-cp37-cp37m-win32.whl", hash = "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434"}, + {file = "Cython-3.0.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc"}, + {file = "Cython-3.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff"}, + {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e"}, + {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae"}, + {file = "Cython-3.0.8-cp38-cp38-win32.whl", hash = "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d"}, + {file = "Cython-3.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83"}, + {file = "Cython-3.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd"}, + {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de"}, + {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39"}, + {file = "Cython-3.0.8-cp39-cp39-win32.whl", hash = "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0"}, + {file = "Cython-3.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c"}, + {file = "Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6"}, + {file = "Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6"}, ] [[package]] @@ -927,13 +947,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.19.0" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" files = [ - {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, - {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] @@ -1096,53 +1116,53 @@ flake8 = ">=3.7" [[package]] name = "fonttools" -version = "4.47.0" +version = "4.47.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, + {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, + {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, + {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, + {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, + {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, + {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, + {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, + {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, + {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, + {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, + {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, + {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, ] [package.extras] @@ -1203,20 +1223,20 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.40" +version = "3.1.41" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, - {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, + {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, + {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] [[package]] name = "glcontext" @@ -1331,13 +1351,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, - {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] @@ -1379,13 +1399,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.27.1" +version = "6.29.0" description = "IPython Kernel for Jupyter" optional = true python-versions = ">=3.8" files = [ - {file = "ipykernel-6.27.1-py3-none-any.whl", hash = "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686"}, - {file = "ipykernel-6.27.1.tar.gz", hash = "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6"}, + {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"}, + {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"}, ] [package.dependencies] @@ -1399,7 +1419,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -1408,7 +1428,7 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.2)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" @@ -1510,13 +1530,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -1552,13 +1572,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.20.0" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = true python-versions = ">=3.8" files = [ - {file = "jsonschema-4.20.0-py3-none-any.whl", hash = "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3"}, - {file = "jsonschema-4.20.0.tar.gz", hash = "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1581,13 +1601,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.11.2" +version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = true python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.11.2-py3-none-any.whl", hash = "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93"}, - {file = "jsonschema_specifications-2023.11.2.tar.gz", hash = "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] [package.dependencies] @@ -1618,13 +1638,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.1" +version = "5.7.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = true python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.1-py3-none-any.whl", hash = "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739"}, - {file = "jupyter_core-5.5.1.tar.gz", hash = "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40"}, + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, ] [package.dependencies] @@ -1663,13 +1683,13 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.1" +version = "2.2.2" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = true python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.1.tar.gz", hash = "sha256:b17fab6d70fe83c8896b0cff59237640038247c196056b43684a0902b6a9e0fb"}, - {file = "jupyter_lsp-2.2.1-py3-none-any.whl", hash = "sha256:17a689910c5e4ae5e7d334b02f31d08ffbe98108f6f658fb05e4304b4345368b"}, + {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, + {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, ] [package.dependencies] @@ -1678,13 +1698,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.12.1" +version = "2.12.5" 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.12.1-py3-none-any.whl", hash = "sha256:fd030dd7be1ca572e4598203f718df6630c12bd28a599d7f1791c4d7938e1010"}, - {file = "jupyter_server-2.12.1.tar.gz", hash = "sha256:dc77b7dcc5fc0547acba2b2844f01798008667201eea27c6319ff9257d700a6d"}, + {file = "jupyter_server-2.12.5-py3-none-any.whl", hash = "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923"}, + {file = "jupyter_server-2.12.5.tar.gz", hash = "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689"}, ] [package.dependencies] @@ -1714,13 +1734,13 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc [[package]] name = "jupyter-server-terminals" -version = "0.5.0" +version = "0.5.2" description = "A Jupyter Server Extension Providing Terminals." optional = true python-versions = ">=3.8" files = [ - {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"}, + {file = "jupyter_server_terminals-0.5.2-py3-none-any.whl", hash = "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80"}, + {file = "jupyter_server_terminals-0.5.2.tar.gz", hash = "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8"}, ] [package.dependencies] @@ -1733,13 +1753,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.0.9" +version = "4.0.11" description = "JupyterLab computational environment" optional = true python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.9-py3-none-any.whl", hash = "sha256:9f6f8e36d543fdbcc3df961a1d6a3f524b4a4001be0327a398f68fa4e534107c"}, - {file = "jupyterlab-4.0.9.tar.gz", hash = "sha256:9ebada41d52651f623c0c9f069ddb8a21d6848e4c887d8e5ddc0613166ed5c0b"}, + {file = "jupyterlab-4.0.11-py3-none-any.whl", hash = "sha256:536bf0e78723153a5016ca7efb88ed0ecd7070d3f1555d5b0e2770658f900a3c"}, + {file = "jupyterlab-4.0.11.tar.gz", hash = "sha256:d1aec24712566bc25a36229788242778e498ca4088028e2f9aa156b8b7fdc8fc"}, ] [package.dependencies] @@ -1758,7 +1778,7 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["black[jupyter] (==23.10.1)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.4)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"] docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] @@ -2046,71 +2066,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] @@ -2230,70 +2250,75 @@ files = [ [[package]] name = "moderngl" -version = "5.9.0" +version = "5.10.0" description = "ModernGL: High performance rendering for Python 3" optional = false python-versions = ">=3.7" files = [ - {file = "moderngl-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d5e496b2c735906b9d7107dd16cd96b31c4af95735235d05d60d40ae33aa464"}, - {file = "moderngl-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e118bebc7f6b060aef0d0eb15323676d28ce93b19f4383cf918399700a2b7e7d"}, - {file = "moderngl-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c889e196c87cc076c49ffb3a50ca223c30e3722ecb629e52d2dac3c32d6c3a9e"}, - {file = "moderngl-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:72a63e651e1906cb6c19b0acbe5df3df08f5dd7d4f4d36fd695a6feefcf109ca"}, - {file = "moderngl-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c26ee87eeea12f8462228b53b8715f5b205eb7c4881d978adc7e3f6abea8542"}, - {file = "moderngl-5.9.0-cp310-cp310-win32.whl", hash = "sha256:1d09f4a644315a4fa5ff65fb5ed11df77203db5b14c0bb0d7f80091cd7e11d97"}, - {file = "moderngl-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a80ec2f8aa27248d95c100ddbf58d193aef63cfcfcee8acf260a027bf305328e"}, - {file = "moderngl-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e68668aa6ea18b9e13b6394e2a979e8ea9e3f70c85988b43724c0d14ad08e7e"}, - {file = "moderngl-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7886633683cc2ca00be643778a59d42dd2711eb3ce7eb8cb43d8d494419d752f"}, - {file = "moderngl-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9e3f34d0bf4bbe91541bc6418f086d89949f138920bad882a5e895e80a670e"}, - {file = "moderngl-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6989ef1452785fe7e0c338ee40b3d19a5e0853d86a5f70adaa45e6725f757cb1"}, - {file = "moderngl-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6df002c102284c5fe5b74392473278d312e0423e47b36b67352f72f554a2ee77"}, - {file = "moderngl-5.9.0-cp311-cp311-win32.whl", hash = "sha256:f958e176c9470c87487bf68c73a5f0a904d1907ea54caa15d2650f1b8e533fd9"}, - {file = "moderngl-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:1ebcc3615d3c20be989005d172a3a74a07df36fca1c5f657afd09d2811982014"}, - {file = "moderngl-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c26beaf0e93317b1b9d2b4ae3c178a0ae0bb4c1f9b3975d2edc27c38fc4431c9"}, - {file = "moderngl-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377368f777f87ff096c6277c8f2c5100a9742cf3b7fc444c0359fee7e6a17d19"}, - {file = "moderngl-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:910007a77455e536a2670a3a50fd7ce6c9ddf3ab0bbcb0fb6735293e767bd73e"}, - {file = "moderngl-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4e4479a75a9617bf8e5126434071eb2321986b6c2b835c7a4ce22e0ff282df42"}, - {file = "moderngl-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce65d0ca1027c4e0d908ec641f6adfbe6e75580ec44c54dc7eaa0565d8720a59"}, - {file = "moderngl-5.9.0-cp312-cp312-win32.whl", hash = "sha256:d0db8fb8ac83f98738abc4592706f05d52f84c4ec3941cef88fbadafc73f36df"}, - {file = "moderngl-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4b7008993303eac0cd666191b006f6f08f681d70cd31e48b792aace914c1907f"}, - {file = "moderngl-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4864256b3b0a576710c046bb9386bc7ddd1df051677d24f63d7fa6f4fc573a09"}, - {file = "moderngl-5.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8604a85b35bb39458d97b2280ce47cbc10cd1a006f0673c29c10e24db3943d38"}, - {file = "moderngl-5.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16747119d37288ad6a9728ac67019049c087f24d4f8b7ed4ae86a6ea0960c76"}, - {file = "moderngl-5.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:73217699fbf23754dde916b78adb33273e6d863d9fe2def3367b3398f404992f"}, - {file = "moderngl-5.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:929fa7983e975bfaac80cfa281b00c99e98bae3dd853eddff916dac384d499d1"}, - {file = "moderngl-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:ec8b9acb17b66736e06e069b9b51e6a20cff40d3b746894618ea79399a89e5ac"}, - {file = "moderngl-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:59766c0fb80a1202b0299e4842a0415a7db8987e395fbffd71c14cf61680491a"}, - {file = "moderngl-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5d38c8935ee6c94002f397150f50c55ba30e4ae594a6598cb9ee36f81928b0b"}, - {file = "moderngl-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdab6c637b4d82c48ce7f1d5cf77b3ca99d3368658906d5d620ecd9092039491"}, - {file = "moderngl-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03811b00a76ae99b6689bf26a6a79e355f3c75a7235006ea664867803b78c972"}, - {file = "moderngl-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c347637ff0418610c5aec4ff1c386673043a1730e007f20e9be876a931b08e71"}, - {file = "moderngl-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bc0f45c1004b0d63b5c4018cf4be668ab6bc1bbdb514346eb5b2a78da78fc807"}, - {file = "moderngl-5.9.0-cp38-cp38-win32.whl", hash = "sha256:1969883d60f4224620c10cb741eb0865a9f2c5d40b34a22120368a98dd42aa6f"}, - {file = "moderngl-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5cdd3636a9ab2fc027d6444b80457c5306ab726acc4fa155ce83e07f34067534"}, - {file = "moderngl-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34e73e2e6074dc9067be89de051134d10e84bc85318e4d599ad89b7a0f7fee2e"}, - {file = "moderngl-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccb7580dbf4212ee0e87733762186bb41ac1bf782996a9260c100fdf13019452"}, - {file = "moderngl-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d29745a910ce04ed6a8ccbcd13f0c8700836e51c6cac03710bf994c5800035e"}, - {file = "moderngl-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cd7613bb144f687527dea89e95ffa478ec8e5fb58407de0b196265e9b6b08008"}, - {file = "moderngl-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c8a3631687b9339d4ffd8e87aab9ba7af883dd8b35e6a6517491ecaf407b4d56"}, - {file = "moderngl-5.9.0-cp39-cp39-win32.whl", hash = "sha256:bc8b02d231ab3a589496562c81fb0980c9d5f3bd9414ca86eaa20ae4f7e43f1d"}, - {file = "moderngl-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:8387b81fe3c230cd954abce08ac91186918e6d0b9681649b118b140209f5fed7"}, - {file = "moderngl-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b8ac0956f68608eb35d9ba76347352978e154d20ccb9d7d18f60797f08266e4"}, - {file = "moderngl-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64abdfda45ac6f46367cb5db7d655b7c17524553a8619a3c79dd7c7f693df521"}, - {file = "moderngl-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a2c2087c9ed204fa1f406bfcead2892180cfc20c5bce287f09d40f8704aa4f"}, - {file = "moderngl-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dace4682eda3bde9b0d180ac8af0732cacc85bc1268792248644311edfaad8fe"}, - {file = "moderngl-5.9.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3f6a54d352f206c70bf2e2de8c14410d0a88d6a0a9dc47a01b204e0ff99e86a8"}, - {file = "moderngl-5.9.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a495db3cf7cdafd700e9f56384ba4f48a801a59b2c9e803f9f9cd190748ed40"}, - {file = "moderngl-5.9.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a454031c65dabf67521762960bd58a4016dde4fb815c98525319c63583eae31"}, - {file = "moderngl-5.9.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a336a02ac2c20331fd441e70fd405bd132874984aae3e8abd44461243bad9dc0"}, - {file = "moderngl-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1f267f8cce67a590bb4686b0667d5f4899ef64eca2da775bbc1fe1288aae415"}, - {file = "moderngl-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9de46c57acf02805458fdf67ef5abd96b5b3ee737bbb0d6a9452966e6d6bf885"}, - {file = "moderngl-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:427703857abd54b8fe933836be9c4184787953515de99fcae8e13669a740a878"}, - {file = "moderngl-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2ebf139d8e5bd22b29e06d374f9c92477db342e88219c422f84be26acb097a00"}, - {file = "moderngl-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:997baf7369bad753bb51527a55062d0b1bd528e094f3dae3d2895133d0c11f23"}, - {file = "moderngl-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df07fd1938c59be63067311228c17277ac1eabba05b24f32b216c5c517d9e79"}, - {file = "moderngl-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d174c0cd3a46b643a0a885c338ed89831b44e588ed6e583295626ab0e32e4ad5"}, - {file = "moderngl-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9f34c0e25b7efb39c7921b286e4a09066497cffe51f6297a0fba0b4cfe693ae5"}, - {file = "moderngl-5.9.0.tar.gz", hash = "sha256:47bc99612c21489ba12f541c9dae24e76e8a492833064e8fee9eb3bae9a5649a"}, + {file = "moderngl-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec38a4883bbfa9a094b7fec8f37c5aed031df0e060ff5451842bd4db9e30f340"}, + {file = "moderngl-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:461b4185b56fc318d42f965160809f08955b8e857545c99cfa89a6734044d256"}, + {file = "moderngl-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:046a85cc3cffbdac5a45ed53c8f10c601e4737a172e3c1307a05b3693733d6e0"}, + {file = "moderngl-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111dd17837ec3a62a38fb8fb78376a09dcb39910554ed0df45fbb3db84d1db4e"}, + {file = "moderngl-5.10.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:72dc0169e3264391905cebd11ed379ba45724329cebc9cd32b2d928f3a33ed5a"}, + {file = "moderngl-5.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf4814039f365c0ad9da00fb8fb884fdce0d4e63bb042a8c1c551bce13d0ff06"}, + {file = "moderngl-5.10.0-cp310-cp310-win32.whl", hash = "sha256:33b0bbd26319cdef724326997484768eb092f223245edc394541cafe59523568"}, + {file = "moderngl-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:28c45e477cc2e47189bc6696b73777072d4c76ad59de4f8fd027ba5c6561b2c0"}, + {file = "moderngl-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d31c49eb5ffeddb62d6d2b09737d7d7713faa8bc4eb293623cc625f0b4ed6020"}, + {file = "moderngl-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ded56b6a182b216bdd63d63b6d373c4f4a58f20816e71c53d555cde9fba366d6"}, + {file = "moderngl-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd105d15c7b73ba972d0bbf962cd2bbb762b9937fdfdd658990c7c9d2805e183"}, + {file = "moderngl-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9e853e869c421632572a0fda929131f2c7a290ad50f45dcbcbcebca78b0d688"}, + {file = "moderngl-5.10.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:61cd81ec6914745e416c2d9feec25541a9f800aeb387952ec73569ced3054ff9"}, + {file = "moderngl-5.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:164d03e4a54d36cfa17165e1aa61f321068b84b5792e55490b447929bcdf973c"}, + {file = "moderngl-5.10.0-cp311-cp311-win32.whl", hash = "sha256:cd11dbe2b598ff4e43424120b6bf9f222a4be095be1d37b0ea43b208937a7e67"}, + {file = "moderngl-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:996e2963df7b9d0d82cedc80e970f4cbf214cc98b09d14cc2681f2e786477367"}, + {file = "moderngl-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1996348331a458d79e60efe6c21e9b1997f338913cd441a4b40635f8202ffed5"}, + {file = "moderngl-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9d4c3199ec68ab6dfaa931c1f851897d00b7cfc8df20fcfdb5d36427ee74d19"}, + {file = "moderngl-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d37297241bd819f2e70747fdac3b8e8d12e1ace06078baea53164fa5b6f2c5a8"}, + {file = "moderngl-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6421d352685fe3f54641efb03c7f10f1c8e9e99739ccb6f09cd7fded13cf6530"}, + {file = "moderngl-5.10.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:249e9e2e82f8ef8f8167ddede17e19c9255d81b3327e3e875842fa4779b8bbc7"}, + {file = "moderngl-5.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:51e7732ae0af7cb367db3f211808aeacde4d4d02da09a5e1413c7a505f44b63a"}, + {file = "moderngl-5.10.0-cp312-cp312-win32.whl", hash = "sha256:fbf3cf3034271d5cff7fe7002a05fd2b6277beee9daf9d47d7772e62daf29a8a"}, + {file = "moderngl-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:e92ab93fb4d948879b8a0d2d2905493015f1f4ffb7b43aa3d9c9c88e26daa393"}, + {file = "moderngl-5.10.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae28c3ca47724c023de886afc205cb73afdd5fb8593514bb58b6181504958580"}, + {file = "moderngl-5.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17ea8080802252b0bed60bf0490321c8c6a0d4cfad4b0924e967a7c802c6396e"}, + {file = "moderngl-5.10.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160fcabf2a98057608fdde72105f23495d204dd643aab1083ed8f775fde70a25"}, + {file = "moderngl-5.10.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:64ede63c5b0eb598c8d4c4afc7bd1d257522f11d78765749c248f96a2994c3a4"}, + {file = "moderngl-5.10.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3e4de1d3fffb39b6d790b3713602f05772976e2cb2c6ad4eb91dd0ce19689906"}, + {file = "moderngl-5.10.0-cp37-cp37m-win32.whl", hash = "sha256:79803b3e475b9b9eb87ebe02ccde9694b4a3aa0d988894a35e571b6c265199d6"}, + {file = "moderngl-5.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d0b8df2d54cd81ff95a2281f88331fadce9a58b340bc03b74d178eca760805f4"}, + {file = "moderngl-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9db7aa884a561d912a0d545d38d0d2dfe587ed8230271fac3143af5141349fe"}, + {file = "moderngl-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81a287198055d2818571976e920b32975e13e1bcdbaf51ca2e13ef314b3479b2"}, + {file = "moderngl-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d116513974c7f2177cab352678d8db1f3181385000bd10c6c2d8e3892c4a2c3"}, + {file = "moderngl-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a932fb195fd48a3a9e850397b6b952f48aa238f9da24073730f53c31773665"}, + {file = "moderngl-5.10.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6cdb4f9542536b1e23a30f5049eced10010568ff6762b381c5ee47f18d4885be"}, + {file = "moderngl-5.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3dc94d9ca08d712650ca465ca355bab49ad2a3a2ab4841f90f00cc575c09d760"}, + {file = "moderngl-5.10.0-cp38-cp38-win32.whl", hash = "sha256:5f00c5e8e94d4fc8e74bc0e91ce120e5b83c9d470d33db96f2ccd54d8ffd84bf"}, + {file = "moderngl-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:90b29cf49cb9fb95176446489d9c448f9bf21d683d66b09f9f3fffcb1dbd7aed"}, + {file = "moderngl-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8a0957053488983e853e881e4d7b1bb5cec8208956dfbe9fb6e1454113d3921"}, + {file = "moderngl-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c3600f33d453b77c3f577f46585807eab3a7c14d9b4555c6c553ee883794223"}, + {file = "moderngl-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28a10cce3656768f1fb1f1a49a87b2b0803f30e775a9605ce2875f5ae3d740a"}, + {file = "moderngl-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02828648a362ac6d399f4babeb156cf1ccdc94053c94c9d80cbf436365f15877"}, + {file = "moderngl-5.10.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5dd8802df9e33e035ff11428a0b813ce9d3ba7e6c852685b30dbe6d6ecf78219"}, + {file = "moderngl-5.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72e3e9a5d6fb7ae25d091603b3770e53c6f0f148a2ce82a6d7c0dcd50c03f221"}, + {file = "moderngl-5.10.0-cp39-cp39-win32.whl", hash = "sha256:6ab3d8848d926cb5768daef7b15b596f833f4a699ff9c87f92f264da9cfd5f8d"}, + {file = "moderngl-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3fd5e3ff2eda7d8152e2191d281ed9744708789049c9feaf32e3f8480ad36ac6"}, + {file = "moderngl-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d40c48e3d4af310807d10be4952b67d390aef83d9c1188a4562724b137381cd8"}, + {file = "moderngl-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e02ba34dee05bce0c6f13eff2b705f12d8b869156d16ac39146616b7b8fd75"}, + {file = "moderngl-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a71dcaa94b2d9d89cff53d76b7b7ba8b98b9c98983851968710d143c29260b"}, + {file = "moderngl-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6933e00279414ea82487262b1418843c813770d34f3b49ffa491a489629d83a8"}, + {file = "moderngl-5.10.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8d2b579e151a68e96f46962c85dcb0ef87c1eef78f9997a1eb38c93a05d78105"}, + {file = "moderngl-5.10.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8762385bc961c3e8c4d62ee3d565b70699df69674613c8815cc6a72260a455b"}, + {file = "moderngl-5.10.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3b2d4d631b0119790d3fc56a9dd6047aa5bc302b5851c0cec5e7504e6ebf5fc"}, + {file = "moderngl-5.10.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:319e8a5baf1fc681b541666bbbb3eb3df0bd127be96ffd751bc995cef7c1ffe3"}, + {file = "moderngl-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:744a4c1c6c5cd959046f000b1d0af2ec5f8e75df115b91a1e4aa07a67f531520"}, + {file = "moderngl-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf92d9645f390ac3caa2d21388c04952b6df64694199bfdfcb1bad512c530bb"}, + {file = "moderngl-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70964094e98a7209a566c17264b70c9a075a11d7181d943742bfc86e2baa334d"}, + {file = "moderngl-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ed976286ff722d4de657dcad0bc14a89a07671ef1ba797b89592e733956600a3"}, + {file = "moderngl-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea8bac3464cfe63f910b76cc55f2f11194fe2325fed43edb63bed33b4aee1756"}, + {file = "moderngl-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e5e88ed0192f15600cc810726a47508a5cc97f3ddfc33aa381c8d9f2d58d54a"}, + {file = "moderngl-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4777d2630b575ab5a5dd109b3ab24312e9ea793b8d5a3453f23f16a92a1851"}, + {file = "moderngl-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6ce7020588529aba4ea8b55c0861e93f997b4a2cf310eef990942cc5fa1ec8fa"}, + {file = "moderngl-5.10.0.tar.gz", hash = "sha256:119c8d364dde3cd8d1c09f237ed4916617ba759954a1952df4694e51ee4f6511"}, ] [package.dependencies] @@ -2399,13 +2424,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.13.0" +version = "7.14.2" description = "Converting Jupyter Notebooks" optional = true python-versions = ">=3.8" files = [ - {file = "nbconvert-7.13.0-py3-none-any.whl", hash = "sha256:22521cfcc10ba5755e44acb6a70d2bd8a891ce7aed6746481e10cd548b169e19"}, - {file = "nbconvert-7.13.0.tar.gz", hash = "sha256:c6f61c86fca5b28bd17f4f9a308248e59fa2b54919e1589f6cc3575c5dfec2bd"}, + {file = "nbconvert-7.14.2-py3-none-any.whl", hash = "sha256:db28590cef90f7faf2ebbc71acd402cbecf13d29176df728c0a9025a49345ea1"}, + {file = "nbconvert-7.14.2.tar.gz", hash = "sha256:a7f8808fd4e082431673ac538400218dd45efd076fbeb07cc6e5aa5a3a4e949e"}, ] [package.dependencies] @@ -2458,13 +2483,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = true python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2501,13 +2526,13 @@ setuptools = "*" [[package]] name = "notebook" -version = "7.0.6" +version = "7.0.7" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = true python-versions = ">=3.8" files = [ - {file = "notebook-7.0.6-py3-none-any.whl", hash = "sha256:0fe8f67102fea3744fedf652e4c15339390902ca70c5a31c4f547fa23da697cc"}, - {file = "notebook-7.0.6.tar.gz", hash = "sha256:ec6113b06529019f7f287819af06c97a2baf7a95ac21a8f6e32192898e9f9a58"}, + {file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"}, + {file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"}, ] [package.dependencies] @@ -2541,58 +2566,58 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numpy" -version = "1.26.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, - {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, - {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, - {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, - {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, - {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, - {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, - {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, - {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, - {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, - {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] name = "overrides" -version = "7.4.0" +version = "7.6.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = true python-versions = ">=3.6" files = [ - {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, - {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, + {file = "overrides-7.6.0-py3-none-any.whl", hash = "sha256:c36e6635519ea9c5b043b65c36d4b886aee8bd45b7d4681d2a6df0898df4b654"}, + {file = "overrides-7.6.0.tar.gz", hash = "sha256:01e15bbbf15b766f0675c275baa1878bd1c7dc9bc7b9ee13e677cdba93dc1bd9"}, ] [[package]] @@ -2608,13 +2633,13 @@ files = [ [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" 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"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -2659,70 +2684,88 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.1.0" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "platformdirs" @@ -2741,13 +2784,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -2802,27 +2845,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" 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.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"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -3132,13 +3175,13 @@ numpy = "*" [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -3294,6 +3337,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3435,13 +3479,13 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.32.0" +version = "0.32.1" description = "JSON Referencing + Python" optional = true python-versions = ">=3.8" files = [ - {file = "referencing-0.32.0-py3-none-any.whl", hash = "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99"}, - {file = "referencing-0.32.0.tar.gz", hash = "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161"}, + {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, + {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, ] [package.dependencies] @@ -3527,153 +3571,153 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.15.2" +version = "0.17.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = true python-versions = ">=3.8" files = [ - {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"}, + {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, + {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59"}, + {file = "rpds_py-0.17.1-cp310-none-win32.whl", hash = "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d"}, + {file = "rpds_py-0.17.1-cp310-none-win_amd64.whl", hash = "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea"}, + {file = "rpds_py-0.17.1-cp311-none-win32.whl", hash = "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518"}, + {file = "rpds_py-0.17.1-cp311-none-win_amd64.whl", hash = "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23"}, + {file = "rpds_py-0.17.1-cp312-none-win32.whl", hash = "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1"}, + {file = "rpds_py-0.17.1-cp312-none-win_amd64.whl", hash = "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6"}, + {file = "rpds_py-0.17.1-cp38-none-win32.whl", hash = "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a"}, + {file = "rpds_py-0.17.1-cp38-none-win_amd64.whl", hash = "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b"}, + {file = "rpds_py-0.17.1-cp39-none-win32.whl", hash = "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f"}, + {file = "rpds_py-0.17.1-cp39-none-win_amd64.whl", hash = "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68"}, + {file = "rpds_py-0.17.1.tar.gz", hash = "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7"}, ] [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "screeninfo" @@ -3708,13 +3752,13 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "69.0.2" +version = "69.0.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, - {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, ] [package.extras] @@ -3900,56 +3944,50 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -3982,38 +4020,34 @@ Sphinx = ">=1.7.0" [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -4162,13 +4196,13 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.0" +version = "5.14.1" description = "Traitlets Python configuration system" optional = true python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, - {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] @@ -4188,35 +4222,35 @@ files = [ [[package]] name = "types-docutils" -version = "0.20.0.3" +version = "0.20.0.20240106" description = "Typing stubs for docutils" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-docutils-0.20.0.3.tar.gz", hash = "sha256:4928e790f42b99d5833990f99c8dd9fa9f16825f6ed30380ca981846d36870cd"}, - {file = "types_docutils-0.20.0.3-py3-none-any.whl", hash = "sha256:a930150d8e01a9170f9bca489f46808ddebccdd8bc1e47c07968a77e49fb9321"}, + {file = "types-docutils-0.20.0.20240106.tar.gz", hash = "sha256:03992ec976fbe080db588e1e56a83c5e4aba5c733022b25bb26cb84397b96049"}, + {file = "types_docutils-0.20.0.20240106-py3-none-any.whl", hash = "sha256:d408f9305761905b157ea3cb80f53d4026bce7d4cc47312939118715467d0278"}, ] [[package]] name = "types-pillow" -version = "10.1.0.2" +version = "10.2.0.20240111" description = "Typing stubs for Pillow" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "types-Pillow-10.1.0.2.tar.gz", hash = "sha256:525c1c5ee67b0ac1721c40d2bc618226ef2123c347e527e14e05b920721a13b9"}, - {file = "types_Pillow-10.1.0.2-py3-none-any.whl", hash = "sha256:131078ffa547bf9a201d39ffcdc65633e108148085f4f1b07d4647fcfec6e923"}, + {file = "types-Pillow-10.2.0.20240111.tar.gz", hash = "sha256:e8d359bfdc5a149a3c90a7e153cb2d0750ddf7fc3508a20dfadabd8a9435e354"}, + {file = "types_Pillow-10.2.0.20240111-py3-none-any.whl", hash = "sha256:1f4243b30c143b56b0646626f052e4269123e550f9096cdfb5fbd999daee7dbb"}, ] [[package]] name = "types-pygments" -version = "2.17.0.0" +version = "2.17.0.20240106" description = "Typing stubs for Pygments" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "types-Pygments-2.17.0.0.tar.gz", hash = "sha256:4241c5f1b7448e559cd820143a564cf10de626a95ab10e2daa463449d16864e7"}, - {file = "types_Pygments-2.17.0.0-py3-none-any.whl", hash = "sha256:83c33c89037f433fd5315b1abf80f5cb8b589b2d0549444d7f63824c628142c7"}, + {file = "types-Pygments-2.17.0.20240106.tar.gz", hash = "sha256:92e62ac37793e567cd2b0f64f1456c24fccce4041d9c5f869697a6739fde4fce"}, + {file = "types_Pygments-2.17.0.20240106-py3-none-any.whl", hash = "sha256:8052c574b0ab8f2dc94bdc4a31b9d48e8aa5a0f12398ef40cadadbe551da949b"}, ] [package.dependencies] @@ -4225,24 +4259,24 @@ types-setuptools = "*" [[package]] name = "types-python-dateutil" -version = "2.8.19.14" +version = "2.8.19.20240106" description = "Typing stubs for python-dateutil" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, - {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, + {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, + {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, ] [[package]] name = "types-setuptools" -version = "69.0.0.0" +version = "69.0.0.20240115" description = "Typing stubs for setuptools" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "types-setuptools-69.0.0.0.tar.gz", hash = "sha256:b0a06219f628c6527b2f8ce770a4f47550e00d3e8c3ad83e2dc31bc6e6eda95d"}, - {file = "types_setuptools-69.0.0.0-py3-none-any.whl", hash = "sha256:8c86195bae2ad81e6dea900a570fe9d64a59dbce2b11cc63c046b03246ea77bf"}, + {file = "types-setuptools-69.0.0.20240115.tar.gz", hash = "sha256:1a9c863899f40cbe2053d0cd1d00ddef0330b492335467d018f73c1fec9462a3"}, + {file = "types_setuptools-69.0.0.20240115-py3-none-any.whl", hash = "sha256:7409e774c69e1810cb45052dbaed839fc30302e86a3ff945172ef2a2e7ab46f8"}, ] [[package]] @@ -4347,13 +4381,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.12" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = true python-versions = "*" files = [ - {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, - {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] From 7006d6b79e8d6cadf38a23154d73bd9289ca116f Mon Sep 17 00:00:00 2001 From: Greg Rupp Date: Wed, 24 Jan 2024 14:12:24 -0600 Subject: [PATCH 21/77] Removed -s / --save_last_frame flag from CLI arguments (#3528) * Remove -s flag * Make help text more verbose --- manim/cli/render/render_options.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/manim/cli/render/render_options.py b/manim/cli/render/render_options.py index fffdce36cb..5a2d992db8 100644 --- a/manim/cli/render/render_options.py +++ b/manim/cli/render/render_options.py @@ -59,7 +59,13 @@ def validate_resolution(ctx, param, value): type=Choice(["png", "gif", "mp4", "webm", "mov"], case_sensitive=False), default=None, ), - option("-s", "--save_last_frame", is_flag=True, default=None), + option( + "-s", + "--save_last_frame", + default=None, + is_flag=True, + help="Render and save only the last frame of a scene as a PNG image.", + ), option( "-q", "--quality", @@ -123,13 +129,6 @@ def validate_resolution(ctx, param, value): is_flag=True, help="Save section videos in addition to movie file.", ), - option( - "-s", - "--save_last_frame", - default=None, - is_flag=True, - help="Save last frame as png (Deprecated).", - ), option( "-t", "--transparent", From 175cb894003e42aaac04aac775c411311506637c Mon Sep 17 00:00:00 2001 From: yuan Date: Thu, 25 Jan 2024 07:40:30 +0800 Subject: [PATCH 22/77] fix write_subcaption_file error when using opengl renderer (#3546) * fix write_subcaption_file error when using opengl renderer * Update manim/scene/scene_file_writer.py --------- Co-authored-by: Benjamin Hackl --- manim/scene/scene_file_writer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index f3e5c08a4a..6d39cc35be 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -725,6 +725,8 @@ def flush_cache_directory(self): def write_subcaption_file(self): """Writes the subcaption file.""" + if config.output_file is None: + return subcaption_file = Path(config.output_file).with_suffix(".srt") subcaption_file.write_text(srt.compose(self.subcaptions), encoding="utf-8") logger.info(f"Subcaption file has been written as {subcaption_file}") From f8b5066899d7a28548b371c28f52d6998267cfe1 Mon Sep 17 00:00:00 2001 From: NotWearingPants <26556598+NotWearingPants@users.noreply.github.com> Date: Thu, 25 Jan 2024 01:41:38 +0200 Subject: [PATCH 23/77] Update docker.rst to use bash from the PATH (#3582) --- docs/source/installation/docker.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/installation/docker.rst b/docs/source/installation/docker.rst index 45eab6864b..1e2b16f0e5 100644 --- a/docs/source/installation/docker.rst +++ b/docs/source/installation/docker.rst @@ -45,7 +45,7 @@ modify to your liking. First, run .. code-block:: sh - docker run -it --name my-manim-container -v "/full/path/to/your/directory:/manim" manimcommunity/manim /bin/bash + docker run -it --name my-manim-container -v "/full/path/to/your/directory:/manim" manimcommunity/manim bash to obtain an interactive shell inside your container allowing you From d0fe0c3894c5f77ba5c988e120d34f6e5c509a47 Mon Sep 17 00:00:00 2001 From: yuan Date: Thu, 25 Jan 2024 15:27:18 +0800 Subject: [PATCH 24/77] fix typo in value_tracker.py (#3594) --- manim/mobject/value_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/value_tracker.py b/manim/mobject/value_tracker.py index 9941698e90..f46944041c 100644 --- a/manim/mobject/value_tracker.py +++ b/manim/mobject/value_tracker.py @@ -45,7 +45,7 @@ def construct(self): self.wait(1) tracker -= 4 self.wait(0.5) - self.play(tracker.animate.set_value(5)), + self.play(tracker.animate.set_value(5)) self.wait(0.5) self.play(tracker.animate.set_value(3)) self.play(tracker.animate.increment_value(-2)) From e2cec98f9a731fa1fe89274b5d8e9317cc577dc2 Mon Sep 17 00:00:00 2001 From: Sparsh Goenka <43041139+sparshg@users.noreply.github.com> Date: Fri, 2 Feb 2024 03:57:17 +0530 Subject: [PATCH 25/77] fix `get_arc_center()` returning reference of point (#3599) --- manim/mobject/geometry/arc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/geometry/arc.py b/manim/mobject/geometry/arc.py index c979f798de..dd532b07b6 100644 --- a/manim/mobject/geometry/arc.py +++ b/manim/mobject/geometry/arc.py @@ -389,7 +389,7 @@ def get_arc_center(self, warning: bool = True) -> Point3D: # For a1 and a2 to lie at the same point arc radius # must be zero. Thus arc_center will also lie at # that point. - return a1 + return np.copy(a1) # Tangent vectors t1 = h1 - a1 t2 = h2 - a2 From f70980aa40808d51c84c42d49ddae09469529c1e Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:27:49 -0500 Subject: [PATCH 26/77] Add ref_class (#3598) --- docs/source/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/examples.rst b/docs/source/examples.rst index 16b3ee7869..6d39027bfc 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -94,7 +94,7 @@ Basic Concepts self.add(image, image.background_rectangle) .. manim:: BooleanOperations - :ref_classes: Union Intersection Exclusion + :ref_classes: Union Intersection Exclusion Difference class BooleanOperations(Scene): def construct(self): From 65d352d0abd307a5cf134a0995f57937fb29d268 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:31:53 -0500 Subject: [PATCH 27/77] Fix typehint (#3592) --- manim/typing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index 6f16bad905..9d8bd7a4c5 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -257,9 +257,9 @@ """ InternalPoint2D_Array: TypeAlias = npt.NDArray[PointDType] -"""``shape: (N, 3)`` +"""``shape: (N, 2)`` -An array of `Point2D` objects: ``[[float, float], ...]``. +An array of `InternalPoint2D` objects: ``[[float, float], ...]``. .. note:: This type alias is mostly made available for internal use, and From 1520481812e4a9a876b88a229f1997144b9cfbe5 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Fri, 2 Feb 2024 01:22:24 +0100 Subject: [PATCH 28/77] Update ci.yml (#3611) --- .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 52477aae02..a2a06b25cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -143,7 +143,7 @@ jobs: $tinyTexPackages = $(python -c "import json;print(' '.join(json.load(open('.github/manimdependency.json'))['windows']['tinytex']))") -Split ' ' $OriPath = $env:PATH echo "Install Tinytex" - Invoke-WebRequest "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.zip" -O "$($env:TMP)\TinyTex.zip" + Invoke-WebRequest "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.zip" -OutFile "$($env:TMP)\TinyTex.zip" Expand-Archive -LiteralPath "$($env:TMP)\TinyTex.zip" -DestinationPath "$($PWD)\ManimCache\LatexWindows" $env:Path = "$($PWD)\ManimCache\LatexWindows\TinyTeX\bin\windows;$($env:PATH)" tlmgr update --self From ed1b203993382e6cfd0e0ae990f39b0b1679df25 Mon Sep 17 00:00:00 2001 From: yuan Date: Sun, 4 Feb 2024 08:14:16 +0800 Subject: [PATCH 29/77] fix type hint of indication.py (#3613) --- manim/animation/indication.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/manim/animation/indication.py b/manim/animation/indication.py index 90d8113b43..db2640d5a5 100644 --- a/manim/animation/indication.py +++ b/manim/animation/indication.py @@ -148,7 +148,7 @@ def construct(self): def __init__( self, - mobject: "Mobject", + mobject: Mobject, scale_factor: float = 1.2, color: str = YELLOW, rate_func: Callable[[float, Optional[float]], np.ndarray] = there_and_back, @@ -158,7 +158,7 @@ def __init__( self.scale_factor = scale_factor super().__init__(mobject, rate_func=rate_func, **kwargs) - def create_target(self) -> "Mobject": + def create_target(self) -> Mobject: target = self.mobject.copy() target.scale(self.scale_factor) target.set_color(self.color) @@ -348,7 +348,7 @@ def __init__(self, vmobject, n_segments=10, time_width=0.1, remover=True, **kwar message="Use Create then FadeOut to achieve this effect.", ) class ShowCreationThenFadeOut(Succession): - def __init__(self, mobject: "Mobject", remover: bool = True, **kwargs) -> None: + def __init__(self, mobject: Mobject, remover: bool = True, **kwargs) -> None: super().__init__(Create(mobject), FadeOut(mobject), remover=remover, **kwargs) @@ -397,7 +397,7 @@ def construct(self): def __init__( self, - mobject: "Mobject", + mobject: Mobject, direction: np.ndarray = UP, amplitude: float = 0.2, wave_func: Callable[[float], float] = smooth, @@ -516,7 +516,7 @@ def construct(self): def __init__( self, - mobject: "Mobject", + mobject: Mobject, scale_value: float = 1.1, rotation_angle: float = 0.01 * TAU, n_wiggles: int = 6, @@ -544,8 +544,8 @@ def get_rotate_about_point(self) -> np.ndarray: def interpolate_submobject( self, - submobject: "Mobject", - starting_submobject: "Mobject", + submobject: Mobject, + starting_submobject: Mobject, alpha: float, ) -> None: submobject.points[:, :] = starting_submobject.points From 011c36a6343baacefc092170a664624e3c4a737c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Mon, 12 Feb 2024 20:27:39 -0300 Subject: [PATCH 30/77] Revert vector type aliases to NumPy ndarrays (#3595) --- manim/typing.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/manim/typing.py b/manim/typing.py index 9d8bd7a4c5..8111ca7398 100644 --- a/manim/typing.py +++ b/manim/typing.py @@ -21,7 +21,7 @@ from __future__ import annotations from os import PathLike -from typing import Callable, Literal, Union +from typing import Callable, Union import numpy as np import numpy.typing as npt @@ -319,7 +319,7 @@ Vector types """ -Vector2D: TypeAlias = Point2D +Vector2D: TypeAlias = npt.NDArray[PointDType] """``shape: (2,)`` A 2-dimensional vector: ``[float, float]``. @@ -332,7 +332,7 @@ VMobjects! """ -Vector2D_Array: TypeAlias = Point2D_Array +Vector2D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 2)`` An array of `Vector2D` objects: ``[[float, float], ...]``. @@ -341,7 +341,7 @@ parameter can handle being passed a `Vector3D_Array` instead. """ -Vector3D: TypeAlias = Point3D +Vector3D: TypeAlias = npt.NDArray[PointDType] """``shape: (3,)`` A 3-dimensional vector: ``[float, float, float]``. @@ -351,13 +351,13 @@ VMobjects! """ -Vector3D_Array: TypeAlias = Point3D_Array +Vector3D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 3)`` An array of `Vector3D` objects: ``[[float, float, float], ...]``. """ -VectorND: TypeAlias = Union[npt.NDArray[PointDType], tuple[float, ...]] +VectorND: TypeAlias = npt.NDArray[PointDType] """``shape (N,)`` An :math:`N`-dimensional vector: ``[float, ...]``. @@ -368,19 +368,19 @@ collisions. """ -VectorND_Array: TypeAlias = Union[npt.NDArray[PointDType], tuple[VectorND, ...]] +VectorND_Array: TypeAlias = npt.NDArray[PointDType] """``shape (M, N)`` An array of `VectorND` objects: ``[[float, ...], ...]``. """ -RowVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...]]] +RowVector: TypeAlias = npt.NDArray[PointDType] """``shape: (1, N)`` A row vector: ``[[float, ...]]``. """ -ColVector: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float], ...]] +ColVector: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 1)`` A column vector: ``[[float], [float], ...]``. @@ -392,13 +392,13 @@ Matrix types """ -MatrixMN: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[float, ...], ...]] +MatrixMN: TypeAlias = npt.NDArray[PointDType] """``shape: (M, N)`` A matrix: ``[[float, ...], [float, ...], ...]``. """ -Zeros: TypeAlias = Union[npt.NDArray[PointDType], tuple[tuple[Literal[0], ...], ...]] +Zeros: TypeAlias = MatrixMN """``shape: (M, N)`` A `MatrixMN` filled with zeros, typically created with From fcd81b21a41e883c19b6fbac47cb947713b2693f Mon Sep 17 00:00:00 2001 From: Said Taghadouini <84044788+staghado@users.noreply.github.com> Date: Tue, 13 Feb 2024 21:26:54 +0100 Subject: [PATCH 31/77] Improve handling of specified font name (#3429) Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: JasonGrace2282 The proposed fix does two things : * If the specified font is 'sans-serif' : change it to 'sans' as this is the name used in the list of fonts * if the font name is not in the list of fonts, automatically check if the capitalized version of the font exists in the list of fonts. If not, print a warning to the user. --- manim/mobject/text/text_mobject.py | 34 ++++++++++++++++--- .../module/mobject/text/test_text_mobject.py | 20 +++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/manim/mobject/text/text_mobject.py b/manim/mobject/text/text_mobject.py index 32f5e4dc25..d394bccd23 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -444,8 +444,21 @@ def __init__( **kwargs, ) -> None: self.line_spacing = line_spacing - if font and warn_missing_font and font not in Text.font_list(): - logger.warning(f"Font {font} not in {Text.font_list()}.") + if font and warn_missing_font: + fonts_list = Text.font_list() + # handle special case of sans/sans-serif + if font.lower() == "sans-serif": + font = "sans" + if font not in fonts_list: + # check if the capitalized version is in the supported fonts + if font.capitalize() in fonts_list: + font = font.capitalize() + elif font.lower() in fonts_list: + font = font.lower() + elif font.title() in fonts_list: + font = font.title() + else: + logger.warning(f"Font {font} not in {fonts_list}.") self.font = font self._font_size = float(font_size) # needs to be a float or else size is inflated when font_size = 24 @@ -1169,8 +1182,21 @@ def __init__( ) -> None: self.text = text self.line_spacing = line_spacing - if font and warn_missing_font and font not in Text.font_list(): - logger.warning(f"Font {font} not in {Text.font_list()}.") + if font and warn_missing_font: + fonts_list = Text.font_list() + # handle special case of sans/sans-serif + if font.lower() == "sans-serif": + font = "sans" + if font not in fonts_list: + # check if the capitalized version is in the supported fonts + if font.capitalize() in fonts_list: + font = font.capitalize() + elif font.lower() in fonts_list: + font = font.lower() + elif font.title() in fonts_list: + font = font.title() + else: + logger.warning(f"Font {font} not in {fonts_list}.") self.font = font self._font_size = float(font_size) self.slant = slant diff --git a/tests/module/mobject/text/test_text_mobject.py b/tests/module/mobject/text/test_text_mobject.py index 048ae883a1..a6b8b3b453 100644 --- a/tests/module/mobject/text/test_text_mobject.py +++ b/tests/module/mobject/text/test_text_mobject.py @@ -1,5 +1,8 @@ from __future__ import annotations +from contextlib import redirect_stdout +from io import StringIO + from manim.mobject.text.text_mobject import MarkupText, Text @@ -11,3 +14,20 @@ def test_font_size(): assert round(text_string.font_size, 5) == 14.4 assert round(markuptext_string.font_size, 5) == 14.4 + + +def test_font_warnings(): + def warning_printed(font: str, **kwargs) -> bool: + io = StringIO() + with redirect_stdout(io): + Text("hi!", font=font, **kwargs) + txt = io.getvalue() + return "Font" in txt and "not in" in txt + + # check for normal fonts (no warning) + assert not warning_printed("System-ui", warn_missing_font=True) + # should be converted to sans before checking + assert not warning_printed("Sans-serif", warn_missing_font=True) + + # check random string (should be warning) + assert warning_printed("Manim!" * 3, warn_missing_font=True) From 206f8740b97df49526e86a85cfba4858980742bd Mon Sep 17 00:00:00 2001 From: Victorien <65306057+Viicos@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:17:13 +0100 Subject: [PATCH 32/77] Remove support for dynamic plugin imports (#3524) * Remove call to deprecated `pkg_resources` * Remove support for dynamic plugin imports, update plugin utilities * fix affected tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * more fixes * Last fix * Fix import * Update docs --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jason Villanueva --- docs/source/plugins.rst | 32 ++------ manim/plugins/__init__.py | 16 +++- manim/plugins/import_plugins.py | 43 ----------- manim/plugins/plugins_flags.py | 16 ++-- poetry.lock | 8 -- pyproject.toml | 1 + tests/test_plugins/simple_scenes.py | 14 ---- tests/test_plugins/test_plugins.py | 114 ---------------------------- 8 files changed, 32 insertions(+), 212 deletions(-) delete mode 100644 manim/plugins/import_plugins.py diff --git a/docs/source/plugins.rst b/docs/source/plugins.rst index 0359d29b5e..c4c631b655 100644 --- a/docs/source/plugins.rst +++ b/docs/source/plugins.rst @@ -99,40 +99,18 @@ directory structure, build system, and naming are completely up to your discretion as an author. The aforementioned template plugin is only a model using Poetry since this is the build system Manim uses. The plugin's `entry point `_ can be -specified in poetry as: +specified in Poetry as: .. code-block:: toml [tool.poetry.plugins."manim.plugins"] "name" = "object_reference" -Here ``name`` is the name of the module of the plugin. +.. versionremoved:: 0.19.0 -Here ``object_reference`` can point to either a function in a module or a module -itself. For example, - -.. code-block:: toml - - [tool.poetry.plugins."manim.plugins"] - "manim_plugintemplate" = "manim_plugintemplate" - -Here a module is used as ``object_reference``, and when this plugin is enabled, -Manim will look for ``__all__`` keyword defined in ``manim_plugintemplate`` and -everything as a global variable one by one. - -If ``object_reference`` is a function, Manim calls the function and expects the -function to return a list of modules or functions that need to be defined globally. - -For example, - -.. code-block:: toml - - [tool.poetry.plugins."manim.plugins"] - "manim_plugintemplate" = "manim_awesomeplugin.imports:setup_things" - -Here, Manim will call the function ``setup_things`` defined in -``manim_awesomeplugin.imports`` and calls that. It returns a list of function or -modules which will be imported globally. + Plugins should be imported explicitly to be usable in user code. The plugin + system will probably be refactored in the future to provide a more structured + interface. A note on Renderer Compatibility ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/manim/plugins/__init__.py b/manim/plugins/__init__.py index a899f63bb8..06314895e1 100644 --- a/manim/plugins/__init__.py +++ b/manim/plugins/__init__.py @@ -1,3 +1,17 @@ from __future__ import annotations -from .import_plugins import * +from manim import config, logger + +from .plugins_flags import get_plugins, list_plugins + +__all__ = [ + "get_plugins", + "list_plugins", +] + +requested_plugins: set[str] = set(config["plugins"]) +missing_plugins = requested_plugins - set(get_plugins().keys()) + + +if missing_plugins: + logger.warning("Missing Plugins: %s", missing_plugins) diff --git a/manim/plugins/import_plugins.py b/manim/plugins/import_plugins.py deleted file mode 100644 index 1f11accbf9..0000000000 --- a/manim/plugins/import_plugins.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -import types - -import pkg_resources - -from .. import config, logger - -__all__ = [] - - -plugins_requested: list[str] = config["plugins"] -if "" in plugins_requested: - plugins_requested.remove("") -for plugin in pkg_resources.iter_entry_points("manim.plugins"): - if plugin.name not in plugins_requested: - continue - loaded_plugin = plugin.load() - if isinstance(loaded_plugin, types.ModuleType): - # it is a module so it can't be called - # see if __all__ is defined - # if it is defined use that to load all the modules necessary - # essentially this would be similar to `from plugin import *`` - # if not just import the module with the plugin name - if hasattr(loaded_plugin, "__all__"): - for thing in loaded_plugin.__all__: # type: ignore - exec(f"{thing}=loaded_plugin.{thing}") - __all__.append(thing) - else: - exec(f"{plugin.name}=loaded_plugin") - __all__.append(plugin.name) - elif isinstance(loaded_plugin, types.FunctionType): - # call the function first - # it will return a list of modules to add globally - # finally add it - lists = loaded_plugin() - for lst in lists: - exec(f"{lst.__name__}=lst") - __all__.append(lst.__name__) - plugins_requested.remove(plugin.name) - -if plugins_requested != []: - logger.warning("Missing Plugins: %s", plugins_requested) diff --git a/manim/plugins/plugins_flags.py b/manim/plugins/plugins_flags.py index a1487e5774..3733ac3f3f 100644 --- a/manim/plugins/plugins_flags.py +++ b/manim/plugins/plugins_flags.py @@ -2,22 +2,28 @@ from __future__ import annotations -import pkg_resources +import sys +from typing import Any + +if sys.version_info < (3, 10): + from importlib_metadata import entry_points +else: + from importlib.metadata import entry_points from manim import console __all__ = ["list_plugins"] -def get_plugins(): - plugins = { +def get_plugins() -> dict[str, Any]: + plugins: dict[str, Any] = { entry_point.name: entry_point.load() - for entry_point in pkg_resources.iter_entry_points("manim.plugins") + for entry_point in entry_points(group="manim.plugins") } return plugins -def list_plugins(): +def list_plugins() -> None: console.print("[green bold]Plugins:[/green bold]", justify="left") plugins = get_plugins() diff --git a/poetry.lock b/poetry.lock index b5fd7d925a..4d97a42aa3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1981,14 +1981,6 @@ 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"}, diff --git a/pyproject.toml b/pyproject.toml index 1ba36a47b1..fcb3f20e52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ click = ">=8.0" cloup = ">=2.0.0" dearpygui = { version = ">=1.0.0", optional = true } decorator = ">=4.3.2" +importlib-metadata = {version = ">=3.6", python = "<=3.9"} # Required to discover plugins isosurfaces = ">=0.1.0" jupyterlab = { version = ">=3.0.0", optional = true } manimpango = ">=0.5.0,<1.0.0" # Complete API change in 1.0.0 diff --git a/tests/test_plugins/simple_scenes.py b/tests/test_plugins/simple_scenes.py index 1562196119..e22085123e 100644 --- a/tests/test_plugins/simple_scenes.py +++ b/tests/test_plugins/simple_scenes.py @@ -8,17 +8,3 @@ def construct(self): square = Square() circle = Circle() self.play(Transform(square, circle)) - - -class FunctionLikeTest(Scene): - def construct(self): - assert "FunctionLike" in globals() - a = FunctionLike() - self.play(FadeIn(a)) - - -class WithAllTest(Scene): - def construct(self): - assert "WithAll" in globals() - a = WithAll() - self.play(FadeIn(a)) diff --git a/tests/test_plugins/test_plugins.py b/tests/test_plugins/test_plugins.py index b73a5d6a1d..e81dc47085 100644 --- a/tests/test_plugins/test_plugins.py +++ b/tests/test_plugins/test_plugins.py @@ -2,7 +2,6 @@ import random import string -import tempfile import textwrap from pathlib import Path @@ -142,116 +141,3 @@ def _create_plugin(entry_point, class_name, function_name, all_dec=""): out, err, exit_code = capture(command) print(out) assert exit_code == 0, err - - -@pytest.mark.slow -def test_plugin_function_like( - tmp_path, - create_plugin, - python_version, - simple_scenes_path, -): - function_like_plugin = create_plugin( - "{plugin_name}.__init__:import_all", - "FunctionLike", - "import_all", - ) - cfg_file = cfg_file_create( - cfg_file_contents.format(plugin_name=function_like_plugin["plugin_name"]), - tmp_path, - ) - scene_name = "FunctionLikeTest" - command = [ - python_version, - "-m", - "manim", - "-ql", - "--media_dir", - str(cfg_file.parent), - "--config_file", - str(cfg_file), - str(simple_scenes_path), - scene_name, - ] - out, err, exit_code = capture(command, cwd=str(cfg_file.parent)) - print(out) - print(err) - assert exit_code == 0, err - - -@pytest.mark.slow -def test_plugin_no_all(tmp_path, create_plugin, python_version): - create_plugin = create_plugin("{plugin_name}", "NoAll", "import_all") - plugin_name = create_plugin["plugin_name"] - cfg_file = cfg_file_create( - cfg_file_contents.format(plugin_name=plugin_name), - tmp_path, - ) - test_class = textwrap.dedent( - f"""\ - from manim import * - class NoAllTest(Scene): - def construct(self): - assert "{plugin_name}" in globals() - a = {plugin_name}.NoAll() - self.play(FadeIn(a)) - """, - ) - - with tempfile.NamedTemporaryFile( - mode="w", - encoding="utf-8", - suffix=".py", - delete=False, - ) as tmpfile: - tmpfile.write(test_class) - scene_name = "NoAllTest" - command = [ - python_version, - "-m", - "manim", - "-ql", - "--media_dir", - str(cfg_file.parent), - "--config_file", - str(cfg_file), - tmpfile.name, - scene_name, - ] - out, err, exit_code = capture(command, cwd=str(cfg_file.parent)) - print(out) - print(err) - assert exit_code == 0, err - Path(tmpfile.name).unlink() - - -@pytest.mark.slow -def test_plugin_with_all(tmp_path, create_plugin, python_version, simple_scenes_path): - create_plugin = create_plugin( - "{plugin_name}", - "WithAll", - "import_all", - all_dec="__all__=['WithAll']", - ) - plugin_name = create_plugin["plugin_name"] - cfg_file = cfg_file_create( - cfg_file_contents.format(plugin_name=plugin_name), - tmp_path, - ) - scene_name = "WithAllTest" - command = [ - python_version, - "-m", - "manim", - "-ql", - "--media_dir", - str(cfg_file.parent), - "--config_file", - str(cfg_file), - str(simple_scenes_path), - scene_name, - ] - out, err, exit_code = capture(command, cwd=str(cfg_file.parent)) - print(out) - print(err) - assert exit_code == 0, err From c7e7ca2e4675dc92cbc3f16bd19ea23b95eda155 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:17:29 -0500 Subject: [PATCH 33/77] Run poetry lock --no-update (#3621) --- poetry.lock | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 4d97a42aa3..e8de9ecdfe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1981,6 +1981,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"}, @@ -4525,4 +4533,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "f15fa632919381a9b5b2cebc3e89aa307fa8735db2e5cde7a408765b46a3b00f" +content-hash = "ee587c7e3241bf8bbd6334cd1de08bc53d3521978ccd68f9ac54a2cc7f61466f" From 77d42d2a46b847b6d5731b4ce254972149c1a426 Mon Sep 17 00:00:00 2001 From: Abulafia <44573666+abul4fia@users.noreply.github.com> Date: Sat, 24 Feb 2024 00:08:47 +0100 Subject: [PATCH 34/77] Update jupyter.rst (#3630) Pinpoint IPython==8.21.0 for Google Colab, because more recent versions are incompatible with their runtime. --- docs/source/installation/jupyter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/installation/jupyter.rst b/docs/source/installation/jupyter.rst index 3b9942e5ec..7542e59be7 100644 --- a/docs/source/installation/jupyter.rst +++ b/docs/source/installation/jupyter.rst @@ -71,7 +71,7 @@ then execute it. texlive-latex-recommended texlive-science \ tipa libpango1.0-dev !pip install manim - !pip install IPython --upgrade + !pip install IPython==8.21.0 You should start to see Colab installing all the dependencies specified in these commands. After the execution has completed, you will be prompted From 9f3d486095a9fe65fa604bf4375bb1b38b380ec0 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:13:08 -0400 Subject: [PATCH 35/77] Fix Vector3 -> Vector3D in contributing docs (#3639) --- docs/source/contributing/docs/typings.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/contributing/docs/typings.rst b/docs/source/contributing/docs/typings.rst index 748cff1e02..72891b0298 100644 --- a/docs/source/contributing/docs/typings.rst +++ b/docs/source/contributing/docs/typings.rst @@ -115,8 +115,8 @@ Typing guidelines from typing import TYPE_CHECKING if TYPE_CHECKING: - from manim.typing import Vector3 - # type stuff with Vector3 + from manim.typing import Vector3D + # type stuff with Vector3D Missing Sections for typehints are: ----------------------------------- From f65ebf21949f9fc3f0c45588f5afee8168ab7804 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 04:26:37 +0200 Subject: [PATCH 36/77] Bump black from 23.12.1 to 24.3.0 (#3649) Bumps [black](https://github.com/psf/black) from 23.12.1 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.12.1...24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 48 ++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/poetry.lock b/poetry.lock index e8de9ecdfe..6cfea9f73c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -219,33 +219,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "23.12.1" +version = "24.3.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, - {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, - {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, - {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, - {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, - {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, - {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, - {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, - {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, - {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, - {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, - {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, - {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, - {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, - {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, + {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, + {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, + {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, + {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, + {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, + {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, + {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, + {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, + {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, + {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, + {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, + {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, + {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, + {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, + {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, + {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, + {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, + {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, + {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, + {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, + {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, + {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, ] [package.dependencies] @@ -4533,4 +4533,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "ee587c7e3241bf8bbd6334cd1de08bc53d3521978ccd68f9ac54a2cc7f61466f" +content-hash = "36d6cb5963f1e9a0ab3d646de64b016ff2afeb6a9ed770188ce04ffadf030bbc" diff --git a/pyproject.toml b/pyproject.toml index fcb3f20e52..7590a73adf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ jupyterlab = ["jupyterlab", "notebook"] gui = ["dearpygui"] [tool.poetry.group.dev.dependencies] -black = "^23.11.0" +black = ">=23.11,<25.0" flake8 = "^6.1.0" flake8-bugbear = "^23.11.28" flake8-builtins = "^2.2.0" From d1cf1c5750a97f6547747aed860094617bbedecb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 02:55:22 +0000 Subject: [PATCH 37/77] Bump cryptography from 42.0.0 to 42.0.4 (#3629) Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.0 to 42.0.4. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/42.0.0...42.0.4) --- updated-dependencies: - dependency-name: cryptography dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 66 ++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6cfea9f73c..85ce76e191 100644 --- a/poetry.lock +++ b/poetry.lock @@ -654,43 +654,43 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.0" +version = "42.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434"}, - {file = "cryptography-42.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b"}, - {file = "cryptography-42.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec"}, - {file = "cryptography-42.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc"}, - {file = "cryptography-42.0.0-cp37-abi3-win32.whl", hash = "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4"}, - {file = "cryptography-42.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0"}, - {file = "cryptography-42.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139"}, - {file = "cryptography-42.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81"}, - {file = "cryptography-42.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221"}, - {file = "cryptography-42.0.0-cp39-abi3-win32.whl", hash = "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b"}, - {file = "cryptography-42.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f"}, - {file = "cryptography-42.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0"}, - {file = "cryptography-42.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce"}, - {file = "cryptography-42.0.0.tar.gz", hash = "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4"}, + {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449"}, + {file = "cryptography-42.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b"}, + {file = "cryptography-42.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824"}, + {file = "cryptography-42.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b"}, + {file = "cryptography-42.0.4-cp37-abi3-win32.whl", hash = "sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925"}, + {file = "cryptography-42.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923"}, + {file = "cryptography-42.0.4-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9"}, + {file = "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929"}, + {file = "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0"}, + {file = "cryptography-42.0.4-cp39-abi3-win32.whl", hash = "sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129"}, + {file = "cryptography-42.0.4-cp39-abi3-win_amd64.whl", hash = "sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20"}, + {file = "cryptography-42.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b"}, + {file = "cryptography-42.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660"}, + {file = "cryptography-42.0.4.tar.gz", hash = "sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb"}, ] [package.dependencies] From 7a794e341f079168fab4399fe3ffe8ab302b5433 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Sun, 31 Mar 2024 23:21:14 -0400 Subject: [PATCH 38/77] Code Cleanup: removing unused imports and global variables (#3620) * Remove unused import * More security fixes * Remove unused global variable * More fixes * Revert change (actual fix would require some rewrite) * Add exception for edge case to satisfy warning * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Stuff * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/__main__.py | 2 -- manim/mobject/mobject.py | 4 ++-- manim/mobject/opengl/opengl_geometry.py | 1 - manim/mobject/table.py | 1 - manim/mobject/text/tex_mobject.py | 2 +- manim/mobject/types/vectorized_mobject.py | 28 +++++++++++++++-------- manim/renderer/opengl_renderer.py | 3 --- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/manim/__main__.py b/manim/__main__.py index c11ca88450..f05f4c2971 100644 --- a/manim/__main__.py +++ b/manim/__main__.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys - import click import cloup diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 1b5eed0d58..9b79f67111 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2700,13 +2700,13 @@ def push_self_into_submobjects(self) -> Self: def add_n_more_submobjects(self, n: int) -> Self | None: if n == 0: - return + return None curr = len(self.submobjects) if curr == 0: # If empty, simply add n point mobjects self.submobjects = [self.get_point_mobject() for k in range(n)] - return + return None target = curr + n # TODO, factor this out to utils so as to reuse diff --git a/manim/mobject/opengl/opengl_geometry.py b/manim/mobject/opengl/opengl_geometry.py index 3e81f6f6f3..2ec0bbe4dd 100644 --- a/manim/mobject/opengl/opengl_geometry.py +++ b/manim/mobject/opengl/opengl_geometry.py @@ -23,7 +23,6 @@ ) DEFAULT_DOT_RADIUS = 0.08 -DEFAULT_SMALL_DOT_RADIUS = 0.04 DEFAULT_DASH_LENGTH = 0.05 DEFAULT_ARROW_TIP_LENGTH = 0.35 DEFAULT_ARROW_TIP_WIDTH = 0.35 diff --git a/manim/mobject/table.py b/manim/mobject/table.py index ff0c0f0bd9..1a1beffad1 100644 --- a/manim/mobject/table.py +++ b/manim/mobject/table.py @@ -74,7 +74,6 @@ def construct(self): from manim.mobject.text.tex_mobject import MathTex from manim.mobject.text.text_mobject import Paragraph -from .. import config from ..animation.animation import Animation from ..animation.composition import AnimationGroup from ..animation.creation import Create, Write diff --git a/manim/mobject/text/tex_mobject.py b/manim/mobject/text/tex_mobject.py index 47cbe6cd96..029b5ce009 100644 --- a/manim/mobject/text/tex_mobject.py +++ b/manim/mobject/text/tex_mobject.py @@ -34,7 +34,7 @@ from manim.constants import * from manim.mobject.geometry.line import Line from manim.mobject.svg.svg_mobject import SVGMobject -from manim.mobject.types.vectorized_mobject import VectorizedPoint, VGroup, VMobject +from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.tex import TexTemplate from manim.utils.tex_file_writing import tex_to_svg_file diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 8312b74459..ec15646c31 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -26,20 +26,17 @@ ) import numpy as np -import numpy.typing as npt from PIL.Image import Image -from typing_extensions import Self +from manim import config +from manim.constants import * +from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.three_d.three_d_utils import ( get_3d_vmob_gradient_start_and_end_points, ) - -from ... import config -from ...constants import * -from ...mobject.mobject import Mobject -from ...utils.bezier import ( +from manim.utils.bezier import ( bezier, get_smooth_handle_points, integer_interpolate, @@ -47,11 +44,19 @@ partial_bezier_points, proportions_along_bezier_curve_for_point, ) -from ...utils.color import BLACK, WHITE, ManimColor, ParsableManimColor -from ...utils.iterables import make_even, resize_array, stretch_array_to_length, tuplify -from ...utils.space_ops import rotate_vector, shoelace_direction +from manim.utils.color import BLACK, WHITE, ManimColor, ParsableManimColor +from manim.utils.iterables import ( + make_even, + resize_array, + stretch_array_to_length, + tuplify, +) +from manim.utils.space_ops import rotate_vector, shoelace_direction if TYPE_CHECKING: + import numpy.typing as npt + from typing_extensions import Self + from manim.typing import ( BezierPoints, CubicBezierPoints, @@ -1406,6 +1411,9 @@ def point_from_proportion(self, alpha: float) -> Point3D: return curve(residue) current_length += length + raise Exception( + "Not sure how you reached here, please file a bug report at https://github.com/ManimCommunity/manim/issues/new/choose" + ) def proportion_from_point( self, diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 79390be97c..d457682267 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -219,9 +219,6 @@ def interpolate(self, *args, **kwargs): self.refresh_rotation_matrix() -points_per_curve = 3 - - class OpenGLRenderer: def __init__(self, file_writer_class=SceneFileWriter, skip_animations=False): # Measured in pixel widths, used for vector graphics From 909ffded2800f331f236832fe7d6cbb0d0005823 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Mon, 1 Apr 2024 05:41:57 +0200 Subject: [PATCH 39/77] Fixing the behavior of `.become` to not modify target mobject via side effects fix color linking (#3508) * Copied ndarray for rgbas when interpolating * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changing .become to copy the target mobject * change tests and test data to reflect .become new behavior * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update tests/test_graphical_units/test_mobjects.py * removed unused copy_submobject kwarg * added doctests and improved documentation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl --- manim/mobject/mobject.py | 74 ++++++++++++++++-- manim/mobject/types/vectorized_mobject.py | 7 +- .../control_data/mobjects/become.npz | Bin 6411 -> 6446 bytes .../mobjects/become_no_color_linking.npz | Bin 0 -> 9600 bytes tests/test_graphical_units/test_mobjects.py | 21 +++-- 5 files changed, 87 insertions(+), 15 deletions(-) create mode 100644 tests/test_graphical_units/control_data/mobjects/become_no_color_linking.npz diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 9b79f67111..ec9017a94f 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2761,7 +2761,6 @@ def interpolate_color(self, mobject1: Mobject, mobject2: Mobject, alpha: float): def become( self, mobject: Mobject, - copy_submobjects: bool = True, match_height: bool = False, match_width: bool = False, match_depth: bool = False, @@ -2774,20 +2773,25 @@ def become( .. note:: If both match_height and match_width are ``True`` then the transformed :class:`~.Mobject` - will match the height first and then the width + will match the height first and then the width. Parameters ---------- match_height - If ``True``, then the transformed :class:`~.Mobject` will match the height of the original + Whether or not to preserve the height of the original + :class:`~.Mobject`. match_width - If ``True``, then the transformed :class:`~.Mobject` will match the width of the original + Whether or not to preserve the width of the original + :class:`~.Mobject`. match_depth - If ``True``, then the transformed :class:`~.Mobject` will match the depth of the original + Whether or not to preserve the depth of the original + :class:`~.Mobject`. match_center - If ``True``, then the transformed :class:`~.Mobject` will match the center of the original + Whether or not to preserve the center of the original + :class:`~.Mobject`. stretch - If ``True``, then the transformed :class:`~.Mobject` will stretch to fit the proportions of the original + Whether or not to stretch the target mobject to match the + the proportions of the original :class:`~.Mobject`. Examples -------- @@ -2801,8 +2805,62 @@ def construct(self): self.wait(0.5) circ.become(square) self.wait(0.5) - """ + + The following examples illustrate how mobject measurements + change when using the ``match_...`` and ``stretch`` arguments. + We start with a rectangle that is 2 units high and 4 units wide, + which we want to turn into a circle of radius 3:: + + >>> from manim import Rectangle, Circle + >>> import numpy as np + >>> rect = Rectangle(height=2, width=4) + >>> circ = Circle(radius=3) + + With ``stretch=True``, the target circle is deformed to match + the proportions of the rectangle, which results in the target + mobject being an ellipse with height 2 and width 4. We can + check that the resulting points satisfy the ellipse equation + :math:`x^2/a^2 + y^2/b^2 = 1` with :math:`a = 4/2` and :math:`b = 2/2` + being the semi-axes:: + + >>> result = rect.copy().become(circ, stretch=True) + >>> result.height, result.width + (2.0, 4.0) + >>> ellipse_eq = np.sum(result.get_anchors()**2 * [1/4, 1, 0], axis=1) + >>> np.allclose(ellipse_eq, 1) + True + + With ``match_height=True`` and ``match_width=True`` the circle is + scaled such that the height or the width of the rectangle will + be preserved, respectively. + The points of the resulting mobject satisfy the circle equation + :math:`x^2 + y^2 = r^2` for the corresponding radius :math:`r`:: + + >>> result = rect.copy().become(circ, match_height=True) + >>> result.height, result.width + (2.0, 2.0) + >>> circle_eq = np.sum(result.get_anchors()**2, axis=1) + >>> np.allclose(circle_eq, 1) + True + >>> result = rect.copy().become(circ, match_width=True) + >>> result.height, result.width + (4.0, 4.0) + >>> circle_eq = np.sum(result.get_anchors()**2, axis=1) + >>> np.allclose(circle_eq, 2**2) + True + + With ``match_center=True``, the resulting mobject is moved such that + its center is the same as the center of the original mobject:: + + >>> rect = rect.shift(np.array([0, 1, 0])) + >>> np.allclose(rect.get_center(), circ.get_center()) + False + >>> result = rect.copy().become(circ, match_center=True) + >>> np.allclose(rect.get_center(), result.get_center()) + True + """ + mobject = mobject.copy() if stretch: mobject.stretch_to_fit_height(self.height) mobject.stretch_to_fit_width(self.width) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index ec15646c31..a59f69bafe 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -352,7 +352,7 @@ def set_stroke( setattr(self, opacity_name, opacity) if color is not None and background: if isinstance(color, (list, tuple)): - self.background_stroke_color = color + self.background_stroke_color = ManimColor.parse(color) else: self.background_stroke_color = ManimColor(color) return self @@ -1738,7 +1738,10 @@ def interpolate_color( interpolate(getattr(mobject1, attr), getattr(mobject2, attr), alpha), ) if alpha == 1.0: - setattr(self, attr, getattr(mobject2, attr)) + val = getattr(mobject2, attr) + if isinstance(val, np.ndarray): + val = val.copy() + setattr(self, attr, val) def pointwise_become_partial( self, diff --git a/tests/test_graphical_units/control_data/mobjects/become.npz b/tests/test_graphical_units/control_data/mobjects/become.npz index afd7ee89dbcedfa78912a6491890fa71ce1146b2..06b190c3b39bcfe43fdcf05ad7872bb68a55b62e 100644 GIT binary patch literal 6446 zcmeHMdsvd$)_<$1=FE(l2&{eU>mZA1-1WfmNo!=CIP<=YO{=v$^s55?#I7}2xqnP1VfO%<0;cK_sh zD%i5vHRIti;RCBlYeFFgt6nqvug<7bCNro#l><1 ziHV&xiaE=W&jvf>49RiK;S^DcJ4}_(ldVE83Hk$KS!y!66#_9-zcE0te>~21TwXvA zVZ~V_jC5AsJeRz*w789gRY|)!!^>0KLQ?38mGW?t;|84_r*0Di0(UP@DqeozBbZ0TJRz;VIhVu<3Z<-s(bZV1S;L zH+&WFQ<5+U&W#)rGU+xtS<3PkJ?icc?V5~?$ky6X`-B|YQDF=B9ntk%g^l;(Fs$A~wNXITP3?|n=g z9j!|K?apfkA6aoRUN_#dQC!kB@-+a=Jr16cm6eqph3#W_dCofn=_@~KqfjINwu4`GLF^eqU+Ih7pd1xt8i$FR@XI3X)_(7Ua9(F z2w}zqfzXfqL7t5x2y8rzWq#aGF1^Eb8G;@dATc!L{4D`pqgoA>n`dOAd{JTwCPcYd z?jIUu)%vJaYjBYHm{7QePUAUpH;0)awIS)^{yb#JFihYWDqXitBu>(CMv=`(thWHkY7liA7jl;(M zW{YLeg4S)A+iU@@-Q$bKS=qA5x~Dw*!HXdg{}QNvHy@|OAm}fBGqrx${SQH^>eblL z)Ldt>-GQ3=IBkG;z9OKFh%rl$$+pmc&7?m{;!a&nOq`B89RL2pR{H)styE5FdUi}`jn6*K7FD>V{La}9Op#fFkvxr_YOEbXh6p}(9CbXYiI z=q=fbB#h8UAtS-rQRiT;!(V~XJOx@ir|^TNX?z>A3sW@-b^b{2QtVciRY+P)Toq#7 zoZoujN^7pYJXp$j?rh-PEn%1UD4Zc3A@)_Cf=LOxtf%YxolWd9#&a<6_Y%ZH#)}|T zFNEEhov*@IB={h=5gHr4wzl2Dw)WWz{2H`?(HrZe+cyo!93~BFPslKjyMK%&xU!8L zeIQ}Zh=BK6_&NPzFOLz{(*Hh5&Qns8^IQF&eV+M-e!u9xr&x0>;!?O3A#LKUvZ;I^ z^!5vDSF-xu``+H}?vI~B@%j$BUZpI*YE6qsQAY9axEeeKv2ze386iw>INe^F4ZWtb zO&iD}X*>Nsx~_~lS}yA~Xj68OT&*odR9uDVI%V8y2qt5Og^k-qM;7;l84eHotwV_~XVzy1lqE#-WG-smQ%+ z>jQ(&?T8muB%$FQ+T3b@m(I#QJcP)98#o0$BhzV!vv6a@{eX3Q=H0^yIjJ^q6s(D3 z+$b~H+s*m;^BP`*$%KEfBpdAL`?l@4MeoY&6=MU-s8mR(McC=cAHbw}{>C&9&35$u z0VG2cDo;Lp#iSZ~wkGwKo$w7auL%TN1@+rh^n!!;+Q^D0XjxQaL9lFVL`iFGkcCh! zBCP~06h6Q1MyfxnCGfdu8~IQp1=RyJ?R!e~3UG5k*qP;NP^Kl7|wTV*$ zN-!Wm61AZs1IcZP*YPJ5ou0P z>-s>owk}5hD36((AYYQRvTkX{Yd@w@QefUr7;@~{0CX%@3*M;qi+i?k4&$+9G;@BnJv35MPC-lBj0IkM_{m(!lahZc&;HfP2ge6$i=>b zVNNhiAP)#x2wh}{EJ+mZA5_jCxs6+tRIox^arLre>EfU1;|rj4qt zs_iOB*sYo9GHC>)il$60VAtgs^!$}$(kG3s~@2u7bYr3 ze)bk6BiPkblj{Ir{wL0d>5RU!XWS2r5PQR00$&!t6nG(t*bPQ)%otGSp#Q)?&&T#Y zV!$Abm0MQL$>(ezuRf0qYVR7WZJa5NCfAv^RF*P~)r+eDAo;iIo5v3l2Ax?q`frlU ziTbr8g|_TAoaF|ha0%kWyLyz*(*=Mh#yY3lV-Aswa4A+nDQOkHh_Z??zI#@Ic)uvI zB>qYSC|b(L2y~x zx$}F>1x0&c^n8ZqQk)griZ=s?e zvUFLL?#Iv|{q`KxE6EEruTcb^q=E@-EZicKxS?@%{s6-vHu ztY3RnFO-`^{(FB8;BT{ z6k=EZ*xAW2GkCM!i-c(JjEI*9)r+9a)t4mw-kmR0odmZWmct#!!E=$-jQwY_FTQ;C zDT-RPm*i4j`J>;>R9{BPrEN@*O&)xiEEkeCn3vbc_VV<5g&IGf zws@DNu6jDGzNYG#loL28DYG>1OYUP`15bzyHM0g0U|jxk-M$ew`1fptMI5MLUvqKxoaT(Hit z)E$=LEDkbt=B}1T`!~3=3Sr<>n1)WR@`Eo=4{O4e>dJh?uoqZVo+o?2$rLaNsv^e3 zK#6?VKZ$G0TnGk7Z04+54Lny~8e?wiy1NtO>F_wVB~ngkOCxa~#e!jo%GsjuTE z7-?>Dv2qP4Yxf`6t6{^Yi<*{H%0`aHX2y}bU%qx7a7EgMAMwIW%uP?(0C}6Nvie2A zV0HHRLTK#VBe-kLp9D|F2*p7y$NWmXQ-YqE-j^iwqhR!{==L{+#u%-)k|+ADQ`}EO9;uGV{IAZX z6OI2J>Jc%~YLDQw^17K*=cJg)YeRTd<~>m`9Q4G2HKRRyMPd_6&g8{2*NCYohpfC% z+S&GX#Z@4v%tjnKUF~Ch3J)cl`vUZ9Z?B;EM%iXC{R>E6Hyb|DwMv$OX`os5_?E(2S*ATwBj zi2vO5FWy4HVa~O`_Ei(7Cc)#MjF@-rZ*X*@U6|d0^RK)xN>3%V&Q!EdG;;*E$49@W zjgbaI&yYO%{MC)wg^Rl8=A{ee;oasqzO5OCPr`*aHLq{rFUSwa?f#Q{^Xrrc9B53M zgYIFxO=`47(DM8RC8o5mWqV6t6?Zh&t@NJLR07oqZ2jtpU84bQ)ADb{*FtsM)Ktff zC@a-i`wh-%=n2mIFg{NQ06tzN(39b2!>qx7D=0OXpxjoBG%q~?m#P>UU`*MD{Z&gE z;KMaF6=N%H5dT0I1ccv&&wKaHWW0J*R;)Uf*RL;UqiizC4gEekrDC}N3ByQZ{!`5H>a>X zdu@7b!`sC9oltv%g##?l0w47>P<<@+*2Y?oDHG_dX#Je;l6~4{R)B^+f9mqVYCYcP zGk_6#oq$UH>c*q>=k^?Lw-7y~4q2aY!KD7S0+D1Kzdqix_$prfja&szgB znq71dG$N%;xj3@vB-kA)lfa2lZep-_MrJ;m5a9P=m%z^Rt4m0iWfL}yx5cRkAKL7o z;*Wx*)$3TX{QE=JcNu-VGwwwqDnLEc&z_-kvAf5r?Y0Wvja^QyMzObnEo3%!yC=q5THX5rK$TRYp&A}1wn+H-(&SkROYtl;-WrlJGr zKyU$4@1gpcQ}6OyXm}+V)YCB1oENvf| z0$1p}S?-^q>K9dePdK&bsXW29!Kk}8_pr*SmlLWZT(4UoHpMoB&@bZlaqq4(38(Qa zYk%x~SUaZ(&jIIq7!_$ZUSVPU$U=WTlpg9=dkX;gX*ohJwNxQq1@SHnmK5D{GsLc= zu|e67W8FGB#!>L2)|vdt;%IA{m!mVcSMV!N1DepP2W`px7iKPRjLoZNa@rYM;0hMerl>eiO#H;Wlk}iPv^3K#X5qMN01Sb?m_D}lwP%->$wk= z*~si4{Q;hrU36rKqp2w+nW!$vOKsXsLhsR>adAF1*{3Y%~~yTxJheyYpDr z*Xt#_2vMJ)-&7SuJ_L87-9%6Qahm&4&)JAenD^I;$O`$q-;#yqN6kS;eNwbsN*5Xk zX*du~|9Sr7f&W_%Bu%cY@^D?X+I-Fbyxq{=TWIevHvF5qD{l;R?1w;Ij&R MIe_1SPxl@F1r?yM@zSt1 z?1=5}F9OWEum1jEz_*a(=;C6Se3TA#EKe|8d+Q%FX(~u24m}`!nNDO>}R3DorTPNI|5eZFWEiCBzw9IHqb+PDWD}@sMl~;b~W!{w23OS}T z+jPTM%l`iV{~v){6GZar#fZ-(?7f?=6giPiAdrI72JAI9?jdfYK`)V^27x#~_bV=p z@t8sAt8bBFypFB3sx=Lp1Sa1_NY@_E6bitPl{eQHxLDWNl*UAnMQ94O}TNas2zWBMco9h1s?@^>V0@o^VaT&^^0rGpzb5hFj$LOen^hnX?ei~3nMOuNxuL7&qu}KcSToidW|^ib zlYBMpQ8=Tw_bwKjzMq_XV~kp?ky}*)MHQaAFB4oB(naBz<{6p0?jh&w`$bTu-gPMr zE1U54C!s72!UmTUwqoyqO04%V{(WJU_SnKVkmHpH81?3O_qsr3Y=Me3zZq^fR@`nx z1qj-<8wvDUHI;Bm*w^{^#*l|H9k`GW6r@x{tL(N(vsRc7Ns`^n3VBaK3gSZ|Ea^7Q z5|1=1t;CQ-*@Nfc0mZm#ANfJTOH@<&=&bt<;dhW*e$I9n$x2?_Xr)702f|rjrj6Tv zPyqM5y(-=J3;Wt3*&Sy4UO`G1+L3XbzVLx`X+#bJp%+~eO{ZlIq%tgDe)3fHU~$%O zs*9!v>IO=^W>}+Qd*ZvYW`i&57EHD86u`@`oEHt`(?(Qhx63fR$$b>w%GyHY;T^5% zjlZj}i`7H3Je`~rjnxZSuv;8s z$rRII=#gIR*X{`r-l5<)#`ILn*h>!gu^x-_u9cZT`s-xiY*@&g!z|FlWMu9Rsp#RJXw>(y=EtA+gg-E0PrP}1j3$YKy!NEnCzvNL0&~y$$ zAu9!{T9rMy*@GaEGw;;+kpkbgg+fk>W0E!Gq63reH3V90o2RbQT<#G#f|17N#s{%# zmOa=!eah+j3-x(*KR_TgI4}{L`3)9O(eZIiq{jt0aYHbaA6@96(=ZzrtW?r3SrYQi zN5Y#0uM~a)FykkEI2HE$$k=mJZ^rDROcfa=r<)z57Lx4(^`eu5@%Z%^}(DL&E`;kV41L z0>w*lAFGh;yGG450WN)wyXFg@@)tOl=)Ef8h~H#!aE|PZ3FjY-i4II?tC3zsi^+W| z1ectr3+{BW*^-t5dRFC0GzjrqsB@3QTW3#r-g)js+TRjjihy+$857K5#irxx5xZ#m zetLr-ZXqVxH(46kg4S?H+kE`}X^m}iSe6Y!v4e&eKsBb-7X1`nw@q$`UVIXxyiU0d zSH3Wlr*z80*>=_Gs@2oZTuG^$goZQ3#~;f`e((CkR;JuT=K^3bC#C0rFvt7bnF=+F z{JD84v!p7sEmQ{$g6;|2Ks3#Vy8MhHjpLj4m%}58s29Y6o7{<@uG|TMlp@Bz?)D{A zJGyRw9G~boD!@}peFtFL`$7V9s|FS$xwH%B2&{I|cD)dmPHzveZf*pUztV00v%u0urSZAOt!tcDAITynNK&3|J-mv|5hA&}qZ@^Zo%G@FT> zM#JbEE}htKIIKoTSbm-RV9IL$PzDq@=Jg9(69E-F73WUe-O_Amoz;au2e)D#nlCso zk0CucTI`Mx$*{zk+8o$Jenl{gp8%IFqNZ+e0AMr*btxju{_PI zEyAX?>>TZrJjCzZ=CiLOe$Sljp3S$8N%z~8v#|+hhI(1@4dm9REI$@=U@+qqzJ|5B z->!4Aws65yXzuh7dkNK5@_Q=?*r#>GQJG6{j9;on$z{0QF~?kLB;{MN^Kd3C!_J%i zI5NBXQ%%&VZduaUbcr#N$DLJtX`pX#=s4_%a%3xB$77HHRb1*KY_?*@Sg0?u;eQVDO-<)^q5J&3e7Q$Y8jHi?SGc_Xt$!`R0YQZ`f550JF%5@Z zEn!M)+(g_kLM~>t0_nQiR5lZ6X_@-K@}bmX&30vQ;n_leL~=xNL`THbf`*VnU6{Eu z%AxkNRj$mkyVRXz;k8R#iJ+{q8l{r)wcHn2=2BPo4`=kW9YFCb(*%^-|1v}MNRUVBe59p(SifJpF_i_uJyWY3>$w77T zX6&)q;gXqlg~%qJQiO@|_V4wye(a*M zRp3&8lxW~u@79*3ku&B^A5j~JALpN&y}_-OQ{IO#0g-HEZ6a2#OivJ>G_t^DmK;+F zwi_ARio$1D4B?`fU>>e?qYny9tJZ5zIAl!=<#|ul51r~SOT5}Wv!6$gZK^QMYRhhY zO7B2CidqH3L*FtLphu^MEap-7yS%iCV<&5CL=(M5g608EPi!1oG9cf^P=G)V?=R|$ zjc8w7Y1#kqDr|cQ+J|%!zB=6NugA%@GumQslPDWC>e-ZO)ngu?n~T@y`i*ilm; zkR4<{Ka>^Y_5(ulT(+sYUKAp*vHzwJ$NISZHg_{e5vhuN76}8+*X%&?>Sql}!$^0; zJ(~Cwt2sJD5k^TUvuVHsF%L)9$_BX;3It8z8u7?4$l!dca-vC}99Rh+4C8CmiK&fa z3KLoIxRKhzDScKX;&PJrr1)FVcQ|>lgWj)1eHQ)Nu-5Lr)7ap2b%JM-?<5*H5A&(7 zOr(QZe514J6GPtSToS!Qi1J4~j`9RE!XIKrAY;X=Dhm6^N>4MRRlXN{Y=YdnTVm-^ zIm_LNm1>{g>0^$lQ*NE7-f3e1G95i_YdfxKhUbp(T26}#3NDvroJ#Ua@=o$i3J{5b zK2wM4%UqaGQs1EYI9SRTIZqatWKe9jJ5 zQGpBbJ!DZL_iGIJJ^U z92u0>Kkj5mgHW@G9nxk#JMkm(5Yh(e@3d~uFA>#4o{_Cf7;{$tiwh?cU3pL%FKV5jKn zM2jxs3#XeZcV~k4ZQh<1{*tO5t3YK31o9!TB_+*dbo4ww`cd75%OO{~9%peFpcIJK zgV51~J(E_y@_wKl|61g7zav7>nAQ9=5AF)EHPOJv-*`rlKx6-@pLisU+f$q?xo1_K z22rMjwCWsm&z`W%mtgJ?oVN`<_JoPhth&HJQurgfs8d9`>s| z?E_ieG&zh6PjZQ3gnmsEXD1J}x-Cg814P&ScX(6vPU(Ydt`)kSnC#^TBmYTLICCg) z_2$TIYTq3_yzs1NpflxItI%|Ka(8&l>6eXWpreS7+pCLfXSNo@EHbC8D@;ni{UJ1R zk_q!-3Lg-5!pYP>38bFaXCj1Gc!(=yG&?h?KzB7%8av#{%~^6BvO6Ok9_4KU@uN5m zU;g-Hb}<;0qA71hmcRRcsodV3?`xg0TlhuOwU3sD(6&`CcDTif>wQW=>MDWgnRT_(-^xw0-G0BRsX`#(7BWtG73s&kGAz{B!uZwf z2{jLY^Y-ib^Pn9_9hGvZ29Zbk7Uo-18XEMYcpQxh6k%5)G69*0OhW2%FI7S7b}vSP zy&EctO00cR`MTpuSK^euW_zSb_F|B0Z|hEUz)||JTkm;br>;sFc$I?+Vs>?PsY0%akP z6RTpWXsJg2nXE+KM%HND9mB9$7N?zXCSyhL}hY$j7}&IUZVOl8i4o zRW|Uk*FgovWP7S61afP__xg>^pb+91${4!m$I=%@iy+7#K6$=Vaiii>aHC>(0(1>X z_?bq#Tcxp_%237hR0SZ6C2br~%C??@vU|Fv5u%H`^+zt5I{_M`=igZSS5f?l$;{^i z=q*WCLvzen;Cy@Q}-Hos*r`MkC*|7D2)#O+}{D(WD$)fipucyQzr#u8ML86~ip;oA|pdT3v1 z#Om(;OM4#z=5?srp6T&6VKpAd(C6;MTcNJ|+G+v;za61<7Aq9PD5;Di++CfgvT?Lv zfUkBJSZcY)#?jEW+QM2-WNZ6qFn~_m!!{t`<}?X4eqCgCt?Hejk5JvkHo#M~2-1yo zhJO$r-*7uPX(=B#?d4YX-g=M>A3eV}axkcb*6GkpjP?@%>+i7qqURP-NhN)z^2?0< z7r)H=A0mz^f{H<|i(4E9IeDU$+CI_2>W)1|8H*4Q$AC9JM~XYF%VQLBHtudi5uoBKbfv|X1{q0^KbVfW@ZkI&I0rfdsd3&bIYQ= z-Rgrwuj|vyULM2IU24|1nLu>i6U@nWe11!y)2=pr;Do+7RoHvA(g78SxXxa6yE#wf zz5eI;cJ+n}hDtI2+5NIv;n(+86-IYYO#zGl{``%=|1AOqZqiK-)*HUjh5Yx?h3rs5 jc0jS^f2q5*zMcQy2N@35-+@X5fouSOP;jkXKg{?yaXYV~ diff --git a/tests/test_graphical_units/control_data/mobjects/become_no_color_linking.npz b/tests/test_graphical_units/control_data/mobjects/become_no_color_linking.npz new file mode 100644 index 0000000000000000000000000000000000000000..4a0aec213879a4ef4a5c678cfc9e4e0e3d802e96 GIT binary patch literal 9600 zcmeHtX;_ojx^}F)b$6puw;BhgW33Z1sE7!J(AFxg2q>e-B%(wO5HLUzLcrD{RSVc6 zgFuoxL}Um70tCpUARr(KGS87PM8*IC5)zVp>&1P({hgoRb)BD^>jK_sy=$#|J;VLn z>pkzd{%@u*80_!hcMoiHR^JBgzkW8uw!wmL1%_S=xEdH4XciVuSO@zGcKh>P;7J&4 z_M5eTu$e)^Bacq9`P`}Rwx2rM{9m8_n zo1IB+WkKld=a%&^@0A=4p5)Ayg&xi-WDUg()<>UxcWh?o)*q5?Jd1z@^84f$x{yE8ZeO1BR) zU95JtR{t){DVZ&^%%w)OHO{MKU1a4%YBo3>~eQIyXeHZX^~ao?kca!%QZdWQ`3irHTz^W zvcoBx8FathLx{i?)qVS|@h3C_fZ^s&v_L=X9m?|b}Z zh5Xt0uck)D80AYtKi-jnBP7?81pb!5>m*i%k@U8SNdP6`FymbfR~{VLU!gl>OWKxV zm!6Ov)>LyS_iEtB*2SeSU@&BL)@Fm6ci*kA5jk0(L`1$@l@G4B!w&p0Eco1_wtF-A zD}lbfaqN}Fx5dHKKpLqhkhpPU>V|30fAW(>547<3{ThIRTHvRHx+^+Cs#mF#He?_3 zwH*8F2uZG?g#Zk*Ox|UsB`{+5>F`&_RMMYMguSb|yUDw9Jj)~}$`kHvXQ_kk9#<7x zV@q3mG9LsqNbBMs0N|GU(9Cf8pf`TGSFY9LD^A0Ucs4o~!K1ydS~*zx=}P?ON%6f6 zzaB`j6Z^@n`2M^jzE+`EE)JGi-Tc^XwRp1*w=72034d1=VUDYl8az#6x;MJ$vk&@q z95MU-Mw9Y_HW;xXYJ%piXu%AT;$?~v?@Eo*q|iGx;ojElW6L+WRms%t_7<~j-b#xJ zVr7(#!Ye0Cd~f~a7Fz#8D_swR;c8-Oq2)O|$r{86ngaTE+tEV#K*T>}RlViQ81)uC|P>7nNA8us*jqE0r%P zz7oc{PI&wH#N34ogUj`6;~AI!X+}jLH|9w%?UJ^d_(s&(%J<_2)A*w9XAa8w*bjK( zxUf~+TbLe%Ul}urU1|2-dF&g~85r!ku9$sme!8Q;RQVUipH3SnkP>7)f6Q3=5(D~$)G8P6qZ+b<@=~>SmW8bn8hMc=~z}@FJJDEo6 zVjCte8mQ1(9bXNJ3feiC8?*e-bfyXg?_!8F>Q}bXkbHIKVlNE#LFmmHnV4ShkkH-j zIg~^UZ(MC7yXP^t9|PWzgLQ^igyc<|QWPG!b3IjCS;RBAF2#j}f%x*nnRd2(dH$G1 zHB%U^-42ZY_jP_YiSZPBI*0n3`p^{-zuNC5E1)15_bpsA7GSKp*F*h!SzS=j{C#fL zW}4wbNxifblem2c1j0 zMd_^NO_)L-xWGC*azeE>vt;ke#Ws_W{&cC{P^^UxRpqNu%d?+hb$9z^WuJ72C^8G# z>D7r{ToFpJZZ@b2Q|T^69QJQ8*o?^T_RXqOCB`9~LFQbF_96i; z%NAV?R4y85)s5?;b+qMI0tq}Gu4m5^bVG7ugU6%#dK1L_57&5cb9YQ4XR_9YX)LyW zqJj%erCT&|&JDI(DO$OqK*M`Klzi?w{!p~u_yqQj}kD{~m^D*vg5G2n}wm-D-3LF_cti#ttUBiU8 zSQ4mr$!g9?uWskigF?}I$MJ+cOPxfxsh~5e+hbh%B(e0!)gP6%MeDa!6Kx$B5}!j=7?=`O@Ok z_^);LI=p~}6dHO_u3VtplvQ6Fey%?A4fL8sk7aisR`Bp>s*e`)hBT25Cl-7+SpAI= z?hi4qtV-fA;InD>Bji>XtSqg^eD(d9PBSr|zq86~;aoy8E*x%1EG*5vRGweSF9*?o zjO&45dbUXDPs`DVi3RxJ7Q$f|tnZFtIl0NsSgh1OQWvPKJyHzQ47W$9weu-Ev{qWl z%Rk0&pGhyBw1~_TBY%E>0C|CMU~ZPpY^6CW&jH_hgl}j|kvN$$RtnSz4^GeoRg+gb zj-kukZJ&-23Vcv5d3`E+RyhI_)gL;``V970jNiZ&dVJ@jJAX2wAowH#WI!|NH;r^zl6aq^{?(>X9(4ARC)R8mB!&jF9CGy zim=b4=N%GZwhK#I3=l_FIG|}?liG7$zn?>xuviEC7QL&d+z~%sxz}+@1+vZ4NNVUL zgwSO;NM_w~{)$r^H8kIZWYe9{;5ACx5szEF;33*u>_Rm`EV(1)*(WBp{2lgf)XRz1 zJp*z0vB!;t->v@>WgN+|^sXF9Zn8-2WwxWTDu~*-GwlNny9cT+2Y1>Z&OzGgV0e$a zFV}v7qQhVc8BXx?vu0GRxI0g_Z3as%$eF(vkSl1P2I=6@RQR~!LL<1&kr_vwoGM%- z0G@(MnjN&@R7BsX65-125A3qD(aE;*Qj(-+g+Gb0wYKng2Rp?}<;^ucNbY}+M<(FF zeJZX74pc5ahFO3Ae;@0H~+{zRJZ{G&~qHEla@JR&5>NyXssLkI;%X(wy zIf+O}!Tku=C>l8XBT~|AbYZaAi$;1Ss1+`gukSV}cR$@=;6;#5yHU?lCEVEHfw-}1 zh|mxyPf5$nv}!eo^^*`}R%uN?m} zZ+{DS7rQ(9EG4gX{zRuZgI~B9JUwJb+7E;EY%!H;$=+jX?bCF*R*;p36mEFTZMc1l zWR`j41nA8m`XUXv!#@-1E%xD)rNNp4%u;?OAvkCOn!|PY5Poj}Q*_HwiLjmQ>UBG7 zscg@p&4{P_Ls?^%G3q5h*|Z*Tn?x? zck1p$>e+HAhqp2uC8LD<(d|wIx<6r`j#^0*0v;e8mu-;Xgkd0QM&djs5vNr(I~Jmp zUG$Yfk33oI#b;SJx1qPAm#d<~QL>j82=ps00y`^`A)qX5r8BvP*x=~)BQ7MK!p zNNIx5#`4ajpm45|UT+Z&`aSI7M0roY2p6-mmDsvZ&FSuRdx zBV67)+jHB3!o+VD3DI58HKgV!+o;92V6Z0$w`gJ1)vHPb4A$C4dLT*f8poMsK1MkD zRBAP`p}fFTN)w~by9pMKQj813z{x5dd#5o^n*6Z z4O55NDu=4%_Gl>;;FD~V@7gfY4z2iKBo+J6hKw$;UW&bOM_0!;Lbo!&i31+k%YETD z(e0pVlvDWwZdZ`0wqhQ<^&dtUzag|;*Ft_l+gf`feqxwbuCU5=IZL6LA{Kt+!TIy` zi{6*|S;6PbIu~B=lcl0==vawzx)+8M+fkrT_3jS3W6wetI|$wPozbiB?vxgX`taZZ z>=PtPSG3rNv@XbLL-fp_&{EnQVq7bnc=hvy46GTF6!L~LW?@}h-F*NIbR@YTr*YQ_ z6VR#xmohsRV`hXr4jC;QN246}d=3oqTh*dG(fJ_#bv!pVaKR*WxDPF}RE(tL3SA#H zc#d)n7|78NquzZrsV?J|>PfG)@sVP#_Wshgdv(f9?@uuF6l50THGe*7(fj^Cg^hJt z^;m2kunfGjS=Vt&wj=p-*zM(9oL}e)xnw!KA|EGhvJL9QSLF9rvji7U&+|TX06(eu zGOfB^^^4mYW{*4g7=n7Rm4N|9k&UP-)lg0zB~fbXtuM1~`5joCN(EEjt#>#o^!ks~ z4dC_HI^S}erlg8#<0#5gy1$=yd;`i0xCm_w`*uV=WU=O{V(ZbSv^AV~zDEK>Zp^6P zML6siw!zIfM*@hLflQ?1d$EDAq(WkV*iT5W_)3aTF1ORJE_wsT8xTgeqm?c5(8KQ_ zI6yc-OW9IqD($-5B+Daz2G||6jP@#T|Nf<^PcRW6!q}%mCp!NKE&XaZZ<#lq1z?Jv z>A33}s>RN8pm#-ekCl@?{QRk#6Lds%*)kHl`VzXOV?K(OG6iQrHzhAhDuh;@C!@f? z(7Vwp@dL=`T6vu6=o?@v_ulV?`p0noU~paREJ^84$sEyduA!{s6YlLGQavT#I_uvb z+F#n5=LY$AnJ(G3>k+Y@9<~AJ6*cQSv5OV#q(q#y4eoh(i=@I$4Mc%ZCmsjaxqX^nsnoSNKryAg>t6x_MZ7N|RI?*qg@HH`I#3B(G(Cb^ zl*Ef}k#s-y+d?g}-1DT0`A-Jl@po0~_Uz?2mfQ~QMx!0b*0}qJTlc2;&{tm^6kr2&}Lc?vM&#f6%PlzBMjr<;Rr6-9C z<#NmJ=R(&qbnb~qH;E$gTF9I#YDN>a>QBozU_(56V}{gS^B9Vz{b9}BLpTu`SmLbr z@dEdLpI}SKLgSX1oQkRLTp_6KRJUILT0$$ATQnG~MdrDh*com_kkaIIKYsNBt&f76 z%Yc@MfzlE37{~fnvATi<sl-baH2w?XQF4zsb=YCo2UGt*p6H-X=2~5y-O3e_nldu z_Aio@4xa*yG?ugX@RBbN0cEAWTu`lL2!_itEIikLF)9hqU;4fCCsooxDt$L#lmJ27 zmC>f&{GZo_IOpUg9~ z{x1!P^$+fDK1<2HZh`U?jOs`HphVEeK61avn8JU26$g3Iy!fm^uCvpcMbl5EYA=-( zml^W^#h6&9;1vAV0V!*YiGEEzeTcRjS#jk;-U|>sXV{_^v|==s05U1yK012!XkSC3wsdV1>`_%eA}#clO0v*@54kD7ka<%kOFm7~__!;vEo5 zx35P^DPy>|U1fK8x1Tw94ejxP(pk#nucX9`DXVH1A;gx%_tKO}yHX)~cU-k1uA)V) zkadC~575Z$Wl<}4H%%~O-SyxClg?TDWJ)T;Oe7Rew7r%98Aof|0SBpD-1z%XnZtIb ztjQwf-qvbEAUgYwNtK? zCS)?>j!0TvTR>E{iDb+?0?QP)_>2>5&Uu(HJGeG4maY7+qclrpI^H=Kw?u8XmU3c~ zc%eRV;~*F5qTSt+PB45t^Lu+YB!hLDn@?`4>7o-_1l9-ESe+HgwmU)VU;ezznIG2o zW{p6IOgO8zc+Px{5^$$Ny%#RVos+swmQ(HSY$#PiloD`tNaKWn;$$=*NHM2(2Kcd$ zPxo?tfO)DGGGygSJ;U%whu8zrdVyXl)esrzY8V z?dgr(Q>=IS8saaB8yjn;7?PAclmeeP%GF+R znyuUmfz`8XesjS%1q-Zjqk(PYk5C@(pM%S1DT8| zDq%lVr!=?mZxoH>G*oE^=N&xMejaL-1ZyaXYu}IaSO+`rC${s<7R3ZFq^`6V@Z>R^ z24f`S{*z#$V2p*r*Qe_BA|DFEY`Vd+_o>n zU7#3_z>xzz7Ii}WUNLEzX&2*)OM@E4EV~LTb^)X-u`96LRaP57y@ zC=WOcPnUaA^A{wZCFX-$UEG&FQ919G@q3Xf^pKl6W~C-ys@_3WTT1f`<9(&}Q0n=^ zj-4TgG@NEjDG93Cg6S`LOZ1ekJ6t!X#JQ!sO=By>%Z;2Pp!{EmfYaP^ zO=3s%(pHEcpO|di^(UmcJ%v1& z(-0pIQrB=^iopd6LuwHHbXbR;)@y+F9Dk9aMY#xf@|({kp3AI8B%P zygq4IXJz1x^?mGi>1q=04ov`dPuQi39AL9I|8R*5yh2!w zFw-b+s|%L7e8u#v7eD`ZdqLe}RE!iP1Z4huF7a->UF;bGW(%Eaw{IgveSG$e7?2aR z%qKwv%!O)4h5g-MsYQ>sov~~=JsEp?=h3fqMB2ED!OS2j|H892)Oy(Mo44Ljh#|O? z@YrZ^DYp+Wk zFTTJlR|vrF%;&k~h6Bnv?1DCyeo;@smk1R=bx4);LrED9CD>wGokf*bm;P2Wij7U| zgn0AtQukq1a?e)t? zYp@T~7Wsk(VSezK<#YBFU40A#+Qfm!DcffnzG{f^VxH>1ghzszg$dT@JrQ#*+I74KH3=N-~w43}qoD0n-sZ$7C|0#7_i1=?X5@`0VEm7p;`R} zKLAO`AS~;sbxyH#t{4>Zp_I_8!dXZz{uN_+4PSJqxnHJkc#o|)kX71nbb1ay#hhz& z2_ELDDntc8KwJeAZ>w{Fl9|Ajhp8_8uKze8)kRR#Vuc!(^W#xGsurP>OUX*vvlMRy zay0t^*NAsA&=(I>6x?*+Q-yje*U5x?XNU0W5`ii?W#qY9sCYcjvivqc8+?h`rfmTr1A-XjhPsdBw7=^OQYV^A0< zgnWo2ofUV_6X!)@;Tviae``E0s2#=WmNf9yul^(q->+X^+wrsd`^2y7eNq!9+L_^< z9^QDx@C@;L&fp8D73*9^yqyk;N=|TdZmc=lFe;sH$$6ac<qYnY zssXH2y)uunUpx;l;vCaye{t=}sl-LC9oWw_^3$4;9l3qxH+SyPs9#!3*}|KfQp^H& z@}fWfT6}ZVKk!FVcZCr~YobrM3OB3zMn^uR(x?i%=6Zsl-BgZ)^5LF|DS*H>^JUI; zumf5+KxBk#fWsICJADb#kRByI!{WSjA0^{HAKP45KbLT);Vx9Oo%`60%9wW8N%TLL zlbOI*Jm64Q=wRPKqk?v&ZF#u+5}H_A7(h+XF?(Cnl;(Z?x zg0j6B!!R6^!$$sv<8uMnP@Bn2Shv3P$dw=9%Y&>1!^@xc)>j{QSpVlUj{l9X7yk2( zPY7H$(%7GOT=$vj`v3X86!aw&^i|a6{|BhsYo_-1Fd+M^g8@+sX0{JH F`#+z({$KzA literal 0 HcmV?d00001 diff --git a/tests/test_graphical_units/test_mobjects.py b/tests/test_graphical_units/test_mobjects.py index 88e30cacfa..c76c8599d7 100644 --- a/tests/test_graphical_units/test_mobjects.py +++ b/tests/test_graphical_units/test_mobjects.py @@ -15,18 +15,29 @@ def test_PointCloudDot(scene): @frames_comparison def test_become(scene): s = Rectangle(width=2, height=1, color=RED).shift(UP) - d1, d2, d3 = (Dot() for _ in range(3)) + d = Dot() - s1 = s.copy().become(d1, match_width=True).set_opacity(0.25).set_color(BLUE) + s1 = s.copy().become(d, match_width=True).set_opacity(0.25).set_color(BLUE) s2 = ( s.copy() - .become(d2, match_height=True, match_center=True) + .become(d, match_height=True, match_center=True) .set_opacity(0.25) .set_color(GREEN) ) - s3 = s.copy().become(d3, stretch=True).set_opacity(0.25).set_color(YELLOW) + s3 = s.copy().become(d, stretch=True).set_opacity(0.25).set_color(YELLOW) - scene.add(s, d1, d2, d3, s1, s2, s3) + scene.add(s, d, s1, s2, s3) + + +@frames_comparison +def test_become_no_color_linking(scene): + a = Circle() + b = Square() + scene.add(a) + scene.add(b) + b.become(a) + b.shift(1 * RIGHT) + b.set_stroke(YELLOW, opacity=1) @frames_comparison From afe1d18de574c9c20ea8291c9f4e5935eb3221fa Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Mon, 1 Apr 2024 09:50:10 -0400 Subject: [PATCH 40/77] Added some examples for `Mobject`/`VMobject` methods (#3641) * Add examples to mobject+vmobject methods * Add missing import * Separate whitespace to point_from_proportion * Fixes! * Changed example of Mobject.get_color * Remove unneccessary import * Add in import --- manim/mobject/mobject.py | 14 +++++++-- manim/mobject/types/vectorized_mobject.py | 37 +++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index ec9017a94f..ce5c971192 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -882,7 +882,7 @@ def has_time_based_updater(self) -> bool: Returns ------- - class:`bool` + :class:`bool` ``True`` if at least one updater uses the ``dt`` parameter, ``False`` otherwise. @@ -1905,7 +1905,17 @@ def fade(self, darkness: float = 0.5, family: bool = True) -> Self: return self def get_color(self) -> ManimColor: - """Returns the color of the :class:`~.Mobject`""" + """Returns the color of the :class:`~.Mobject` + + Examples + -------- + :: + + >>> from manim import Square, RED + >>> Square(color=RED).get_color() == RED + True + + """ return self.color ## diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index a59f69bafe..5e10fadc64 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -962,6 +962,27 @@ def set_points_as_corners(self, points: Point3D_Array) -> Self: ------- :class:`VMobject` ``self`` + + + Examples + -------- + .. manim:: PointsAsCornersExample + :save_last_frame: + + class PointsAsCornersExample(Scene): + def construct(self): + corners = ( + # create square + UR, UL, + DL, DR, + UR, + # create crosses + DL, UL, + DR + ) + vmob = VMobject(stroke_color=RED) + vmob.set_points_as_corners(corners).scale(2) + self.add(vmob) """ nppcc = self.n_points_per_cubic_curve points = np.array(points) @@ -1387,6 +1408,22 @@ def point_from_proportion(self, alpha: float) -> Point3D: If ``alpha`` is not between 0 and 1. :exc:`Exception` If the :class:`VMobject` has no points. + + Example + ------- + .. manim:: PointFromProportion + :save_last_frame: + + class PointFromProportion(Scene): + def construct(self): + line = Line(2*DL, 2*UR) + self.add(line) + colors = (RED, BLUE, YELLOW) + proportions = (1/4, 1/2, 3/4) + for color, proportion in zip(colors, proportions): + self.add(Dot(color=color).move_to( + line.point_from_proportion(proportion) + )) """ if alpha < 0 or alpha > 1: From ef675b64f063e1b44200d312a1c0a505be1ee068 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Tue, 2 Apr 2024 14:44:41 -0400 Subject: [PATCH 41/77] Fix typehint of `Vector` direction parameter (#3640) * Fix typehint of Vector * Change from Vector to Point in typehint In `TipableVMobject._pointify` it converts a 3D list of the form [x, y, z] to a Vector3D. Therefore the direction parameter can take lists, not just numpy arrays. --- manim/mobject/geometry/line.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 93b0d73bf0..2989dcb44a 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -17,7 +17,6 @@ from typing import TYPE_CHECKING import numpy as np -from typing_extensions import Self from manim import config from manim.constants import * @@ -31,6 +30,8 @@ from manim.utils.space_ops import angle_of_vector, line_intersection, normalize if TYPE_CHECKING: + from typing_extensions import Self + from manim.typing import Point2D, Point3D, Vector3D from manim.utils.color import ParsableManimColor @@ -659,7 +660,9 @@ def construct(self): self.add(plane, vector_1, vector_2) """ - def __init__(self, direction: Vector3D = RIGHT, buff: float = 0, **kwargs) -> None: + def __init__( + self, direction: Point2D | Point3D = RIGHT, buff: float = 0, **kwargs + ) -> None: self.buff = buff if len(direction) == 2: direction = np.hstack([direction, 0]) From c025be65164622b6a5feb74b4faf620adbcc8422 Mon Sep 17 00:00:00 2001 From: Abulafia <44573666+abul4fia@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:46:43 +0200 Subject: [PATCH 42/77] Fix bug in :class:`.VMobjectFromSVGPath` (#3677) * Fixes #3676 * Update manim/mobject/svg/svg_mobject.py Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Fixed problem and added test --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --- manim/mobject/svg/svg_mobject.py | 18 +++-- tests/module/mobject/svg/test_svg_mobject.py | 68 +++++++++++++++++++ .../img_svg_resources/A.svg | 13 ++++ 3 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 tests/test_graphical_units/img_svg_resources/A.svg diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 87cad3bda0..c029daa942 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -510,17 +510,15 @@ def handle_commands(self) -> None: all_points: list[np.ndarray] = [] last_move = None curve_start = None + last_true_move = None - # These lambdas behave the same as similar functions in - # vectorized_mobject, except they add to a list of points instead - # of updating this Mobject's numpy array of points. This way, - # we don't observe O(n^2) behavior for complex paths due to - # numpy's need to re-allocate memory on every append. - def move_pen(pt): - nonlocal last_move, curve_start + def move_pen(pt, *, true_move: bool = False): + nonlocal last_move, curve_start, last_true_move last_move = pt if curve_start is None: curve_start = last_move + if true_move: + last_true_move = last_move if self.n_points_per_curve == 4: @@ -568,7 +566,7 @@ def add_line(start, end): for segment in self.path_obj: segment_class = segment.__class__ if segment_class == se.Move: - move_pen(_convert_point_to_3d(*segment.end)) + move_pen(_convert_point_to_3d(*segment.end), true_move=True) elif segment_class == se.Line: add_line(last_move, _convert_point_to_3d(*segment.end)) elif segment_class == se.QuadraticBezier: @@ -588,8 +586,8 @@ def add_line(start, end): # If the SVG path naturally ends at the beginning of the curve, # we do *not* need to draw a closing line. To account for floating # point precision, we use a small value to compare the two points. - if abs(np.linalg.norm(last_move - curve_start)) > 0.0001: - add_line(last_move, curve_start) + if abs(np.linalg.norm(last_move - last_true_move)) > 0.0001: + add_line(last_move, last_true_move) curve_start = None else: raise AssertionError(f"Not implemented: {segment_class}") diff --git a/tests/module/mobject/svg/test_svg_mobject.py b/tests/module/mobject/svg/test_svg_mobject.py index eba36fb3ab..1d8f6190ef 100644 --- a/tests/module/mobject/svg/test_svg_mobject.py +++ b/tests/module/mobject/svg/test_svg_mobject.py @@ -134,3 +134,71 @@ def test_closed_path_does_not_have_extra_point(): ), decimal=5, ) + + +def test_close_command_closes_last_move_not_the_starting_one(): + # This A.svg is the output of a Text("A") in some systems + # It contains a path that moves from the outer boundary of the A + # to the boundary of the inner triangle, anc then closes the path + # which should close the inner triangle and not the outer boundary. + svg = SVGMobject( + get_svg_resource("A.svg"), + ) + assert len(svg.points) == 0, svg.points + assert len(svg.submobjects) == 1, svg.submobjects + capital_A = svg.submobjects[0] + + # The last point should not be the same as the first point + assert not all(capital_A.points[0] == capital_A.points[-1]) + np.testing.assert_almost_equal( + capital_A.points, + np.array( + [ + [-0.8380339075214888, -1.0, 1.2246467991473532e-16], + [-0.6132152047642527, -0.3333333333333336, 4.082155997157847e-17], + [-0.388396502007016, 0.3333333333333336, -4.082155997157847e-17], + [-0.16357779924977994, 1.0, -1.2246467991473532e-16], + [-0.16357779924977994, 1.0, -1.2246467991473532e-16], + [-0.05425733591657368, 1.0, -1.2246467991473532e-16], + [0.05506312741663405, 1.0, -1.2246467991473532e-16], + [0.16438359074984032, 1.0, -1.2246467991473532e-16], + [0.16438359074984032, 1.0, -1.2246467991473532e-16], + [0.3889336963403905, 0.3333333333333336, -4.082155997157847e-17], + [0.6134838019309422, -0.3333333333333336, 4.082155997157847e-17], + [0.8380339075214923, -1.0, 1.2246467991473532e-16], + [0.8380339075214923, -1.0, 1.2246467991473532e-16], + [0.744560897060354, -1.0, 1.2246467991473532e-16], + [0.6510878865992157, -1.0, 1.2246467991473532e-16], + [0.5576148761380774, -1.0, 1.2246467991473532e-16], + [0.5576148761380774, -1.0, 1.2246467991473532e-16], + [0.49717968849274957, -0.8138597980824822, 9.966907966764229e-17], + [0.4367445008474217, -0.6277195961649644, 7.687347942054928e-17], + [0.3763093132020939, -0.4415793942474466, 5.407787917345625e-17], + [0.3763093132020939, -0.4415793942474466, 5.407787917345625e-17], + [0.12167600863867864, -0.4415793942474466, 5.407787917345625e-17], + [-0.13295729592473662, -0.4415793942474466, 5.407787917345625e-17], + [-0.38759060048815186, -0.4415793942474466, 5.407787917345625e-17], + [-0.38759060048815186, -0.4415793942474466, 5.407787917345625e-17], + [-0.4480257881334797, -0.6277195961649644, 7.687347942054928e-17], + [-0.5084609757788076, -0.8138597980824822, 9.966907966764229e-17], + [-0.5688961634241354, -1.0, 1.2246467991473532e-16], + [-0.5688961634241354, -1.0, 1.2246467991473532e-16], + [-0.6586087447899202, -1.0, 1.2246467991473532e-16], + [-0.7483213261557048, -1.0, 1.2246467991473532e-16], + [-0.8380339075214888, -1.0, 1.2246467991473532e-16], + [0.3021757525699033, -0.21434317946653003, 2.6249468865275272e-17], + [0.1993017037512583, 0.09991949373745423, -1.2236608817799732e-17], + [0.09642765493261184, 0.4141821669414385, -5.072268650087473e-17], + [-0.006446393886033166, 0.7284448401454228, -8.920876418394973e-17], + [-0.006446393886033166, 0.7284448401454228, -8.920876418394973e-17], + [-0.10905185929034443, 0.4141821669414385, -5.072268650087473e-17], + [-0.2116573246946542, 0.09991949373745423, -1.2236608817799732e-17], + [-0.31426279009896546, -0.21434317946653003, 2.6249468865275272e-17], + [-0.31426279009896546, -0.21434317946653003, 2.6249468865275272e-17], + [-0.10878327587600921, -0.21434317946653003, 2.6249468865275272e-17], + [0.09669623834694704, -0.21434317946653003, 2.6249468865275272e-17], + [0.3021757525699033, -0.21434317946653003, 2.6249468865275272e-17], + ] + ), + decimal=5, + ) diff --git a/tests/test_graphical_units/img_svg_resources/A.svg b/tests/test_graphical_units/img_svg_resources/A.svg new file mode 100644 index 0000000000..b8a0bafab4 --- /dev/null +++ b/tests/test_graphical_units/img_svg_resources/A.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 1aad0c7b1af295708950dcffa2c661d33ec1579d Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Tue, 9 Apr 2024 08:22:30 +0200 Subject: [PATCH 43/77] Flake8 rule C901 is about McCabe code complexity (#3673) * Flake8 rule C901 is about McCabe code complexity It is not about flake8-comprehensions. * max-complexity = 29 --- .flake8 | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.flake8 b/.flake8 index 15e385901c..b16c3bf625 100644 --- a/.flake8 +++ b/.flake8 @@ -2,7 +2,7 @@ # Exclude the grpc generated code exclude = ./manim/grpc/gen/*, __pycache__,.git, per-file-ignores = __init__.py:F401 -max-complexity = 15 +max-complexity = 29 max-line-length = 88 statistics = True # Prevents some flake8-rst-docstrings errors @@ -27,9 +27,6 @@ extend-ignore = E203, W503, D202, D212, D213, D404 # Plug-in: flake8-simplify SIM105, SIM106, SIM119, - # Plug-in: flake8-comprehensions - C901 - # Plug-in: flake8-pytest-style PT001, PT004, PT006, PT011, PT018, PT022, PT023, From 7936c7d08a49b02eca1a1fcdfa403aa53a356a17 Mon Sep 17 00:00:00 2001 From: Chin Zhe Ning <108804868+biinnnggggg@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:55:40 +0800 Subject: [PATCH 44/77] Fix broken link to Poetry's installation guide in the first time contributors page (#3692) --- docs/source/contributing/development.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/contributing/development.rst b/docs/source/contributing/development.rst index 03de21642d..d3ef8fadf5 100644 --- a/docs/source/contributing/development.rst +++ b/docs/source/contributing/development.rst @@ -62,7 +62,7 @@ For first-time contributors managing virtual environments. If you choose to use Poetry as well, follow `Poetry's installation - guidelines `__ + guidelines `__ to install it on your system, then run ``poetry install`` from your cloned repository. Poetry will then install Manim, as well as create and enter a virtual environment. You can always re-enter From d62a04f0596c200cb3f2ed48d8bd894c4be13b0b Mon Sep 17 00:00:00 2001 From: Chin Zhe Ning <108804868+biinnnggggg@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:57:40 +0800 Subject: [PATCH 45/77] Fix minor grammatical errors found in the index page of the documentation (#3690) * Fix some minor grammatical errors in the index page of the docs * Fix grammar * Undo uneccessary change in phrasing --- docs/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 8e6d8c2fb6..7afffef4d3 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -30,7 +30,7 @@ in the right place! You can also find information on Manim's docker images and (online) notebook environments there. - Want to try the library before installing it? Take a look at our - interactive online playground at https://try.manim.community in form + interactive online playground at https://try.manim.community in the form of a Jupyter notebook. - In our :doc:`Tutorials ` section you will find a collection of resources that will teach you how to use Manim. In particular, @@ -71,7 +71,7 @@ Here are some short summaries for all of the sections in this documentation: can be found in the :doc:`FAQ ` section. - The :doc:`Reference Manual ` contains a comprehensive list of all of Manim's (documented) modules, classes, and functions. If you are somewhat familiar with Manim's - module structure feel free to browse the manual directly. If you are searching for + module structure, feel free to browse the manual directly. If you are searching for something specific, feel free to use the documentation's search feature in the sidebar. Many classes and methods come with their own illustrated examples too! - The :doc:`Plugins ` page documents how to install, write, and distribute From a6da37b88cb50e1eda0f6e074e8b351f8e0691f5 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:57:55 -0400 Subject: [PATCH 46/77] fix(LICENSE): update year (#3689) --- LICENSE.community | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.community b/LICENSE.community index 8e35bc50b2..c1c149f1eb 100644 --- a/LICENSE.community +++ b/LICENSE.community @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021, the Manim Community Developers +Copyright (c) 2024, the Manim Community Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 294313d683567b4960063c45ab15d5c465e0cc75 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:49:02 -0400 Subject: [PATCH 47/77] Remove deprecated parameters and animations (#3688) * Remove deprecated parameters/animations * Remove test * Remove test data --- manim/animation/indication.py | 11 ------ manim/utils/paths.py | 32 +++++++----------- .../indication/ShowCreationThenFadeOut.npz | Bin 9879 -> 0 bytes tests/test_graphical_units/test_indication.py | 7 ---- 4 files changed, 12 insertions(+), 38 deletions(-) delete mode 100644 tests/test_graphical_units/control_data/indication/ShowCreationThenFadeOut.npz diff --git a/manim/animation/indication.py b/manim/animation/indication.py index db2640d5a5..01a0e619a5 100644 --- a/manim/animation/indication.py +++ b/manim/animation/indication.py @@ -31,7 +31,6 @@ def construct(self): "Flash", "ShowPassingFlash", "ShowPassingFlashWithThinningStrokeWidth", - "ShowCreationThenFadeOut", "ApplyWave", "Circumscribe", "Wiggle", @@ -342,16 +341,6 @@ def __init__(self, vmobject, n_segments=10, time_width=0.1, remover=True, **kwar ) -@deprecated( - since="v0.15.0", - until="v0.16.0", - message="Use Create then FadeOut to achieve this effect.", -) -class ShowCreationThenFadeOut(Succession): - def __init__(self, mobject: Mobject, remover: bool = True, **kwargs) -> None: - super().__init__(Create(mobject), FadeOut(mobject), remover=remover, **kwargs) - - class ApplyWave(Homotopy): """Send a wave through the Mobject distorting it temporarily. diff --git a/manim/utils/paths.py b/manim/utils/paths.py index 9d7ec10d73..4cf867b428 100644 --- a/manim/utils/paths.py +++ b/manim/utils/paths.py @@ -10,28 +10,22 @@ ] -from typing import Callable +from typing import TYPE_CHECKING import numpy as np from ..constants import OUT from ..utils.bezier import interpolate -from ..utils.deprecation import deprecated_params from ..utils.space_ops import rotation_matrix -STRAIGHT_PATH_THRESHOLD = 0.01 +if TYPE_CHECKING: + from manim.typing import PathFuncType, Vector3D + -PATH_FUNC_TYPE = Callable[[np.ndarray, np.ndarray, float], np.ndarray] +STRAIGHT_PATH_THRESHOLD = 0.01 -# Remove `*args` and the `if` inside the functions when removing deprecation -@deprecated_params( - params="start_points, end_points, alpha", - since="v0.14", - until="v0.15", - message="Straight path is now returning interpolating function to make it consistent with other path functions. Use straight_path()(a,b,c) instead of straight_path(a,b,c).", -) -def straight_path(*args) -> PATH_FUNC_TYPE: +def straight_path(): """Simplest path function. Each point in a set goes in a straight path toward its destination. Examples @@ -74,14 +68,12 @@ def construct(self): self.wait() """ - if len(args) > 0: - return interpolate(*args) return interpolate def path_along_circles( - arc_angle: float, circles_centers: np.ndarray, axis: np.ndarray = OUT -) -> PATH_FUNC_TYPE: + arc_angle: float, circles_centers: np.ndarray, axis: Vector3D = OUT +) -> PathFuncType: """This function transforms each point by moving it roughly along a circle, each with its own specified center. The path may be seen as each point smoothly changing its orbit from its starting position to its destination. @@ -158,7 +150,7 @@ def path(start_points: np.ndarray, end_points: np.ndarray, alpha: float): return path -def path_along_arc(arc_angle: float, axis: np.ndarray = OUT) -> PATH_FUNC_TYPE: +def path_along_arc(arc_angle: float, axis: Vector3D = OUT) -> PathFuncType: """This function transforms each point by moving it along a circular arc. Parameters @@ -225,7 +217,7 @@ def path(start_points: np.ndarray, end_points: np.ndarray, alpha: float): return path -def clockwise_path() -> PATH_FUNC_TYPE: +def clockwise_path() -> PathFuncType: """This function transforms each point by moving clockwise around a half circle. Examples @@ -271,7 +263,7 @@ def construct(self): return path_along_arc(-np.pi) -def counterclockwise_path() -> PATH_FUNC_TYPE: +def counterclockwise_path() -> PathFuncType: """This function transforms each point by moving counterclockwise around a half circle. Examples @@ -317,7 +309,7 @@ def construct(self): return path_along_arc(np.pi) -def spiral_path(angle: float, axis: np.ndarray = OUT) -> PATH_FUNC_TYPE: +def spiral_path(angle: float, axis: Vector3D = OUT) -> PathFuncType: """This function transforms each point by moving along a spiral to its destination. Parameters diff --git a/tests/test_graphical_units/control_data/indication/ShowCreationThenFadeOut.npz b/tests/test_graphical_units/control_data/indication/ShowCreationThenFadeOut.npz deleted file mode 100644 index ecd0ebf1b436424be18bd04d877498d42bfddda1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9879 zcmeHNe{33M7(Uw7DT~8t)x^ybW1`uzl|MALv;1(0v(d&CXSN!lutr^z)xt{MCw!vOzpSPG9r4>O@3mA*4k~EC z1Hc&nHL527R6Ld60rQjRBwr?*kNE}$WR{NyP8%*CsoYsdyYG1U+43uV{%0R<{rrVB z?V5XP>08{A-M<5UGR8hvM~hLlg_(RwR^LLOQwOZ(ri(v5)@09Kils3))eC2WFmaSc z5+|~WR1Zp~FgTr>K-GjkyGRE0_H>E~#t|6APe7zitj1kZGn_pk&RjLa1c5<>4o>t) zp=_4doqd|8#$!BU&VZ2%0cbG|kqN39M6#i@gJnuq z9{J^h?bmhRoV|byi8K{MAyd3;>sRfiQ~tvf6Is$epHBusJZ$QZy)>0bB9W|znf1f@ zm=qO^igqw#is|WTVHm>#nYkL+%I0tga}|@x`xo5B+)Ku85G1cDL)=t|*4674?73co z_wv5oBNE)R#TNs|yKhwOSWJ5F>2{ zK}AGC1#Wu=+~mv0q^M9;yn_jJ$mKbZzoJm7@_a$&bW9q@SZ>Vk_eVBHH?w&>Xnu5b zl#{td?1u=&0vg>cl%C2x^p3BA+Byqe^KIwqY}nj_xCbQ{^FqVt`<~+6pGv&DWWZCr zYqQxXfib}5a`RFRQUcyNB8~S1@n}?*xIbChuh;Vyy0wq) zO^r4u4`L*dcEyzn#rDiG6@6l2f~k~BrHnk3<9nN-D#D_oyEpoC>B#gJV0_$IHZ%Ws z_$hF_5~#ylh5!OJCAV|h)TnL{?Q zNL1a}*cdaNkvu#W@KeExq&wcv$7I!Fc4;@>=R^?1@6a-~yTf0gRT@iju2)*^#+*!u zodGH89uLY(2FHromz2Sww>wvdJ9;^n}c8%%kt^=<<~{~oxT6v|vNQ3~wHn#}htAhSug*+wC_mKL&`Pr$?Y`UBERO$+C`TysPGS*^Ur{fj z<&jTyI-T>T9fliWCeL?+?JXP*lolzMeZjTgL)q8FFd~Va%%!DLg;H5ZfPKCj+%!fj z4)_%NC^YD-%*r;o+it@f$8ieYcKfapyjQxOfP!~C9v>E&3-GoIs|~2`nN3J*mQ(Dw zDw6R Date: Thu, 11 Apr 2024 17:56:59 -0400 Subject: [PATCH 48/77] Attempted fix for windows cp1252 encoding failure (#3687) * Attempt to fix windows test * Revert "Attempt to fix windows test" This reverts commit e31c2077cd15ed83f81974c2cc8729f093731da3. * try a different fix * maybe both fixes together? * try adding in CI * Update ci.yml * Update logger_utils.py * maybe needs a dash? * try utf8 again * Remove legacy_windows * try changing test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Try decoding after capturing bytes output * Nicer fix * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .github/workflows/ci.yml | 1 + manim/utils/commands.py | 9 ++++++++- tests/test_logging/test_logging.py | 6 ++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2a06b25cc..b750abb2b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,7 @@ jobs: env: DISPLAY: :0 PYTEST_ADDOPTS: "--color=yes" # colors in pytest + PYTHONIOENCODING: "utf8" strategy: fail-fast: false matrix: diff --git a/manim/utils/commands.py b/manim/utils/commands.py index 2ec9a776dd..bcb205eb6a 100644 --- a/manim/utils/commands.py +++ b/manim/utils/commands.py @@ -14,7 +14,14 @@ def capture(command, cwd=None, command_input=None): - p = run(command, cwd=cwd, input=command_input, capture_output=True, text=True) + p = run( + command, + cwd=cwd, + input=command_input, + capture_output=True, + text=True, + encoding="utf-8", + ) out, err = p.stdout, p.stderr return out, err, p.returncode diff --git a/tests/test_logging/test_logging.py b/tests/test_logging/test_logging.py index 1bbc59de00..ca209482a7 100644 --- a/tests/test_logging/test_logging.py +++ b/tests/test_logging/test_logging.py @@ -43,8 +43,10 @@ def test_error_logging(tmp_path, python_version): str(path_error_scene), ] - _, err, exitcode = capture(command) - assert exitcode != 0 and len(err) > 0 + out, err, exitcode = capture(command) + if err is None: + err = out + assert exitcode != 0 and "Traceback (most recent call last)" in err @logs_comparison( From b7501527009a3749889712e95ac9f2eace0ecc64 Mon Sep 17 00:00:00 2001 From: Chin Zhe Ning <108804868+biinnnggggg@users.noreply.github.com> Date: Fri, 12 Apr 2024 18:42:28 +0800 Subject: [PATCH 49/77] Fix typo (#3696) --- docs/source/contributing/internationalization.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/contributing/internationalization.rst b/docs/source/contributing/internationalization.rst index e960cae660..2033c8b608 100644 --- a/docs/source/contributing/internationalization.rst +++ b/docs/source/contributing/internationalization.rst @@ -28,7 +28,7 @@ Contributing That being said, improving the documentation and making it more accessible is still highly encouraged. And even if your work gets outdated and requires change, you or someone else can simply adjust the translation. -Your efforts are not in vail! +Your efforts are not in vain! Voting From aef81843795ad4e1cd792ff57686dd7d848ce674 Mon Sep 17 00:00:00 2001 From: HairlessVillager <64526732+HairlessVillager@users.noreply.github.com> Date: Sat, 13 Apr 2024 21:02:34 +0800 Subject: [PATCH 50/77] Docs: fix out-dated CLI option in Manim's Output Settings (#3674) * Docs: fix out-dated CLI option in Manim's Output Settings * Docs: more fluent English Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Docs: break lines * Docs: more fluent English * Docs: remove a space Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --- docs/source/tutorials/output_and_config.rst | 33 +++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/docs/source/tutorials/output_and_config.rst b/docs/source/tutorials/output_and_config.rst index 483cd88296..af7961d873 100644 --- a/docs/source/tutorials/output_and_config.rst +++ b/docs/source/tutorials/output_and_config.rst @@ -276,25 +276,28 @@ When executing the command manim -pql scene.py SquareToCircle -it was necessary to specify which ``Scene`` class to render. This is because a -single file can contain more than one ``Scene`` class. If your file contains -multiple ``Scene`` classes, and you want to render them all, you can use the -``-a`` flag. - -As discussed previously, the ``-ql`` specifies low render quality. This does -not look very good, but is very useful for rapid prototyping and testing. The -other options that specify render quality are ``-qm``, ``-qh``, and ``-qk`` for -medium, high, and 4k quality, respectively. +it specifies the scene to render. This is not necessary now. When a single +file contains only one ``Scene`` class, it will just render the ``Scene`` +class. When a single file contains more than one ``Scene`` class, manim will +let you choose a ``Scene`` class. If your file contains multiple ``Scene`` +classes, and you want to render them all, you can use the ``-a`` flag. + +As discussed previously, the ``-ql`` specifies low render quality (854x480 +15FPS). This does not look very good, but is very useful for rapid +prototyping and testing. The other options that specify render quality are +``-qm``, ``-qh``, ``-qp`` and ``-qk`` for medium (1280x720 30FPS), high +(1920x1080 60FPS), 2k (2560x1440 60FPS) and 4k quality (3840x2160 60FPS), +respectively. The ``-p`` flag plays the animation once it is rendered. If you want to open the file browser at the location of the animation instead of playing it, you can use the ``-f`` flag. You can also omit these two flags. Finally, by default manim will output .mp4 files. If you want your animations -in .gif format instead, use the ``-i`` flag. The output files will be in the -same folder as the .mp4 files, and with the same name, but a different file -extension. +in .gif format instead, use the ``--format gif`` flag. The output files will +be in the same folder as the .mp4 files, and with the same name, but a +different file extension. -This was a quick review of some of the most frequent command-line flags. For a -thorough review of all flags available, see the -:doc:`thematic guide on Manim's configuration system `. +This was a quick review of some of the most frequent command-line flags. +For a thorough review of all flags available, see the :doc:`thematic guide on +Manim's configuration system `. From 902c3f42151a816f19abd6424cc17a0305ac7dca Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Sun, 14 Apr 2024 04:31:40 -0400 Subject: [PATCH 51/77] only do actions if try succeeded (#3694) --- manim/cli/render/commands.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/manim/cli/render/commands.py b/manim/cli/render/commands.py index 3ad340ed5e..37e8ffb6b6 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -142,14 +142,14 @@ def __repr__(self): ) except Exception: logger.debug("Something went wrong: %s", warn_prompt) - - stable = json_data["info"]["version"] - if stable != __version__: - console.print( - f"You are using manim version [red]v{__version__}[/red], but version [green]v{stable}[/green] is available.", - ) - console.print( - "You should consider upgrading via [yellow]pip install -U manim[/yellow]", - ) + else: + stable = json_data["info"]["version"] + if stable != __version__: + console.print( + f"You are using manim version [red]v{__version__}[/red], but version [green]v{stable}[/green] is available.", + ) + console.print( + "You should consider upgrading via [yellow]pip install -U manim[/yellow]", + ) return args From 2a4c2da1d78a43a4d32f7fcfdd577d89f94bb042 Mon Sep 17 00:00:00 2001 From: Pavel Zwerschke Date: Sun, 14 Apr 2024 13:56:25 +0200 Subject: [PATCH 52/77] Mention pixi in installation guide (#3678) * Mention pixi in installation guide * Update docs/source/installation/conda.rst Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Benjamin Hackl * Add note --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: Benjamin Hackl --- docs/source/installation.rst | 16 +++++++++++++--- docs/source/installation/conda.rst | 13 ++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 7e91a63c30..9822e3e17a 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -28,8 +28,8 @@ your system's Python, or via Docker). .. _conda-installation: -Installing Manim in conda -************************* +Installing Manim via Conda and related environment managers +*********************************************************** Conda is a package manager for Python that allows creating environments where all your dependencies are stored. Like this, you don't clutter up your PC with @@ -39,6 +39,15 @@ It is a good way to install manim since all dependencies like Also, the installation steps are the same, no matter if you are on Windows, Linux, Intel Macs or on Apple Silicon. +.. NOTE:: + + There are various popular alternatives to Conda like + `mamba `__ / + `micromamba `__, + or `pixi `__. + They all can be used to setup a suitable, isolated environment + for your Manim projects. + The following pages show how to install Manim in a conda environment: .. toctree:: @@ -54,7 +63,8 @@ Installing Manim locally ************************ Manim is a Python library, and it can be -`installed via pip `__. However, +installed via `pip `__ +or `conda `__. However, in order for Manim to work properly, some additional system dependencies need to be installed first. The following pages have operating system specific instructions for you to follow. diff --git a/docs/source/installation/conda.rst b/docs/source/installation/conda.rst index b946b003a0..b69c8d6de6 100644 --- a/docs/source/installation/conda.rst +++ b/docs/source/installation/conda.rst @@ -4,18 +4,21 @@ Conda Required Dependencies --------------------- -To create a conda environment, you must first install -`conda `__ -or `mamba `__, -the two most popular conda clients. +There are several package managers that work with conda packages, +namely `conda `__, +`mamba `__ and `pixi `__. -After installing conda, you can create a new environment and install ``manim`` inside by running +After installing your package manager, you can create a new environment and install ``manim`` inside by running .. code-block:: bash + # using conda or mamba conda create -n my-manim-environment conda activate my-manim-environment conda install -c conda-forge manim + # using pixi + pixi init + pixi add manim Since all dependencies (except LaTeX) are handled by conda, you don't need to worry about needing to install additional dependencies. From 27766127e26668f9097af1a4a94a9b13fd04f565 Mon Sep 17 00:00:00 2001 From: Sir James Clark Maxwell <71722499+SirJamesClarkMaxwell@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:22:36 +0200 Subject: [PATCH 53/77] Fix successive calls of :meth:`.LinearTransformationScene.apply_matrix` (#3675) * docs: improve installation FAQ's * I have potentially resolved the issue when in LinearTransformationScene between two animations of transforming space we invoke the self.wait() * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * added another solutions in comments, added tests and removed wrong files from git * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * yeah , i forgot to save the file xd * fixed the test, removed the comments my in changed file * fix test and speed up test time for test_apply_matrix * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixed the test, removed the comments my in changed file * fixed the test * Revert "docs: improve installation FAQ's" This reverts commit e53a1c8d6f14b77f389f79126f77bbcc48e6f869. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JasonGrace2282 Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --- manim/scene/vector_space_scene.py | 8 ++++++-- tests/test_graphical_units/test_vector_scene.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index d39ce32895..e9304115ef 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -1003,8 +1003,11 @@ def get_piece_movement(self, pieces: list | tuple | np.ndarray): Animation The animation of the movement. """ - start = VGroup(*pieces) - target = VGroup(*(mob.target for mob in pieces)) + + v_pieces = [piece for piece in pieces if isinstance(piece, VMobject)] + start = VGroup(*v_pieces) + target = VGroup(*(mob.target for mob in v_pieces)) + # don't add empty VGroups if self.leave_ghost_vectors and start.submobjects: # start.copy() gives a VGroup of Vectors @@ -1091,6 +1094,7 @@ def apply_matrix(self, matrix: np.ndarray | list | tuple, **kwargs): **kwargs Any valid keyword argument of self.apply_transposed_matrix() """ + self.apply_transposed_matrix(np.array(matrix).T, **kwargs) def apply_inverse(self, matrix: np.ndarray | list | tuple, **kwargs): diff --git a/tests/test_graphical_units/test_vector_scene.py b/tests/test_graphical_units/test_vector_scene.py index 59dfda44a9..75bc1806d1 100644 --- a/tests/test_graphical_units/test_vector_scene.py +++ b/tests/test_graphical_units/test_vector_scene.py @@ -1,6 +1,6 @@ from __future__ import annotations -from manim.scene.vector_space_scene import VectorScene +from manim.scene.vector_space_scene import LinearTransformationScene, VectorScene from manim.utils.testing.frames_comparison import frames_comparison __module_test__ = "vector_scene" @@ -14,3 +14,13 @@ def test_vector_to_coords(scene): scene.add(basis) scene.vector_to_coords(vector=vector) scene.wait() + + +def test_apply_matrix(): + scene = LinearTransformationScene(include_background_plane=False) + scene.setup() + matrix = [[-1, 1], [1, 1]] + # use short runtimes to speed up animation rendering + scene.apply_matrix(matrix, run_time=0.01) + scene.wait() + scene.apply_inverse(matrix, run_time=0.01) From a45c0d4b67fe62380a6cdafa91d943d032dae912 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 21:20:24 +0000 Subject: [PATCH 54/77] Bump actions/cache from 3 to 4 (#3607) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b750abb2b3..8315c02059 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,7 +78,7 @@ jobs: sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 & - name: Setup Cairo Cache - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-cairo if: runner.os == 'Linux' || runner.os == 'macOS' with: @@ -94,7 +94,7 @@ jobs: run: python .github/scripts/ci_build_cairo.py --set-env-vars - name: Setup macOS cache - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-macos if: runner.os == 'macOS' with: @@ -131,7 +131,7 @@ jobs: - name: Setup Windows cache id: cache-windows if: runner.os == 'Windows' - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ github.workspace }}\ManimCache key: ${{ runner.os }}-dependencies-tinytex-${{ hashFiles('.github/manimdependency.json') }}-${{ steps.cache-vars.outputs.date }}-1 From dc0db4124526ca03ece90909ca3f5208872dfadf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 21:50:46 +0000 Subject: [PATCH 55/77] Bump FedericoCarboni/setup-ffmpeg from 2 to 3 (#3608) Bumps [FedericoCarboni/setup-ffmpeg](https://github.com/federicocarboni/setup-ffmpeg) from 2 to 3. - [Release notes](https://github.com/federicocarboni/setup-ffmpeg/releases) - [Commits](https://github.com/federicocarboni/setup-ffmpeg/compare/v2...v3) --- updated-dependencies: - dependency-name: FedericoCarboni/setup-ffmpeg dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .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 8315c02059..731769d721 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: echo "date=$(/bin/date -u "+%m%w%Y")" >> $GITHUB_OUTPUT - name: Install and cache ffmpeg (all OS) - uses: FedericoCarboni/setup-ffmpeg@v2 + uses: FedericoCarboni/setup-ffmpeg@v3 with: token: ${{ secrets.GITHUB_TOKEN }} id: setup-ffmpeg From 04bfa221075166a00eaa11fc9e9f0757f56625d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:18:04 +0000 Subject: [PATCH 56/77] Bump ssciwr/setup-mesa-dist-win from 1 to 2 (#3609) Bumps [ssciwr/setup-mesa-dist-win](https://github.com/ssciwr/setup-mesa-dist-win) from 1 to 2. - [Release notes](https://github.com/ssciwr/setup-mesa-dist-win/releases) - [Commits](https://github.com/ssciwr/setup-mesa-dist-win/compare/v1...v2) --- updated-dependencies: - dependency-name: ssciwr/setup-mesa-dist-win dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .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 731769d721..192b9fae3a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,7 +136,7 @@ jobs: path: ${{ github.workspace }}\ManimCache key: ${{ runner.os }}-dependencies-tinytex-${{ hashFiles('.github/manimdependency.json') }}-${{ steps.cache-vars.outputs.date }}-1 - - uses: ssciwr/setup-mesa-dist-win@v1 + - uses: ssciwr/setup-mesa-dist-win@v2 - name: Install system dependencies (Windows) if: runner.os == 'Windows' && steps.cache-windows.outputs.cache-hit != 'true' From 5139765ff4353d052167b0855deb3efb2e4225c3 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Tue, 16 Apr 2024 21:40:15 -0400 Subject: [PATCH 57/77] docs: update typing guidelines (#3704) * Update typing guidelines * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix formatting * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/contributing/docs/typings.rst | 30 ++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/source/contributing/docs/typings.rst b/docs/source/contributing/docs/typings.rst index 72891b0298..a522b38472 100644 --- a/docs/source/contributing/docs/typings.rst +++ b/docs/source/contributing/docs/typings.rst @@ -18,9 +18,7 @@ https://realpython.com/python-type-checking/#hello-types. Typing standards ~~~~~~~~~~~~~~~~ -Manim uses `mypy`_ to type check its codebase. You will find a list of -configuration values in the ``mypy.ini`` configuration file. - +Manim uses `mypy`_ to type check its codebase. You will find a list of configuration values in the ``mypy.ini`` configuration file. To be able to use the newest typing features not available in the lowest supported Python version, make use of `typing_extensions`_. @@ -91,6 +89,32 @@ Typing guidelines * Use ``typing.Iterable`` whenever the function works with *any* iterable, not a specific type. +* Prefer ``numpy.typing.NDArray`` over ``numpy.ndarray`` + +.. code:: py + + import numpy as np + + if TYPE_CHECKING: + import numpy.typing as npt + + + def foo() -> npt.NDArray[float]: + return np.array([1, 0, 1]) + +* If a method returns ``self``, use ``typing_extensions.Self``. + +.. code:: py + + if TYPE_CHECKING: + from typing_extensions import Self + + + class CustomMobject: + def set_color(self, color: ManimColor) -> Self: + ... + return self + * If the function returns a container of a specific length each time, consider using ``tuple`` instead of ``list``. .. code:: py From f9dc9c7a5bf28179b82c7eb53829daa57043172f Mon Sep 17 00:00:00 2001 From: Daniel Zhu Date: Fri, 19 Apr 2024 04:11:13 -0700 Subject: [PATCH 58/77] Update documentation and typings for `ParametricFunction` (#3703) * Update documentation and typings for ParametricFunction * Use manim tyings Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * fix typings * a few doc fixes * Update manim/mobject/graphing/functions.py Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update typings * remove extraneous line * update example code * add line back for comptibility * import TYPE_CHECKING --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/mobject/graphing/functions.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/manim/mobject/graphing/functions.py b/manim/mobject/graphing/functions.py index 970ddb0ce6..aae20c2e59 100644 --- a/manim/mobject/graphing/functions.py +++ b/manim/mobject/graphing/functions.py @@ -5,7 +5,7 @@ __all__ = ["ParametricFunction", "FunctionGraph", "ImplicitFunction"] -from typing import Callable, Iterable, Sequence +from typing import TYPE_CHECKING, Callable, Iterable, Sequence import numpy as np from isosurfaces import plot_isoline @@ -14,6 +14,10 @@ from manim.mobject.graphing.scale import LinearBase, _ScaleBase from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VMobject + +if TYPE_CHECKING: + from manim.typing import Point2D, Point3D + from manim.utils.color import YELLOW @@ -23,9 +27,9 @@ class ParametricFunction(VMobject, metaclass=ConvertToOpenGL): Parameters ---------- function - The function to be plotted in the form of ``(lambda x: x**2)`` + The function to be plotted in the form of ``(lambda t: (x(t), y(t), z(t)))`` t_range - Determines the length that the function spans. By default ``[0, 1]`` + Determines the length that the function spans in the form of (t_min, t_max, step=0.01). By default ``[0, 1]`` scaling Scaling class applied to the points of the function. Default of :class:`~.LinearBase`. use_smoothing @@ -49,10 +53,10 @@ class ParametricFunction(VMobject, metaclass=ConvertToOpenGL): class PlotParametricFunction(Scene): def func(self, t): - return np.array((np.sin(2 * t), np.sin(3 * t), 0)) + return (np.sin(2 * t), np.sin(3 * t), 0) def construct(self): - func = ParametricFunction(self.func, t_range = np.array([0, TAU]), fill_opacity=0).set_color(RED) + func = ParametricFunction(self.func, t_range = (0, TAU), fill_opacity=0).set_color(RED) self.add(func.scale(3)) .. manim:: ThreeDParametricSpring @@ -61,11 +65,11 @@ def construct(self): class ThreeDParametricSpring(ThreeDScene): def construct(self): curve1 = ParametricFunction( - lambda u: np.array([ + lambda u: ( 1.2 * np.cos(u), 1.2 * np.sin(u), u * 0.05 - ]), color=RED, t_range = np.array([-3*TAU, 5*TAU, 0.01]) + ), color=RED, t_range = (-3*TAU, 5*TAU, 0.01) ).set_shade_in_3d(True) axes = ThreeDAxes() self.add(axes, curve1) @@ -97,8 +101,8 @@ def construct(self): def __init__( self, - function: Callable[[float, float], float], - t_range: Sequence[float] | None = None, + function: Callable[[float], Point3D], + t_range: Point2D | Point3D = (0, 1), scaling: _ScaleBase = LinearBase(), dt: float = 1e-8, discontinuities: Iterable[float] | None = None, @@ -107,7 +111,7 @@ def __init__( **kwargs, ): self.function = function - t_range = [0, 1, 0.01] if t_range is None else t_range + t_range = (0, 1, 0.01) if t_range is None else t_range if len(t_range) == 2: t_range = np.array([*t_range, 0.01]) From 679b89a43f2e10fb126fcf6925f05dc125d931a5 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Fri, 19 Apr 2024 17:42:17 -0400 Subject: [PATCH 59/77] fix(copyright): automate copyright updating for docs (#3708) --- docs/source/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index e488dc9dbc..3910fd7ed1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,6 +8,7 @@ import os import sys +from datetime import datetime from pathlib import Path import manim @@ -25,7 +26,7 @@ # -- Project information ----------------------------------------------------- project = "Manim" -copyright = "2020-2022, The Manim Community Dev Team" +copyright = f"2020-{datetime.now().year}, The Manim Community Dev Team" author = "The Manim Community Dev Team" From f8e3408f9e581d2946c58820acd20e98bd0de69b Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Sat, 20 Apr 2024 10:16:29 -0400 Subject: [PATCH 60/77] Fix some typehints in mobject.py (#3668) * refactor(mobject): fix some typehints * Move typing_extensions import under `if TYPE_CHECKING` * Change from using `def animate(self: T ,...) -> T` to `def animate(self, ...) -> Self` as stated in PEP 673 * Fix incorrect usage of `T` in a method * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * move updaters type alias into TYPE_CHECKING * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/animation/speedmodifier.py | 7 +++++-- manim/mobject/mobject.py | 20 +++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manim/animation/speedmodifier.py b/manim/animation/speedmodifier.py index 9df1c9f018..63b9b2e5b3 100644 --- a/manim/animation/speedmodifier.py +++ b/manim/animation/speedmodifier.py @@ -4,15 +4,18 @@ import inspect import types -from typing import Callable +from typing import TYPE_CHECKING, Callable from numpy import piecewise from ..animation.animation import Animation, Wait, prepare_animation from ..animation.composition import AnimationGroup -from ..mobject.mobject import Mobject, Updater, _AnimationBuilder +from ..mobject.mobject import Mobject, _AnimationBuilder from ..scene.scene import Scene +if TYPE_CHECKING: + from ..mobject.mobject import Updater + __all__ = ["ChangeSpeed"] diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index ce5c971192..73b1920ff6 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -16,10 +16,9 @@ import warnings from functools import partialmethod, reduce from pathlib import Path -from typing import TYPE_CHECKING, Callable, Iterable, Literal, TypeVar, Union +from typing import TYPE_CHECKING, Callable, Iterable, Literal import numpy as np -from typing_extensions import Self, TypeAlias from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL @@ -39,14 +38,9 @@ from ..utils.paths import straight_path from ..utils.space_ops import angle_between_vectors, normalize, rotation_matrix -# TODO: Explain array_attrs - -TimeBasedUpdater: TypeAlias = Callable[["Mobject", float], None] -NonTimeBasedUpdater: TypeAlias = Callable[["Mobject"], None] -Updater: TypeAlias = Union[NonTimeBasedUpdater, TimeBasedUpdater] -T = TypeVar("T", bound="Mobject") - if TYPE_CHECKING: + from typing_extensions import Self, TypeAlias + from manim.typing import ( FunctionOverride, Image, @@ -61,6 +55,10 @@ from ..animation.animation import Animation + TimeBasedUpdater: TypeAlias = Callable[["Mobject", float], object] + NonTimeBasedUpdater: TypeAlias = Callable[["Mobject"], object] + Updater: TypeAlias = NonTimeBasedUpdater | TimeBasedUpdater + class Mobject: """Mathematical Object: base class for objects that can be displayed on screen. @@ -237,7 +235,7 @@ def construct(self): cls.__init__ = cls._original__init__ @property - def animate(self: T) -> _AnimationBuilder | T: + def animate(self) -> _AnimationBuilder | Self: """Used to animate the application of any method of :code:`self`. Any method called on :code:`animate` is converted to an animation of applying @@ -2926,7 +2924,7 @@ def set_z_index( self, z_index_value: float, family: bool = True, - ) -> T: + ) -> Self: """Sets the :class:`~.Mobject`'s :attr:`z_index` to the value specified in `z_index_value`. Parameters From 83957b9c2f180eb959d90b835ed4671b171cd6a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 11:22:37 +0200 Subject: [PATCH 61/77] Bump idna from 3.6 to 3.7 (#3693) Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 85ce76e191..923ac567ee 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.8.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -1329,13 +1329,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] From dff83be61fd0200655f8be41a1f05d7ba0d978e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 11:23:20 +0200 Subject: [PATCH 62/77] Bump pillow from 10.2.0 to 10.3.0 (#3672) Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.2.0 to 10.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/10.2.0...10.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 139 ++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/poetry.lock b/poetry.lock index 923ac567ee..47c813f803 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2684,79 +2684,80 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] From 563810a772494b2ed5ec93d263a0702760fa8839 Mon Sep 17 00:00:00 2001 From: Stefano Ottolenghi Date: Wed, 24 Apr 2024 12:21:37 +0200 Subject: [PATCH 63/77] Fix typo (#3721) --- manim/animation/rotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/animation/rotation.py b/manim/animation/rotation.py index faff411c21..af21fdcbf5 100644 --- a/manim/animation/rotation.py +++ b/manim/animation/rotation.py @@ -59,7 +59,7 @@ class Rotate(Transform): about_point The rotation center. about_edge - If ``about_point``is ``None``, this argument specifies + If ``about_point`` is ``None``, this argument specifies the direction of the bounding box point to be taken as the rotation center. From 0fd16b891879f8a11f9f442d3692953bf2ac78cf Mon Sep 17 00:00:00 2001 From: MontroyJosh <122334909+MontroyJosh@users.noreply.github.com> Date: Wed, 24 Apr 2024 06:37:44 -0400 Subject: [PATCH 64/77] Fixed `Mobject.put_start_and_end_on` with same start and end point (#3718) * fix put_start_and_end_on() at the same point * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/mobject/mobject.py | 3 ++- tests/module/mobject/graphing/test_number_line.py | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 73b1920ff6..40bcd46336 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1734,7 +1734,8 @@ def put_start_and_end_on(self, start: Point3D, end: Point3D) -> Self: curr_start, curr_end = self.get_start_and_end() curr_vect = curr_end - curr_start if np.all(curr_vect == 0): - raise Exception("Cannot position endpoints of closed loop") + self.points = start + return self target_vect = np.array(end) - np.array(start) axis = ( normalize(np.cross(curr_vect, target_vect)) diff --git a/tests/module/mobject/graphing/test_number_line.py b/tests/module/mobject/graphing/test_number_line.py index 3fededfab8..56cd7267ed 100644 --- a/tests/module/mobject/graphing/test_number_line.py +++ b/tests/module/mobject/graphing/test_number_line.py @@ -2,7 +2,7 @@ import numpy as np -from manim import NumberLine +from manim import DashedLine, NumberLine from manim.mobject.text.numbers import Integer @@ -121,3 +121,10 @@ def test_point_to_number(): np.testing.assert_array_equal(np.round(num_1, 4), np.round(expected, 4)) np.testing.assert_array_equal(np.round(num_2, 4), np.round(expected, 4)) np.testing.assert_array_equal(np.round(num_3, 4), np.round(expected, 4)) + + +def test_start_and_end_at_same_point(): + line = DashedLine(np.zeros(3), np.zeros(3)) + line.put_start_and_end_on(np.zeros(3), np.array([0, 0, 0])) + + np.testing.assert_array_equal(np.round(np.zeros(3), 4), np.round(line.points, 4)) From 1aee37bfb5f935fb627c2d4e8328b5ff64946d03 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:11:03 +0200 Subject: [PATCH 65/77] [pre-commit.ci] pre-commit autoupdate (#3332) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.6.0) - [github.com/pycqa/isort: 5.12.0 → 5.13.2](https://github.com/pycqa/isort/compare/5.12.0...5.13.2) - [github.com/asottile/pyupgrade: v3.10.1 → v3.15.2](https://github.com/asottile/pyupgrade/compare/v3.10.1...v3.15.2) - [github.com/psf/black: 23.7.0 → 24.4.0](https://github.com/psf/black/compare/23.7.0...24.4.0) - [github.com/asottile/blacken-docs: 1.15.0 → 1.16.0](https://github.com/asottile/blacken-docs/compare/1.15.0...1.16.0) - [github.com/PyCQA/flake8: 6.1.0 → 7.0.0](https://github.com/PyCQA/flake8/compare/6.1.0...7.0.0) - [github.com/pre-commit/mirrors-mypy: v1.5.1 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.5.1...v1.9.0) - [github.com/codespell-project/codespell: v2.2.5 → v2.2.6](https://github.com/codespell-project/codespell/compare/v2.2.5...v2.2.6) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * make smoothererstep readable again, avoid overlong line * zoom_value more readable * fix blacken-docs touching .github * fix codespell setup, remove unnecessary file, fix some typos * flake8: ignore E704, triggered by overload * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update docs/source/tutorials/quickstart.rst * more flake fixes * try to make blacken-docs happy --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl --- .codespell_ignorelines | 1 - .codespell_ignorewords | 5 ++++ .codespellrc | 6 ++--- .flake8 | 3 +++ .pre-commit-config.yaml | 19 +++++++------- docs/source/contributing/docs/docstrings.rst | 3 +-- docs/source/contributing/docs/typings.rst | 3 +-- docs/source/guides/add_voiceovers.rst | 1 + docs/source/tutorials/quickstart.rst | 2 +- example_scenes/opengl.py | 2 +- manim/_config/logger_utils.py | 1 + manim/_config/utils.py | 6 ++--- manim/animation/animation.py | 1 - manim/animation/composition.py | 1 - manim/animation/fading.py | 1 - manim/animation/indication.py | 2 +- manim/camera/camera.py | 1 - manim/cli/cfg/group.py | 1 + manim/cli/default_group.py | 1 + manim/cli/init/commands.py | 1 + manim/cli/plugins/commands.py | 1 + manim/cli/render/commands.py | 1 + manim/mobject/graphing/coordinate_systems.py | 21 +++++++-------- manim/scene/scene.py | 2 +- manim/scene/three_d_scene.py | 11 ++++---- manim/utils/bezier.py | 27 +++++++------------- manim/utils/color/BS381.py | 1 + manim/utils/color/XKCD.py | 1 + manim/utils/color/core.py | 16 +++++++----- manim/utils/debug.py | 1 - manim/utils/deprecation.py | 5 ++-- manim/utils/docbuild/manim_directive.py | 4 ++- manim/utils/rate_functions.py | 14 +++++----- manim/utils/testing/frames_comparison.py | 12 +++++---- manim/utils/tex_templates.py | 1 + tests/helpers/graphical_units.py | 1 - tests/module/mobject/graphing/test_ticks.py | 8 +++--- tests/module/utils/test_deprecation.py | 8 +++--- tests/test_config.py | 2 +- 39 files changed, 102 insertions(+), 96 deletions(-) delete mode 100644 .codespell_ignorelines create mode 100644 .codespell_ignorewords diff --git a/.codespell_ignorelines b/.codespell_ignorelines deleted file mode 100644 index ae00dfdf8e..0000000000 --- a/.codespell_ignorelines +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.codespell_ignorewords b/.codespell_ignorewords new file mode 100644 index 0000000000..b03acdedca --- /dev/null +++ b/.codespell_ignorewords @@ -0,0 +1,5 @@ + nam + sherif + falsy + medias + strager diff --git a/.codespellrc b/.codespellrc index bbc928a1bb..ca31db7e0e 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,4 @@ [codespell] -exclude-file=.codespell_ignorelines -check-hidden=True -ignore-words-list = nam,sherif,falsy +check-hidden = True +skip = .git,*.js,*.js.map,*.css,*.css.map,*.html,*.po,*.pot,poetry.lock,*.log,*.svg +ignore-words = .codespell_ignorewords diff --git a/.flake8 b/.flake8 index b16c3bf625..b80d86a0fd 100644 --- a/.flake8 +++ b/.flake8 @@ -18,6 +18,9 @@ extend-ignore = E203, W503, D202, D212, D213, D404 # Misc F401, F403, F405, F841, E501, E731, E402, F811, F821, + # multiple statements on one line (overload) + E704, + # Plug-in: flake8-builtins A001, A002, A003, diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aa134edea8..f0cb427122 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ fail_fast: false exclude: ^(manim/grpc/gen/|docs/i18n/) repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: check-ast name: Validate Python @@ -13,7 +13,7 @@ repos: - id: check-toml name: Validate Poetry - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort name: isort (python) @@ -24,7 +24,7 @@ repos: name: isort (pyi) types: [pyi] - repo: https://github.com/asottile/pyupgrade - rev: v3.10.1 + rev: v3.15.2 hooks: - id: pyupgrade name: Update code to new python versions @@ -35,16 +35,17 @@ repos: - id: python-check-blanket-noqa name: Precision flake ignores - repo: https://github.com/psf/black - rev: 23.7.0 + rev: 24.4.0 hooks: - id: black - repo: https://github.com/asottile/blacken-docs - rev: 1.15.0 + rev: 1.16.0 hooks: - id: blacken-docs - additional_dependencies: [black==22.3.0] + additional_dependencies: [black==24.4.0] + exclude: ^\.github/ - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.0.0 hooks: - id: flake8 additional_dependencies: @@ -58,7 +59,7 @@ repos: flake8-simplify==0.14.1, ] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.5.1 + rev: v1.9.0 hooks: - id: mypy additional_dependencies: @@ -72,7 +73,7 @@ repos: files: ^manim/ - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.2.6 hooks: - id: codespell files: ^.*\.(py|md|rst)$ diff --git a/docs/source/contributing/docs/docstrings.rst b/docs/source/contributing/docs/docstrings.rst index 86ee68f81c..5851f5d1ff 100644 --- a/docs/source/contributing/docs/docstrings.rst +++ b/docs/source/contributing/docs/docstrings.rst @@ -77,8 +77,7 @@ Example: The mobject linked to this instance. """ - def __init__(name: str, id: int, singleton: MyClass, mobj: Mobject = None): - ... + def __init__(name: str, id: int, singleton: MyClass, mobj: Mobject = None): ... 2. The usage of ``Parameters`` on functions to specify how every parameter works and what it does. This should be excluded if diff --git a/docs/source/contributing/docs/typings.rst b/docs/source/contributing/docs/typings.rst index a522b38472..befd557a2b 100644 --- a/docs/source/contributing/docs/typings.rst +++ b/docs/source/contributing/docs/typings.rst @@ -84,8 +84,7 @@ Typing guidelines T = TypeVar("T") - def copy(self: T) -> T: - ... + def copy(self: T) -> T: ... * Use ``typing.Iterable`` whenever the function works with *any* iterable, not a specific type. diff --git a/docs/source/guides/add_voiceovers.rst b/docs/source/guides/add_voiceovers.rst index 90a6b30c36..5db74f0ea2 100644 --- a/docs/source/guides/add_voiceovers.rst +++ b/docs/source/guides/add_voiceovers.rst @@ -38,6 +38,7 @@ and then record it during rendering: from manim_voiceover import VoiceoverScene from manim_voiceover.services.recorder import RecorderService + # Simply inherit from VoiceoverScene instead of Scene to get all the # voiceover functionality. class RecorderExample(VoiceoverScene): diff --git a/docs/source/tutorials/quickstart.rst b/docs/source/tutorials/quickstart.rst index bd681add5b..84df97b8af 100644 --- a/docs/source/tutorials/quickstart.rst +++ b/docs/source/tutorials/quickstart.rst @@ -113,7 +113,7 @@ Now let's look at the next two lines: class CreateCircle(Scene): def construct(self): - ... + [...] Most of the time, the code for scripting an animation is entirely contained within the :meth:`~.Scene.construct` method of a :class:`.Scene` class. diff --git a/example_scenes/opengl.py b/example_scenes/opengl.py index b30c5ace29..27f579a6e4 100644 --- a/example_scenes/opengl.py +++ b/example_scenes/opengl.py @@ -406,7 +406,7 @@ def construct(self): self.play(Create(square)) self.wait() - # This opens an iPython termnial where you can keep writing + # This opens an iPython terminal where you can keep writing # lines as if they were part of this construct method. # In particular, 'square', 'circle' and 'self' will all be # part of the local namespace in that terminal. diff --git a/manim/_config/logger_utils.py b/manim/_config/logger_utils.py index e17bc44b8c..e861d3899c 100644 --- a/manim/_config/logger_utils.py +++ b/manim/_config/logger_utils.py @@ -9,6 +9,7 @@ format. """ + from __future__ import annotations import configparser diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 814db08a3e..7ced9c1101 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -9,6 +9,7 @@ See :doc:`/guides/configuration` for an introduction to Manim's configuration system. """ + from __future__ import annotations import argparse @@ -245,8 +246,7 @@ class ManimConfig(MutableMapping): config.background_color = RED - class MyScene(Scene): - ... + class MyScene(Scene): ... the background color will be set to RED, regardless of the contents of ``manim.cfg`` or the CLI arguments used when invoking manim. @@ -1200,7 +1200,7 @@ def from_animation_number(self, value: int) -> None: @property def upto_animation_number(self) -> int: - """Stop rendering animations at this nmber. Use -1 to avoid skipping (-n).""" + """Stop rendering animations at this number. Use -1 to avoid skipping (-n).""" return self._d["upto_animation_number"] @upto_animation_number.setter diff --git a/manim/animation/animation.py b/manim/animation/animation.py index 90290eee3e..106649d36b 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -1,6 +1,5 @@ """Animate mobjects.""" - from __future__ import annotations from manim.mobject.opengl.opengl_mobject import OpenGLMobject diff --git a/manim/animation/composition.py b/manim/animation/composition.py index ff219405f2..3fc2d5f716 100644 --- a/manim/animation/composition.py +++ b/manim/animation/composition.py @@ -1,6 +1,5 @@ """Tools for displaying multiple animations at once.""" - from __future__ import annotations import types diff --git a/manim/animation/fading.py b/manim/animation/fading.py index 33f38a5027..1e98b2c295 100644 --- a/manim/animation/fading.py +++ b/manim/animation/fading.py @@ -12,7 +12,6 @@ def construct(self): """ - from __future__ import annotations __all__ = [ diff --git a/manim/animation/indication.py b/manim/animation/indication.py index 01a0e619a5..bb3f712199 100644 --- a/manim/animation/indication.py +++ b/manim/animation/indication.py @@ -556,7 +556,7 @@ class Circumscribe(Succession): mobject The mobject to be circumscribed. shape - The shape with which to surrond the given mobject. Should be either + The shape with which to surround the given mobject. Should be either :class:`~.Rectangle` or :class:`~.Circle` fade_in Whether to make the surrounding shape to fade in. It will be drawn otherwise. diff --git a/manim/camera/camera.py b/manim/camera/camera.py index 1844b40869..fa36440a17 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -1,6 +1,5 @@ """A camera converts the mobjects contained in a Scene into an array of pixels.""" - from __future__ import annotations __all__ = ["Camera", "BackgroundColoredVMobjectDisplayer"] diff --git a/manim/cli/cfg/group.py b/manim/cli/cfg/group.py index b35e5eb378..346205d89f 100644 --- a/manim/cli/cfg/group.py +++ b/manim/cli/cfg/group.py @@ -5,6 +5,7 @@ group. """ + from __future__ import annotations from ast import literal_eval diff --git a/manim/cli/default_group.py b/manim/cli/default_group.py index 3afb7cecb5..06f1c0520a 100644 --- a/manim/cli/default_group.py +++ b/manim/cli/default_group.py @@ -9,6 +9,7 @@ This library isn't used as a dependency as we need to inherit from ``cloup.Group`` instead of ``click.Group``. """ + import warnings import cloup diff --git a/manim/cli/init/commands.py b/manim/cli/init/commands.py index 33fac1b1d3..1ca5b9c05c 100644 --- a/manim/cli/init/commands.py +++ b/manim/cli/init/commands.py @@ -5,6 +5,7 @@ group. """ + from __future__ import annotations import configparser diff --git a/manim/cli/plugins/commands.py b/manim/cli/plugins/commands.py index 7926f01649..d47325cd03 100644 --- a/manim/cli/plugins/commands.py +++ b/manim/cli/plugins/commands.py @@ -5,6 +5,7 @@ group. """ + from __future__ import annotations import cloup diff --git a/manim/cli/render/commands.py b/manim/cli/render/commands.py index 37e8ffb6b6..5b23ba8fb7 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -5,6 +5,7 @@ can specify options, and arguments for the render command. """ + from __future__ import annotations import http.client diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 9f773626c1..4acc1d9b99 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -1,6 +1,5 @@ """Mobjects that represent coordinate systems.""" - from __future__ import annotations __all__ = [ @@ -441,8 +440,7 @@ def get_line_from_axis_to_point( line_config: dict | None = ..., color: ParsableManimColor | None = ..., stroke_width: float = ..., - ) -> DashedLine: - ... + ) -> DashedLine: ... @overload def get_line_from_axis_to_point( @@ -453,8 +451,7 @@ def get_line_from_axis_to_point( line_config: dict | None = ..., color: ParsableManimColor | None = ..., stroke_width: float = ..., - ) -> LineType: - ... + ) -> LineType: ... def get_line_from_axis_to_point( # type: ignore[no-untyped-def] self, @@ -855,9 +852,11 @@ def plot_surface( function: Callable[[float], float], u_range: Sequence[float] | None = None, v_range: Sequence[float] | None = None, - colorscale: Sequence[ParsableManimColor] - | Sequence[tuple[ParsableManimColor, float]] - | None = None, + colorscale: ( + Sequence[ParsableManimColor] + | Sequence[tuple[ParsableManimColor, float]] + | None + ) = None, colorscale_axis: int = 2, **kwargs: Any, ) -> Surface | OpenGLSurface: @@ -2653,14 +2652,12 @@ def construct(self): def __init__( self, - x_range: Sequence[float] - | None = ( + x_range: Sequence[float] | None = ( -config["frame_x_radius"], config["frame_x_radius"], 1, ), - y_range: Sequence[float] - | None = ( + y_range: Sequence[float] | None = ( -config["frame_y_radius"], config["frame_y_radius"], 1, diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 2a3b37d76f..8f92d215c4 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -287,7 +287,7 @@ def construct(self): Examples -------- A typical manim script includes a class derived from :class:`Scene` with an - overridden :meth:`Scene.contruct` method: + overridden :meth:`Scene.construct` method: .. code-block:: python diff --git a/manim/scene/three_d_scene.py b/manim/scene/three_d_scene.py index 6f9e7a651b..8f49393d03 100644 --- a/manim/scene/three_d_scene.py +++ b/manim/scene/three_d_scene.py @@ -283,16 +283,15 @@ def move_camera( frame_center = frame_center.get_center() frame_center = list(frame_center) + zoom_value = None + if zoom is not None: + zoom_value = config.frame_height / (zoom * cam.height) + for value, method in [ [theta, "theta"], [phi, "phi"], [gamma, "gamma"], - [ - config.frame_height / (zoom * cam.height) - if zoom is not None - else None, - "zoom", - ], + [zoom_value, "zoom"], [frame_center, "frame_center"], ]: if value is not None: diff --git a/manim/utils/bezier.py b/manim/utils/bezier.py index 938e7362b5..d97a2545e1 100644 --- a/manim/utils/bezier.py +++ b/manim/utils/bezier.py @@ -261,13 +261,11 @@ def quadratic_bezier_remap( @overload -def interpolate(start: float, end: float, alpha: float) -> float: - ... +def interpolate(start: float, end: float, alpha: float) -> float: ... @overload -def interpolate(start: Point3D, end: Point3D, alpha: float) -> Point3D: - ... +def interpolate(start: Point3D, end: Point3D, alpha: float) -> Point3D: ... def interpolate( @@ -321,13 +319,11 @@ def integer_interpolate( @overload -def mid(start: float, end: float) -> float: - ... +def mid(start: float, end: float) -> float: ... @overload -def mid(start: Point3D, end: Point3D) -> Point3D: - ... +def mid(start: Point3D, end: Point3D) -> Point3D: ... def mid(start: float | Point3D, end: float | Point3D) -> float | Point3D: @@ -348,18 +344,15 @@ def mid(start: float | Point3D, end: float | Point3D) -> float | Point3D: @overload -def inverse_interpolate(start: float, end: float, value: float) -> float: - ... +def inverse_interpolate(start: float, end: float, value: float) -> float: ... @overload -def inverse_interpolate(start: float, end: float, value: Point3D) -> Point3D: - ... +def inverse_interpolate(start: float, end: float, value: Point3D) -> Point3D: ... @overload -def inverse_interpolate(start: Point3D, end: Point3D, value: Point3D) -> Point3D: - ... +def inverse_interpolate(start: Point3D, end: Point3D, value: Point3D) -> Point3D: ... def inverse_interpolate( @@ -408,8 +401,7 @@ def match_interpolate( old_start: float, old_end: float, old_value: float, -) -> float: - ... +) -> float: ... @overload @@ -419,8 +411,7 @@ def match_interpolate( old_start: float, old_end: float, old_value: Point3D, -) -> Point3D: - ... +) -> Point3D: ... def match_interpolate( diff --git a/manim/utils/color/BS381.py b/manim/utils/color/BS381.py index 5d09a6f1b3..50ae95b96c 100644 --- a/manim/utils/color/BS381.py +++ b/manim/utils/color/BS381.py @@ -24,6 +24,7 @@ .. automanimcolormodule:: manim.utils.color.BS381 """ + from .core import ManimColor BS381_101 = ManimColor("#94BFAC") diff --git a/manim/utils/color/XKCD.py b/manim/utils/color/XKCD.py index d8ee93bac5..db9bccaed3 100644 --- a/manim/utils/color/XKCD.py +++ b/manim/utils/color/XKCD.py @@ -23,6 +23,7 @@ .. automanimcolormodule:: manim.utils.color.XKCD """ + from .core import ManimColor ACIDGREEN = ManimColor("#8FFE09") diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index f4c2e94593..767fdcf576 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -62,7 +62,7 @@ class ManimColor: It's internal representation is a 4 element array of floats corresponding to a [r,g,b,a] value where r,g,b,a can be between 0 to 1. - This is done in order to reduce the amount of color inconsitencies by constantly + This is done in order to reduce the amount of color inconsistencies by constantly casting between integers and floats which introduces errors. The class can accept any value of type :class:`ParsableManimColor` i.e. @@ -473,9 +473,13 @@ def to_hex(self, with_alpha: bool = False) -> str: str A hex string starting with a # with either 6 or 8 nibbles depending on your input, by default 6 i.e #XXXXXX """ - tmp = f"#{int(self._internal_value[0]*255):02X}{int(self._internal_value[1]*255):02X}{int(self._internal_value[2]*255):02X}" + tmp = ( + f"#{int(self._internal_value[0] * 255):02X}" + f"{int(self._internal_value[1] * 255):02X}" + f"{int(self._internal_value[2] * 255):02X}" + ) if with_alpha: - tmp += f"{int(self._internal_value[3]*255):02X}" + tmp += f"{int(self._internal_value[3] * 255):02X}" return tmp def to_hsv(self) -> HSV_Array_Float: @@ -628,8 +632,7 @@ def parse( cls, color: ParsableManimColor | None, alpha: float = ..., - ) -> Self: - ... + ) -> Self: ... @overload @classmethod @@ -637,8 +640,7 @@ def parse( cls, color: Sequence[ParsableManimColor], alpha: float = ..., - ) -> list[Self]: - ... + ) -> list[Self]: ... @classmethod def parse( diff --git a/manim/utils/debug.py b/manim/utils/debug.py index 3e066837e2..d161948147 100644 --- a/manim/utils/debug.py +++ b/manim/utils/debug.py @@ -1,6 +1,5 @@ """Debugging utilities.""" - from __future__ import annotations __all__ = ["print_family", "index_labels"] diff --git a/manim/utils/deprecation.py b/manim/utils/deprecation.py index b72ecc7508..68788a75e7 100644 --- a/manim/utils/deprecation.py +++ b/manim/utils/deprecation.py @@ -233,8 +233,9 @@ def deprecated_params( since: str | None = None, until: str | None = None, message: str | None = "", - redirections: None - | (Iterable[tuple[str, str] | Callable[..., dict[str, Any]]]) = None, + redirections: None | ( + Iterable[tuple[str, str] | Callable[..., dict[str, Any]]] + ) = None, ) -> Callable: """Decorator to mark parameters of a callable as deprecated. diff --git a/manim/utils/docbuild/manim_directive.py b/manim/utils/docbuild/manim_directive.py index 9ed5d0566c..111b40fa4d 100644 --- a/manim/utils/docbuild/manim_directive.py +++ b/manim/utils/docbuild/manim_directive.py @@ -77,6 +77,7 @@ def construct(self): that is rendered in a reference block after the source code. """ + from __future__ import annotations import csv @@ -150,6 +151,7 @@ class ManimDirective(Directive): See the module docstring for documentation. """ + has_content = True required_arguments = 1 optional_arguments = 0 @@ -384,7 +386,7 @@ def _log_rendering_times(*args: tuple[Any]) -> None: f"{key}{f'{time_sum:.3f}'.rjust(7, '.')}s => {len(group)} EXAMPLES", ) for row in group: - print(f"{' '*(max_file_length)} {row[2].rjust(7)}s {row[1]}") + print(f"{' ' * max_file_length} {row[2].rjust(7)}s {row[1]}") print("") diff --git a/manim/utils/rate_functions.py b/manim/utils/rate_functions.py index dec8579692..d3cd79c355 100644 --- a/manim/utils/rate_functions.py +++ b/manim/utils/rate_functions.py @@ -83,7 +83,6 @@ def construct(self): self.wait() """ - from __future__ import annotations __all__ = [ @@ -179,13 +178,12 @@ def smoothererstep(t: float) -> float: The 1st, 2nd and 3rd derivatives (speed, acceleration and jerk) are zero at the endpoints. https://en.wikipedia.org/wiki/Smoothstep """ - return ( - 0 - if t <= 0 - else 35 * t**4 - 84 * t**5 + 70 * t**6 - 20 * t**7 - if t < 1 - else 1 - ) + alpha = 0 + if 0 < t < 1: + alpha = 35 * t**4 - 84 * t**5 + 70 * t**6 - 20 * t**7 + elif t >= 1: + alpha = 1 + return alpha @unit_interval diff --git a/manim/utils/testing/frames_comparison.py b/manim/utils/testing/frames_comparison.py index ea067b64fe..e3814ea696 100644 --- a/manim/utils/testing/frames_comparison.py +++ b/manim/utils/testing/frames_comparison.py @@ -214,11 +214,13 @@ def real_test(): # If you pass a custom renderer to the Scene, the Camera class given as an argument in the Scene # is not passed to the renderer. See __init__ of Scene. # This potentially prevents OpenGL testing. - test_renderer=testRenderer(file_writer_class=file_writer_class) - if base_scene is not ThreeDScene - else testRenderer( - file_writer_class=file_writer_class, - camera_class=ThreeDCamera, + test_renderer=( + testRenderer(file_writer_class=file_writer_class) + if base_scene is not ThreeDScene + else testRenderer( + file_writer_class=file_writer_class, + camera_class=ThreeDCamera, + ) ), # testRenderer(file_writer_class=file_writer_class), ) scene_tested = sceneTested(skip_animations=True) diff --git a/manim/utils/tex_templates.py b/manim/utils/tex_templates.py index 43153f933e..ed9db91c3f 100644 --- a/manim/utils/tex_templates.py +++ b/manim/utils/tex_templates.py @@ -1,4 +1,5 @@ """A library of LaTeX templates.""" + from __future__ import annotations __all__ = [ diff --git a/tests/helpers/graphical_units.py b/tests/helpers/graphical_units.py index b202217b05..75fb00343a 100644 --- a/tests/helpers/graphical_units.py +++ b/tests/helpers/graphical_units.py @@ -1,6 +1,5 @@ """Helpers functions for devs to set up new graphical-units data.""" - from __future__ import annotations import tempfile diff --git a/tests/module/mobject/graphing/test_ticks.py b/tests/module/mobject/graphing/test_ticks.py index 5bc5eb1604..e4bbcd3c67 100644 --- a/tests/module/mobject/graphing/test_ticks.py +++ b/tests/module/mobject/graphing/test_ticks.py @@ -27,9 +27,11 @@ def test_elongated_ticks_float_equality(): default_tick_height, elongated_tick_height = min(tick_heights), max(tick_heights) assert all( - tick.height == elongated_tick_height - if ind in [2, 7] - else tick.height == default_tick_height + ( + tick.height == elongated_tick_height + if ind in [2, 7] + else tick.height == default_tick_height + ) for ind, tick in enumerate(nline.ticks) ) diff --git a/tests/module/utils/test_deprecation.py b/tests/module/utils/test_deprecation.py index 8fb7b9675a..e498b8b196 100644 --- a/tests/module/utils/test_deprecation.py +++ b/tests/module/utils/test_deprecation.py @@ -232,9 +232,11 @@ def quux(self, **kwargs): @deprecated_params( redirections=[ - lambda point2D=1: {"x": point2D[0], "y": point2D[1]} - if isinstance(point2D, tuple) - else {"x": point2D, "y": point2D}, + lambda point2D=1: ( + {"x": point2D[0], "y": point2D[1]} + if isinstance(point2D, tuple) + else {"x": point2D, "y": point2D} + ), ], ) def quuz(self, **kwargs): diff --git a/tests/test_config.py b/tests/test_config.py index b543e8a5e6..ed2f4b59c0 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -221,7 +221,7 @@ def test_tex_template_file(tmp_path): tmp_cfg.write( f""" [CLI] - tex_template_file = { tex_file } + tex_template_file = {tex_file} """, ) tmp_cfg.close() From a4e5233273396d0602c9712bf7bfd591216e2172 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:02:43 -0400 Subject: [PATCH 66/77] fix(autoaliasattr): search for type aliases under if TYPE_CHECKING (#3671) --- manim/utils/docbuild/module_parsing.py | 119 ++++++++++++++++--------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/manim/utils/docbuild/module_parsing.py b/manim/utils/docbuild/module_parsing.py index 46c31d41d0..8ff7c0fe5e 100644 --- a/manim/utils/docbuild/module_parsing.py +++ b/manim/utils/docbuild/module_parsing.py @@ -44,6 +44,10 @@ MANIM_ROOT = Path(__file__).resolve().parent.parent.parent +# In the following, we will use ``type(xyz) is xyz_type`` instead of +# isinstance checks to make sure no subclasses of the type pass the +# check + def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: """Read all files, generate Abstract Syntax Trees from them, and @@ -70,7 +74,7 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: 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[-1] = module_name[-1].removesuffix(".py") module_name = ".".join(module_name) module_content = module_path.read_text(encoding="utf-8") @@ -107,53 +111,84 @@ def parse_module_attributes() -> tuple[AliasDocsDict, DataDict]: data_list.append(data_name) continue - # If we encounter an assignment annotated as "TypeAlias": + # if it's defined under if TYPE_CHECKING + # go through the body of the if statement 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 + # NOTE: This logic does not (and cannot) + # check if the comparison is against a + # variable called TYPE_CHECKING + # It also says that you cannot do the following + # import typing as foo + # if foo.TYPE_CHECKING: + # BAR: TypeAlias = ... + type(node) is ast.If + and ( + ( + # if TYPE_CHECKING + type(node.test) is ast.Name + and node.test.id == "TYPE_CHECKING" + ) + or ( + # if typing.TYPE_CHECKING + type(node.test) is ast.Attribute + and type(node.test.value) is ast.Name + and node.test.value.id == "typing" + and node.test.attr == "TYPE_CHECKING" + ) + ) ): - alias_name = node.target.id - def_node = node.value - # If it's an Union, replace it with vertical bar notation + inner_nodes = node.body + else: + inner_nodes = [node] + + for node in inner_nodes: + # If we encounter an assignment annotated as "TypeAlias": 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.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 ): - definition = " | ".join( - ast.unparse(elem) for elem in def_node.slice.elts - ) + 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) + + definition = definition.replace("npt.", "") + if category_dict is None: + module_dict[""] = {} + category_dict = module_dict[""] + category_dict[alias_name] = {"definition": definition} + alias_info = category_dict[alias_name] + continue + + # If here, the node is not a TypeAlias definition + alias_info = None + + # 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: + target = node.targets[0] else: - definition = ast.unparse(def_node) - - definition = definition.replace("npt.", "") - if category_dict is None: - module_dict[""] = {} - category_dict = module_dict[""] - category_dict[alias_name] = {"definition": definition} - alias_info = category_dict[alias_name] - continue - - # If here, the node is not a TypeAlias definition - alias_info = None - - # 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: - target = node.targets[0] - else: - target = None + target = None - if type(target) is ast.Name: - data_name = target.id - else: - data_name = 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 From c32f0fd83ab549953fee0d2090b8d875ed03ac86 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Wed, 24 Apr 2024 10:52:15 -0400 Subject: [PATCH 67/77] build(deps): read-the-docs sphinx (#3720) --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 74e954fe80..807fb0d3c4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ furo myst-parser -sphinx<5.1 +sphinx>=7.3 sphinx-copybutton sphinxext-opengraph From aa3e2cf54e6e581466e57968524636878aa2e638 Mon Sep 17 00:00:00 2001 From: Greg Rupp Date: Wed, 24 Apr 2024 15:02:13 -0500 Subject: [PATCH 68/77] Fix issue where SpiralIn doesn't show elements. (#3589) * Set SpiralIn to use fill_opacity 1 if not set * Create SpiralIn control data * Create test for SpiralIn * Fix spiralin to separate fill and stroke opacity * resolve opacity issue * fix test data --------- Co-authored-by: Benjamin Hackl --- manim/animation/creation.py | 18 ++++++++++++------ .../control_data/creation/SpiralIn.npz | Bin 0 -> 12527 bytes tests/test_graphical_units/test_creation.py | 8 ++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 tests/test_graphical_units/control_data/creation/SpiralIn.npz diff --git a/manim/animation/creation.py b/manim/animation/creation.py index 6f8173e35a..2e15182bcd 100644 --- a/manim/animation/creation.py +++ b/manim/animation/creation.py @@ -456,7 +456,7 @@ def __init__( fade_in_fraction=0.3, **kwargs, ) -> None: - self.shapes = shapes + self.shapes = shapes.copy() self.scale_factor = scale_factor self.shape_center = shapes.get_center() self.fade_in_fraction = fade_in_fraction @@ -473,15 +473,21 @@ def __init__( def interpolate_mobject(self, alpha: float) -> None: alpha = self.rate_func(alpha) - for shape in self.shapes: + for original_shape, shape in zip(self.shapes, self.mobject): shape.restore() - shape.save_state() - opacity = shape.get_fill_opacity() - new_opacity = min(opacity, alpha * opacity / self.fade_in_fraction) + fill_opacity = original_shape.get_fill_opacity() + stroke_opacity = original_shape.get_stroke_opacity() + new_fill_opacity = min( + fill_opacity, alpha * fill_opacity / self.fade_in_fraction + ) + new_stroke_opacity = min( + stroke_opacity, alpha * stroke_opacity / self.fade_in_fraction + ) shape.shift((shape.final_position - shape.initial_position) * alpha) shape.rotate(TAU * alpha, about_point=self.shape_center) shape.rotate(-TAU * alpha, about_point=shape.get_center_of_mass()) - shape.set_opacity(new_opacity) + shape.set_fill(opacity=new_fill_opacity) + shape.set_stroke(opacity=new_stroke_opacity) class ShowIncreasingSubsets(Animation): diff --git a/tests/test_graphical_units/control_data/creation/SpiralIn.npz b/tests/test_graphical_units/control_data/creation/SpiralIn.npz new file mode 100644 index 0000000000000000000000000000000000000000..7b580600446fa5b5e7132dd6ae24bde7c3db1979 GIT binary patch literal 12527 zcmeHuc~p~G_HEEoR7A8;BOpP=84wVaF+jDYXd$A^GDScIK?sp40RmK6fC7dpEdddN zf`E)MVjv7jN~SI>5F-QGz7_$8LZnAY zzs7rI|8R4}9KC+))aMI1XOwTZEWVO(s?WQ%z3MvuMynwfpVkqxnQ_o$pDt_tFK2fg z{O-Wk{in{tHedI>&yUf)b}WX!eck?dr;LMD%xD#Ty|Q%&OztF~l5pTbv-u?I>GbBz zpp{jhl2ycF26mP@@Fy{Gn<k|p;8@Fyct3i2{`?+l6=^2f1o1Lp1n;naG zqcJjOtC_PO+B;}GZ{_eGE<>iVsHIbHqgS(;Nic)gL-s`WDfd7399y{@G!Pb_Y0P<^ z1tSy?buoCzG~DW;JY((%E|#}UaZb9&GbowqF+A=?SP9<^>HQ=sL)nd~5tCbTqU(s= zud`-~JJhsqG;TD9@eJ}QY0&138%c`HyQr?vZUt9xx3MEe?T zr3r;RoNUZO0_7Mkmsf2~SvKviG!$|UZG3MrW`)w+CD5IoH4S0C&U#4bQTXot*~rv_ z5`~$9Al@DwPT80rYJFf7&xB@RI{c8G53?S-iYh%@wC1w1@;?^; z9Mq`@adI-dW!ItWajC=XwyS{-CX)Q>Kosrvod_obPxPMllR8^{?p%WDK?d|uqUWz~ zx<(klgM7)Th8hv?<`lgQ%G&10N>@Jd^vton=_g+d*}Lr$FFw}G`?W94Om8W4Ac#f^ zc1KTU410Lz#)oWG`CeIraw5bO@&{ccvz)jR?4K*BdG#6TnU&CIt@Qc(^u-Wlaf{us zrK0o3*pM8HI7QXRbh(s9d3M1x8Lr5T)4jLxFndP~^%$owk^izI3x6si+^Ltd+c|x~ zexPGnMTMSS&gD*iAZy?%c5HQR1l ziS#3v1YyY`AJauuGanNP;>EeCxe0NQcuI{!F*HGndtQ6mxlFo3jwYj{C+k0;$MHE4 zwfFLIzb23O+RR5q>9%|QI29A1svZ?EMV{qJOx@>~(HYtfIB2plW6$;&xl_?~B2h|H zQSI4$T%7SNQqDTFd&l|EGJQDy>iTE&FN3V3IF-e=XZj^urp|A*#Opz@XU8lEu4ONW zu1<6l_ZKU{-{c8gjPCx}T*RB_IZmC0pijx~LXAyle%uyE>#8`dsnqG*KE<5E7M^4! z2%;x5a0l=$?cc?4)N#3-?n=|h#UCAYlXdK~?hD|CLB7od4h8GxQ}h{b0a++#_?K`s zQpdFGPf>2-=`H*3C3;^&P|*mdjx#106Ua+N!C)^!iQe-j^qPPEzk)7I19` zA|oix2nHEJO6rK*_#+DO&=XHnO;VWO3rI|ZFngYrsvKmdtdOD=IgxOdTeYF=5%aTZ zyLN_Kol4)i%OFV7_v-jf)THRf4Rbj06YS$Wx#0T=eVp1R)wA&jlQ+b4Js9P4T3eMk z)DWwzXNoZXa+$v$JzpWXOL4>VI(K6DMY5!W<4KXU5MA%@kiLb9ZLSBLJz;Og25zJcc@G@0Su+_RR4}at@4Bbu;94TR-G|147uf)BV#&$<^W%vKn7DG~g0U z79u#pff^h6drlgRa32jnPMB%8Wy<_HKQAs&?<_t?4QPBN%6V+@h$&+(VZe9sd&u)o zYt*Y>`=fs+!1u^3;K1T8OCvQV>l$rh^^=5hKxER;az=!;` zR0j_VN~_@L2H%JO09kmg4Fl7Ihr_}2OusbzLKlpaHhuD@++oy;xV_IFGp|~z^_Cr~ zxlsuplUXRll+bJG`N?q)?tR2WYjPxu7Z1@~Ihc({i>eibN5^|+pbnD@ciM6NDDZwA z8#9!tm~4%$0lwgcon}M|jidhL%s>u(q7jK{UzU?FdXJbkR_qM3q7DSHfVdw#=XB3w zLGZ5x$NGIG>lcnB=PGxl%l?YAo2>M0dn;X^sv!R+2pmvai7iAsx|UyRY;~1UVvP-R zo%u{1>Ajjs$iZS?q$SMKx{kzGGYUEN>~z1(-KmHoD0K7$X{H&znGbKAOB%_0lK2Rm z<6lSFWQKjNSL4;)_34uw&rnU56XuVA3Tu3-;k#shI#HSh6&#u-5gVF{c0+?&_)#+j zUNX;T9m*?WC)`j+U1@=#lTKCY^-6p<-9n_9-}=9n#?lSWEQ$KLo>{dmM3WSiRF*a` zNt_3^%0l<4a(JZR%{?w@GzB`bH6JH{GSKd{D9jE-l3oZ%8D(G*=<17b%iZBk?vCQ8 zb{S`Pw0FNgp#`~`L0=J$k0$6g7Cg0m+_WP}0EhcIlWE^GjVnsz)E9<&!Xduuvk%Bf zZiRL5F0bN&obxR+ODIlVpIyC;c&Yu5$mk1@@I37GAT&L07lV3bEkl-w7q*M%#3tfM z@8behd&B4vKZtps6y4BY>Yp&GE}?3srZIX6rVbCil1uj62IEfHf?Qc{RE%Qr!mD7x`n%lmb0gpI?S$!3s=Dnmibs0M@GlUPK98c}abfH3S{^l~y z(n7?Xd|whONYOS|>UXFP`Uri#^=?sb<$&Ckjg_s!p2-bI@AdeG1I@vK*?71LE5pz>T-TbiRw@ClTh+5CQjkZlQ z4Gwey9I8X-mYtJv_zkC)Hsw6~sJ0%0E+!Jvf75Ao#iQ>fiaSuWJ6?*s)bQaI(fcRN zD4{H%HfmW$lT#DXcNcu5ltc7$rV9O`r6AtQt9wQpQg{OQtTfH=bfk|YFIyrdTWF+U zA&{PJ$oo9)`Z!VJd|B=KRJE;Ygy~nUITmdLHAIC_tEbzkfj7eDDlBJX z)oqU)rtOAIn~J0Q@&S!SR8MCI)_C3Zxv-rcQ(w}I$J%EfOI4Y@FSEXXLqaIl?~_4J13j1RA@xV_lL!Gzgm z8g)q;=hx>>)hbxSPT+Ut;s%;c!kROrgrjziFsw7jx&hP@yZZ1uX8VaIcnxnWjru5* zspp6jyd;-IkQ!o*kI|NW>+WOm7hZcDYKcbNI=0lO?ihW+Vi3bmnN`IK73^BB$P-H&N z_#fWh-n%&qZ546d0o7XbA+ih9ihygXoVTc(lLo$rSbmXhwVe(8`<{dk1=7rXMFrJY zOKv;c6R#hlN&0@#Zp^WOfB$QiZmCx^J{%uS3y#)R&;iktFK%8z&rLV$5JH?LoxUA& zz9)X=A;m}dLrEQ_6t9asKWXsKvr|uST#9X<8R484DXoe0>T-f5%wjFk|2&c?sfSfg zIuZ4;BTl~KfA)*HRKDyZ=I?8;@qB^jIz!G6*ydLgx>eO?df@j5eIcwhB)NjMerBv5 zxnS-MXzG5J>Vw6MVpaIb+k3wPO5ucb=X6(;UW8dt>L{0SVV5o|pZ#{vh~9;P*cMdF z$4scdHP!mUKZi1EUlR%H2oQ)5LvCYVJ9Xst)_-0uv%4)eRTGhBf(ys2;^ettjXtXX znxUUBaB6PbqZuQI0DDgb)#3N0E;<^2pQE`|lGKsal&VLQ1W{ z2$#AKE!J`i6d(V6$rD++xoONyz=M5mk2n@1s;}3HUZTFD=PRoHxIg!ut;Ii9>+Ac8 zEnU3wwrofFk#_CBA0G+Q8u!SP1xj%Led!Uy*S^$3!{6;WxrVFe{!8OOk8}0EXFn{8 zuejshs=jWEF^+^m6_{Ftj)h(rBHP~V$hR@~R^7BhGs{U}WO-y751K68%yu>~ z#%Kz@O-so+{}M)rZ^QexexjXaWd4YBn|@lcYVb1rc8&36Zv7K3L4uT%r|e6?CrlVJ zBci1X38P6n`t>&B4`Cg9sX?9ZJWU=MrQjEqPg~M^K|Lptv1Lvsep}K^`zNL|e-6mf zlRVCXjPfGXdap`Ue|-@wP09{37KpBndM0h8*yT_12vHzZ6eO@k7zYZ z|H^k}6x(0V3A`d|v+Tkh5aFSxUq;&!sa(WZms1Tt!w8Q!^mR~JMp)@e*-2B(OjmA$ z*D#JuXaL39*63&-Z=Z3-=(%rmNZXauRU4)ak~}CM2`~gh64?hT{<+VL2>M*g4-I^b z=GXQ7`Ti(1ia+ETF-iV5TSh@H@v+*78tuqnc8bmm z=tCDC?01w~!rbMK_k%JG{9)YJr?|}sBk(d}4eG0WCg)xf>oAHm)971s%?;|@6w=4= zCgJ04RyBI3nR%jh<4sGi&2@!*Tx^8X5Gh}igrrjsdiYsH?aoW*_gI#N# z{{?k|$+^g{jWBMH&&n`$P8#6p6}Dg`KYqKqACPQB_@B%kj4Ctc(c0IjI(O8}4!=E> zxf=Ac`~$kc@58Sm+0m5PMV#8vwuo@ATm_bjt|kWG`fbZg60w5~0LH@Z@*}Ph!x-L{ z$j+MMQaBDAD89`ddi%hG`KvA?9V?z_Z^Xl-pgZ@a#4k~TRx3@)@=Q+XLzwv6>}iP~ zviaLQ4L<$3MLsVnX`hX@9P?XdV;9U8tgC6G5 zEplJxpsc^X{QuXK+H*W=jvG&3uVC_9tgKq(6~ek9FC!x(DGoX8)^^WWs#^a)sM&ww zuXY~?QW3BKGB>VR)1_P!VDj@tVa*gPkPVmo+Kr^a<@%O|VRSvbI0+zpj4+XMJpcdO zDrnymz&&4+OHR9jeSm)V2*V8-O^r9}tva(b&ywe!t=5kXyW^s=;=}(Ss@8zU7TvOv zQ(=}%foJuD*S95)m$GH4vN)ZyTD7#sNkqAck~kXJJ5ttG19YHlB;30>gEv8=-MZae zwj%tCC87f%*!p#=U-70DB3g8S5?0XaHu zvsdk3d3gb9`NS9dH4BsIrI}`WJ#CfLAvdXLiYjJf2ftiv4FCm_QQRzY3%fMw1vPZ| z9Jf!qS1l@{^A{cOxle_vv=H;vY}pn2T-lW@?d2fy)D!*q$`bk`fty13E^~I>;$0vj ze!s$h0F4FGmaU0jf>)6QALl{?B*_%-Lt;lnf-iKQR17lLg9JURh3!}1@k1&A~n zE<_afN@Xcir7UksXz!%XD+H~-JuhW`ooJ2+r#*AjIuTBnlHCVf$5x?%0)NUP6v{6~ zY0Zph9-G|om*Z$($DWlNQzLT8@LhlM6D7+Wvd6i(4~G`%fMWx&s_9bYKU_XO z+bY(&_lW5-8YzSR2N^Y7BPvmJ^KjS3WEB{bjBy0h*Fj!$J?~Us=6`zVAuLjfo4n_iu98Znx0*2BuQI`n6a7n(0x#p)qV7YHnrjpqZC9a zm1JCcZ?QtQ96G9-i=)8i*Y)pXc-$*WwPn>=kiqH-6B|>i? zpLIJGf#6|Q>Y{Hhj!97jl*TFCrkcOP5MS#l7w0?{TulZC+_H~w(Y1!RO-U6%e4CIg za6o4Aof1K)Kki&mLRhpdQ;ZIGuFg6Wc7Cq2^>tiYSAio zfaq>~gw_S5ord;gwM~mhlC5D({_t(^q()|e^Y30`m(uzxThtLTZ|?gIz-^TL8uzv> z_Q4C!kFS9J$#cIx;yUsK2uH;*_{pWYmft;B`@pF1zAZwt&YCKABLTedsFCaje&Rfk zyoYcgFlQ<%acMiq&UFX3eFv0dE?BZa_%<%QT8$vzaG#sXRCy$@k&gJUi$Qr%cAyQj zS(O;t7uxO5jZ+CAU!RC(G;tBDbMkPb^OVS$B1CHu5`6u5z$Miva=rKJQ?>ltEf$0MU{kSZj*4#ilsF921- zYGwFEU8oM&kHLMv?4T!-_Qp+5k|0F`@F%*hmMPj&9llrpHG<~ZS9nO>?t0-jCY?Y4+55(5>0Q-LDSMaqIv=Z+Y4ZI> z`}#*f_Wf(g6&?|eLTZNWCGGB8zw#d6w5F(sfXb>EVSMv~<)oAEF=6w}(xIToK=6;P zEGjDN2+{?IpRD{G&yQr10X-PX}0i+4Z_>hXnzrpk=J#QQ=-=@Klb8m6L zOMX#NQLgP%>rx7EHPQxZx*fB#smSs)VKKe)3teBstFRofPM}{K)o)YY10ye8H#p;O z0~WCFkGW>OVN2#j3rDF4Q0lFfp(@S2FMwJM!n|btlH;?#CrKInI`a@lSJWcDiM!rd zKQ7LFJ3E$qW8tNUqOlE=wdHx;;cYNG69FbbEz%6lx$nWPPF35I?`>rX9)Z+q=y6HR zYQ3qKcQ84(`mlV!W<=$UX!P>JfOJr%mxC`ITWFH}@O z#oBdZ|7=l51=#35dGe}z*W{HUyw;1{2D}=?FhL^YMN1g%o-Lo>4Md9sOyWdGd3lGx zU`sr_ zry_yooE;|2GBKSGk$E2WU}`tM%;&Or<+HT7owC?U=&p>PnNX9K3Pk8Kkl{53+w!R} z$h14ry2gJr-ILNS2`*JA>gx6lEo}x3%T*`pzMkmLccSF@uvk^a`h#q>7^*t1i1P+x zj~;4i7Il`YGN=#vF5#w}+n~VPW|g^}L&Cc0;u4sqM*i6X8;I-cIZX|gVp2q4-7;@g zip2@7meRsEk%ZfL>Wryy0;ytF)j`)cO$gQtRfH$-q;@osLV5(QZ+%(yGN$Ngq_L$=!XB z=gv}O{%G;=XuZ=B@5}PmS^7C-$32qN1j$T!l8WkKJ1%wqeT+lC1qN&S@J5(3~IItT9fpt-E4V{^Q1%U zT;=KGF&vK%zomTGbK6}C8=}7o)VW@u9{0)vLNopTpv>xcS+YYlUjP`5cGLv_NnbK^ z-g5vgCX43^f@-b+>gWu1w8B~q3ZzJ~bUU>%(&OLrr!sw3S(P@x#|`>DaY~JQL1`A*C+k1e2kPK z2mYVtgK!RW=;Am|uxNKPV;6h1-%$0ONde)a*3<^js3l6dUOX~uXiF+P?e05lc0S1% zFX?YAI7bVY%!a%eM+pt{@*HJam_WV~J+YjHdZpu8L9ZOf@jw|6YmR<|PRPl1#~q=a zCjo)m0{SmMf;}g?@Yc8x@Xo&t2@B4xMhM7CboCLOyqO8cpeC@PrckwPH_4dgmy8k? z);(KDZ&gP?qI?0jnd9t=uMLsAWj{kE754sZO~8(i0OlvW1>7pq#_tmA!#R7iP%S@+ z)e|%gwPZd7$k+VoVhbvy(ih}6;mF8Vpx);l4yyILR_#@@mYJr1X6Za9>dupj0l}*b z2cjUC;}sz_z4+Z-a&8y?%dXJ=MoJQIEvH>&gr6rx4%#MnQNEfMrmk7%Xba?iO9Zwx zuJE350_m|Y1|QxkbR@Vbn|70O-fIkm07g9aB{I+sO7CpC08elV)<>98YXf>!K6{2rREwo4xT4LJudzUMwYmIw0tqsi9;oMtBN`M}ijY z!FETW89cps&!rZ)bTnpvDQq{iZ4rKRHWaY2tQJ7$F81{4v+M~1L)%v2n!6!qWlCn| zcnluXnx4xY8*B}Mdlz;sw`mpmQ4d=nKR};ruG|I9*I$kcb2?NDe8YN@#Q^%-mX$~C zA#lZsMAghQ#8SZ}`)ci{rUg#X6i&O7bQqxVV;=mcI^PzdaGtW|uiA&ePbirmX|C+T&W?2k4mLim!gN1dIl9zm-2>xH#v_YI zFcn1bEpm2o8ST=rkrW1jUg|1aW+B~90SHO7n|}~7n3q=Jj+DA9835vvwm*lgI_1Gy`&mgvrCwvg{^54rF@Ayr}}MozE<{Xpch# zcIfy8Kw9BJjK%`)Ga$TzY8l9|wv7U*pg-oOU>-7qyrVf7Z05yD0)a1j0`~D)$2-1v zF08dYK=R;@KGD4}8ne>iRS*ZL9#`c_$sVj7Ey6@wxcRs!g}#F)=+$oDl}2%2Et-2928^YvPr%uJ*pYdlfL{ zR}aZhE^rjZNks-=-ZT-Y*DscikJf^gKt=um^9IJu6tCu2>X|c@z*^*qTX_3oz`bvK zOqO#eXE!yB@gi^;v`>H%yT>~zjPZ)PTr3|mRp!U*kctb5*e%k+3b0t(eZBf;!2dXc z{L(QilG?V~OI_S+^rX`6PCf=u$8(XotQIlkH&$&qm(lYlu!)VHj&Ngm+n~0cb4Ajt z-a>vvZCk9aAZXO<F9#fX&k)jZU(vr-Gg32!}Xu^tze&R#%|BW zs#hmcCm#T$OH64}aH)SNoOQNR*8upKOp`Qxm|)HT4y^k(Byomw(N`>G*6m#XfBSgCzs4LR cBmMn<|FFUp%MBZ)f0Y6MOu+w{YadwnUo8d1y#N3J literal 0 HcmV?d00001 diff --git a/tests/test_graphical_units/test_creation.py b/tests/test_graphical_units/test_creation.py index c6cfc3e504..bcab0bafa4 100644 --- a/tests/test_graphical_units/test_creation.py +++ b/tests/test_graphical_units/test_creation.py @@ -94,3 +94,11 @@ def test_z_index_introducer(scene): b.set_z_index(-1) scene.play(Create(b)) scene.wait() + + +@frames_comparison(last_frame=False) +def test_SpiralIn(scene): + circle = Circle().shift(LEFT) + square = Square().shift(UP) + shapes = VGroup(circle, square) + scene.play(SpiralIn(shapes)) From a3adcaaab364b3fbd97b273881b2e222264e96aa Mon Sep 17 00:00:00 2001 From: Nikhil Iyer Date: Wed, 24 Apr 2024 17:33:44 -0400 Subject: [PATCH 69/77] Clean Graph layouts and increase flexibility (#3434) * allow user-defined layout functions for Graph + fixup type annotations * only pass relevant args * write tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * change_layout forward root_vertex and partitions - deduplicated layout code in __init__ and change_layout - fixed change_layout backwards compatibility * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add test for change_layout * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix copy/paste error * fix * fixup types for CodeQL * static type the Layout Names * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix dynamic union type for Python 3.9 * add example scenes to LayoutFunction protocol documentation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Replace references to np.ndarray with standard Manim types * Label NxGraph as a TypeAlias * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tristan Schulz Co-authored-by: Benjamin Hackl --- manim/mobject/graph.py | 482 ++++++++++++++++++++++------- tests/module/mobject/test_graph.py | 68 ++++ 2 files changed, 444 insertions(+), 106 deletions(-) diff --git a/manim/mobject/graph.py b/manim/mobject/graph.py index 12082d5ad4..dda52de770 100644 --- a/manim/mobject/graph.py +++ b/manim/mobject/graph.py @@ -9,10 +9,11 @@ import itertools as it from copy import copy -from typing import Hashable, Iterable +from typing import Any, Hashable, Iterable, Literal, Protocol, Union, cast import networkx as nx import numpy as np +from typing_extensions import TypeAlias from manim.animation.composition import AnimationGroup from manim.animation.creation import Create, Uncreate @@ -23,91 +24,296 @@ from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.text.tex_mobject import MathTex from manim.mobject.types.vectorized_mobject import VMobject +from manim.typing import Point3D from manim.utils.color import BLACK +NxGraph: TypeAlias = Union[nx.classes.graph.Graph, nx.classes.digraph.DiGraph] -def _determine_graph_layout( - nx_graph: nx.classes.graph.Graph | nx.classes.digraph.DiGraph, - layout: str | dict = "spring", - layout_scale: float = 2, - layout_config: dict | None = None, - partitions: list[list[Hashable]] | None = None, - root_vertex: Hashable | None = None, -) -> dict: - automatic_layouts = { - "circular": nx.layout.circular_layout, - "kamada_kawai": nx.layout.kamada_kawai_layout, - "planar": nx.layout.planar_layout, - "random": nx.layout.random_layout, - "shell": nx.layout.shell_layout, - "spectral": nx.layout.spectral_layout, - "partite": nx.layout.multipartite_layout, - "tree": _tree_layout, - "spiral": nx.layout.spiral_layout, - "spring": nx.layout.spring_layout, - } - - custom_layouts = ["random", "partite", "tree"] - if layout_config is None: - layout_config = {} +class LayoutFunction(Protocol): + """A protocol for automatic layout functions that compute a layout for a graph to be used in :meth:`~.Graph.change_layout`. - if isinstance(layout, dict): - return layout - elif layout in automatic_layouts and layout not in custom_layouts: - auto_layout = automatic_layouts[layout]( - nx_graph, scale=layout_scale, **layout_config - ) - # NetworkX returns a dictionary of 3D points if the dimension - # is specified to be 3. Otherwise, it returns a dictionary of - # 2D points, so adjusting is required. - if layout_config.get("dim") == 3: - return auto_layout - else: - return {k: np.append(v, [0]) for k, v in auto_layout.items()} - elif layout == "tree": - return _tree_layout( - nx_graph, root_vertex=root_vertex, scale=layout_scale, **layout_config - ) - elif layout == "partite": - if partitions is None or len(partitions) == 0: - raise ValueError( - "The partite layout requires the 'partitions' parameter to contain the partition of the vertices", - ) - partition_count = len(partitions) - for i in range(partition_count): - for v in partitions[i]: - if nx_graph.nodes[v] is None: - raise ValueError( - "The partition must contain arrays of vertices in the graph", - ) - nx_graph.nodes[v]["subset"] = i - # Add missing vertices to their own side - for v in nx_graph.nodes: - if "subset" not in nx_graph.nodes[v]: - nx_graph.nodes[v]["subset"] = partition_count - - auto_layout = automatic_layouts["partite"]( - nx_graph, scale=layout_scale, **layout_config - ) - return {k: np.append(v, [0]) for k, v in auto_layout.items()} - elif layout == "random": - # the random layout places coordinates in [0, 1) - # we need to rescale manually afterwards... - auto_layout = automatic_layouts["random"](nx_graph, **layout_config) - for k, v in auto_layout.items(): - auto_layout[k] = 2 * layout_scale * (v - np.array([0.5, 0.5])) - return {k: np.append(v, [0]) for k, v in auto_layout.items()} - else: + .. note:: The layout function must be a pure function, i.e., it must not modify the graph passed to it. + + Examples + -------- + + Here is an example that arranges nodes in an n x m grid in sorted order. + + .. manim:: CustomLayoutExample + :save_last_frame: + + class CustomLayoutExample(Scene): + def construct(self): + import numpy as np + import networkx as nx + + # create custom layout + def custom_layout( + graph: nx.Graph, + scale: float | tuple[float, float, float] = 2, + n: int | None = None, + *args: tuple[Any, ...], + **kwargs: dict[str, Any], + ): + nodes = sorted(list(graph)) + height = len(nodes) // n + return { + node: (scale * np.array([ + (i % n) - (n-1)/2, + -(i // n) + height/2, + 0 + ])) for i, node in enumerate(graph) + } + + # draw graph + n = 4 + graph = Graph( + [i for i in range(4 * 2 - 1)], + [(0, 1), (0, 4), (1, 2), (1, 5), (2, 3), (2, 6), (4, 5), (5, 6)], + labels=True, + layout=custom_layout, + layout_config={'n': n} + ) + self.add(graph) + + Several automatic layouts are provided by manim, and can be used by passing their name as the ``layout`` parameter to :meth:`~.Graph.change_layout`. + Alternatively, a custom layout function can be passed to :meth:`~.Graph.change_layout` as the ``layout`` parameter. Such a function must adhere to the :class:`~.LayoutFunction` protocol. + + The :class:`~.LayoutFunction` s provided by manim are illustrated below: + + - Circular Layout: places the vertices on a circle + + .. manim:: CircularLayout + :save_last_frame: + + class CircularLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="circular", + labels=True + ) + self.add(graph) + + - Kamada Kawai Layout: tries to place the vertices such that the given distances between them are respected + + .. manim:: KamadaKawaiLayout + :save_last_frame: + + class KamadaKawaiLayout(Scene): + def construct(self): + from collections import defaultdict + distances: dict[int, dict[int, float]] = defaultdict(dict) + + # set desired distances + distances[1][2] = 1 # distance between vertices 1 and 2 is 1 + distances[2][3] = 1 # distance between vertices 2 and 3 is 1 + distances[3][4] = 2 # etc + distances[4][5] = 3 + distances[5][6] = 5 + distances[6][1] = 8 + + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1)], + layout="kamada_kawai", + layout_config={"dist": distances}, + layout_scale=4, + labels=True + ) + self.add(graph) + + - Partite Layout: places vertices into distinct partitions + + .. manim:: PartiteLayout + :save_last_frame: + + class PartiteLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="partite", + layout_config={"partitions": [[1,2],[3,4],[5,6]]}, + labels=True + ) + self.add(graph) + + - Planar Layout: places vertices such that edges do not cross + + .. manim:: PlanarLayout + :save_last_frame: + + class PlanarLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="planar", + layout_scale=4, + labels=True + ) + self.add(graph) + + - Random Layout: randomly places vertices + + .. manim:: RandomLayout + :save_last_frame: + + class RandomLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="random", + labels=True + ) + self.add(graph) + + - Shell Layout: places vertices in concentric circles + + .. manim:: ShellLayout + :save_last_frame: + + class ShellLayout(Scene): + def construct(self): + nlist = [[1, 2, 3], [4, 5, 6, 7, 8, 9]] + graph = Graph( + [1, 2, 3, 4, 5, 6, 7, 8, 9], + [(1, 2), (2, 3), (3, 1), (4, 1), (4, 2), (5, 2), (6, 2), (6, 3), (7, 3), (8, 3), (8, 1), (9, 1)], + layout="shell", + layout_config={"nlist": nlist}, + labels=True + ) + self.add(graph) + + - Spectral Layout: places vertices using the eigenvectors of the graph Laplacian (clusters nodes which are an approximation of the ratio cut) + + .. manim:: SpectralLayout + :save_last_frame: + + class SpectralLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="spectral", + labels=True + ) + self.add(graph) + + - Sprial Layout: places vertices in a spiraling pattern + + .. manim:: SpiralLayout + :save_last_frame: + + class SpiralLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="spiral", + labels=True + ) + self.add(graph) + + - Spring Layout: places nodes according to the Fruchterman-Reingold force-directed algorithm (attempts to minimize edge length while maximizing node separation) + + .. manim:: SpringLayout + :save_last_frame: + + class SpringLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6], + [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], + layout="spring", + labels=True + ) + self.add(graph) + + - Tree Layout: places vertices into a tree with a root node and branches (can only be used with legal trees) + + .. manim:: TreeLayout + :save_last_frame: + + class TreeLayout(Scene): + def construct(self): + graph = Graph( + [1, 2, 3, 4, 5, 6, 7], + [(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7)], + layout="tree", + layout_config={"root_vertex": 1}, + labels=True + ) + self.add(graph) + + """ + + def __call__( + self, + graph: NxGraph, + scale: float | tuple[float, float, float] = 2, + *args: tuple[Any, ...], + **kwargs: dict[str, Any], + ) -> dict[Hashable, Point3D]: + """Given a graph and a scale, return a dictionary of coordinates. + + Parameters + ---------- + graph : NxGraph + The underlying NetworkX graph to be laid out. DO NOT MODIFY. + scale : float | tuple[float, float, float], optional + Either a single float value, or a tuple of three float values specifying the scale along each axis. + + Returns + ------- + dict[Hashable, Point3D] + A dictionary mapping vertices to their positions. + """ + ... + + +def _partite_layout( + nx_graph: NxGraph, + scale: float = 2, + partitions: list[list[Hashable]] | None = None, + **kwargs: dict[str, Any], +) -> dict[Hashable, Point3D]: + if partitions is None or len(partitions) == 0: raise ValueError( - f"The layout '{layout}' is neither a recognized automatic layout, " - "nor a vertex placement dictionary.", + "The partite layout requires partitions parameter to contain the partition of the vertices", ) + partition_count = len(partitions) + for i in range(partition_count): + for v in partitions[i]: + if nx_graph.nodes[v] is None: + raise ValueError( + "The partition must contain arrays of vertices in the graph", + ) + nx_graph.nodes[v]["subset"] = i + # Add missing vertices to their own side + for v in nx_graph.nodes: + if "subset" not in nx_graph.nodes[v]: + nx_graph.nodes[v]["subset"] = partition_count + + return nx.layout.multipartite_layout(nx_graph, scale=scale, **kwargs) + + +def _random_layout(nx_graph: NxGraph, scale: float = 2, **kwargs: dict[str, Any]): + # the random layout places coordinates in [0, 1) + # we need to rescale manually afterwards... + auto_layout = nx.layout.random_layout(nx_graph, **kwargs) + for k, v in auto_layout.items(): + auto_layout[k] = 2 * scale * (v - np.array([0.5, 0.5])) + return {k: np.append(v, [0]) for k, v in auto_layout.items()} def _tree_layout( - T: nx.classes.graph.Graph | nx.classes.digraph.DiGraph, - root_vertex: Hashable | None, + T: NxGraph, + root_vertex: Hashable | None = None, scale: float | tuple | None = 2, vertex_spacing: tuple | None = None, orientation: str = "down", @@ -212,6 +418,68 @@ def slide(v, dx): return {v: (np.array([x, y, 0]) - center) * sf for v, (x, y) in pos.items()} +LayoutName = Literal[ + "circular", + "kamada_kawai", + "partite", + "planar", + "random", + "shell", + "spectral", + "spiral", + "spring", + "tree", +] + +_layouts: dict[LayoutName, LayoutFunction] = { + "circular": cast(LayoutFunction, nx.layout.circular_layout), + "kamada_kawai": cast(LayoutFunction, nx.layout.kamada_kawai_layout), + "partite": cast(LayoutFunction, _partite_layout), + "planar": cast(LayoutFunction, nx.layout.planar_layout), + "random": cast(LayoutFunction, _random_layout), + "shell": cast(LayoutFunction, nx.layout.shell_layout), + "spectral": cast(LayoutFunction, nx.layout.spectral_layout), + "spiral": cast(LayoutFunction, nx.layout.spiral_layout), + "spring": cast(LayoutFunction, nx.layout.spring_layout), + "tree": cast(LayoutFunction, _tree_layout), +} + + +def _determine_graph_layout( + nx_graph: nx.classes.graph.Graph | nx.classes.digraph.DiGraph, + layout: LayoutName | dict[Hashable, Point3D] | LayoutFunction = "spring", + layout_scale: float | tuple[float, float, float] = 2, + layout_config: dict[str, Any] | None = None, +) -> dict[Hashable, Point3D]: + if layout_config is None: + layout_config = {} + + if isinstance(layout, dict): + return layout + elif layout in _layouts: + auto_layout = _layouts[layout](nx_graph, scale=layout_scale, **layout_config) + # NetworkX returns a dictionary of 3D points if the dimension + # is specified to be 3. Otherwise, it returns a dictionary of + # 2D points, so adjusting is required. + if ( + layout_config.get("dim") == 3 + or auto_layout[next(auto_layout.__iter__())].shape[0] == 3 + ): + return auto_layout + else: + return {k: np.append(v, [0]) for k, v in auto_layout.items()} + else: + try: + return cast(LayoutFunction, layout)( + nx_graph, scale=layout_scale, **layout_config + ) + except TypeError as e: + raise ValueError( + f"The layout '{layout}' is neither a recognized layout, a layout function," + "nor a vertex placement dictionary.", + ) + + class GenericGraph(VMobject, metaclass=ConvertToOpenGL): """Abstract base class for graphs (that is, a collection of vertices connected with edges). @@ -254,14 +522,14 @@ class GenericGraph(VMobject, metaclass=ConvertToOpenGL): layout Either one of ``"spring"`` (the default), ``"circular"``, ``"kamada_kawai"``, ``"planar"``, ``"random"``, ``"shell"``, ``"spectral"``, ``"spiral"``, ``"tree"``, and ``"partite"`` - for automatic vertex positioning using ``networkx`` + for automatic vertex positioning primarily using ``networkx`` (see `their documentation `_ - for more details), or a dictionary specifying a coordinate (value) - for each vertex (key) for manual positioning. + for more details), a dictionary specifying a coordinate (value) + for each vertex (key) for manual positioning, or a .:class:`~.LayoutFunction` with a user-defined automatic layout. layout_config - Only for automatically generated layouts. A dictionary whose entries - are passed as keyword arguments to the automatic layout algorithm - specified via ``layout`` of``networkx``. + Only for automatic layouts. A dictionary whose entries + are passed as keyword arguments to the named layout or automatic layout function + specified via ``layout``. The ``tree`` layout also accepts a special parameter ``vertex_spacing`` passed as a keyword argument inside the ``layout_config`` dictionary. Passing a tuple ``(space_x, space_y)`` as this argument overrides @@ -301,8 +569,8 @@ def __init__( edges: list[tuple[Hashable, Hashable]], labels: bool | dict = False, label_fill_color: str = BLACK, - layout: str | dict = "spring", - layout_scale: float | tuple = 2, + layout: LayoutName | dict[Hashable, Point3D] | LayoutFunction = "spring", + layout_scale: float | tuple[float, float, float] = 2, layout_config: dict | None = None, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, @@ -319,15 +587,6 @@ def __init__( nx_graph.add_edges_from(edges) self._graph = nx_graph - self._layout = _determine_graph_layout( - nx_graph, - layout=layout, - layout_scale=layout_scale, - layout_config=layout_config, - partitions=partitions, - root_vertex=root_vertex, - ) - if isinstance(labels, dict): self._labels = labels elif isinstance(labels, bool): @@ -361,8 +620,14 @@ def __init__( self.vertices = {v: vertex_type(**self._vertex_config[v]) for v in vertices} self.vertices.update(vertex_mobjects) - for v in self.vertices: - self[v].move_to(self._layout[v]) + + self.change_layout( + layout=layout, + layout_scale=layout_scale, + layout_config=layout_config, + partitions=partitions, + root_vertex=root_vertex, + ) # build edge_config if edge_config is None: @@ -399,7 +664,7 @@ def __init__( self.add_updater(self.update_edges) @staticmethod - def _empty_networkx_graph(): + def _empty_networkx_graph() -> nx.classes.graph.Graph: """Return an empty networkx graph for the given graph type.""" raise NotImplementedError("To be implemented in concrete subclasses") @@ -415,13 +680,13 @@ def __getitem__(self: Graph, v: Hashable) -> Mobject: def _create_vertex( self, vertex: Hashable, - position: np.ndarray | None = None, + position: Point3D | None = None, label: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobject: dict | None = None, - ) -> tuple[Hashable, np.ndarray, dict, Mobject]: + ) -> tuple[Hashable, Point3D, dict, Mobject]: if position is None: position = self.get_center() @@ -459,7 +724,7 @@ def _create_vertex( def _add_created_vertex( self, vertex: Hashable, - position: np.ndarray, + position: Point3D, vertex_config: dict, vertex_mobject: Mobject, ) -> Mobject: @@ -485,7 +750,7 @@ def _add_created_vertex( def _add_vertex( self, vertex: Hashable, - position: np.ndarray | None = None, + position: Point3D | None = None, label: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, @@ -540,7 +805,7 @@ def _create_vertices( vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobjects: dict | None = None, - ) -> Iterable[tuple[Hashable, np.ndarray, dict, Mobject]]: + ) -> Iterable[tuple[Hashable, Point3D, dict, Mobject]]: if positions is None: positions = {} if vertex_mobjects is None: @@ -944,9 +1209,9 @@ def construct(self): def change_layout( self, - layout: str | dict = "spring", - layout_scale: float = 2, - layout_config: dict | None = None, + layout: LayoutName | dict[Hashable, Point3D] | LayoutFunction = "spring", + layout_scale: float | tuple[float, float, float] = 2, + layout_config: dict[str, Any] | None = None, partitions: list[list[Hashable]] | None = None, root_vertex: Hashable | None = None, ) -> Graph: @@ -970,14 +1235,19 @@ def construct(self): self.play(G.animate.change_layout("circular")) self.wait() """ + layout_config = {} if layout_config is None else layout_config + if partitions is not None and "partitions" not in layout_config: + layout_config["partitions"] = partitions + if root_vertex is not None and "root_vertex" not in layout_config: + layout_config["root_vertex"] = root_vertex + self._layout = _determine_graph_layout( self._graph, layout=layout, layout_scale=layout_scale, layout_config=layout_config, - partitions=partitions, - root_vertex=root_vertex, ) + for v in self.vertices: self[v].move_to(self._layout[v]) return self diff --git a/tests/module/mobject/test_graph.py b/tests/module/mobject/test_graph.py index b05d6b21d9..d5d0efe08b 100644 --- a/tests/module/mobject/test_graph.py +++ b/tests/module/mobject/test_graph.py @@ -3,6 +3,7 @@ import pytest from manim import DiGraph, Graph, Scene, Text, tempconfig +from manim.mobject.graph import _layouts def test_graph_creation(): @@ -104,6 +105,73 @@ def test_custom_animation_mobject_list(): assert scene.mobjects == [G] +def test_custom_graph_layout_dict(): + G = Graph( + [1, 2, 3], [(1, 2), (2, 3)], layout={1: [0, 0, 0], 2: [1, 1, 0], 3: [1, -1, 0]} + ) + assert str(G) == "Undirected graph on 3 vertices and 2 edges" + assert all(G.vertices[1].get_center() == [0, 0, 0]) + assert all(G.vertices[2].get_center() == [1, 1, 0]) + assert all(G.vertices[3].get_center() == [1, -1, 0]) + + +def test_graph_layouts(): + for layout in ( + layout for layout in _layouts if layout != "tree" and layout != "partite" + ): + G = Graph([1, 2, 3], [(1, 2), (2, 3)], layout=layout) + assert str(G) == "Undirected graph on 3 vertices and 2 edges" + + +def test_tree_layout(): + G = Graph([1, 2, 3], [(1, 2), (2, 3)], layout="tree", root_vertex=1) + assert str(G) == "Undirected graph on 3 vertices and 2 edges" + + +def test_partite_layout(): + G = Graph( + [1, 2, 3, 4, 5], + [(1, 2), (2, 3), (3, 4), (4, 5)], + layout="partite", + partitions=[[1, 2], [3, 4, 5]], + ) + assert str(G) == "Undirected graph on 5 vertices and 4 edges" + + +def test_custom_graph_layout_function(): + def layout_func(graph, scale): + return {vertex: [vertex, vertex, 0] for vertex in graph} + + G = Graph([1, 2, 3], [(1, 2), (2, 3)], layout=layout_func) + assert all(G.vertices[1].get_center() == [1, 1, 0]) + assert all(G.vertices[2].get_center() == [2, 2, 0]) + assert all(G.vertices[3].get_center() == [3, 3, 0]) + + +def test_custom_graph_layout_function_with_kwargs(): + def layout_func(graph, scale, offset): + return { + vertex: [vertex * scale + offset, vertex * scale + offset, 0] + for vertex in graph + } + + G = Graph( + [1, 2, 3], [(1, 2), (2, 3)], layout=layout_func, layout_config={"offset": 1} + ) + assert all(G.vertices[1].get_center() == [3, 3, 0]) + assert all(G.vertices[2].get_center() == [5, 5, 0]) + assert all(G.vertices[3].get_center() == [7, 7, 0]) + + +def test_graph_change_layout(): + for layout in ( + layout for layout in _layouts if layout != "tree" and layout != "partite" + ): + G = Graph([1, 2, 3], [(1, 2), (2, 3)]) + G.change_layout(layout=layout) + assert str(G) == "Undirected graph on 3 vertices and 2 edges" + + def test_tree_layout_no_root_error(): with pytest.raises(ValueError) as excinfo: G = Graph([1, 2, 3], [(1, 2), (2, 3)], layout="tree") From 0f268e6f9ca3d14565775f0d764ea2c28c6fa017 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 25 Apr 2024 00:38:16 +0200 Subject: [PATCH 70/77] Follow-up to graph layout cleanup: improvements for tests and typing (#3728) * suggestions from review on #3434 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/mobject/graph.py | 25 ++++++++++++++----------- tests/module/mobject/test_graph.py | 8 ++------ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/manim/mobject/graph.py b/manim/mobject/graph.py index dda52de770..9723e704cb 100644 --- a/manim/mobject/graph.py +++ b/manim/mobject/graph.py @@ -9,11 +9,17 @@ import itertools as it from copy import copy -from typing import Any, Hashable, Iterable, Literal, Protocol, Union, cast +from typing import TYPE_CHECKING, Any, Hashable, Iterable, Literal, Protocol, cast import networkx as nx import numpy as np -from typing_extensions import TypeAlias + +if TYPE_CHECKING: + from typing_extensions import TypeAlias + + from manim.typing import Point3D + + NxGraph: TypeAlias = nx.classes.graph.Graph | nx.classes.digraph.DiGraph from manim.animation.composition import AnimationGroup from manim.animation.creation import Create, Uncreate @@ -24,11 +30,8 @@ from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.text.tex_mobject import MathTex from manim.mobject.types.vectorized_mobject import VMobject -from manim.typing import Point3D from manim.utils.color import BLACK -NxGraph: TypeAlias = Union[nx.classes.graph.Graph, nx.classes.digraph.DiGraph] - class LayoutFunction(Protocol): """A protocol for automatic layout functions that compute a layout for a graph to be used in :meth:`~.Graph.change_layout`. @@ -53,8 +56,8 @@ def custom_layout( graph: nx.Graph, scale: float | tuple[float, float, float] = 2, n: int | None = None, - *args: tuple[Any, ...], - **kwargs: dict[str, Any], + *args: Any, + **kwargs: Any, ): nodes = sorted(list(graph)) height = len(nodes) // n @@ -256,8 +259,8 @@ def __call__( self, graph: NxGraph, scale: float | tuple[float, float, float] = 2, - *args: tuple[Any, ...], - **kwargs: dict[str, Any], + *args: Any, + **kwargs: Any, ) -> dict[Hashable, Point3D]: """Given a graph and a scale, return a dictionary of coordinates. @@ -280,7 +283,7 @@ def _partite_layout( nx_graph: NxGraph, scale: float = 2, partitions: list[list[Hashable]] | None = None, - **kwargs: dict[str, Any], + **kwargs: Any, ) -> dict[Hashable, Point3D]: if partitions is None or len(partitions) == 0: raise ValueError( @@ -302,7 +305,7 @@ def _partite_layout( return nx.layout.multipartite_layout(nx_graph, scale=scale, **kwargs) -def _random_layout(nx_graph: NxGraph, scale: float = 2, **kwargs: dict[str, Any]): +def _random_layout(nx_graph: NxGraph, scale: float = 2, **kwargs: Any): # the random layout places coordinates in [0, 1) # we need to rescale manually afterwards... auto_layout = nx.layout.random_layout(nx_graph, **kwargs) diff --git a/tests/module/mobject/test_graph.py b/tests/module/mobject/test_graph.py index d5d0efe08b..b23ccff622 100644 --- a/tests/module/mobject/test_graph.py +++ b/tests/module/mobject/test_graph.py @@ -116,9 +116,7 @@ def test_custom_graph_layout_dict(): def test_graph_layouts(): - for layout in ( - layout for layout in _layouts if layout != "tree" and layout != "partite" - ): + for layout in (layout for layout in _layouts if layout not in ["tree", "partite"]): G = Graph([1, 2, 3], [(1, 2), (2, 3)], layout=layout) assert str(G) == "Undirected graph on 3 vertices and 2 edges" @@ -164,9 +162,7 @@ def layout_func(graph, scale, offset): def test_graph_change_layout(): - for layout in ( - layout for layout in _layouts if layout != "tree" and layout != "partite" - ): + for layout in (layout for layout in _layouts if layout not in ["tree", "partite"]): G = Graph([1, 2, 3], [(1, 2), (2, 3)]) G.change_layout(layout=layout) assert str(G) == "Undirected graph on 3 vertices and 2 edges" From 791a892be3f84e58f4d7eec1ffe93a6135447417 Mon Sep 17 00:00:00 2001 From: Amirreza A <45117218+amrear@users.noreply.github.com> Date: Sat, 27 Apr 2024 02:25:03 +0330 Subject: [PATCH 71/77] Update coordinate_systems.py (#3730) small change --- manim/mobject/graphing/coordinate_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 4acc1d9b99..89e072d4b3 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -2570,7 +2570,7 @@ def construct(self): self.set_camera_orientation(phi=2*PI/5, theta=PI/5) axes = ThreeDAxes() labels = axes.get_axis_labels( - Tex("x-axis").scale(0.7), Text("y-axis").scale(0.45), Text("z-axis").scale(0.45) + Text("x-axis").scale(0.7), Text("y-axis").scale(0.45), Text("z-axis").scale(0.45) ) self.add(axes, labels) """ From a3d584b7f4646ed168daa42bb14dc0101c19cfb7 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Fri, 26 Apr 2024 18:57:17 -0400 Subject: [PATCH 72/77] build(ci): change from macos-latest to macos-13 (#3729) --- .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 192b9fae3a..76d08ece04 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-22.04, macos-latest, windows-latest] + os: [ubuntu-22.04, macos-13, windows-latest] python: ["3.9", "3.10", "3.11", "3.12"] steps: From 98641a2f82afc90961708dc9983429f36293857c Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:18:48 -0400 Subject: [PATCH 73/77] Add ``--preview_command`` cli flag (#3615) * Add preview_command cli flag * Edit help for --preview_command * Change back from subprocess.run * Remove old comment * Bug with timg stopped happening with sp.run * Fix docstring * Revert "Fix docstring" This reverts commit d2c00fc24dc46586f994237f1d2758528b78d6a3. * Actually fix docstring * Change help for option Co-authored-by: Benjamin Hackl --------- Co-authored-by: Benjamin Hackl --- manim/_config/utils.py | 10 ++++++++++ manim/cli/render/global_options.py | 5 +++++ manim/utils/file_ops.py | 8 ++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 7ced9c1101..a202d857cd 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -318,6 +318,7 @@ class MyScene(Scene): ... "zero_pad", "force_window", "no_latex_cleanup", + "preview_command", } def __init__(self) -> None: @@ -767,6 +768,7 @@ def digest_args(self, args: argparse.Namespace) -> Self: "force_window", "dry_run", "no_latex_cleanup", + "preview_command", ]: if hasattr(args, key): attr = getattr(args, key) @@ -1016,6 +1018,14 @@ def no_latex_cleanup(self) -> bool: def no_latex_cleanup(self, value: bool) -> None: self._set_boolean("no_latex_cleanup", value) + @property + def preview_command(self) -> str: + return self._d["preview_command"] + + @preview_command.setter + def preview_command(self, value: str) -> None: + self._set_str("preview_command", value) + @property def verbosity(self) -> str: """Logger verbosity; "DEBUG", "INFO", "WARNING", "ERROR", or "CRITICAL" (-v).""" diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index 42b61ae2d9..d7424dd1ee 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -105,4 +105,9 @@ def validate_gui_location(ctx, param, value): help="Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.", default=False, ), + option( + "--preview_command", + help="The command used to preview the output file (for example vlc for video files)", + default="", + ), ) diff --git a/manim/utils/file_ops.py b/manim/utils/file_ops.py index ae06561991..df505a60f3 100644 --- a/manim/utils/file_ops.py +++ b/manim/utils/file_ops.py @@ -32,7 +32,7 @@ from manim import __version__, config, logger -from .. import console +from .. import config, console def is_mp4_format() -> bool: @@ -204,8 +204,12 @@ def open_file(file_path, in_browser=False): commands = ["open"] if not in_browser else ["open", "-R"] else: raise OSError("Unable to identify your operating system...") + + # check after so that file path is set correctly + if config.preview_command: + commands = [config.preview_command] commands.append(file_path) - sp.Popen(commands) + sp.run(commands) def open_media_file(file_writer: SceneFileWriter) -> None: From 1ce3edd97af2fd2e376516da9e6e332e766df8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:34:17 -0400 Subject: [PATCH 74/77] AnimationGroup: optimized interpolate() and fixed alpha bug on finish() (#3542) * Optimized AnimationGroup computation of start-end times with lag ratio * Added extra comment for init_run_time * Added full path to imports in composition.py * Optimized AnimationGroup.interpolate * Fixed final bugs * Removed accidental print * Final fix to AnimationGroup.interpolate * Fixed animations being skipped unintentionally * Addressed requested changes --------- Co-authored-by: Benjamin Hackl --- manim/animation/animation.py | 1 + manim/animation/composition.py | 98 ++++++++++++++-------- tests/module/animation/test_composition.py | 2 +- tests/opengl/test_composition_opengl.py | 2 +- 4 files changed, 65 insertions(+), 38 deletions(-) diff --git a/manim/animation/animation.py b/manim/animation/animation.py index 106649d36b..80ad691a41 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -404,6 +404,7 @@ def set_run_time(self, run_time: float) -> Animation: self.run_time = run_time return self + # TODO: is this getter even necessary? def get_run_time(self) -> float: """Get the run time of the animation. diff --git a/manim/animation/composition.py b/manim/animation/composition.py index 3fc2d5f716..62d67d5807 100644 --- a/manim/animation/composition.py +++ b/manim/animation/composition.py @@ -7,21 +7,19 @@ import numpy as np +from manim._config import config +from manim.animation.animation import Animation, prepare_animation +from manim.constants import RendererType +from manim.mobject.mobject import Group, Mobject from manim.mobject.opengl.opengl_mobject import OpenGLGroup +from manim.scene.scene import Scene +from manim.utils.iterables import remove_list_redundancies from manim.utils.parameter_parsing import flatten_iterable_parameters - -from .._config import config -from ..animation.animation import Animation, prepare_animation -from ..constants import RendererType -from ..mobject.mobject import Group, Mobject -from ..scene.scene import Scene -from ..utils.iterables import remove_list_redundancies -from ..utils.rate_functions import linear +from manim.utils.rate_functions import linear if TYPE_CHECKING: from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup - - from ..mobject.types.vectorized_mobject import VGroup + from manim.mobject.types.vectorized_mobject import VGroup __all__ = ["AnimationGroup", "Succession", "LaggedStart", "LaggedStartMap"] @@ -93,6 +91,7 @@ def begin(self) -> None: f"{self} has a run_time of 0 seconds, this cannot be " f"rendered correctly. {tmp}." ) + self.anim_group_time = 0.0 if self.suspend_mobject_updating: self.group.suspend_updating() for anim in self.animations: @@ -103,8 +102,9 @@ def _setup_scene(self, scene) -> None: anim._setup_scene(scene) def finish(self) -> None: - for anim in self.animations: - anim.finish() + self.interpolate(1) + self.anims_begun[:] = True + self.anims_finished[:] = True if self.suspend_mobject_updating: self.group.resume_updating() @@ -116,7 +116,9 @@ def clean_up_from_scene(self, scene: Scene) -> None: anim.clean_up_from_scene(scene) def update_mobjects(self, dt: float) -> None: - for anim in self.animations: + for anim in self.anims_with_timings["anim"][ + self.anims_begun & ~self.anims_finished + ]: anim.update_mobjects(dt) def init_run_time(self, run_time) -> float: @@ -133,22 +135,30 @@ def init_run_time(self, run_time) -> float: The duration of the animation in seconds. """ self.build_animations_with_timings() - if self.anims_with_timings: - self.max_end_time = np.max([awt[2] for awt in self.anims_with_timings]) - else: - self.max_end_time = 0 + # Note: if lag_ratio < 1, then not necessarily the final animation's + # end time will be the max end time! Therefore we must calculate the + # maximum over all the end times, and not just take the last one. + # Example: if you want to play 2 animations of 10s and 1s with a + # lag_ratio of 0.1, the 1st one will end at t=10 and the 2nd one will + # end at t=2, so the AnimationGroup will end at t=10. + self.max_end_time = max(self.anims_with_timings["end"], default=0) return self.max_end_time if run_time is None else run_time def build_animations_with_timings(self) -> None: """Creates a list of triplets of the form (anim, start_time, end_time).""" - self.anims_with_timings = [] - curr_time: float = 0 - for anim in self.animations: - start_time: float = curr_time - end_time: float = start_time + anim.get_run_time() - self.anims_with_timings.append((anim, start_time, end_time)) - # Start time of next animation is based on the lag_ratio - curr_time = (1 - self.lag_ratio) * start_time + self.lag_ratio * end_time + run_times = np.array([anim.run_time for anim in self.animations]) + num_animations = run_times.shape[0] + dtype = [("anim", "O"), ("start", "f8"), ("end", "f8")] + self.anims_with_timings = np.zeros(num_animations, dtype=dtype) + self.anims_begun = np.zeros(num_animations, dtype=bool) + self.anims_finished = np.zeros(num_animations, dtype=bool) + if num_animations == 0: + return + + lags = run_times[:-1] * self.lag_ratio + self.anims_with_timings["anim"] = self.animations + self.anims_with_timings["start"][1:] = np.add.accumulate(lags) + self.anims_with_timings["end"] = self.anims_with_timings["start"] + run_times def interpolate(self, alpha: float) -> None: # Note, if the run_time of AnimationGroup has been @@ -156,14 +166,30 @@ def interpolate(self, alpha: float) -> None: # times might not correspond to actual times, # e.g. of the surrounding scene. Instead they'd # be a rescaled version. But that's okay! - time = self.rate_func(alpha) * self.max_end_time - for anim, start_time, end_time in self.anims_with_timings: - anim_time = end_time - start_time - if anim_time == 0: - sub_alpha = 0 - else: - sub_alpha = np.clip((time - start_time) / anim_time, 0, 1) - anim.interpolate(sub_alpha) + anim_group_time = self.rate_func(alpha) * self.max_end_time + time_goes_back = anim_group_time < self.anim_group_time + + # Only update ongoing animations + awt = self.anims_with_timings + new_begun = anim_group_time >= awt["start"] + new_finished = anim_group_time > awt["end"] + to_update = awt[ + (self.anims_begun | new_begun) & (~self.anims_finished | ~new_finished) + ] + + run_times = to_update["end"] - to_update["start"] + sub_alphas = (anim_group_time - to_update["start"]) / run_times + if time_goes_back: + sub_alphas[sub_alphas < 0] = 0 + else: + sub_alphas[sub_alphas > 1] = 1 + + for anim_to_update, sub_alpha in zip(to_update["anim"], sub_alphas): + anim_to_update.interpolate(sub_alpha) + + self.anim_group_time = anim_group_time + self.anims_begun = new_begun + self.anims_finished = new_finished class Succession(AnimationGroup): @@ -238,8 +264,8 @@ def update_active_animation(self, index: int) -> None: self.active_animation = self.animations[index] self.active_animation._setup_scene(self.scene) self.active_animation.begin() - self.active_start_time = self.anims_with_timings[index][1] - self.active_end_time = self.anims_with_timings[index][2] + self.active_start_time = self.anims_with_timings[index]["start"] + self.active_end_time = self.anims_with_timings[index]["end"] def next_animation(self) -> None: """Proceeds to the next animation. @@ -256,7 +282,7 @@ def interpolate(self, alpha: float) -> None: self.next_animation() if self.active_animation is not None and self.active_start_time is not None: elapsed = current_time - self.active_start_time - active_run_time = self.active_animation.get_run_time() + active_run_time = self.active_animation.run_time subalpha = elapsed / active_run_time if active_run_time != 0.0 else 1.0 self.active_animation.interpolate(subalpha) diff --git a/tests/module/animation/test_composition.py b/tests/module/animation/test_composition.py index 6837699fdf..878176de7e 100644 --- a/tests/module/animation/test_composition.py +++ b/tests/module/animation/test_composition.py @@ -128,7 +128,7 @@ def test_animationgroup_with_wait(): animation_group.begin() timings = animation_group.anims_with_timings - assert timings == [(wait, 0.0, 1.0), (sqr_anim, 1.0, 2.0)] + assert timings.tolist() == [(wait, 0.0, 1.0), (sqr_anim, 1.0, 2.0)] @pytest.mark.parametrize( diff --git a/tests/opengl/test_composition_opengl.py b/tests/opengl/test_composition_opengl.py index 1bedc3edcf..c09cd691a1 100644 --- a/tests/opengl/test_composition_opengl.py +++ b/tests/opengl/test_composition_opengl.py @@ -104,4 +104,4 @@ def test_animationgroup_with_wait(using_opengl_renderer): animation_group.begin() timings = animation_group.anims_with_timings - assert timings == [(wait, 0.0, 1.0), (sqr_anim, 1.0, 2.0)] + assert timings.tolist() == [(wait, 0.0, 1.0), (sqr_anim, 1.0, 2.0)] From c4e7502968e73c1e3461d5a913acc6148346e425 Mon Sep 17 00:00:00 2001 From: Jinchu Li <63861808+JinchuLi2002@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:54:24 -0400 Subject: [PATCH 75/77] Fixed ```get_anchors()``` Return Type Inconsistency (#3214) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * changed return type of get_anchors() * Ensured consistency with OpenGLVMobject * Fixed CodeQl, updated docstring * Update manim/mobject/types/vectorized_mobject.py Co-authored-by: Benjamin Hackl * Update manim/mobject/opengl/opengl_vectorized_mobject.py Co-authored-by: Benjamin Hackl * fixed typo, t -> e * fixed doctest --------- Co-authored-by: Tristan Schulz Co-authored-by: Benjamin Hackl Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> --- manim/mobject/mobject.py | 9 ++++++--- .../opengl/opengl_vectorized_mobject.py | 20 +++++++------------ manim/mobject/types/vectorized_mobject.py | 7 ++++--- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 40bcd46336..9127c2a1d6 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2836,7 +2836,8 @@ def construct(self): >>> result = rect.copy().become(circ, stretch=True) >>> result.height, result.width (2.0, 4.0) - >>> ellipse_eq = np.sum(result.get_anchors()**2 * [1/4, 1, 0], axis=1) + >>> ellipse_points = np.array(result.get_anchors()) + >>> ellipse_eq = np.sum(ellipse_points**2 * [1/4, 1, 0], axis=1) >>> np.allclose(ellipse_eq, 1) True @@ -2849,13 +2850,15 @@ def construct(self): >>> result = rect.copy().become(circ, match_height=True) >>> result.height, result.width (2.0, 2.0) - >>> circle_eq = np.sum(result.get_anchors()**2, axis=1) + >>> circle_points = np.array(result.get_anchors()) + >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 1) True >>> result = rect.copy().become(circ, match_width=True) >>> result.height, result.width (4.0, 4.0) - >>> circle_eq = np.sum(result.get_anchors()**2, axis=1) + >>> circle_points = np.array(result.get_anchors()) + >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 2**2) True diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 5d37f1eed2..30d47b8882 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -1025,7 +1025,7 @@ def proportion_from_point( return alpha - def get_anchors_and_handles(self): + def get_anchors_and_handles(self) -> Iterable[np.ndarray]: """ Returns anchors1, handles, anchors2, where (anchors1[i], handles[i], anchors2[i]) @@ -1057,27 +1057,21 @@ def get_end_anchors(self) -> np.ndarray: nppc = self.n_points_per_curve return self.points[nppc - 1 :: nppc] - def get_anchors(self) -> np.ndarray: + def get_anchors(self) -> Iterable[np.ndarray]: """Returns the anchors of the curves forming the OpenGLVMobject. Returns ------- - np.ndarray + Iterable[np.ndarray] The anchors. """ points = self.points if len(points) == 1: return points - return np.array( - list( - it.chain( - *zip( - self.get_start_anchors(), - self.get_end_anchors(), - ) - ), - ), - ) + + s = self.get_start_anchors() + e = self.get_end_anchors() + return list(it.chain.from_iterable(zip(s, e))) def get_points_without_null_curves(self, atol=1e-9): nppc = self.n_points_per_curve diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 5e10fadc64..6a2fffd2cb 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -1553,9 +1553,10 @@ def get_anchors(self) -> Point3D_Array: """ if self.points.shape[0] == 1: return self.points - return np.array( - tuple(it.chain(*zip(self.get_start_anchors(), self.get_end_anchors()))), - ) + + s = self.get_start_anchors() + e = self.get_end_anchors() + return list(it.chain.from_iterable(zip(s, e))) def get_points_defining_boundary(self) -> Point3D_Array: # Probably returns all anchors, but this is weird regarding the name of the method. From 6cb89a06bab4f8a65fd8ace315b1825ea60ace4f Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Sun, 28 Apr 2024 00:35:29 +0200 Subject: [PATCH 76/77] fixed [""] being set as loaded plugins (#3734) --- manim/_config/utils.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index a202d857cd..9b05ffd7d8 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -652,7 +652,12 @@ def digest_parser(self, parser: configparser.ConfigParser) -> Self: setattr(self, "window_size", window_size) # plugins - self.plugins = parser["CLI"].get("plugins", fallback="", raw=True).split(",") + plugins = parser["CLI"].get("plugins", fallback="", raw=True) + if plugins == "": + plugins = [] + else: + plugins = plugins.split(",") + self.plugins = plugins # the next two must be set AFTER digesting pixel_width and pixel_height self["frame_height"] = parser["CLI"].getfloat("frame_height", 8.0) width = parser["CLI"].getfloat("frame_width", None) From 33e560473d207b1062bee19eeb1af57ee3fe40a5 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Sun, 28 Apr 2024 11:02:22 +0200 Subject: [PATCH 77/77] Prepare new release: v0.18.1 (#3719) * add note about changelog in changelog.rst * bump version * Update CITATION.cff --- CITATION.cff | 4 ++-- docs/source/changelog.rst | 4 ++++ pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 4f1432a265..9bce914e14 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,10 +4,10 @@ authors: - name: "The Manim Community Developers" cff-version: "1.2.0" -date-released: 2023-11-11 +date-released: 2024-04-28 license: MIT message: "We acknowledge the importance of good software to support research, and we note that research becomes more valuable when it is communicated effectively. To demonstrate the value of Manim, we ask that you cite Manim in your work." title: Manim – Mathematical Animation Framework url: "https://www.manim.community/" -version: "v0.18.0" +version: "v0.18.1" ... diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index fd690ea562..f2afb6cfd8 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -2,6 +2,10 @@ Changelog ######### +This page contains a list of changes made between releases. Changes +from versions that are not listed below (in particular patch-level +releases since v0.18.0) are documented on our +`GitHub release page `__. .. toctree:: diff --git a/pyproject.toml b/pyproject.toml index 7590a73adf..8afcf1a35a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "manim" -version = "0.18.0" +version = "0.18.1" description = "Animation engine for explanatory math videos." authors = ["The Manim Community Developers ", "3b1b "] license="MIT"