diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 3ac4191..457ec8f 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -6,6 +6,11 @@ jobs: test: name: Coverage runs-on: ubuntu-latest + env: + QT_QPA_PLATFORM: offscreen + MANIM_SLIDES_VERBOSITY: debug + PYTHONFAULTHANDLER: 1 + DISPLAY: :99 steps: - name: Checkout repository uses: actions/checkout@v3 @@ -23,6 +28,11 @@ jobs: run: | sudo apt-get install libcairo2-dev libpango1.0-dev ffmpeg freeglut3-dev + - name: Install xvfb on Ubuntu + run: | + sudo apt-get install xvfb + nohup Xvfb $DISPLAY & + - name: Install Manim Slides run: | poetry install --with test diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index aa8ef03..7cc3452 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,6 +11,11 @@ jobs: matrix: pyversion: ['3.8', '3.9', '3.10', '3.11'] runs-on: ubuntu-latest + env: + QT_QPA_PLATFORM: offscreen + MANIM_SLIDES_VERBOSITY: debug + PYTHONFAULTHANDLER: 1 + DISPLAY: :99 steps: - name: Checkout repository uses: actions/checkout@v3 @@ -28,6 +33,11 @@ jobs: run: | sudo apt-get install libcairo2-dev libpango1.0-dev ffmpeg freeglut3-dev + - name: Install xvfb on Ubuntu + run: | + sudo apt-get install xvfb + nohup Xvfb $DISPLAY & + - name: Install Manim Slides run: | poetry install --with test diff --git a/manim_slides/manim.py b/manim_slides/manim.py index 56165f5..e3ce6fd 100644 --- a/manim_slides/manim.py +++ b/manim_slides/manim.py @@ -51,8 +51,8 @@ MANIMGL_IMPORTED = MANIMGL_PACKAGE_NAME in sys.modules if MANIM_IMPORTED and MANIMGL_IMPORTED: from manim import logger - logger.warn( - "Both manim and manimgl are installed, therefore `manim-slide` needs to know which one to use. Please only import one of the two modules so that `manim-slide` knows which one to use. Here, manim is used by default" + logger.warning( + "Both manim and manimgl are imported, therefore `manim-slide` needs to know which one to use. Please only import one of the two modules so that `manim-slide` knows which one to use. Here, manim is used by default" ) MANIM = True MANIMGL = False diff --git a/poetry.lock b/poetry.lock index 8520f5f..330c6d9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -22,7 +22,7 @@ name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -30,7 +30,7 @@ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" category = "main" -optional = true +optional = false python-versions = "*" [package.dependencies] @@ -55,7 +55,7 @@ name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -185,7 +185,7 @@ name = "contourpy" version = "1.1.0" description = "Python library for calculating contours of 2D quadrilateral grids" category = "main" -optional = true +optional = false python-versions = ">=3.8" [package.dependencies] @@ -217,7 +217,7 @@ name = "cycler" version = "0.11.0" description = "Composable style cycles" category = "main" -optional = true +optional = false python-versions = ">=3.6" [[package]] @@ -268,7 +268,7 @@ name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" category = "main" -optional = true +optional = false python-versions = "*" [package.extras] @@ -291,7 +291,7 @@ name = "fonttools" version = "4.40.0" description = "Tools to manipulate font files" category = "main" -optional = true +optional = false python-versions = ">=3.8" [package.extras] @@ -378,7 +378,7 @@ name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" category = "main" -optional = true +optional = false python-versions = ">=3.7" [package.dependencies] @@ -401,7 +401,7 @@ name = "ipython" version = "8.12.2" description = "IPython: Productive Interactive Computing" category = "main" -optional = true +optional = false python-versions = ">=3.8" [package.dependencies] @@ -462,7 +462,7 @@ name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." category = "main" -optional = true +optional = false python-versions = ">=3.6" [package.dependencies] @@ -492,7 +492,7 @@ name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" category = "main" -optional = true +optional = false python-versions = ">=3.7" [[package]] @@ -553,7 +553,7 @@ name = "manimgl" version = "1.6.1" description = "Animation engine for explanatory math videos" category = "main" -optional = true +optional = false python-versions = "*" [package.dependencies] @@ -636,7 +636,7 @@ name = "matplotlib" version = "3.7.1" description = "Python plotting package" category = "main" -optional = true +optional = false python-versions = ">=3.8" [package.dependencies] @@ -657,7 +657,7 @@ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" category = "main" -optional = true +optional = false python-versions = ">=3.5" [package.dependencies] @@ -728,7 +728,7 @@ name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" category = "main" -optional = true +optional = false python-versions = "*" [package.extras] @@ -861,7 +861,7 @@ name = "parso" version = "0.8.3" description = "A Python Parser" category = "main" -optional = true +optional = false python-versions = ">=3.6" [package.extras] @@ -881,7 +881,7 @@ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." category = "main" -optional = true +optional = false python-versions = "*" [package.dependencies] @@ -892,7 +892,7 @@ name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -951,7 +951,7 @@ name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" category = "main" -optional = true +optional = false python-versions = ">=3.7.0" [package.dependencies] @@ -962,7 +962,7 @@ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -970,7 +970,7 @@ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" category = "main" -optional = true +optional = false python-versions = "*" [package.extras] @@ -1076,7 +1076,7 @@ name = "pyopengl" version = "3.1.7" description = "Standard OpenGL bindings for Python" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -1084,7 +1084,7 @@ name = "pyparsing" version = "3.1.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" -optional = true +optional = false python-versions = ">=3.6.8" [package.extras] @@ -1177,7 +1177,7 @@ name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" category = "main" -optional = true +optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" [package.dependencies] @@ -1300,7 +1300,7 @@ name = "setuptools-scm" version = "7.1.0" description = "the blessed package to manage your versions by scm tags" category = "main" -optional = true +optional = false python-versions = ">=3.7" [package.dependencies] @@ -1326,7 +1326,7 @@ name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "main" -optional = true +optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] @@ -1525,7 +1525,7 @@ name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" category = "main" -optional = true +optional = false python-versions = "*" [package.dependencies] @@ -1549,7 +1549,7 @@ name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" category = "main" -optional = true +optional = false python-versions = ">=3.8" [package.dependencies] @@ -1585,7 +1585,7 @@ name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" category = "main" -optional = true +optional = false python-versions = ">=3.7" [package.extras] @@ -1619,7 +1619,7 @@ name = "validators" version = "0.20.0" description = "Python Data Validation for Humans™." category = "main" -optional = true +optional = false python-versions = ">=3.4" [package.dependencies] @@ -1661,7 +1661,7 @@ name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" category = "main" -optional = true +optional = false python-versions = "*" [[package]] @@ -1691,7 +1691,7 @@ manimgl = ["manimgl"] [metadata] lock-version = "1.1" python-versions = ">=3.8.1,<3.12" -content-hash = "48219918ba4e5d048fbdb074b74b1e95098039b6333b11c8a227a1b311949b2b" +content-hash = "2edf41fcd75a345be83bfe18d377360f5480ab8030c55a680988219926deb809" [metadata.files] alabaster = [ @@ -1952,45 +1952,6 @@ cycler = [ {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, ] cython = [ - {file = "Cython-0.29.36-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea33c1c57f331f5653baa1313e445fbe80d1da56dd9a42c8611037887897b9d"}, - {file = "Cython-0.29.36-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2fe34615c13ace29e77bf9d21c26188d23eff7ad8b3e248da70404e5f5436b95"}, - {file = "Cython-0.29.36-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ae75eac4f13cbbcb50b2097470dcea570182446a3ebd0f7e95dd425c2017a2d7"}, - {file = "Cython-0.29.36-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:847d07fc02978c4433d01b4f5ee489b75fd42fd32ccf9cc4b5fd887e8cffe822"}, - {file = "Cython-0.29.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7cb44aeaf6c5c25bd6a7562ece4eadf50d606fc9b5f624fa95bd0281e8bf0a97"}, - {file = "Cython-0.29.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:28fb10aabd56a2e4d399273b48e106abe5a0d271728fd5eed3d36e7171000045"}, - {file = "Cython-0.29.36-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:86b7a13c6b23ab6471d40a320f573fbc8a4e39833947eebed96661145dc34771"}, - {file = "Cython-0.29.36-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:19ccf7fc527cf556e2e6a3dfeffcadfbcabd24a59a988289117795dfed8a25ad"}, - {file = "Cython-0.29.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:74bddfc7dc8958526b2018d3adc1aa6dc9cf2a24095c972e5ad06758c360b261"}, - {file = "Cython-0.29.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6c4d7e36fe0211e394adffd296382b435ac22762d14f2fe45c506c230f91cf2d"}, - {file = "Cython-0.29.36-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:0bca6a7504e8cfc63a4d3c7c9b9a04e5d05501942a6c8cee177363b61a32c2d4"}, - {file = "Cython-0.29.36-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17c74f80b06e2fa8ffc8acd41925f4f9922da8a219cd25c6901beab2f7c56cc5"}, - {file = "Cython-0.29.36-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:25ff471a459aad82146973b0b8c177175ab896051080713d3035ad4418739f66"}, - {file = "Cython-0.29.36-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9738f23d00d99481797b155ad58f8fc1c72096926ea2554b8ccc46e1d356c27"}, - {file = "Cython-0.29.36-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af2f333f08c4c279f3480532341bf70ec8010bcbc7d8a6daa5ca0bf4513af295"}, - {file = "Cython-0.29.36-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:cd77cedbcc13cb67aef39b8615fd50a67fc42b0c6defea6fc0a21e19d3a062ec"}, - {file = "Cython-0.29.36-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50d506d73a46c4a522ef9fdafcbf7a827ba13907b18ff58f61a8fa0887d0bd8d"}, - {file = "Cython-0.29.36-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:6a571d7c7b52ee12d73bc65b4855779c069545da3bac26bec06a1389ad17ade5"}, - {file = "Cython-0.29.36-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a216b2801c7d9c3babe0a10cc25da3bc92494d7047d1f732d3c47b0cceaf0941"}, - {file = "Cython-0.29.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:68abee3be27f21c9642a07a93f8333d491f4c52bc70068e42f51685df9ac1a57"}, - {file = "Cython-0.29.36-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:1ef90023da8a9bf84cf16f06186db0906d2ce52a09f751e2cb9d3da9d54eae46"}, - {file = "Cython-0.29.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9deef0761e8c798043dbb728a1c6df97b26e5edc65b8d6c7608b3c07af3eb722"}, - {file = "Cython-0.29.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:69af2365de2343b4e5a61c567e7611ddf2575ae6f6e5c01968f7d4f2747324eb"}, - {file = "Cython-0.29.36-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:fdf377b0f6e9325b73ad88933136023184afdc795caeeaaf3dca13494cffd15e"}, - {file = "Cython-0.29.36-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ff2cc5518558c598028ae8d9a43401e0e734b74b6e598156b005328c9da3472"}, - {file = "Cython-0.29.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7ca921068242cd8b52544870c807fe285c1f248b12df7b6dfae25cc9957b965e"}, - {file = "Cython-0.29.36-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6058a6d04e04d790cda530e1ff675e9352359eb4b777920df3cac2b62a9a030f"}, - {file = "Cython-0.29.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:de2045ceae1857e56a72f08e0acfa48c994277a353b7bdab1f097db9f8803f19"}, - {file = "Cython-0.29.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9f2a4b4587aaef08815410dc20653613ca04a120a2954a92c39e37c6b5fdf6be"}, - {file = "Cython-0.29.36-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:2edd9f8edca69178d74cbbbc180bc3e848433c9b7dc80374a11a0bb0076c926d"}, - {file = "Cython-0.29.36-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c6c0aea8491a70f98b7496b5057c9523740e02cec21cd678eef609d2aa6c1257"}, - {file = "Cython-0.29.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:768f65b16d23c630d8829ce1f95520ef1531a9c0489fa872d87c8c3813f65aee"}, - {file = "Cython-0.29.36-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:568625e8274ee7288ad87b0f615ec36ab446ca9b35e77481ed010027d99c7020"}, - {file = "Cython-0.29.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bdc0a4cb99f55e6878d4b67a4bfee23823484915cb6b7e9c9dd01002dd3592ea"}, - {file = "Cython-0.29.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f0df6552be39853b10dfb5a10dbd08f5c49023d6b390d7ce92d4792a8b6e73ee"}, - {file = "Cython-0.29.36-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:8894db6f5b6479a3c164e0454e13083ebffeaa9a0822668bb2319bdf1b783df1"}, - {file = "Cython-0.29.36-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53f93a8c342e9445a8f0cb7039775294f2dbbe5241936573daeaf0afe30397e4"}, - {file = "Cython-0.29.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ee317f9bcab901a3db39c34ee5a27716f7132e5c0de150125342694d18b30f51"}, - {file = "Cython-0.29.36-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e4b8269e5a5d127a2191b02b9df3636c0dac73f14f1ff8a831f39cb5197c4f38"}, {file = "Cython-0.29.36-py2.py3-none-any.whl", hash = "sha256:95bb13d8be507425d03ebe051f90d4b2a9fdccc64e4f30b35645fdb7542742eb"}, {file = "Cython-0.29.36.tar.gz", hash = "sha256:41c0cfd2d754e383c9eeb95effc9aa4ab847d0c9747077ddd7c0dcb68c3bc01f"}, ] @@ -2228,13 +2189,10 @@ lxml = [ {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, - {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, @@ -2243,7 +2201,6 @@ lxml = [ {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, @@ -2263,7 +2220,6 @@ lxml = [ {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, @@ -2273,7 +2229,6 @@ lxml = [ {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, @@ -2283,7 +2238,6 @@ lxml = [ {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, @@ -2293,7 +2247,6 @@ lxml = [ {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, @@ -2304,16 +2257,13 @@ lxml = [ {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, diff --git a/pyproject.toml b/pyproject.toml index 551401b..f3543a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,6 +85,8 @@ sphinx-copybutton = "^0.5.1" sphinxext-opengraph = "^0.7.5" [tool.poetry.group.test.dependencies] +manim = "^0.17.3" +manimgl = "^1.6.1" pytest = "^7.4.0" pytest-cov = "^4.1.0" @@ -93,6 +95,12 @@ pytest-cov = "^4.1.0" [tool.poetry.plugins."console_scripts"] manim-slides = "manim_slides.__main__:cli" +[tool.pytest.ini_options] +filterwarnings = [ + "error", + "ignore::DeprecationWarning" +] + [tool.ruff] ignore = [ "E501" diff --git a/tests/test_manim.py b/tests/test_manim.py new file mode 100644 index 0000000..3c22532 --- /dev/null +++ b/tests/test_manim.py @@ -0,0 +1,143 @@ +import importlib +import sys +from contextlib import contextmanager +from importlib.abc import MetaPathFinder +from importlib.machinery import ModuleSpec +from types import ModuleType +from typing import Iterator, Optional, Sequence + +import pytest + +import manim_slides.manim as msm + + +@contextmanager +def suppress_module_finder() -> Iterator[None]: + meta_path = sys.meta_path + try: + + class PathFinder(MetaPathFinder): + @classmethod + def find_spec( + cls, + fullname: str, + path: Optional[Sequence[str]], + target: Optional[ModuleType] = None, + ) -> Optional[ModuleSpec]: + if fullname in ["manim", "manimlib"]: + return None + + for finder in meta_path: + spec = finder.find_spec(fullname, path, target=target) + if spec is not None: + return spec + + return None + + sys.meta_path = [PathFinder] + yield + finally: + sys.meta_path = meta_path + + +def assert_import( + *, + manim: bool, + manim_available: bool, + manim_imported: bool, + manimgl: bool, + manimgl_available: bool, + manimgl_imported: bool, +) -> None: + importlib.reload(msm) + + assert msm.MANIM == manim + assert msm.MANIM_AVAILABLE == manim_available + assert msm.MANIM_IMPORTED == manim_imported + assert msm.MANIMGL == manimgl + assert msm.MANIMGL_AVAILABLE == manim_available + assert msm.MANIMGL_IMPORTED == manimgl_imported + + +@pytest.mark.filterwarnings("ignore:assert_import") +def test_manim_and_manimgl_imported() -> None: + import manim # noqa: F401 + import manimlib # noqa: F401 + + assert_import( + manim=True, + manim_available=True, + manim_imported=True, + manimgl=False, + manimgl_available=True, + manimgl_imported=True, + ) + + +def test_manim_imported() -> None: + import manim # noqa: F401 + + if "manimlib" in sys.modules: + del sys.modules["manimlib"] + + assert_import( + manim=True, + manim_available=True, + manim_imported=True, + manimgl=False, + manimgl_available=True, + manimgl_imported=False, + ) + + +def test_manimgl_imported() -> None: + import manimlib # noqa: F401 + + if "manim" in sys.modules: + del sys.modules["manim"] + + assert_import( + manim=False, + manim_available=True, + manim_imported=False, + manimgl=True, + manimgl_available=True, + manimgl_imported=True, + ) + + +def test_nothing_imported() -> None: + if "manim" in sys.modules: + del sys.modules["manim"] + + if "manimlib" in sys.modules: + del sys.modules["manimlib"] + + assert_import( + manim=True, + manim_available=True, + manim_imported=False, + manimgl=False, + manimgl_available=True, + manimgl_imported=False, + ) + + +def test_no_package_available() -> None: + with suppress_module_finder(): + if "manim" in sys.modules: + del sys.modules["manim"] + + if "manimlib" in sys.modules: + del sys.modules["manimlib"] + + with pytest.raises(ModuleNotFoundError): + # Actual values are not important + assert_import( + manim=False, + manim_available=False, + manim_imported=False, + manimgl=False, + manimgl_available=False, + manimgl_imported=False, + ) diff --git a/tests/test_slide.py b/tests/test_slide.py new file mode 100644 index 0000000..5c883c1 --- /dev/null +++ b/tests/test_slide.py @@ -0,0 +1,91 @@ +import pytest +from manim import Text +from pydantic import ValidationError + +from manim_slides.slide import Slide + + +def assert_construct(cls: type) -> type: + class Wrapper: + @classmethod + def test_construct(_) -> None: + cls().construct() + + return Wrapper + + +class TestSlide: + @assert_construct + class TestLoop(Slide): + def construct(self) -> None: + text = Text("Some text") + + self.add(text) + + self.start_loop() + self.play(text.animate.scale(2)) + self.end_loop() + + with pytest.raises(AssertionError): + self.end_loop() + + self.start_loop() + with pytest.raises(AssertionError): + self.start_loop() + + with pytest.raises(ValidationError): + self.end_loop() + + @assert_construct + class TestWipe(Slide): + def construct(self) -> None: + text = Text("Some text") + bye = Text("Bye") + + self.add(text) + + assert text in self.mobjects + assert bye not in self.mobjects + + self.play(self.wipe([text], [bye])) + + assert text not in self.mobjects + assert bye in self.mobjects + + @assert_construct + class TestCanvas(Slide): + def construct(self) -> None: + text = Text("Some text") + bye = Text("Bye") + + assert len(self.canvas) == 0 + + self.add(text) + + assert len(self.canvas) == 0 + + self.add_to_canvas(text=text) + + assert len(self.canvas) == 1 + + self.add(bye) + + assert len(self.canvas) == 1 + + assert text not in self.mobjects_without_canvas + assert bye in self.mobjects_without_canvas + + self.remove(text) + + assert len(self.canvas) == 1 + + self.add_to_canvas(bye=bye) + + assert len(self.canvas) == 2 + + self.remove_from_canvas("text", "bye") + + assert len(self.canvas) == 0 + + with pytest.raises(KeyError): + self.remove_from_canvas("text")