diff --git a/pkgs/applications/video/manim/default.nix b/pkgs/applications/video/manim/default.nix index 5da81eff50e6..edc084ef6a0f 100644 --- a/pkgs/applications/video/manim/default.nix +++ b/pkgs/applications/video/manim/default.nix @@ -1,64 +1,134 @@ -{ lib, buildPythonApplication, fetchFromGitHub, pythonOlder, file, fetchpatch -, cairo, ffmpeg, sox, xdg-utils, texlive -, colour, numpy, pillow, progressbar, scipy, tqdm, opencv , pycairo, pydub -, pbr, fetchPypi -}: -buildPythonApplication rec { - pname = "manim"; - version = "0.1.10"; +{ lib +, fetchFromGitHub - src = fetchPypi { - pname = "manimlib"; - inherit version; - sha256 = "0vg9b3rwypq5zir74pi0pmj47yqlcg7hrvscwrpjzjbqq2yihn49"; +, cairo +, ffmpeg +, texlive + +, python3 +}: + +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 = { + inherit (texlive) + + # tinytex + scheme-infraonly 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 python3.pkgs.buildPythonApplication rec { + pname = "manim"; + format = "pyproject"; + version = "0.15.2"; + disabled = python3.pythonOlder "3.8"; + + src = fetchFromGitHub { + owner = "ManimCommunity"; + repo = pname; + rev = "v${version}"; + sha256 = "l5JiFWCMQbGnwRRtYzCHBXdVzWBrTNPdcIYaAt/wRNA="; }; - patches = [ ./remove-dependency-constraints.patch ]; - - nativeBuildInputs = [ pbr ]; - - propagatedBuildInputs = [ - colour - numpy - pillow - progressbar - scipy - tqdm - opencv - pycairo - pydub - - cairo sox ffmpeg xdg-utils + nativeBuildInputs = [ + python3.pkgs.poetry-core ]; - # Test with texlive to see whether it works but don't propagate - # because it's huge and optional - # TODO: Use smaller TexLive distribution - # Doesn't need everything but it's hard to figure out what it needs - checkInputs = [ cairo sox ffmpeg xdg-utils texlive.combined.scheme-full ]; - - # Simple test and complex test with LaTeX - checkPhase = '' - for scene in SquareToCircle OpeningManimExample - do - python3 manim.py example_scenes.py $scene -l - tail -n 20 files/Tex/*.log # Print potential LaTeX erorrs - ${file}/bin/file videos/example_scenes/480p15/$scene.mp4 \ - | tee | grep -F "ISO Media, MP4 Base Media v1 [ISO 14496-12:2003]" - done + postPatch = '' + substituteInPlace pyproject.toml \ + --replace 'cloup = "^0.13.0"' 'cloup = "*"' \ + --replace 'mapbox-earcut = "^0.12.10"' 'mapbox-earcut = "*"' \ ''; - disabled = pythonOlder "3.7"; + buildInputs = [ cairo ]; - meta = { - description = "Animation engine for explanatory math videos"; + propagatedBuildInputs = with python3.pkgs; [ + 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 + pysrt + rich + scipy + screeninfo + skia-pathops + srt + tqdm + watchdog + ]; + + makeWrapperArgs = [ + "--prefix" "PATH" ":" (lib.makeBinPath [ + ffmpeg + (texlive.combine manim-tinytex) + ]) + ]; + + + checkInputs = [ + python3.pkgs.pytest-cov + python3.pkgs.pytest-xdist + python3.pkgs.pytestCheckHook + + ffmpeg + (texlive.combine manim-tinytex) + ]; + + # 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. + 3Blue1Brown on YouTube. This is the community maintained version of + manim. ''; - homepage = "https://github.com/3b1b/manim"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ johnazoidberg ]; + homepage = "https://github.com/ManimCommunity/manim"; + license = licenses.mit; + maintainers = with maintainers; [ friedelino ]; }; } diff --git a/pkgs/applications/video/manim/failing_tests.nix b/pkgs/applications/video/manim/failing_tests.nix new file mode 100644 index 000000000000..a1f82a98dc16 --- /dev/null +++ b/pkgs/applications/video/manim/failing_tests.nix @@ -0,0 +1,74 @@ +# 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" +] ++ + +# failing with: +# TypeError: __init__() got an unexpected keyword argument 'msg' - maybe you meant pytest.mark.skipif? +[ + "test_force_window_opengl_render_with_movies" +] diff --git a/pkgs/applications/video/manim/remove-dependency-constraints.patch b/pkgs/applications/video/manim/remove-dependency-constraints.patch deleted file mode 100644 index 4a7da45d0f57..000000000000 --- a/pkgs/applications/video/manim/remove-dependency-constraints.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git i/requirements.txt w/requirements.txt -index 556122ad..11fd49d5 100644 ---- i/requirements.txt -+++ w/requirements.txt -@@ -1,11 +1,10 @@ --argparse==1.4.0 --colour==0.1.5 --numpy==1.15.0 --Pillow==5.2.0 --progressbar==2.5 --scipy==1.1.0 --tqdm==4.24.0 --opencv-python==3.4.2.17 --pycairo==1.17.1; sys_platform == 'linux' --pycairo>=1.18.0; sys_platform == 'win32' --pydub==0.23.0 -+colour -+numpy -+Pillow -+progressbar -+scipy -+tqdm -+pycairo -+pycairo>=1.18.1; sys_platform == 'win32' -+pydub -+pyreadline==2.1; sys_platform == 'win32' diff --git a/pkgs/development/python-modules/cloup/default.nix b/pkgs/development/python-modules/cloup/default.nix new file mode 100644 index 000000000000..92ccba675e0c --- /dev/null +++ b/pkgs/development/python-modules/cloup/default.nix @@ -0,0 +1,44 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytestCheckHook +, click +, setuptools-scm +, pythonOlder +}: + +buildPythonPackage rec { + pname = "cloup"; + version = "0.14.0"; + + disabled = pythonOlder "3.6"; + + src = fetchPypi { + inherit pname version; + sha256 = "4dec7e43905b7771884cda4f13ab8b7537bceaee467a92655e7660797ab08c47"; + }; + + nativeBuildInputs = [ + setuptools-scm + ]; + + propagatedBuildInputs = [ + click + ]; + + checkInputs = [ + pytestCheckHook + ]; + + pythonImportsCheck = [ "cloup" ]; + + meta = with lib; { + homepage = "https://github.com/janLuke/cloup"; + description = "Click extended with option groups, constraints, aliases, help themes"; + longDescription = '' + Enriches Click with option groups, constraints, command aliases, help sections for subcommands, themes for --help and other stuff. + ''; + license = licenses.bsd3; + maintainers = with maintainers; [ friedelino ]; + }; +} diff --git a/pkgs/development/python-modules/isosurfaces/default.nix b/pkgs/development/python-modules/isosurfaces/default.nix new file mode 100644 index 000000000000..49f3fb90b296 --- /dev/null +++ b/pkgs/development/python-modules/isosurfaces/default.nix @@ -0,0 +1,36 @@ +{ lib +, buildPythonPackage +, fetchPypi +, numpy +}: + +buildPythonPackage rec { + pname = "isosurfaces"; + version = "0.1.0"; + + src = fetchPypi { + inherit pname version; + sha256 = "fa1b44e5e59d2f429add49289ab89e36f8dcda49b7badd99e0beea273be331f4"; + }; + + propagatedBuildInputs = [ numpy ]; + + # no tests defined upstream + doCheck = false; + + pythonImportsCheck = [ "isosurfaces" ]; + + meta = with lib; { + homepage = "https://github.com/jared-hughes/isosurfaces"; + description = "Construct isolines/isosurfaces of a 2D/3D scalar field defined by a function"; + longDescription = '' + Construct isolines/isosurfaces of a 2D/3D scalar field defined by a + function, i.e. curves over which f(x,y)=0 or surfaces over which + f(x,y,z)=0. Most similar libraries use marching squares or similar over a + uniform grid, but this uses a quadtree to avoid wasting time sampling + many far from the implicit surface. + ''; + license = licenses.mit; + maintainers = with maintainers; [ friedelino ]; + }; +} diff --git a/pkgs/development/python-modules/mapbox-earcut/default.nix b/pkgs/development/python-modules/mapbox-earcut/default.nix new file mode 100644 index 000000000000..009bf2ed653c --- /dev/null +++ b/pkgs/development/python-modules/mapbox-earcut/default.nix @@ -0,0 +1,41 @@ +{ lib +, buildPythonPackage +, fetchPypi +, fetchFromGitHub +, numpy +, pybind11 +, pytestCheckHook +, setuptools +}: + +buildPythonPackage rec { + pname = "mapbox-earcut"; + version = "1.0.0"; + + src = fetchFromGitHub { + owner = "skogler"; + repo = "mapbox_earcut_python"; + rev = "v${version}"; + sha256 = "m4q2qTL55fkdi3hm75C3/XV9SUQkpJS+B5SEgpPEctk="; + }; + + nativeBuildInputs = [ setuptools pybind11 ]; + + propagatedBuildInputs = [ numpy ]; + + checkInputs = [ pytestCheckHook ]; + + pythonImportsCheck = [ "mapbox_earcut" ]; + + meta = with lib; { + homepage = "https://github.com/skogler/mapbox_earcut_python"; + license = licenses.isc; + description = "Mapbox-earcut fast triangulation of 2D-polygons"; + longDescription = '' + Python bindings for the C++ implementation of the Mapbox Earcut + library, which provides very fast and quite robust triangulation of 2D + polygons. + ''; + maintainers = with maintainers; [ friedelino ]; + }; +} diff --git a/pkgs/development/python-modules/srt/default.nix b/pkgs/development/python-modules/srt/default.nix new file mode 100644 index 000000000000..b6a5f4df097d --- /dev/null +++ b/pkgs/development/python-modules/srt/default.nix @@ -0,0 +1,33 @@ +{ lib +, buildPythonPackage +, fetchPypi +, hypothesis +, pytestCheckHook +, pythonOlder +}: + +buildPythonPackage rec { + pname = "srt"; + version = "3.5.2"; + + disabled = pythonOlder "2.7"; + + src = fetchPypi { + inherit pname version; + sha256 = "7aa4ad5ce4126d3f53b3e7bc4edaa86653d0378bf1c0b1ab8c59f5ab41384450"; + }; + + checkInputs = [ + hypothesis + pytestCheckHook + ]; + + pythonImportsCheck = [ "srt" ]; + + meta = with lib; { + homepage = "https://github.com/cdown/srt"; + description = "A tiny but featureful Python library for parsing, modifying, and composing SRT files"; + license = licenses.bsd3; + maintainers = with maintainers; [ friedelino ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 024257e9590d..cad446e147fe 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -26807,9 +26807,7 @@ with pkgs; m32edit = callPackage ../applications/audio/midas/m32edit.nix {}; - manim = python3Packages.callPackage ../applications/video/manim { - opencv = python3Packages.opencv3; - }; + manim = callPackage ../applications/video/manim { }; manuskript = libsForQt5.callPackage ../applications/editors/manuskript { }; diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 413350450290..924884839151 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -1763,6 +1763,8 @@ in { cloudsplaining = callPackage ../development/python-modules/cloudsplaining { }; + cloup = callPackage ../development/python-modules/cloup { }; + clustershell = callPackage ../development/python-modules/clustershell { }; clvm = callPackage ../development/python-modules/clvm { }; @@ -4343,6 +4345,8 @@ in { isort = callPackage ../development/python-modules/isort { }; + isosurfaces = callPackage ../development/python-modules/isosurfaces { }; + isounidecode = callPackage ../development/python-modules/isounidecode { }; isoweek = callPackage ../development/python-modules/isoweek { }; @@ -5166,6 +5170,8 @@ in { mapbox = callPackage ../development/python-modules/mapbox { }; + mapbox-earcut = callPackage ../development/python-modules/mapbox-earcut { }; + mariadb = callPackage ../development/python-modules/mariadb { }; marisa-trie = callPackage ../development/python-modules/marisa-trie { }; @@ -9969,6 +9975,8 @@ in { srsly = callPackage ../development/python-modules/srsly { }; + srt = callPackage ../development/python-modules/srt { }; + srvlookup = callPackage ../development/python-modules/srvlookup { }; ssdeep = callPackage ../development/python-modules/ssdeep {