diff --git a/CHANGELOG.md b/CHANGELOG.md index ee684d7e..612e1605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 (unreleased)= ## [Unreleased](https://github.com/jeertmans/manim-slides/compare/v5.5.1...HEAD) +(unreleased-added)= +### Added + +- `manim-slides render` now exits with the same return code as the one returned by `manim render` or `manimgl`. + [@chrjabs](https://github.com/chrjabs) [#545](https://github.com/jeertmans/manim-slides/pull/545) + (unreleased-chore)= ### Chore diff --git a/manim_slides/render.py b/manim_slides/render.py index 6bb8720a..dfdb1194 100644 --- a/manim_slides/render.py +++ b/manim_slides/render.py @@ -48,6 +48,7 @@ def render(ce: bool, gl: bool, args: tuple[str, ...]) -> None: if ce and gl: raise click.UsageError("You cannot specify both --CE and --GL renderers.") if gl: - subprocess.run([sys.executable, "-m", "manimlib", "-w", *args]) + completed = subprocess.run([sys.executable, "-m", "manimlib", "-w", *args]) else: - subprocess.run([sys.executable, "-m", "manim", "render", *args]) + completed = subprocess.run([sys.executable, "-m", "manim", "render", *args]) + sys.exit(completed.returncode) diff --git a/tests/data/slides.py b/tests/data/slides.py index 4dc84ad9..be3e48d7 100644 --- a/tests/data/slides.py +++ b/tests/data/slides.py @@ -42,3 +42,8 @@ def construct(self): class BasicSlideSkipReversing(BasicSlide): skip_reversing = True + + +class FailingSlide(Slide): + def construct(self): + self.play("this fails to render") diff --git a/tests/test_slide.py b/tests/test_slide.py index 1724953c..121484a5 100644 --- a/tests/test_slide.py +++ b/tests/test_slide.py @@ -113,6 +113,37 @@ def test_render_basic_slide( assert local_presentation_config.resolution == presentation_config.resolution +@pytest.mark.parametrize( + "renderer", + [ + "--CE", + pytest.param( + "--GL", + marks=pytest.mark.skipif( + sys.version_info < (3, 10), + reason="See https://github.com/3b1b/manim/issues/2263.", + ), + ), + "--CE --renderer=opengl", + ], + ids=("CE", "GL", "CE(GL)"), +) +def test_render_failing_slide( + renderer: str, + slides_file: Path, + manimgl_config: Path, +) -> None: + runner = CliRunner() + + with runner.isolated_filesystem() as tmp_dir: + shutil.copy(manimgl_config, tmp_dir) + results = runner.invoke( + render, [*renderer.split(" "), str(slides_file), "FailingSlide", "-ql"] + ) + + assert results.exit_code != 0, results + + def test_clear_cache( slides_file: Path, ) -> None: