diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0427b867f..097a23475 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,20 +15,16 @@ on: jobs: test-build-full: - name: Test Linux, notebook + offscreen + name: Test Linux runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 10 if: ${{ !github.event.pull_request.draft }} strategy: fail-fast: false matrix: - include: - - name: Test py311 - pyversion: '3.11' - - name: Test py312 - pyversion: '3.12' - - name: Test py313 - pyversion: '3.13' + python: ["3.11", "3.12", "3.13"] + imgui_dep: ["imgui", ""] + notebook_dep: ["notebook", ""] steps: - uses: actions/checkout@v4 with: @@ -36,7 +32,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.pyversion }} + python-version: ${{ matrix.python }} - name: Install llvmpipe and lavapipe for offscreen canvas run: | sudo apt-get update -y -qq @@ -47,7 +43,12 @@ jobs: # remove pygfx from install_requires, we install using pygfx@main sed -i "/pygfx/d" ./setup.py pip install git+https://github.com/pygfx/pygfx.git@main - pip install -e ".["tests"]" + - name: Install fastplotlib + run: | + # create string with one of: tests,imgui,notebook; test,imgui; test,notebook ; tests + # sed removes trailing comma + # install fastplotlib with given extras options from above + pip install -e ".[$(echo "tests,${{ matrix.imgui_dep }},${{ matrix.notebook_dep }}" | sed -e "s/,\+/,/g" -e "s/,$//")]" - name: Show wgpu backend run: python -c "from examples.tests.testutils import wgpu_backend; print(wgpu_backend)" @@ -60,69 +61,27 @@ jobs: PYGFX_EXPECT_LAVAPIPE: true run: | WGPU_FORCE_OFFSCREEN=1 pytest -v tests/ - pytest -v examples - FASTPLOTLIB_NB_TESTS=1 pytest --nbmake examples/notebooks/ - - uses: actions/upload-artifact@v4 - if: ${{ failure() }} - with: - name: screenshot-diffs - path: | - examples/diffs - examples/notebooks/diffs - - test-build-offscreen: - name: Test Linux, only offscreen - runs-on: ubuntu-latest - timeout-minutes: 30 - if: ${{ !github.event.pull_request.draft }} - strategy: - fail-fast: false - matrix: - include: - - name: Test py311 - pyversion: '3.11' - - name: Test py312 - pyversion: '3.12' - - name: Test py313 - pyversion: '3.13' - steps: - - uses: actions/checkout@v4 - with: - lfs: true - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.pyversion }} - - name: Install llvmpipe and lavapipe for offscreen canvas - run: | - sudo apt-get update -y -qq - sudo apt-get install --no-install-recommends -y libegl1-mesa-dev libgl1-mesa-dri libxcb-xfixes0-dev mesa-vulkan-drivers xorg-dev - - name: Install dev dependencies - run: | - python -m pip install --upgrade pip setuptools - # remove pygfx from install_requires, we install using pygfx@main - sed -i "/pygfx/d" ./setup.py - pip install git+https://github.com/pygfx/pygfx.git@main - pip install -e ".["tests-desktop"]" - - name: Show wgpu backend - run: - python -c "from examples.tests.testutils import wgpu_backend; print(wgpu_backend)" - - name: fetch git lfs files - run: | - git lfs fetch --all - git lfs pull - - name: Test examples + WGPU_FORCE_OFFSCREEN=1 pytest -v examples/ + - name: Test examples notebooks, exclude ImageWidget notebook + if: ${{ matrix.notebook_dep == 'notebook' }} env: PYGFX_EXPECT_LAVAPIPE: true - run: | - WGPU_FORCE_OFFSCREEN=1 pytest -v tests/ - pytest -v examples + # test notebooks, exclude ImageWidget notebooks + run: FASTPLOTLIB_NB_TESTS=1 pytest --nbmake $(find ./examples/notebooks/ -maxdepth 1 -type f -name "*.ipynb" ! -name "image_widget*.ipynb" -print | xargs) + - name: Test ImageWidget notebooks + # test image widget notebooks only if imgui is installed + if: ${{ matrix.notebook_dep == 'notebook' && matrix.imgui_dep == 'imgui' }} + env: + PYGFX_EXPECT_LAVAPIPE: true + run: FASTPLOTLIB_NB_TESTS=1 pytest --nbmake $(find ./examples/notebooks/ -maxdepth 1 -type f -name "image_widget*.ipynb" -print | xargs) - uses: actions/upload-artifact@v4 if: ${{ failure() }} with: - name: screenshot-diffs + name: screenshot-diffs-${{ matrix.pyversion }}-${{ matrix.imgui_dep }}-${{ matrix.notebook_dep }} path: | examples/diffs + examples/notebooks/diffs + # test-build-full-mac: # name: Test Mac, notebook + glfw diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 63b0f81d7..fe267291a 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -42,7 +42,7 @@ jobs: # remove pygfx from install_requires, we install using pygfx@main sed -i "/pygfx/d" ./setup.py pip install git+https://github.com/pygfx/pygfx.git@main - pip install -e ".["docs"]" + pip install -e ".[docs,notebook,imgui]" - name: Show wgpu backend run: python -c "from examples.tests.testutils import wgpu_backend; print(wgpu_backend)" diff --git a/.github/workflows/screenshots.yml b/.github/workflows/screenshots.yml index b8ac88d56..80bf95201 100644 --- a/.github/workflows/screenshots.yml +++ b/.github/workflows/screenshots.yml @@ -16,6 +16,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 if: ${{ !github.event.pull_request.draft }} + strategy: + fail-fast: false + matrix: + imgui_dep: ["imgui", ""] steps: - uses: actions/checkout@v4 with: @@ -34,21 +38,34 @@ jobs: # remove pygfx from install_requires, we install using pygfx@main sed -i "/pygfx/d" ./setup.py pip install git+https://github.com/pygfx/pygfx.git@main - pip install -e ".["tests"]" + - name: Install fastplotlib + run: | + # create string with one of: tests,imgui,notebook; test,imgui; test,notebook ; tests + # sed removes trailing comma + # install fastplotlib with with or without imgui depending on build matrix + pip install -e ".[$(echo "tests,notebook,${{ matrix.imgui_dep }}" | sed -e "s/,\+/,/g" -e "s/,$//")]" - name: Show wgpu backend run: python -c "from examples.tests.testutils import wgpu_backend; print(wgpu_backend)" - - name: Test examples + - name: Generate screenshots env: PYGFX_EXPECT_LAVAPIPE: true run: | # regenerate screenshots - REGENERATE_SCREENSHOTS=1 pytest -v examples - FASTPLOTLIB_NB_TESTS=1 REGENERATE_SCREENSHOTS=1 pytest --nbmake examples/notebooks/ - - uses: actions/upload-artifact@v3 + WGPU_FORCE_OFFSCREEN=1 REGENERATE_SCREENSHOTS=1 pytest -v examples + - name: Generate screenshots notebook, exclude image widget + env: + PYGFX_EXPECT_LAVAPIPE: true + run: FASTPLOTLIB_NB_TESTS=1 REGENERATE_SCREENSHOTS=1 pytest --nbmake $(find ./examples/notebooks/ -maxdepth 1 -type f -name "*.ipynb" ! -name "image_widget*.ipynb" -print | xargs) + - name: Generate screenshots notebook, include image widget + if: ${{ matrix.imgui_dep == 'imgui' }} + env: + PYGFX_EXPECT_LAVAPIPE: true + run: FASTPLOTLIB_NB_TESTS=1 REGENERATE_SCREENSHOTS=1 pytest --nbmake $(find ./examples/notebooks/ -maxdepth 1 -type f -name "image_widget*.ipynb" -print | xargs) + - uses: actions/upload-artifact@v4 if: always() with: - name: screenshots + name: screenshots-${{ matrix.imgui_dep }} path: | examples/screenshots/ examples/notebooks/screenshots/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6e1a5396c..bb786f9fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,7 +63,7 @@ cd fastplotlib ```bash # install all extras in place -pip install -e ".[notebook,docs,tests]" +pip install -e ".[imgui, notebook, docs, tests]" ``` 5. Add the upstream remote branch: @@ -280,7 +280,7 @@ to open source software packages. # after cloning cd fastplotlib # install dev dependencies -pip install -e ".[tests, docs, notebook]" +pip install -e ".[imgui, tests, docs, notebook]" ``` 3) Check out a feature branch from `main` diff --git a/examples/notebooks/nb_test_utils.py b/examples/notebooks/nb_test_utils.py index 3d9e50d34..fc74f5875 100644 --- a/examples/notebooks/nb_test_utils.py +++ b/examples/notebooks/nb_test_utils.py @@ -105,11 +105,21 @@ def plot_test(name, fig: fpl.Figure): def regenerate_screenshot(name, data): - iio.imwrite(SCREENSHOTS_DIR.joinpath(f"nb-{name}.png"), data) + if fpl.IMGUI: + prefix = "" + else: + prefix = "no-imgui-" + + iio.imwrite(SCREENSHOTS_DIR.joinpath(f"{prefix}nb-{name}.png"), data) def assert_screenshot_equal(name, data): - ground_truth = iio.imread(SCREENSHOTS_DIR.joinpath(f"nb-{name}.png")) + if fpl.IMGUI: + prefix = "" + else: + prefix = "no-imgui-" + + ground_truth = iio.imread(SCREENSHOTS_DIR.joinpath(f"{prefix}nb-{name}.png")) img = normalize_image(data) ref_img = normalize_image(ground_truth) @@ -140,9 +150,14 @@ def get_diffs_rgba(slicer): diffs_rgba = diffs_rgba.astype("u1") return diffs_rgba[..., slicer] + if fpl.IMGUI: + prefix = "" + else: + prefix = "no-imgui-" + # split into an rgb and an alpha diff diffs = { - DIFFS_DIR.joinpath(f"nb-diff-{name}-rgb.png"): slice(0, 3), + DIFFS_DIR.joinpath(f"{prefix}nb-diff-{name}-rgb.png"): slice(0, 3), } for path, slicer in diffs.items(): diff --git a/examples/notebooks/screenshots/no-imgui-nb-astronaut.png b/examples/notebooks/screenshots/no-imgui-nb-astronaut.png new file mode 100644 index 000000000..a1e524e2a --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-astronaut.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:915f6c4695c932dc2aa467be750e58a0435fe86fe0e0fa5a52c6065e05ec3193 +size 85456 diff --git a/examples/notebooks/screenshots/no-imgui-nb-astronaut_RGB.png b/examples/notebooks/screenshots/no-imgui-nb-astronaut_RGB.png new file mode 100644 index 000000000..ec3208e01 --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-astronaut_RGB.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31cfa60229a4e297be507a8888e08d6950c2a7d4b323d34774c9462419272ada +size 84284 diff --git a/examples/notebooks/screenshots/no-imgui-nb-camera.png b/examples/notebooks/screenshots/no-imgui-nb-camera.png new file mode 100644 index 000000000..31b60d9c0 --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-camera.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800845fae18093945ed921237c8756b1afa31ee391fe679b03c57a67929e4ba9 +size 60087 diff --git a/examples/notebooks/screenshots/no-imgui-nb-lines-3d.png b/examples/notebooks/screenshots/no-imgui-nb-lines-3d.png new file mode 100644 index 000000000..35c777e6a --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-lines-3d.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4253362c0908e0d983542be3691a3d94f27a0319fb9e7183315c77891dac140 +size 23232 diff --git a/examples/notebooks/screenshots/no-imgui-nb-lines-colors.png b/examples/notebooks/screenshots/no-imgui-nb-lines-colors.png new file mode 100644 index 000000000..b8e34aab3 --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-lines-colors.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc95d6291d06ab64d142ba0048318caefa28b404bb4b31635df075dc651eaa08 +size 37276 diff --git a/examples/notebooks/screenshots/no-imgui-nb-lines-data.png b/examples/notebooks/screenshots/no-imgui-nb-lines-data.png new file mode 100644 index 000000000..8f58dbc6d --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-lines-data.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8aa0b8303f0a69609198ea312800fc0eb98007c18d0ebc37672a9cf4f1cbaff +size 46780 diff --git a/examples/notebooks/screenshots/no-imgui-nb-lines-underlay.png b/examples/notebooks/screenshots/no-imgui-nb-lines-underlay.png new file mode 100644 index 000000000..b33cde5a6 --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-lines-underlay.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:822410f43d48d12e70930b5b581bafe624ea72475d53ca0d98cdaa5649338c63 +size 51849 diff --git a/examples/notebooks/screenshots/no-imgui-nb-lines.png b/examples/notebooks/screenshots/no-imgui-nb-lines.png new file mode 100644 index 000000000..5d7e704ca --- /dev/null +++ b/examples/notebooks/screenshots/no-imgui-nb-lines.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e3ba744fcfa43df839fddce88f79fb8d7c5eafdd22f271e6b885e09b8891072 +size 31222 diff --git a/examples/notebooks/test_gc.ipynb b/examples/notebooks/test_gc.ipynb index 6a0130d8e..df08e7a2d 100644 --- a/examples/notebooks/test_gc.ipynb +++ b/examples/notebooks/test_gc.ipynb @@ -202,57 +202,27 @@ "metadata": {}, "outputs": [], "source": [ - "movies = [np.random.rand(100, 100, 100) for i in range(6)]\n", - "\n", - "iw = fpl.ImageWidget(movies)\n", - "\n", - "# add some events onto all the image graphics\n", - "for g in iw.managed_graphics:\n", - " for f in g._features:\n", - " g.add_event_handler(feature_changed_handler, f)\n", - "\n", - "iw.show()" - ] - }, - { - "cell_type": "markdown", - "id": "189bcd7a-40a2-4e84-abcf-c334e50f5544", - "metadata": {}, - "source": [ - "# Test that setting new data with different dims clears old ImageGraphics" + "if fpl.IMGUI:\n", + " # do image widget tests only if imgui is installed\n", + " movies = [np.random.rand(100, 100, 100) for i in range(6)]\n", + " \n", + " iw = fpl.ImageWidget(movies)\n", + " \n", + " # add some events onto all the image graphics\n", + " for g in iw.managed_graphics:\n", + " for f in g._features:\n", + " g.add_event_handler(feature_changed_handler, f)\n", + " \n", + " iw.show()\n", + " \n", + " old_graphics = [weakref.proxy(g) for g in iw.managed_graphics]\n", + " \n", + " # Test that setting new data with different dims clears old ImageGraphics\n", + " new_movies = [np.random.rand(100, 200, 200) for i in range(6)]\n", + " \n", + " iw.set_data(new_movies)\n", + " test_references(old_graphics)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7e855043-91c1-4f6c-bed3-b69cf4a87f84", - "metadata": {}, - "outputs": [], - "source": [ - "old_graphics = [weakref.proxy(g) for g in iw.managed_graphics]\n", - "\n", - "new_movies = [np.random.rand(100, 200, 200) for i in range(6)]\n", - "\n", - "iw.set_data(new_movies)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59e3c193-5672-4a66-bdca-12f1dd675d32", - "metadata": {}, - "outputs": [], - "source": [ - "test_references(old_graphics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ad3d2a24-88b3-4071-a49c-49667d5a7813", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/screenshots/no-imgui-gridplot.png b/examples/screenshots/no-imgui-gridplot.png new file mode 100644 index 000000000..45571161d --- /dev/null +++ b/examples/screenshots/no-imgui-gridplot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a27ccf2230628980d16ab22a17df64504268da35a27cd1adb44102e64df033af +size 329247 diff --git a/examples/screenshots/no-imgui-gridplot_non_square.png b/examples/screenshots/no-imgui-gridplot_non_square.png new file mode 100644 index 000000000..f8c307c22 --- /dev/null +++ b/examples/screenshots/no-imgui-gridplot_non_square.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58f50c4fc1b00c9e78c840193d1e15d008b9fe1e7f2a3d8b90065be91e2178f5 +size 236474 diff --git a/examples/screenshots/no-imgui-heatmap.png b/examples/screenshots/no-imgui-heatmap.png new file mode 100644 index 000000000..3d1cf5ef2 --- /dev/null +++ b/examples/screenshots/no-imgui-heatmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fac55efd9339b180b9e34d5cf244c473d6439e57e34f272c1a7e59183f1afa2 +size 98573 diff --git a/examples/screenshots/no-imgui-image_cmap.png b/examples/screenshots/no-imgui-image_cmap.png new file mode 100644 index 000000000..6c565ca2b --- /dev/null +++ b/examples/screenshots/no-imgui-image_cmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82f7176a61e2c6953c22171bea561845bb79cb8179d76b20eef2b2cc475bbb23 +size 237327 diff --git a/examples/screenshots/no-imgui-image_rgb.png b/examples/screenshots/no-imgui-image_rgb.png new file mode 100644 index 000000000..355238724 --- /dev/null +++ b/examples/screenshots/no-imgui-image_rgb.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fce532d713d2c664eb3b676e0128060ebf17241387134812b490d3ad398d42c2 +size 269508 diff --git a/examples/screenshots/no-imgui-image_rgbvminvmax.png b/examples/screenshots/no-imgui-image_rgbvminvmax.png new file mode 100644 index 000000000..6282f2438 --- /dev/null +++ b/examples/screenshots/no-imgui-image_rgbvminvmax.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e01469f0f7da37d3c1c90225bf7c03c44badd1f3612ac9bf88eaed5eeb6850 +size 50145 diff --git a/examples/screenshots/no-imgui-image_simple.png b/examples/screenshots/no-imgui-image_simple.png new file mode 100644 index 000000000..d00a166ce --- /dev/null +++ b/examples/screenshots/no-imgui-image_simple.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8bb29f192617b9dde2490ce36c69bd8352b6ba5d068434bc53edaad91871356 +size 237960 diff --git a/examples/screenshots/no-imgui-image_small.png b/examples/screenshots/no-imgui-image_small.png new file mode 100644 index 000000000..aca14cd69 --- /dev/null +++ b/examples/screenshots/no-imgui-image_small.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1ea4bcf76158169bc06973457ea09997c13ecd4a91e6e634566beb31348ef68 +size 13194 diff --git a/examples/screenshots/no-imgui-image_vminvmax.png b/examples/screenshots/no-imgui-image_vminvmax.png new file mode 100644 index 000000000..6282f2438 --- /dev/null +++ b/examples/screenshots/no-imgui-image_vminvmax.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e01469f0f7da37d3c1c90225bf7c03c44badd1f3612ac9bf88eaed5eeb6850 +size 50145 diff --git a/examples/screenshots/no-imgui-line.png b/examples/screenshots/no-imgui-line.png new file mode 100644 index 000000000..29610c612 --- /dev/null +++ b/examples/screenshots/no-imgui-line.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:709458b03d535bcf407fdae1720ccdcd11a5f79ccf673e85c7e64c5748f6d25e +size 173422 diff --git a/examples/screenshots/no-imgui-line_cmap.png b/examples/screenshots/no-imgui-line_cmap.png new file mode 100644 index 000000000..9340e191e --- /dev/null +++ b/examples/screenshots/no-imgui-line_cmap.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69426f5aac61e59a08764626b2aded602e576479e652d76b6b3bf646e3218cc1 +size 48028 diff --git a/examples/screenshots/no-imgui-line_cmap_more.png b/examples/screenshots/no-imgui-line_cmap_more.png new file mode 100644 index 000000000..f0cea4ec1 --- /dev/null +++ b/examples/screenshots/no-imgui-line_cmap_more.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df9a2ef9d54b417e0387116eb6e6215c54b7c939867d0d62c768768baae27e5f +size 129510 diff --git a/examples/screenshots/no-imgui-line_collection.png b/examples/screenshots/no-imgui-line_collection.png new file mode 100644 index 000000000..ca74d3362 --- /dev/null +++ b/examples/screenshots/no-imgui-line_collection.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f281301e8b23a22a5333e7b34316475907ac25ffc9a23b7395b7431c965343 +size 106518 diff --git a/examples/screenshots/no-imgui-line_collection_cmap_values.png b/examples/screenshots/no-imgui-line_collection_cmap_values.png new file mode 100644 index 000000000..df237aa1b --- /dev/null +++ b/examples/screenshots/no-imgui-line_collection_cmap_values.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5a7257d121a15a8a35ca6e9c70de9d6fbb4977221c840dd34e25e67136f4ea +size 67209 diff --git a/examples/screenshots/no-imgui-line_collection_cmap_values_qualitative.png b/examples/screenshots/no-imgui-line_collection_cmap_values_qualitative.png new file mode 100644 index 000000000..0347f7361 --- /dev/null +++ b/examples/screenshots/no-imgui-line_collection_cmap_values_qualitative.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89a7bc62495e6454ee008e15f1504211777cc01e52f303c18f6068fd38ab3c12 +size 70090 diff --git a/examples/screenshots/no-imgui-line_collection_colors.png b/examples/screenshots/no-imgui-line_collection_colors.png new file mode 100644 index 000000000..dff4f83db --- /dev/null +++ b/examples/screenshots/no-imgui-line_collection_colors.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78b14e90e5ae1e185abb51d94ac9d99c1a4318b0ddf79c26a55e6061f22c0ed9 +size 60447 diff --git a/examples/screenshots/no-imgui-line_collection_slicing.png b/examples/screenshots/no-imgui-line_collection_slicing.png new file mode 100644 index 000000000..70c343361 --- /dev/null +++ b/examples/screenshots/no-imgui-line_collection_slicing.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6b4090d3ae9e38256c9f04e17bf2499f0a35348552f62e9c8d8dc97c9e760a7 +size 132125 diff --git a/examples/screenshots/no-imgui-line_colorslice.png b/examples/screenshots/no-imgui-line_colorslice.png new file mode 100644 index 000000000..3befac6da --- /dev/null +++ b/examples/screenshots/no-imgui-line_colorslice.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f161ad7f351b56c988e1b27155e3963be5191dc09cbaa55615026d07df07334 +size 56338 diff --git a/examples/screenshots/no-imgui-line_dataslice.png b/examples/screenshots/no-imgui-line_dataslice.png new file mode 100644 index 000000000..957462d09 --- /dev/null +++ b/examples/screenshots/no-imgui-line_dataslice.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2f737e0afd8f57c7d621197d37fcf30199086f6c083ec0d3d8e5497965e6d12 +size 67938 diff --git a/examples/screenshots/no-imgui-line_stack.png b/examples/screenshots/no-imgui-line_stack.png new file mode 100644 index 000000000..26f4a3af8 --- /dev/null +++ b/examples/screenshots/no-imgui-line_stack.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dd69dc4be7a2283ec11a8427a75a2ddfe4be0cdbbdaedef3dcbf5f567c11ea7 +size 130519 diff --git a/examples/screenshots/no-imgui-linear_region_selectors_match_offsets.png b/examples/screenshots/no-imgui-linear_region_selectors_match_offsets.png new file mode 100644 index 000000000..9871d65c1 --- /dev/null +++ b/examples/screenshots/no-imgui-linear_region_selectors_match_offsets.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:747b0915eeaf5985346e3b6807a550da53b516769d2517d7c2e0f189baefef91 +size 100604 diff --git a/examples/screenshots/no-imgui-scatter_cmap_iris.png b/examples/screenshots/no-imgui-scatter_cmap_iris.png new file mode 100644 index 000000000..35812357a --- /dev/null +++ b/examples/screenshots/no-imgui-scatter_cmap_iris.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74438dc47ff3fc1391b6952a52c66160fece0545de4ad40c13d3d56b2e093257 +size 59951 diff --git a/examples/screenshots/no-imgui-scatter_colorslice_iris.png b/examples/screenshots/no-imgui-scatter_colorslice_iris.png new file mode 100644 index 000000000..61812c8d7 --- /dev/null +++ b/examples/screenshots/no-imgui-scatter_colorslice_iris.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a02a21459deeca379a69b30054bebcc3739553b9d377d25b953315094e714d1a +size 35763 diff --git a/examples/screenshots/no-imgui-scatter_dataslice_iris.png b/examples/screenshots/no-imgui-scatter_dataslice_iris.png new file mode 100644 index 000000000..9ef39785c --- /dev/null +++ b/examples/screenshots/no-imgui-scatter_dataslice_iris.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21ccf85a9242f6d7a724c38797688abd804d9a565e818b81ea0c8931aa05ca4e +size 38337 diff --git a/examples/screenshots/no-imgui-scatter_iris.png b/examples/screenshots/no-imgui-scatter_iris.png new file mode 100644 index 000000000..91dc29397 --- /dev/null +++ b/examples/screenshots/no-imgui-scatter_iris.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ec960574580af159f3502da09f1f34e841267985edb52b89baf034c1d49125e +size 37410 diff --git a/examples/screenshots/no-imgui-scatter_size.png b/examples/screenshots/no-imgui-scatter_size.png new file mode 100644 index 000000000..6fadfec4d --- /dev/null +++ b/examples/screenshots/no-imgui-scatter_size.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94b4b9d39f3d4ef2c46b6b4dd7f712ca612f31a7fc94ab5fad8015e48c637e91 +size 70290 diff --git a/examples/tests/test_examples.py b/examples/tests/test_examples.py index caa8e9dca..67519187b 100644 --- a/examples/tests/test_examples.py +++ b/examples/tests/test_examples.py @@ -10,6 +10,7 @@ import numpy as np import imageio.v3 as iio import pygfx +import fastplotlib as fpl MAX_TEXTURE_SIZE = 2048 pygfx.renderers.wgpu.set_wgpu_limits(**{"max-texture-dimension-2d": MAX_TEXTURE_SIZE}) @@ -35,9 +36,21 @@ examples_to_test = find_examples(query="# test_example = true") +def check_skip_imgui(module): + # skip any imgui or ImageWidget tests + with open(module, "r") as f: + contents = f.read() + if "ImageWidget" in contents: + pytest.skip("skipping ImageWidget tests since they require imgui") + elif "imgui" in contents or "imgui_bundle" in contents: + pytest.skip("skipping tests that require imgui") + + @pytest.mark.parametrize("module", examples_to_run, ids=lambda x: x.stem) def test_examples_run(module, force_offscreen): """Run every example marked to see if they run without error.""" + if not fpl.IMGUI: + check_skip_imgui(module) runpy.run_path(module, run_name="__main__") @@ -75,15 +88,20 @@ def import_from_path(module_name, filename): @pytest.mark.parametrize("module", examples_to_test, ids=lambda x: x.stem) def test_example_screenshots(module, force_offscreen): """Make sure that every example marked outputs the expected.""" + + if not fpl.IMGUI: + # skip any imgui or ImageWidget tests + check_skip_imgui(module) + # import the example module example = import_from_path(module.stem, module) - # there doesn't seem to be a resize event for the manual offscreen canvas - example.figure.imgui_renderer._backend.io.display_size = example.figure.canvas.get_logical_size() - - # run this once so any edge widgets set their sizes and therefore the subplots get the correct rect - # hacky but it works for now - example.figure.imgui_renderer.render() + if fpl.IMGUI: + # there doesn't seem to be a resize event for the manual offscreen canvas + example.figure.imgui_renderer._backend.io.display_size = example.figure.canvas.get_logical_size() + # run this once so any edge widgets set their sizes and therefore the subplots get the correct rect + # hacky but it works for now + example.figure.imgui_renderer.render() # render each subplot for subplot in example.figure: @@ -94,8 +112,9 @@ def test_example_screenshots(module, force_offscreen): # flush pygfx renderer example.figure.renderer.flush() - # render imgui - example.figure.imgui_renderer.render() + if fpl.IMGUI: + # render imgui + example.figure.imgui_renderer.render() # render a frame img = np.asarray(example.figure.renderer.target.draw()) @@ -107,7 +126,13 @@ def test_example_screenshots(module, force_offscreen): if not os.path.exists(screenshots_dir): os.mkdir(screenshots_dir) - screenshot_path = screenshots_dir / f"{module.stem}.png" + # test screenshots for both imgui and non-gui installs + if not fpl.IMGUI: + prefix = "no-imgui-" + else: + prefix = "" + + screenshot_path = screenshots_dir / f"{prefix}{module.stem}.png" black = np.zeros(img.shape).astype(np.uint8) black[:, :, -1] = 255 diff --git a/setup.py b/setup.py index a1c74d5e5..befed8333 100644 --- a/setup.py +++ b/setup.py @@ -16,45 +16,28 @@ "sphinx-gallery", "pydata-sphinx-theme", "glfw", - "jupyter-rfb>=0.4.1", # required so ImageWidget docs show up "ipywidgets>=8.0.0,<9", "sphinx-copybutton", "sphinx-design", "pandoc", - "jupyterlab", - "sidecar", "imageio[ffmpeg]", "matplotlib", "scikit-learn", - "imgui-bundle", ], "notebook": [ "jupyterlab", - "jupyter-rfb>=0.4.1", + "jupyter-rfb>=0.5.1", "ipywidgets>=8.0.0,<9", "sidecar", ], "tests": [ - "pytest<8.0.0", + "pytest", "nbmake", "black", "scipy", "imageio[ffmpeg]", - "jupyterlab", - "jupyter-rfb>=0.4.1", - "ipywidgets>=8.0.0,<9", - "scikit-learn", - "tqdm", - "sidecar", - "imgui-bundle", - ], - "tests-desktop": [ - "pytest<8.0.0", - "scipy", - "imageio[ffmpeg]", "scikit-learn", "tqdm", - "imgui-bundle", ], "imgui": ["imgui-bundle"], }