diff options
author | OTABI Tomoya <tomoya.otabi@gmail.com> | 2024-05-01 23:26:41 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-01 23:26:41 +0900 |
commit | a4082b9ebaa4c2a113d4ef24f19f4496a4eb4308 (patch) | |
tree | f6390d7a1a6bb65609d2a7b6d63201c281cb330b /pkgs/development/python-modules | |
parent | 0d92c737a9d6295cfc9a57e0b11124b2c7f811c0 (diff) | |
parent | 4f0dbbd68bc4dd8b6240bb479d592dbfdde5d3df (diff) |
Merge pull request #303130 from felix-andreas/manim-python-package
manim: move to python modules and use toPythonApplication
Diffstat (limited to 'pkgs/development/python-modules')
3 files changed, 289 insertions, 0 deletions
diff --git a/pkgs/development/python-modules/manim/default.nix b/pkgs/development/python-modules/manim/default.nix new file mode 100644 index 0000000000000..09f2953c362e4 --- /dev/null +++ b/pkgs/development/python-modules/manim/default.nix @@ -0,0 +1,175 @@ +{ lib +, buildPythonPackage +, fetchFromGitHub +, poetry-core +, pytest-xdist +, pytestCheckHook +, pythonOlder +, pythonRelaxDepsHook + +, cairo +, ffmpeg +, texliveInfraOnly + +, click +, click-default-group +, cloup +, colour +, grpcio +, grpcio-tools +, importlib-metadata +, isosurfaces +, jupyterlab +, manimpango +, mapbox-earcut +, moderngl +, moderngl-window +, networkx +, numpy +, pillow +, pycairo +, pydub +, pygments +, rich +, scipy +, screeninfo +, skia-pathops +, srt +, svgelements +, tqdm +, watchdog +}: + +let + # According to ManimCommunity documentation manim uses tex-packages packaged + # in a custom distribution called "manim-latex", + # + # https://community.chocolatey.org/packages/manim-latex#files + # + # which includes another cutom distribution called tinytex, for which the + # package list can be found at + # + # https://github.com/yihui/tinytex/blob/master/tools/pkgs-custom.txt + # + # these two combined add up to: + manim-tinytex = texliveInfraOnly.withPackages (ps: with ps; [ + + # tinytex + amsfonts amsmath atbegshi atveryend auxhook babel bibtex + bigintcalc bitset booktabs cm dehyph dvipdfmx dvips ec epstopdf-pkg etex + etexcmds etoolbox euenc everyshi fancyvrb filehook firstaid float fontspec + framed geometry gettitlestring glyphlist graphics graphics-cfg graphics-def + grffile helvetic hycolor hyperref hyph-utf8 iftex inconsolata infwarerr + intcalc knuth-lib kvdefinekeys kvoptions kvsetkeys l3backend l3kernel + l3packages latex latex-amsmath-dev latex-bin latex-fonts latex-tools-dev + latexconfig latexmk letltxmacro lm lm-math ltxcmds lua-alt-getopt luahbtex + lualatex-math lualibs luaotfload luatex mdwtools metafont mfware natbib + pdfescape pdftex pdftexcmds plain psnfss refcount rerunfilecheck stringenc + tex tex-ini-files times tipa tools unicode-data unicode-math uniquecounter + url xcolor xetex xetexconfig xkeyval xunicode zapfding + + # manim-latex + standalone everysel preview doublestroke ms setspace rsfs relsize ragged2e + fundus-calligra microtype wasysym physics dvisvgm jknapltx wasy cm-super + babel-english gnu-freefont mathastext cbfonts-fd + ]); + +in buildPythonPackage rec { + pname = "manim"; + pyproject = true; + version = "0.18.1"; + disabled = pythonOlder "3.9"; + + src = fetchFromGitHub { + owner = "ManimCommunity"; + repo = "manim"; + rev = "refs/tags/v${version}"; + hash = "sha256-o+Wl3NMK6yopcsRVFtZuUE9c1GABa5d8rbQNHDJ4OiQ="; + }; + + nativeBuildInputs = [ + poetry-core + pythonRelaxDepsHook + ]; + + pythonRelaxDeps = [ + "cloup" + "isosurfaces" + "pillow" + "skia-pathops" + "watchdog" + ]; + + patches = [ + ./pytest-report-header.patch + ]; + + postPatch = '' + substituteInPlace pyproject.toml \ + --replace "--no-cov-on-fail --cov=manim --cov-report xml --cov-report term" "" + ''; + + buildInputs = [ cairo ]; + + propagatedBuildInputs = [ + click + click-default-group + cloup + colour + grpcio + grpcio-tools + importlib-metadata + isosurfaces + jupyterlab + manimpango + mapbox-earcut + moderngl + moderngl-window + networkx + numpy + pillow + pycairo + pydub + pygments + rich + scipy + screeninfo + skia-pathops + srt + svgelements + tqdm + watchdog + ]; + + makeWrapperArgs = [ + "--prefix" "PATH" ":" (lib.makeBinPath [ + ffmpeg + manim-tinytex + ]) + ]; + + nativeCheckInputs = [ + ffmpeg + manim-tinytex + pytest-xdist + pytestCheckHook + ]; + + # about 55 of ~600 tests failing mostly due to demand for display + disabledTests = import ./failing_tests.nix; + + pythonImportsCheck = [ "manim" ]; + + meta = with lib; { + description = "Animation engine for explanatory math videos - Community version"; + longDescription = '' + Manim is an animation engine for explanatory math videos. It's used to + create precise animations programmatically, as seen in the videos of + 3Blue1Brown on YouTube. This is the community maintained version of + manim. + ''; + homepage = "https://github.com/ManimCommunity/manim"; + license = licenses.mit; + maintainers = with maintainers; [ friedelino ]; + }; +} diff --git a/pkgs/development/python-modules/manim/failing_tests.nix b/pkgs/development/python-modules/manim/failing_tests.nix new file mode 100644 index 0000000000000..ac788c25be20c --- /dev/null +++ b/pkgs/development/python-modules/manim/failing_tests.nix @@ -0,0 +1,92 @@ +[ + # reason for failure: tests try to open display + "test_background_color" + "test_scene_add_remove" + "test_Circle" + "test_wait_skip" + "test_basic_scene_with_default_values" + "test_dry_run_with_png_format" + "test_dry_run_with_png_format_skipped_animations" + "test_FixedMobjects3D" + "test_basic_scene_l_flag" + "test_n_flag" + "test_s_flag_opengl_renderer" + "test_s_flag_no_animations" + "test_image_output_for_static_scene" + "test_no_image_output_with_interactive_embed" + "test_no_default_image_output_with_non_static_scene" + "test_image_output_for_static_scene_with_write_to_movie" + "test_s_flag" + "test_r_flag" + "test_play_skip" + "test_write_to_movie_disables_window" + "test_a_flag" + "test_pixel_coords_to_space_coords" + "test_t_values" + "test_custom_folders" + "test_t_values[15]" + "test_t_values[30]" + "test_t_values[60]" + "test_dash_as_filename" + "test_images_are_created_when_png_format_set_for_opengl" + "test_t_values_with_skip_animations" + "test_static_wait_detection" + "test_non_static_wait_detection" + "test_frozen_frame" + "test_gif_format_output" + "test_animate_with_changed_custom_attribute" + "test_images_are_zero_padded_when_zero_pad_set_for_opengl" + "test_mp4_format_output" + "test_videos_not_created_when_png_format_set" + "test_images_are_created_when_png_format_set" + "test_images_are_zero_padded_when_zero_pad_set" + "test_webm_format_output" + "test_default_format_output_for_transparent_flag" + "test_mov_can_be_set_as_output_format" + "test_force_window_opengl_render_with_format" + "test_get_frame_with_preview_disabled" + "test_get_frame_with_preview_enabled" + + # reason for failure: tests try to reach network + "test_logging_to_file" + "test_plugin_function_like" + "test_plugin_no_all" + "test_plugin_with_all" + + # failing with: + # E AssertionError: + # E Not equal to tolerance rtol=1e-07, atol=1.01 + # E Frame no -1. You can use --show_diff to visually show the difference. + # E Mismatched elements: 18525 / 1639680 (1.13%) + # E Max absolute difference: 255 + # E Max relative difference: 255. + "test_Text2Color" + "test_PointCloudDot" + "test_Torus" + + # test_ImplicitFunction[/test_implicit_graph] failing with: + # E AssertionError: + # E Not equal to tolerance rtol=1e-07, atol=1.01 + # E Frame no -1. You can use --show_diff to visually show the difference. + # E Mismatched elements: 1185[/633] / 1639680[/1639680] (0.0723[/0.0386]%) + # E Max absolute difference: 125[/121] + # E Max relative difference: 6.5[/1] + # + # These started failing after relaxing the “watchdog” and “isosurfaces” dependencies, + # likely due to a tolerance difference. They should, however, start working again when [1] is + # included in a Manim release. + # [1]: https://github.com/ManimCommunity/manim/pull/3376 + "test_ImplicitFunction" + "test_implicit_graph" + + # failing with: + # TypeError: __init__() got an unexpected keyword argument 'msg' - maybe you meant pytest.mark.skipif? + "test_force_window_opengl_render_with_movies" + + # mismatching expecation on the new commandline + "test_manim_new_command" + + # This tests checks if the manim executable is a python script. In our case it is not. + # It is a wrapper shell script instead. + "test_manim_checkhealth_subcommand" +] diff --git a/pkgs/development/python-modules/manim/pytest-report-header.patch b/pkgs/development/python-modules/manim/pytest-report-header.patch new file mode 100644 index 0000000000000..7aa87d373e508 --- /dev/null +++ b/pkgs/development/python-modules/manim/pytest-report-header.patch @@ -0,0 +1,22 @@ +diff --git a/conftest.py b/conftest.py +index dacb730a..149c6702 100644 +--- a/conftest.py ++++ b/conftest.py +@@ -33,17 +33,3 @@ def temp_media_dir(tmpdir, monkeypatch, request): + with tempconfig({"media_dir": str(tmpdir)}): + assert config.media_dir == str(tmpdir) + yield tmpdir +- +- +-def pytest_report_header(config): +- ctx = moderngl.create_standalone_context() +- info = ctx.info +- ctx.release() +- return ( +- f"\nCairo Version: {cairo.cairo_version()}", +- "\nOpenGL information", +- "------------------", +- f"vendor: {info['GL_VENDOR'].strip()}", +- f"renderer: {info['GL_RENDERER'].strip()}", +- f"version: {info['GL_VERSION'].strip()}\n", +- ) |