Skip to content

Commit 3e07d29

Browse files
authored
fix(lib): properly import manimlib and fix tests (#550)
1 parent ff08345 commit 3e07d29

File tree

11 files changed

+1522
-1263
lines changed

11 files changed

+1522
-1263
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3030
[@casperalgera](https://github.com/casperalgera) [#556](https://github.com/jeertmans/manim-slides/pull/556)
3131
- Added example in the school work section of the gallery.
3232
[@amstrdm](https://github.com/amstrdm) [#557](https://github.com/jeertmans/manim-slides/pull/557)
33+
- Fixed some tests that were failing.
34+
[#550](https://github.com/jeertmans/manim-slides/pull/550)
35+
- Pinned `setuptools<81` for `manimgl` extra, as `setuptools>=81`
36+
dropped support for its API.
37+
[#550](https://github.com/jeertmans/manim-slides/pull/550)
38+
39+
(unreleased-fixed)=
40+
### Fixed
41+
42+
- Fixed potential import issue of ManimGL, importing `manimlib` will parse `sys.argv`
43+
to initialize the config, which can lead to surprising behavior when using the library with
44+
different command line arguments that are not meant to be used by ManimGL.
45+
[#550](https://github.com/jeertmans/manim-slides/pull/550)
3346

3447
(v5.5.1)=
3548
## [v5.5.1](https://github.com/jeertmans/manim-slides/compare/v5.5.0...v5.5.1)

manim_slides/checkhealth.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@ def checkhealth() -> None:
2020
click.secho("\tmanim not found", bold=True)
2121

2222
try:
23+
# Manimlib parses sys.argv on import, so we clear it temporarily.
24+
old_argv = sys.argv
25+
sys.argv = [__file__]
2326
from manimlib import __version__ as manimlib_version
2427

28+
sys.argv = old_argv
29+
2530
click.echo(f"\tmanimgl (version: {manimlib_version})")
2631
except ImportError:
2732
click.secho("\tmanimgl not found", bold=True)

manim_slides/slide/animation.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,17 @@
2222
from manim import LEFT, AnimationGroup, FadeIn, FadeOut
2323
from manim.mobject.mobject import Mobject
2424
else:
25+
import sys
26+
27+
# Manimlib parses sys.argv on import, so we clear it temporarily.
28+
old_argv = sys.argv
29+
sys.argv = [__file__]
2530
from manimlib import LEFT, AnimationGroup, FadeIn, FadeOut
2631

32+
sys.argv = old_argv
33+
34+
del sys
35+
2736
Mobject = Any
2837

2938

manim_slides/slide/manimlib.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
import sys
12
from pathlib import Path
23
from typing import Any, ClassVar, Optional
34

4-
from manimlib import Scene, ThreeDCamera
5+
# Manimlib parses sys.argv on import, so we clear it temporarily.
6+
old_argv = sys.argv
7+
sys.argv = [__file__]
8+
from manimlib import Scene, ThreeDCamera # noqa: E402
59

6-
from .base import BaseSlide
10+
sys.argv = old_argv
11+
12+
from .base import BaseSlide # noqa: E402
713

814

915
class Slide(BaseSlide, Scene): # type: ignore[misc]

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ docs = [
2626
]
2727
tests = [
2828
"importlib-metadata>=8.6.1;python_version<'3.10'",
29-
"manim-slides[full,manimgl,pyqt6,pyside6,sphinx-directive]",
29+
"manim-slides[full,manim,manimgl,pyqt6,pyside6,sphinx-directive]",
3030
"pytest>=7.4.0",
3131
"pytest-cov>=4.1.0",
3232
"pytest-env>=0.8.2",
@@ -80,7 +80,7 @@ full = [
8080
]
8181
magic = ["manim-slides[manim]", "ipython>=8.12.2"]
8282
manim = ["manim>=0.19"]
83-
manimgl = ["manimgl>=1.7.2"]
83+
manimgl = ["manimgl>=1.7.2", "setuptools<81"]
8484
pyqt6 = ["pyqt6>=6.7.0"]
8585
pyqt6-full = ["manim-slides[full,pyqt6]"]
8686
pyside6 = ["pyside6>=6.6.1,!=6.8.1.1"]
@@ -205,13 +205,13 @@ filterwarnings = [
205205
'ignore::DeprecationWarning:pkg_resources.*:',
206206
'ignore:invalid escape sequence.*:DeprecationWarning',
207207
'ignore:invalid escape sequence.*:SyntaxWarning',
208+
'ignore:urllib3 v2 only supports OpenSSL.*:urllib3.exceptions.NotOpenSSLWarning',
208209
]
209210

210211
[tool.ruff]
211212
extend-exclude = ["manim_slides/resources.py"]
212213
extend-include = ["*.ipynb"]
213214
line-length = 88
214-
target-version = "py39"
215215

216216
[tool.ruff.lint]
217217
extend-ignore = [

tests/test_checkhealth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"names",
2121
list(
2222
chain.from_iterable(
23-
combinations(("manim", "manimlib", "PyQt6", "PySide6"), r=r)
23+
combinations(("manim", "manimlib", "pyqt6", "pyside6"), r=r)
2424
for r in range(0, 5)
2525
)
2626
),

tests/test_main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_convert(slides_folder: Path, extension: str) -> None:
6767

6868
@pytest.mark.parametrize(("extension",), [("html",)])
6969
def test_convert_data_uri_deprecated(slides_folder: Path, extension: str) -> None:
70-
runner = CliRunner(mix_stderr=False)
70+
runner = CliRunner()
7171

7272
with runner.isolated_filesystem():
7373
with warnings.catch_warnings(record=True) as w:

tests/test_manim.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ def assert_import(
2727

2828
@skip_if_py39
2929
def test_force_api() -> None:
30+
# Manimlib parses sys.argv on import, so we clear it temporarily.
31+
old_argv = sys.argv
32+
sys.argv = [__file__]
3033
pytest.importorskip("manimlib")
34+
sys.argv = old_argv
3135
import manim # noqa: F401
3236

3337
if "manimlib" in sys.modules:
@@ -62,9 +66,12 @@ def test_invalid_api() -> None:
6266
@skip_if_py39
6367
@pytest.mark.filterwarnings("ignore:assert_import")
6468
def test_manim_and_manimgl_imported() -> None:
69+
# Manimlib parses sys.argv on import, so we clear it temporarily.
70+
old_argv = sys.argv
71+
sys.argv = [__file__]
6572
pytest.importorskip("manimlib")
73+
sys.argv = old_argv
6674
import manim # noqa: F401
67-
import manimlib # noqa: F401
6875

6976
assert_import(
7077
api_name="manim",
@@ -88,8 +95,11 @@ def test_manim_imported() -> None:
8895

8996
@skip_if_py39
9097
def test_manimgl_imported() -> None:
98+
# Manimlib parses sys.argv on import, so we clear it temporarily.
99+
old_argv = sys.argv
100+
sys.argv = [__file__]
91101
pytest.importorskip("manimlib")
92-
import manimlib # noqa: F401
102+
sys.argv = old_argv
93103

94104
if "manim" in sys.modules:
95105
del sys.modules["manim"]

tests/test_present.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_present_unexisting_slide(args: tuple[str, ...]) -> None:
4141
results = runner.invoke(present, ["UnexistingSlide", *args])
4242

4343
assert results.exit_code != 0
44-
assert "UnexistingSlide.json does not exist" in results.stdout
44+
assert "UnexistingSlide.json does not exist" in results.output
4545

4646

4747
def test_present_full_screen(args: tuple[str, ...]) -> None:

tests/test_slide.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,13 @@ def init_slide(cls: SlideType) -> Slide:
250250
if issubclass(cls, CESlide):
251251
return cls()
252252
elif issubclass(cls, GLSlide):
253+
# Manimlib parses sys.argv on import, so we clear it temporarily.
254+
old_argv = sys.argv
255+
sys.argv = [__file__]
253256
from manimlib.config import parse_cli
254257

255258
_args = parse_cli()
259+
sys.argv = old_argv
256260
return cls()
257261

258262
raise ValueError(f"Unsupported class {cls}")

0 commit comments

Comments
 (0)