From 838feed3b1a8f6463615d3cc2b7fa4178ca18594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melissa=20Weber=20Mendon=C3=A7a?= Date: Wed, 24 Jan 2024 19:37:38 -0300 Subject: [PATCH 01/23] Documentation set up with Sphinx --- .gitignore | 9 +- Makefile | 42 +++ docs/_static/custom.css | 0 docs/_static/favicon/logo-noborder-180.png | Bin 0 -> 36168 bytes docs/_static/favicon/logo-silhouette-192.png | Bin 0 -> 3992 bytes .../favicon/logo-silhouette-dark-light.svg | 28 ++ docs/_templates/navbar-project.html | 4 + docs/_toc.yml | 4 + docs/conf.py | 259 ++++++++++++++++++ docs/developers/contributing.md | 171 ++++++++++++ docs/gallery.md | 11 + docs/images/logo.png | Bin 0 -> 143476 bytes docs/index.md | 135 +++++++++ examples/README.rst | 0 examples/animate2D.py | 12 +- examples/animate3D.py | 11 +- examples/animateMixed.py | 11 +- examples/ease_function.py | 4 + examples/example.py | 4 + examples/interactive_animation.py | 3 + examples/programmatic_notebook_example.ipynb | 7 + setup.cfg | 12 +- 22 files changed, 712 insertions(+), 15 deletions(-) create mode 100644 Makefile create mode 100644 docs/_static/custom.css create mode 100644 docs/_static/favicon/logo-noborder-180.png create mode 100644 docs/_static/favicon/logo-silhouette-192.png create mode 100644 docs/_static/favicon/logo-silhouette-dark-light.svg create mode 100644 docs/_templates/navbar-project.html create mode 100644 docs/_toc.yml create mode 100644 docs/conf.py create mode 100644 docs/developers/contributing.md create mode 100644 docs/gallery.md create mode 100644 docs/images/logo.png create mode 100644 docs/index.md create mode 100644 examples/README.rst diff --git a/.gitignore b/.gitignore index e82e5bb..6c2de3f 100644 --- a/.gitignore +++ b/.gitignore @@ -80,4 +80,11 @@ target/ */_version.py # vscode -.vscode \ No newline at end of file +.vscode + +# Autogenerated gallery +docs/gallery +docs/jupyter_execute +docs/sg_execution_times.rst +examples/*.mov +examples/*.mp4 \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4b93154 --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +.PHONY: docs clean + +SPHINXOPTS = + +mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) +current_dir := $(dir $(mkfile_path)) +docs_dir := $(current_dir)docs + +clean: + echo clean + echo $(current_dir) + rm -rf $(docs_dir)/_build/ + rm -rf $(docs_dir)/gallery/* + +docs-build: + NAPARI_CONFIG="" NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -b html docs/ docs/_build $(SPHINXOPTS) + +docs-xvfb: + NAPARI_CONFIG="" NAPARI_APPLICATION_IPY_INTERACTIVE=0 xvfb-run --auto-servernum sphinx-build -b html docs/ docs/_build $(SPHINXOPTS) + +docs: clean docs-build + +# Implies noplot, but no clean - call 'make clean' manually if needed +# Autogenerated paths need to be ignored to prevent reload loops +html-live: + NAPARI_APPLICATION_IPY_INTERACTIVE=0 \ + sphinx-autobuild \ + -b html \ + docs/ \ + docs/_build \ + -D plot_gallery=0 \ + --ignore $(docs_dir)"/gallery/*" \ + --ignore $(docs_dir)"/jupyter_execute/*" \ + --open-browser \ + --port=0 \ + $(SPHINXOPTS) + +html-noplot: clean + NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -D plot_gallery=0 -b html docs/ docs/_build $(SPHINXOPTS) + +linkcheck-files: + NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -b linkcheck -D plot_gallery=0 --color docs/ docs/_build ${FILES} $(SPHINXOPTS) diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000..e69de29 diff --git a/docs/_static/favicon/logo-noborder-180.png b/docs/_static/favicon/logo-noborder-180.png new file mode 100644 index 0000000000000000000000000000000000000000..88b21dd18b189a55be207090c9013f0ee07fe0a1 GIT binary patch literal 36168 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 literal 0 HcmV?d00001 diff --git a/docs/_static/favicon/logo-silhouette-192.png b/docs/_static/favicon/logo-silhouette-192.png new file mode 100644 index 0000000000000000000000000000000000000000..31f4f5cc91483ab1a95918bf4e372304fa912655 GIT binary patch literal 3992 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 mHVm7ZkIOCp`8P((qV@q9 literal 0 HcmV?d00001 diff --git a/docs/_static/favicon/logo-silhouette-dark-light.svg b/docs/_static/favicon/logo-silhouette-dark-light.svg new file mode 100644 index 0000000..7120e73 --- /dev/null +++ b/docs/_static/favicon/logo-silhouette-dark-light.svg @@ -0,0 +1,28 @@ + + + + + + + diff --git a/docs/_templates/navbar-project.html b/docs/_templates/navbar-project.html new file mode 100644 index 0000000..0090ea2 --- /dev/null +++ b/docs/_templates/navbar-project.html @@ -0,0 +1,4 @@ + + + napari-animation + diff --git a/docs/_toc.yml b/docs/_toc.yml new file mode 100644 index 0000000..78123c3 --- /dev/null +++ b/docs/_toc.yml @@ -0,0 +1,4 @@ +root: index +subtrees: +- entries: + - file: gallery diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..953360f --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,259 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +from pathlib import Path + +# from sphinx_gallery import scrapers +from sphinx_gallery.sorting import ExampleTitleSortKey + +from napari_animation._version import version as napari_animation_version + +release = napari_animation_version +if "dev" in release: + version = "dev" +else: + version = release + +# -- Project information ----------------------------------------------------- + +project = "napari-animation" +copyright = "2024, The napari team" +author = "The napari team" + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. + +extensions = [ + "sphinx.ext.intersphinx", + "sphinx_external_toc", + "myst_nb", + "sphinx.ext.viewcode", + "sphinx_favicon", + "sphinx_copybutton", + "sphinx_gallery.gen_gallery", +] + +external_toc_path = "_toc.yml" + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "napari_sphinx_theme" + +# # Define the json_url for our version switcher. +# json_url = "https://napari.org/dev/_static/version_switcher.json" + +# if version == "dev": +# version_match = "latest" +# else: +# version_match = release + +html_theme_options = { + "external_links": [{"name": "napari", "url": "https://napari.org"}], + "github_url": "https://github.com/napari/napari-animation", + "navbar_start": ["navbar-logo", "navbar-project"], + "navbar_end": ["navbar-icon-links"], + # "switcher": { + # "json_url": json_url, + # "version_match": version_match, + # }, + "navbar_persistent": [], + "header_links_before_dropdown": 6, + "secondary_sidebar_items": ["page-toc"], + "pygment_light_style": "napari", + "pygment_dark_style": "napari", +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] +html_logo = "images/logo.png" +html_sourcelink_suffix = "" +html_title = "napari animation" + +favicons = [ + { + # the SVG is the "best" and contains code to detect OS light/dark mode + "static-file": "favicon/logo-silhouette-dark-light.svg", + "type": "image/svg+xml", + }, + { + # Safari in Oct. 2022 does not support SVG + # an ICO would work as well, but PNG should be just as good + # setting sizes="any" is needed for Chrome to prefer the SVG + "sizes": "any", + "static-file": "favicon/logo-silhouette-192.png", + }, + { + # this is used on iPad/iPhone for "Save to Home Screen" + # apparently some other apps use it as well + "rel": "apple-touch-icon", + "sizes": "180x180", + "static-file": "favicon/logo-noborder-180.png", + }, +] + +html_css_files = [ + "custom.css", +] + +intersphinx_mapping = { + "python": ["https://docs.python.org/3", None], + "numpy": ["https://numpy.org/doc/stable/", None], + "napari_plugin_engine": [ + "https://napari-plugin-engine.readthedocs.io/en/latest/", + "https://napari-plugin-engine.readthedocs.io/en/latest/objects.inv", + ], + "napari": [ + "https://napari.org/dev", + "https://napari.org/dev/objects.inv", + ], +} + +myst_enable_extensions = [ + "colon_fence", + "dollarmath", + "substitution", + "tasklist", +] + +myst_heading_anchors = 4 +suppress_warnings = ["etoc.toctree"] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", + ".jupyter_cache", + "jupyter_execute", +] + +# def reset_napari(gallery_conf, fname): +# from napari.settings import get_settings +# from qtpy.QtWidgets import QApplication + +# settings = get_settings() +# settings.appearance.theme = 'dark' + +# # Disabling `QApplication.exec_` means example scripts can call `exec_` +# # (scripts work when run normally) without blocking example execution by +# # sphinx-gallery. (from qtgallery) +# QApplication.exec_ = lambda _: None + + +# def napari_scraper(block, block_vars, gallery_conf): +# """Basic napari window scraper. + +# Looks for any QtMainWindow instances and takes a screenshot of them. + +# `app.processEvents()` allows Qt events to propagateo and prevents hanging. +# """ +# imgpath_iter = block_vars['image_path_iterator'] + +# if app := napari.qt.get_app(): +# app.processEvents() +# else: +# return "" + +# img_paths = [] +# for win, img_path in zip( +# reversed(napari._qt.qt_main_window._QtMainWindow._instances), +# imgpath_iter, +# ): +# img_paths.append(img_path) +# win._window.screenshot(img_path, canvas_only=False) + +# napari.Viewer.close_all() +# app.processEvents() + +# return scrapers.figure_rst(img_paths, gallery_conf['src_dir']) + + +sphinx_gallery_conf = { + # path to your example scripts + "examples_dirs": "../examples", + "gallery_dirs": "gallery", # path to where to save gallery generated output + "filename_pattern": "/*.py", + "ignore_pattern": "README.rst|/*_.py", + "default_thumb_file": Path(__file__).parent / "images" / "logo.png", + "plot_gallery": "'True'", # https://github.com/sphinx-gallery/sphinx-gallery/pull/304/files + "download_all_examples": False, + "only_warn_on_example_error": False, + "abort_on_example_error": True, + #'image_scrapers': ("matplotlib", napari_scraper,), + #'reset_modules': (reset_napari,), + "reference_url": {"napari": None}, + "within_subsection_order": ExampleTitleSortKey, +} + + +def setup(app): + """Set up docs build. + + * Ignores .ipynb files to prevent sphinx from complaining about multiple + files found for document when generating the gallery + * Rewrites github anchors to be comparable + * Adds google calendar api key to meetings schedule page + + """ + app.registry.source_suffix.pop(".ipynb", None) + + +# linkcheck_anchors_ignore = [r'^!', r'L\d+-L\d+', r'r\d+', r'issuecomment-\d+'] + +# linkcheck_ignore = [ +# 'https://napari.zulipchat.com/', +# '../_tags', +# 'https://en.wikipedia.org/wiki/Napari#/media/File:Tabuaeran_Kiribati.jpg', +# ] + + +# def rewrite_github_anchor(app, uri: str): +# """Rewrite anchor name of the hyperlink to github.com + +# The hyperlink anchors in github.com are dynamically generated. This rewrites +# them before checking and makes them comparable. +# """ +# parsed = urlparse(uri) +# if parsed.hostname == "github.com" and parsed.fragment: +# for text in [ +# "L", +# "readme", +# "pullrequestreview", +# "issuecomment", +# "issue", +# ]: +# if parsed.fragment.startswith(text): +# return None +# if re.match(r'r\d+', parsed.fragment): +# return None +# prefixed = parsed.fragment.startswith('user-content-') +# if not prefixed: +# fragment = f'user-content-{parsed.fragment}' +# return urlunparse(parsed._replace(fragment=fragment)) +# return None diff --git a/docs/developers/contributing.md b/docs/developers/contributing.md new file mode 100644 index 0000000..f4b1345 --- /dev/null +++ b/docs/developers/contributing.md @@ -0,0 +1,171 @@ +# Contributing Guide + +We welcome your contributions! Please see the provided steps below and never hesitate to contact us. + +If you are a new user, we recommend checking out the detailed [Github Guides](https://guides.github.com). + +## Setting up a development installation + +In order to make changes to `napari-animation`, you will need to [fork](https://guides.github.com/activities/forking/#fork) the +[repository](https://github.com/napari/napari-animation). + +If you are not familiar with `git`, we recommend reading up on [this guide](https://guides.github.com/introduction/git-handbook/#basic-git). + +Clone the forked repository to your local machine and change directories: +```sh +git clone https://github.com/your-username/napari-animation.git +cd napari-animation +``` + +Set the `upstream` remote to the base `napari` repository: +```sh +git remote add upstream https://github.com/napari/napari-animation.git +``` + +Install the package in editable mode, along with all of the developer tools +```sh +pip install -r requirements.txt +``` + +We use [`pre-commit`](https://pre-commit.com) to sort imports with +[`isort`](https://github.com/timothycrosley/isort), format code with +[`black`](https://github.com/psf/black), and lint with +[`flake8`](https://github.com/PyCQA/flake8) automatically prior to each commit. +To minmize test errors when submitting pull requests, please install `pre-commit` +in your environment as follows: + +```sh +pre-commit install +``` + +Upon committing, your code will be formatted according to our [`black` +configuration](https://github.com/napari/napari-animation/blob/main/pyproject.toml). To learn more, +see [`black`'s documentation](https://black.readthedocs.io/en/stable/). + +Code will also be linted to enforce the stylistic and logistical rules specified +in our [`flake8` configuration](https://github.com/napari/napari/blob/master/setup.cfg), which currently ignores +[E203](https://lintlyci.github.io/Flake8Rules/rules/E203.html), +[E501](https://lintlyci.github.io/Flake8Rules/rules/E501.html), +[W503](https://lintlyci.github.io/Flake8Rules/rules/W503.html) and +[C901](https://lintlyci.github.io/Flake8Rules/rules/C901.html). For information +on any specific flake8 error code, see the [Flake8 +Rules](https://lintlyci.github.io/Flake8Rules/). You may also wish to refer to +the [PEP 8 style guide](https://www.python.org/dev/peps/pep-0008/). + +If you wish to tell the linter to ignore a specific line use the `# noqa` +comment along with the specific error code (e.g. `import sys # noqa: E402`) but +please do not ignore errors lightly. + +## Translations + +Starting with version 0.4.7, napari codebase include internationalization +(i18n) and now offers the possibility of installing language packs, which +provide localization (l10n) enabling the user interface to be displayed in +different languages. + +To learn more about the current languages that are in the process of +translation, visit the [language packs repository](https://github.com/napari/napari-language-packs) + +To make your code translatable (localizable), please use the `trans` helper +provided by the napari utilities. + +```python +from napari.utils.translations import trans + +some_string = trans._("Localizable string") +``` + +To learn more, please see the [translations guide](https://napari.org/guides/stable/translations.html). + +## Making changes + +Create a new feature branch: +```sh +git checkout master -b your-branch-name +``` + +`git` will automatically detect changes to a repository. +You can view them with: +```sh +git status +``` + +Add and commit your changed files: +```sh +git add my-file-or-directory +git commit -m "my message" +``` + +## Tests + +We use unit tests and integration tests to ensure that +napari-animation works as intended. Writing tests for new code is a critical part of +keeping napari-animation maintainable as it grows. + +Check out the dedicated documentation on testing over at [napari.org](https://napari.org/developers/testing.html) that we recommend you +read as you're working on your first contribution. + +### Help us make sure it's you + +Each commit you make must have a [GitHub-registered email](https://github.com/settings/emails) +as the `author`. You can read more [here](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address). + +To set it, use `git config --global user.email your-address@example.com`. + +## Keeping your branches up-to-date + +Switch to the `master` branch: +```sh +git checkout master +``` + +Fetch changes and update `master`: +```sh +git pull upstream master --tags +``` + +This is shorthand for: +```sh +git fetch upstream master --tags +git merge upstream/master +``` + +Update your other branches: +```sh +git checkout your-branch-name +git merge master +``` + +## Sharing your changes + +Update your remote branch: +```sh +git push -u origin your-branch-name +``` + +You can then make a [pull-request](https://guides.github.com/activities/forking/#making-a-pull-request) to `napari`'s `master` branch. + +## Building the docs + +From the project root: +```sh +make docs +``` + +The docs will be built at `docs/_build/html`. + +Most web browsers will allow you to preview HTML pages. +Try entering `file:///absolute/path/to/napari/docs/_build/html/index.html` in your address bar. + +To read more about the docs, how they're organized, and built, read {ref}`docs-dev`. + +## Code of conduct + +`napari` has a [Code of Conduct](CODE_OF_CONDUCT.md) that should be honored by everyone who participates in the `napari` community. + +## Questions, comments, and feedback + +If you have questions, comments, suggestions for improvement, or any other inquiries +regarding the project, feel free to open an [issue](https://github.com/napari/napari/issues). + +Issues and pull-requests are written in [Markdown](https://guides.github.com/features/mastering-markdown/#what). You can find a comprehensive guide [here](https://guides.github.com/features/mastering-markdown/#syntax). diff --git a/docs/gallery.md b/docs/gallery.md new file mode 100644 index 0000000..ef524a9 --- /dev/null +++ b/docs/gallery.md @@ -0,0 +1,11 @@ +# Examples gallery + +Examples can be found in our [examples](https://github.com/napari/napari-animation/tree/main/examples) folder. Simple examples for both interactive and headless use of the plugin follow. + +Check also [a Programmatic notebook example](https://github.com/napari/napari-animation/tree/main/examples/programmatic_notebook_example.ipynb). + +```{eval-rst} +.. include:: gallery/index.rst + :start-after: :orphan: + :end-before: .. toctree:: +``` diff --git a/docs/images/logo.png b/docs/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..736ee20849af2f250d266a209ae48d3b9728e510 GIT binary patch literal 143476 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..cfb7f05 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,135 @@ +# napari-animation documentation + +**napari-animation** is a plugin for making animations in [napari](https://napari.org). + +

+ +

+ +napari-animation is hosted on GitHub at [github.com/napari/napari-animation](https://github.com/napari/napari-animation). + +## Overview + +**napari-animation** provides a framework for the creation of animations in napari. The plugin contains: + +- an easy to use GUI for creating animations interactively; +- a Python package for the programmatic creation of animations. + +This plugin remains under development and contributions are very welcome, please open an issue to discuss potential improvements. + +## Installation + +### PyPI +`napari-animation` is available through the Python package index and can be installed using `pip`. + +```sh +pip install napari-animation +``` + +### Local +You can clone this repository and install locally with + + pip install -e . + +### Interactive use +**napari-animation** can be used interactively. + +An animation is created by capturing [keyframes](https://en.wikipedia.org/wiki/Key_frame) containing the current viewer state. + +

+ +

+ +To activate the GUI, select **napari-animation: wizard** from the *plugins menu* + +

+ +

+ +### Scripting + +**napari-animation** can also be run programmatically, allowing for reproducible, scripted creation of animations. + +```python +from napari_animation import Animation + +animation = Animation(viewer) + +viewer.dims.ndisplay = 3 +viewer.camera.angles = (0.0, 0.0, 90.0) +animation.capture_keyframe() +viewer.camera.zoom = 2.4 +animation.capture_keyframe() +viewer.camera.angles = (-7.0, 15.7, 62.4) +animation.capture_keyframe(steps=60) +viewer.camera.angles = (2.0, -24.4, -36.7) +animation.capture_keyframe(steps=60) +viewer.reset_view() +viewer.camera.angles = (0.0, 0.0, 90.0) +animation.capture_keyframe() +animation.animate('demo.mov', canvas_only=False) +``` + +## Contributing + +Contributions are very welcome and a detailed contributing guide is coming soon. + +We recommend using a virtual environment, for example `conda`. + +```{important} + +Ensure you have a suitable Qt backend for napari! We recommend `PyQt5`. +For more information, see the napari [Qt backend installation guide](https://napari.org/stable/tutorials/fundamentals/installation.html#choosing-a-different-qt-backend) +``` + +To set up your development installation, clone this repository, navigate to the clone folder, and install napari-animation in editable mode using `pip`. + +```sh +conda create -n nap-anim python=3.10 +conda activate nap-anim +pip install -e ".[dev]" PyQt5 + +``` + +Tests are run with `pytest`: + +```sh +pytest . +``` + +````{note} + +We use [`pre-commit`](https://pre-commit.com) to sort imports with +[`isort`](https://github.com/timothycrosley/isort), format code with +[`black`](https://github.com/psf/black), and lint with +[`flake8`](https://github.com/PyCQA/flake8) automatically prior to each commit. +To minmize test errors when submitting pull requests, please install `pre-commit` in your environment as follows: + +```sh +pre-commit install +``` +```` + +## Documentation + +The documentation for napari-animation is built with [mkdocs](https://www.mkdocs.org). After installing the documentation dependencies with + +```sh +pip install ".[doc]" +``` + +you can see a local version of the documentation by running + +```sh +mkdocs serve +``` + +Open up http://127.0.0.1:8000/ in your browser, and you'll see the home page of the docs being displayed. + +## License + +Distributed under the terms of the [BSD-3 license](http://opensource.org/licenses/BSD-3-Clause), "napari-animation" is free and open source software. + +## Issues + +If you encounter any problems, please [file an issue on GitHub](https://github.com/napari/napari-animation/issues) along with a detailed description. diff --git a/examples/README.rst b/examples/README.rst new file mode 100644 index 0000000..e69de29 diff --git a/examples/animate2D.py b/examples/animate2D.py index e3346f4..c720371 100644 --- a/examples/animate2D.py +++ b/examples/animate2D.py @@ -1,4 +1,7 @@ """ +Animate 2D +========== + Display a labels layer above of an image layer using the add_labels and add_image APIs """ @@ -10,12 +13,12 @@ blobs = data.binary_blobs(length=128, volume_fraction=0.1, n_dim=3) -viewer = napari.view_image(blobs.astype(float), name='blobs') +viewer = napari.view_image(blobs.astype(float), name="blobs") labeled = ndi.label(blobs)[0] -viewer.add_labels(labeled, name='blob ID') +viewer.add_labels(labeled, name="blob ID") animation = Animation(viewer) -viewer.update_console({'animation': animation}) +viewer.update_console({"animation": animation}) animation.capture_keyframe() viewer.camera.zoom = 0.2 @@ -29,5 +32,4 @@ animation.capture_keyframe(steps=60) viewer.reset_view() animation.capture_keyframe() -animation.animate('demo2D.mov', canvas_only=False) - +animation.animate("demo2D.mov", canvas_only=False) diff --git a/examples/animate3D.py b/examples/animate3D.py index 585a0cd..d66b8f9 100644 --- a/examples/animate3D.py +++ b/examples/animate3D.py @@ -1,4 +1,7 @@ """ +Animate 3D +========== + Display a labels layer above of an image layer using the add_labels and add_image APIs """ @@ -10,12 +13,12 @@ blobs = data.binary_blobs(length=128, volume_fraction=0.1, n_dim=3) -viewer = napari.view_image(blobs.astype(float), name='blobs') +viewer = napari.view_image(blobs.astype(float), name="blobs") labeled = ndi.label(blobs)[0] -viewer.add_labels(labeled, name='blob ID') +viewer.add_labels(labeled, name="blob ID") animation = Animation(viewer) -viewer.update_console({'animation': animation}) +viewer.update_console({"animation": animation}) viewer.dims.ndisplay = 3 viewer.camera.angles = (0.0, 0.0, 90.0) @@ -29,4 +32,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate('demo3D.mov', canvas_only=False) +animation.animate("demo3D.mov", canvas_only=False) diff --git a/examples/animateMixed.py b/examples/animateMixed.py index 5e672c1..98eb5b1 100644 --- a/examples/animateMixed.py +++ b/examples/animateMixed.py @@ -1,4 +1,7 @@ """ +Animate mixed +============= + Display a labels layer above of an image layer using the add_labels and add_image APIs """ @@ -10,12 +13,12 @@ blobs = data.binary_blobs(length=128, volume_fraction=0.1, n_dim=3) -viewer = napari.view_image(blobs.astype(float), name='blobs') +viewer = napari.view_image(blobs.astype(float), name="blobs") labeled = ndi.label(blobs)[0] -viewer.add_labels(labeled, name='blob ID') +viewer.add_labels(labeled, name="blob ID") animation = Animation(viewer) -viewer.update_console({'animation': animation}) +viewer.update_console({"animation": animation}) animation.capture_keyframe() viewer.camera.zoom = 0.2 @@ -42,4 +45,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate('demoMixed.mov', canvas_only=False) +animation.animate("demoMixed.mov", canvas_only=False) diff --git a/examples/ease_function.py b/examples/ease_function.py index 2d7a455..3c0d5b9 100644 --- a/examples/ease_function.py +++ b/examples/ease_function.py @@ -1,3 +1,7 @@ +""" +Ease function +============= +""" import napari from skimage import data from napari_animation import Animation diff --git a/examples/example.py b/examples/example.py index 643ed5e..389032b 100644 --- a/examples/example.py +++ b/examples/example.py @@ -1,3 +1,7 @@ +""" +Camera example +============== +""" from scipy import ndimage as ndi from napari_animation import Animation import napari diff --git a/examples/interactive_animation.py b/examples/interactive_animation.py index e00fb87..36eb652 100644 --- a/examples/interactive_animation.py +++ b/examples/interactive_animation.py @@ -1,4 +1,7 @@ """ +Interactive animation +===================== + Display a labels layer above of an image layer using the add_labels and add_image APIs """ diff --git a/examples/programmatic_notebook_example.ipynb b/examples/programmatic_notebook_example.ipynb index fffa090..ddc08c5 100644 --- a/examples/programmatic_notebook_example.ipynb +++ b/examples/programmatic_notebook_example.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Programmatic example" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/setup.cfg b/setup.cfg index 96f8b41..db5a131 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,7 @@ include_package_data = True install_requires = imageio imageio-ffmpeg - napari + napari>=0.4.19rc5 npe2 numpy qtpy @@ -50,6 +50,16 @@ dev = ruff check-manifest %(testing)s +doc = + sphinx>6 + sphinx-autobuild + sphinx-external-toc + sphinx-copybutton + sphinx-gallery + sphinx-favicon + matplotlib + myst-nb + napari-sphinx-theme>=0.3.0 [options.entry_points] From 98bcfda746713bfe90e9b78585093ec5f87f214d Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:49:25 +1100 Subject: [PATCH 02/23] Fix ruff CI warnings --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 953360f..5766194 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -22,7 +22,7 @@ from napari_animation._version import version as napari_animation_version release = napari_animation_version -if "dev" in release: +if "dev" in release: # noqa: SIM108 version = "dev" else: version = release @@ -30,7 +30,7 @@ # -- Project information ----------------------------------------------------- project = "napari-animation" -copyright = "2024, The napari team" +copyright = "2024, The napari team" # noqa: A001 author = "The napari team" # -- General configuration --------------------------------------------------- From c39754eba98e06632759b946d07322ea8a6cd181 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:57:01 +1100 Subject: [PATCH 03/23] Add 'doc' setup requirements to development install --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6d951a6..de9088e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ # requirements are in setup.cfg # https://caremad.io/posts/2013/07/setup-vs-requirement/ --e ".[dev]" \ No newline at end of file +-e ".[dev,doc]" \ No newline at end of file From e5425cde469a6cb080d0cb8855fb87cadb8403a4 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:45:10 +1100 Subject: [PATCH 04/23] Add unlinked documentation file to ToC --- docs/_toc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_toc.yml b/docs/_toc.yml index 78123c3..fca364f 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -2,3 +2,4 @@ root: index subtrees: - entries: - file: gallery + - file: developers/contributing From 4ef598ccb0c5c10cbed191fed86950aadaa9f7f5 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:46:16 +1100 Subject: [PATCH 05/23] Add video scraper for example animation gallery --- docs/conf.py | 93 +++++++++++++++++++++++++++++++++++++++++++++------- setup.cfg | 1 + 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5766194..2248251 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,9 +14,14 @@ # import sys # sys.path.insert(0, os.path.abspath('.')) +from glob import glob +import os from pathlib import Path +import shutil -# from sphinx_gallery import scrapers +import imageio.v2 as iio +import napari +from sphinx_gallery import scrapers from sphinx_gallery.sorting import ExampleTitleSortKey from napari_animation._version import version as napari_animation_version @@ -47,6 +52,7 @@ "sphinx_favicon", "sphinx_copybutton", "sphinx_gallery.gen_gallery", + "sphinxcontrib.video", ] external_toc_path = "_toc.yml" @@ -153,17 +159,80 @@ "jupyter_execute", ] -# def reset_napari(gallery_conf, fname): -# from napari.settings import get_settings -# from qtpy.QtWidgets import QApplication +# -- Examples gallery scrapers ------------------------------------------------- -# settings = get_settings() -# settings.appearance.theme = 'dark' -# # Disabling `QApplication.exec_` means example scripts can call `exec_` -# # (scripts work when run normally) without blocking example execution by -# # sphinx-gallery. (from qtgallery) -# QApplication.exec_ = lambda _: None +class VideoScraper(object): + """Video file scraper class. + Scrapes video files that were saved to disk by the example scripts. + Based on the sphinx example scraper "Example 2: detecting image files on disk" + https://sphinx-gallery.github.io/stable/advanced.html#example-2-detecting-image-files-on-disk + """ + def __init__(self): + self.seen = set() + + def __repr__(self): + return 'VideoScraper' + + def __call__(self, block, block_vars, gallery_conf): + """Video file scraper. + Scrapes video files that were saved to disk by the example scripts. + Based on the sphinx example scraper "Example 2: detecting image files on disk" + https://sphinx-gallery.github.io/stable/advanced.html#example-2-detecting-image-files-on-disk + """ + # Find all video files in the directory of this example. + video_file_extensions = [".mp4", ".mov"] + path_current_example = os.path.dirname(block_vars['src_file']) + video_paths = sorted(str(p.resolve()) for p in Path(path_current_example).glob("**/*") if p.suffix in video_file_extensions) + + # Iterate through the videos, copy them to the sphinx-gallery output directory + video_names = list() + image_path_iterator = block_vars['image_path_iterator'] + rst = "" + for video in video_paths: + if video not in self.seen: + self.seen |= set(video) + this_video_path = image_path_iterator.next() + this_video_path = os.path.splitext(this_video_path)[0] + os.path.splitext(video)[1] + video_names.append(this_video_path) + shutil.move(video, this_video_path) + self.video_thumbnail(this_video_path) + rst += self.rst_video_template(this_video_path) + + # Use the `figure_rst` helper function to generate reST for image files + # result = figure_rst(video_names, gallery_conf['src_dir']) + return rst + + def video_thumbnail(self, video_filename): + """Save PNG screenshot of the first video frame.""" + reader = iio.get_reader(video_filename) + first_frame = reader.get_data(0) + first_frame_filename = os.path.splitext(video_filename)[0] + ".png" + iio.imwrite(first_frame_filename, first_frame) + return first_frame + + def rst_video_template(self, video_filepath): + """Template HTML for embedding video into webpage.""" + rst = f""".. video:: {video_filepath} + :autoplay: + :loop: + :width: 600 + :poster: {os.path.splitext(video_filepath)[0] + ".png"} + """ + return rst + + +def reset_napari(gallery_conf, fname): + from napari.settings import get_settings + from qtpy.QtWidgets import QApplication + + settings = get_settings() + settings.appearance.theme = 'dark' + + # Disabling `QApplication.exec_` means example scripts can call `exec_` + # (scripts work when run normally) without blocking example execution by + # sphinx-gallery. (from qtgallery) + QApplication.exec_ = lambda _: None # def napari_scraper(block, block_vars, gallery_conf): @@ -205,8 +274,8 @@ "download_all_examples": False, "only_warn_on_example_error": False, "abort_on_example_error": True, - #'image_scrapers': ("matplotlib", napari_scraper,), - #'reset_modules': (reset_napari,), + 'image_scrapers': ("matplotlib", VideoScraper(),), + 'reset_modules': (reset_napari,), "reference_url": {"napari": None}, "within_subsection_order": ExampleTitleSortKey, } diff --git a/setup.cfg b/setup.cfg index db5a131..00a26a7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,6 +57,7 @@ doc = sphinx-copybutton sphinx-gallery sphinx-favicon + sphinxcontrib-video matplotlib myst-nb napari-sphinx-theme>=0.3.0 From 2e73dfaebb650aead073c5fca2d1e81a511a3deb Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:48:10 +1100 Subject: [PATCH 06/23] Reformat docs/conf.py file with black --- docs/conf.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2248251..98ea8e8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -168,11 +168,12 @@ class VideoScraper(object): Based on the sphinx example scraper "Example 2: detecting image files on disk" https://sphinx-gallery.github.io/stable/advanced.html#example-2-detecting-image-files-on-disk """ + def __init__(self): self.seen = set() def __repr__(self): - return 'VideoScraper' + return "VideoScraper" def __call__(self, block, block_vars, gallery_conf): """Video file scraper. @@ -182,18 +183,25 @@ def __call__(self, block, block_vars, gallery_conf): """ # Find all video files in the directory of this example. video_file_extensions = [".mp4", ".mov"] - path_current_example = os.path.dirname(block_vars['src_file']) - video_paths = sorted(str(p.resolve()) for p in Path(path_current_example).glob("**/*") if p.suffix in video_file_extensions) + path_current_example = os.path.dirname(block_vars["src_file"]) + video_paths = sorted( + str(p.resolve()) + for p in Path(path_current_example).glob("**/*") + if p.suffix in video_file_extensions + ) # Iterate through the videos, copy them to the sphinx-gallery output directory video_names = list() - image_path_iterator = block_vars['image_path_iterator'] + image_path_iterator = block_vars["image_path_iterator"] rst = "" for video in video_paths: if video not in self.seen: self.seen |= set(video) this_video_path = image_path_iterator.next() - this_video_path = os.path.splitext(this_video_path)[0] + os.path.splitext(video)[1] + this_video_path = ( + os.path.splitext(this_video_path)[0] + + os.path.splitext(video)[1] + ) video_names.append(this_video_path) shutil.move(video, this_video_path) self.video_thumbnail(this_video_path) @@ -227,7 +235,7 @@ def reset_napari(gallery_conf, fname): from qtpy.QtWidgets import QApplication settings = get_settings() - settings.appearance.theme = 'dark' + settings.appearance.theme = "dark" # Disabling `QApplication.exec_` means example scripts can call `exec_` # (scripts work when run normally) without blocking example execution by @@ -274,8 +282,11 @@ def reset_napari(gallery_conf, fname): "download_all_examples": False, "only_warn_on_example_error": False, "abort_on_example_error": True, - 'image_scrapers': ("matplotlib", VideoScraper(),), - 'reset_modules': (reset_napari,), + "image_scrapers": ( + "matplotlib", + VideoScraper(), + ), + "reset_modules": (reset_napari,), "reference_url": {"napari": None}, "within_subsection_order": ExampleTitleSortKey, } From 707f3f82f8d007ca836fc14cc8b7ddac392cfd43 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:49:39 +1100 Subject: [PATCH 07/23] Fix ruff formatting warning --- docs/conf.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 98ea8e8..f9d46bc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,14 +14,11 @@ # import sys # sys.path.insert(0, os.path.abspath('.')) -from glob import glob import os -from pathlib import Path import shutil +from pathlib import Path import imageio.v2 as iio -import napari -from sphinx_gallery import scrapers from sphinx_gallery.sorting import ExampleTitleSortKey from napari_animation._version import version as napari_animation_version @@ -162,7 +159,7 @@ # -- Examples gallery scrapers ------------------------------------------------- -class VideoScraper(object): +class VideoScraper: """Video file scraper class. Scrapes video files that were saved to disk by the example scripts. Based on the sphinx example scraper "Example 2: detecting image files on disk" @@ -191,7 +188,7 @@ def __call__(self, block, block_vars, gallery_conf): ) # Iterate through the videos, copy them to the sphinx-gallery output directory - video_names = list() + video_names = [] image_path_iterator = block_vars["image_path_iterator"] rst = "" for video in video_paths: From 5efe40fab73d4d36adcd0e77e3e79662907b452b Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:07:41 +1100 Subject: [PATCH 08/23] Sphinx docs build producing warning where .mov files exist, we'll use .mp4 instead --- examples/animate2D.py | 2 +- examples/animate3D.py | 2 +- examples/animateMixed.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/animate2D.py b/examples/animate2D.py index c720371..5e94836 100644 --- a/examples/animate2D.py +++ b/examples/animate2D.py @@ -32,4 +32,4 @@ animation.capture_keyframe(steps=60) viewer.reset_view() animation.capture_keyframe() -animation.animate("demo2D.mov", canvas_only=False) +animation.animate("demo2D.mp4", canvas_only=False) diff --git a/examples/animate3D.py b/examples/animate3D.py index d66b8f9..9e9c26a 100644 --- a/examples/animate3D.py +++ b/examples/animate3D.py @@ -32,4 +32,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate("demo3D.mov", canvas_only=False) +animation.animate("demo3D.mp4", canvas_only=False) diff --git a/examples/animateMixed.py b/examples/animateMixed.py index 98eb5b1..503dcff 100644 --- a/examples/animateMixed.py +++ b/examples/animateMixed.py @@ -45,4 +45,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate("demoMixed.mov", canvas_only=False) +animation.animate("demoMixed.mp4", canvas_only=False) From 1843ede671d7ea368621a14542361cc99b2d6d5a Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:10:35 +1100 Subject: [PATCH 09/23] Make output video filenames match name of script that generated it --- examples/animate2D.py | 2 +- examples/animate3D.py | 2 +- examples/animateMixed.py | 2 +- examples/ease_function.py | 2 +- examples/example.py | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/animate2D.py b/examples/animate2D.py index 5e94836..047b9fc 100644 --- a/examples/animate2D.py +++ b/examples/animate2D.py @@ -32,4 +32,4 @@ animation.capture_keyframe(steps=60) viewer.reset_view() animation.capture_keyframe() -animation.animate("demo2D.mp4", canvas_only=False) +animation.animate("animate2D.mp4", canvas_only=False) diff --git a/examples/animate3D.py b/examples/animate3D.py index 9e9c26a..96c6de4 100644 --- a/examples/animate3D.py +++ b/examples/animate3D.py @@ -32,4 +32,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate("demo3D.mp4", canvas_only=False) +animation.animate("animate3D.mp4", canvas_only=False) diff --git a/examples/animateMixed.py b/examples/animateMixed.py index 503dcff..a2f703f 100644 --- a/examples/animateMixed.py +++ b/examples/animateMixed.py @@ -45,4 +45,4 @@ viewer.reset_view() viewer.camera.angles = (0.0, 0.0, 90.0) animation.capture_keyframe() -animation.animate("demoMixed.mp4", canvas_only=False) +animation.animate("animateMixed.mp4", canvas_only=False) diff --git a/examples/ease_function.py b/examples/ease_function.py index 3c0d5b9..63de40d 100644 --- a/examples/ease_function.py +++ b/examples/ease_function.py @@ -20,4 +20,4 @@ animation.capture_keyframe(steps=60) -animation.animate("hello.mp4", canvas_only=True, fps=60) +animation.animate("ease_function.mp4", canvas_only=True, fps=60) diff --git a/examples/example.py b/examples/example.py index 389032b..3644322 100644 --- a/examples/example.py +++ b/examples/example.py @@ -1,6 +1,6 @@ """ -Camera example -============== +Layer plane example +=================== """ from scipy import ndimage as ndi from napari_animation import Animation @@ -59,5 +59,5 @@ def replace_labels_data(): image_layer.plane.position = (0, 0, 0) animation.capture_keyframe(steps=30) -animation.animate("test.mp4", canvas_only=True) +animation.animate("layer_plane_example.mp4", canvas_only=True) image_layer.plane.position = (0, 0, 0) \ No newline at end of file From 10843272b4437cf4c8606b4210b0e2f8213ed1a1 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:11:21 +1100 Subject: [PATCH 10/23] More meaningful name for layer_plane_example.py --- examples/{example.py => layer_plane_example.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{example.py => layer_plane_example.py} (100%) diff --git a/examples/example.py b/examples/layer_plane_example.py similarity index 100% rename from examples/example.py rename to examples/layer_plane_example.py From 02f64703cf4470f00a1a5dfee71b0eb80e70bb26 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:13:47 +1100 Subject: [PATCH 11/23] Shorter name for layer planes example, fits better in gallery thumbnail --- examples/{layer_plane_example.py => layer_planes.py} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename examples/{layer_plane_example.py => layer_planes.py} (94%) diff --git a/examples/layer_plane_example.py b/examples/layer_planes.py similarity index 94% rename from examples/layer_plane_example.py rename to examples/layer_planes.py index 3644322..366aa70 100644 --- a/examples/layer_plane_example.py +++ b/examples/layer_planes.py @@ -1,6 +1,6 @@ """ -Layer plane example -=================== +Layer planes +============ """ from scipy import ndimage as ndi from napari_animation import Animation @@ -59,5 +59,5 @@ def replace_labels_data(): image_layer.plane.position = (0, 0, 0) animation.capture_keyframe(steps=30) -animation.animate("layer_plane_example.mp4", canvas_only=True) +animation.animate("layer_planes.mp4", canvas_only=True) image_layer.plane.position = (0, 0, 0) \ No newline at end of file From 84993ba8ab459b160b984d2190409b85477817d5 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:16:14 +1100 Subject: [PATCH 12/23] Add outside link to main napari.org code of conduct page --- docs/developers/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers/contributing.md b/docs/developers/contributing.md index f4b1345..4876f7f 100644 --- a/docs/developers/contributing.md +++ b/docs/developers/contributing.md @@ -161,7 +161,7 @@ To read more about the docs, how they're organized, and built, read {ref}`docs-d ## Code of conduct -`napari` has a [Code of Conduct](CODE_OF_CONDUCT.md) that should be honored by everyone who participates in the `napari` community. +`napari` has a [Code of Conduct](https://napari.org/stable/community/code_of_conduct.html) that should be honored by everyone who participates in the `napari` community. ## Questions, comments, and feedback From 91096821558474dd55e5ce7295f7ef1b322d2308 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 25 Jan 2024 18:08:40 +1100 Subject: [PATCH 13/23] Minor text update --- docs/gallery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/gallery.md b/docs/gallery.md index ef524a9..1b70595 100644 --- a/docs/gallery.md +++ b/docs/gallery.md @@ -2,7 +2,7 @@ Examples can be found in our [examples](https://github.com/napari/napari-animation/tree/main/examples) folder. Simple examples for both interactive and headless use of the plugin follow. -Check also [a Programmatic notebook example](https://github.com/napari/napari-animation/tree/main/examples/programmatic_notebook_example.ipynb). +There is also a [Programmatic jupyter notebook example](https://github.com/napari/napari-animation/tree/main/examples/programmatic_notebook_example.ipynb). ```{eval-rst} .. include:: gallery/index.rst From 58b8ec3d50c48245a13ac2a05ff6d272619c3470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melissa=20Weber=20Mendon=C3=A7a?= Date: Fri, 26 Jan 2024 17:38:39 +0000 Subject: [PATCH 14/23] Include README in index and address review comments --- README.md | 40 +++++++--- docs/developers/contributing.md | 26 +++--- docs/index.md | 135 +------------------------------- 3 files changed, 44 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index 7d09349..6964998 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![tests](https://github.com/napari/napari-animation/actions/workflows/test_and_deploy.yml/badge.svg)](https://github.com/napari/napari-animation/actions) [![codecov](https://codecov.io/gh/napari/napari-animation/branch/main/graph/badge.svg)](https://codecov.io/gh/napari/napari-animation) -**napari-animation** is a plugin for making animations in [napari]. +**napari-animation** is a plugin for making animations in [napari](https://napari.org).

@@ -18,14 +18,15 @@ ---------------------------------- -This plugin is built on [naparimovie](https://github.com/guiwitz/naparimovie) from @guiwitz. naparimovie was submitted to napari in [PR#851](https://github.com/napari/napari/pull/780) before napari plugin infrastructure existed. +This plugin is built on [`naparimovie`](https://github.com/guiwitz/naparimovie) from [@guiwitz](https://github.com/guiwitz). `naparimovie` was submitted to napari in [PR#851](https://github.com/napari/napari/pull/780) before napari plugin infrastructure existed. ---------------------------------- ## Overview -**napari-animation** provides a framework for the creation of animations in napari, the plugin contains: -- an easy to use GUI for creating animations interactively -- a Python package for the programmatic creation of animations +**napari-animation** provides a framework for the creation of animations in napari. The plugin contains: + +- an easy to use GUI for creating animations interactively; +- a Python package for the programmatic creation of animations. This plugin remains under development and contributions are very welcome, please open an issue to discuss potential improvements. @@ -71,8 +72,8 @@ To activate the GUI, select **napari-animation: wizard** from the *plugins menu*

-### Headless -**napari-animation** can also be run headless, allowing for reproducible, scripted creation of animations. +### Scripting +**napari-animation** can also be run programatically, allowing for reproducible, scripted creation of animations. ```python from napari_animation import Animation @@ -107,6 +108,8 @@ We recommend using a virtual environment, for example `conda`. > Ensure you have a suitable Qt backend for napari! We recommend `PyQt5`. > For more information, see the napari [Qt backend installation guide](https://napari.org/stable/tutorials/fundamentals/installation.html#choosing-a-different-qt-backend) +To set up your development installation, clone this repository, navigate to the clone folder, and install napari-animation in editable mode using `pip`. + ```sh conda create -n nap-anim python=3.10 conda activate nap-anim @@ -128,14 +131,31 @@ You can make sure your `[dev]` installation is working properly by running > pre-commit install > ``` +## Documentation + +The documentation for napari-animation is built with [Sphinx](https://www.spinx-doc.org). After installing the documentation dependencies with + +```sh +pip install ".[doc]" +``` + +you can see a local version of the documentation by running + +```sh +make docs +``` + +Open up the `docs/_build/index.html` file in your browser, and you'll see the home page of the docs being displayed. + + ## License -Distributed under the terms of the [BSD-3] license, -"napari-animation" is free and open source software +Distributed under the terms of the [BSD-3 license](http://opensource.org/licenses/BSD-3-Clause), +`napari-animation` is free and open source software. ## Issues -If you encounter any problems, please [file an issue] along with a detailed description. +If you encounter any problems, please [file an issue](https://github.com/napari/napari-animation/issues) along with a detailed description. [napari]: https://github.com/napari/napari [Cookiecutter]: https://github.com/audreyr/cookiecutter diff --git a/docs/developers/contributing.md b/docs/developers/contributing.md index 4876f7f..76c1c08 100644 --- a/docs/developers/contributing.md +++ b/docs/developers/contributing.md @@ -102,7 +102,7 @@ We use unit tests and integration tests to ensure that napari-animation works as intended. Writing tests for new code is a critical part of keeping napari-animation maintainable as it grows. -Check out the dedicated documentation on testing over at [napari.org](https://napari.org/developers/testing.html) that we recommend you +Check out the dedicated documentation on testing over at [napari.org](https://napari.org/dev/developers/testing.html) that we recommend you read as you're working on your first contribution. ### Help us make sure it's you @@ -114,26 +114,26 @@ To set it, use `git config --global user.email your-address@example.com`. ## Keeping your branches up-to-date -Switch to the `master` branch: +Switch to the `main` branch: ```sh -git checkout master +git checkout main ``` -Fetch changes and update `master`: +Fetch changes and update `main`: ```sh -git pull upstream master --tags +git pull upstream main --tags ``` This is shorthand for: ```sh -git fetch upstream master --tags -git merge upstream/master +git fetch upstream main --tags +git merge upstream/main ``` Update your other branches: ```sh git checkout your-branch-name -git merge master +git merge main ``` ## Sharing your changes @@ -143,7 +143,7 @@ Update your remote branch: git push -u origin your-branch-name ``` -You can then make a [pull-request](https://guides.github.com/activities/forking/#making-a-pull-request) to `napari`'s `master` branch. +You can then make a [pull-request](https://guides.github.com/activities/forking/#making-a-pull-request) to `napari-animation`'s `main` branch. ## Building the docs @@ -155,17 +155,15 @@ make docs The docs will be built at `docs/_build/html`. Most web browsers will allow you to preview HTML pages. -Try entering `file:///absolute/path/to/napari/docs/_build/html/index.html` in your address bar. - -To read more about the docs, how they're organized, and built, read {ref}`docs-dev`. +Try entering `file:///absolute/path/to/napari-animation/docs/_build/html/index.html` in your address bar. ## Code of conduct -`napari` has a [Code of Conduct](https://napari.org/stable/community/code_of_conduct.html) that should be honored by everyone who participates in the `napari` community. +`napari` has a [Code of Conduct](https://napari.org/stable/community/code_of_conduct.html) that should be honored by everyone who participates in the `napari` community, including `napari-animation`. ## Questions, comments, and feedback If you have questions, comments, suggestions for improvement, or any other inquiries -regarding the project, feel free to open an [issue](https://github.com/napari/napari/issues). +regarding the project, feel free to open an [issue](https://github.com/napari/napari-animation/issues). Issues and pull-requests are written in [Markdown](https://guides.github.com/features/mastering-markdown/#what). You can find a comprehensive guide [here](https://guides.github.com/features/mastering-markdown/#syntax). diff --git a/docs/index.md b/docs/index.md index cfb7f05..4f46ed4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,135 +1,4 @@ # napari-animation documentation -**napari-animation** is a plugin for making animations in [napari](https://napari.org). - -

- -

- -napari-animation is hosted on GitHub at [github.com/napari/napari-animation](https://github.com/napari/napari-animation). - -## Overview - -**napari-animation** provides a framework for the creation of animations in napari. The plugin contains: - -- an easy to use GUI for creating animations interactively; -- a Python package for the programmatic creation of animations. - -This plugin remains under development and contributions are very welcome, please open an issue to discuss potential improvements. - -## Installation - -### PyPI -`napari-animation` is available through the Python package index and can be installed using `pip`. - -```sh -pip install napari-animation -``` - -### Local -You can clone this repository and install locally with - - pip install -e . - -### Interactive use -**napari-animation** can be used interactively. - -An animation is created by capturing [keyframes](https://en.wikipedia.org/wiki/Key_frame) containing the current viewer state. - -

- -

- -To activate the GUI, select **napari-animation: wizard** from the *plugins menu* - -

- -

- -### Scripting - -**napari-animation** can also be run programmatically, allowing for reproducible, scripted creation of animations. - -```python -from napari_animation import Animation - -animation = Animation(viewer) - -viewer.dims.ndisplay = 3 -viewer.camera.angles = (0.0, 0.0, 90.0) -animation.capture_keyframe() -viewer.camera.zoom = 2.4 -animation.capture_keyframe() -viewer.camera.angles = (-7.0, 15.7, 62.4) -animation.capture_keyframe(steps=60) -viewer.camera.angles = (2.0, -24.4, -36.7) -animation.capture_keyframe(steps=60) -viewer.reset_view() -viewer.camera.angles = (0.0, 0.0, 90.0) -animation.capture_keyframe() -animation.animate('demo.mov', canvas_only=False) -``` - -## Contributing - -Contributions are very welcome and a detailed contributing guide is coming soon. - -We recommend using a virtual environment, for example `conda`. - -```{important} - -Ensure you have a suitable Qt backend for napari! We recommend `PyQt5`. -For more information, see the napari [Qt backend installation guide](https://napari.org/stable/tutorials/fundamentals/installation.html#choosing-a-different-qt-backend) -``` - -To set up your development installation, clone this repository, navigate to the clone folder, and install napari-animation in editable mode using `pip`. - -```sh -conda create -n nap-anim python=3.10 -conda activate nap-anim -pip install -e ".[dev]" PyQt5 - -``` - -Tests are run with `pytest`: - -```sh -pytest . -``` - -````{note} - -We use [`pre-commit`](https://pre-commit.com) to sort imports with -[`isort`](https://github.com/timothycrosley/isort), format code with -[`black`](https://github.com/psf/black), and lint with -[`flake8`](https://github.com/PyCQA/flake8) automatically prior to each commit. -To minmize test errors when submitting pull requests, please install `pre-commit` in your environment as follows: - -```sh -pre-commit install -``` -```` - -## Documentation - -The documentation for napari-animation is built with [mkdocs](https://www.mkdocs.org). After installing the documentation dependencies with - -```sh -pip install ".[doc]" -``` - -you can see a local version of the documentation by running - -```sh -mkdocs serve -``` - -Open up http://127.0.0.1:8000/ in your browser, and you'll see the home page of the docs being displayed. - -## License - -Distributed under the terms of the [BSD-3 license](http://opensource.org/licenses/BSD-3-Clause), "napari-animation" is free and open source software. - -## Issues - -If you encounter any problems, please [file an issue on GitHub](https://github.com/napari/napari-animation/issues) along with a detailed description. +```{include} ../README.md +``` \ No newline at end of file From a4414a32c23d979ec4ce21186715b660209f82e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melissa=20Weber=20Mendon=C3=A7a?= Date: Fri, 26 Jan 2024 14:50:51 -0300 Subject: [PATCH 15/23] Fix reference in README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 6964998..d4cd9d0 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ animation.animate('demo.mov', canvas_only=False) ``` ## Examples -Examples can be found in our [examples](examples) folder. Simple examples for both interactive and headless +Examples can be found in our [Examples gallery](https://napari-animation.github.io/gallery) folder. Simple examples for both interactive and headless use of the plugin follow. ## Contributing @@ -157,7 +157,6 @@ Distributed under the terms of the [BSD-3 license](http://opensource.org/license If you encounter any problems, please [file an issue](https://github.com/napari/napari-animation/issues) along with a detailed description. -[napari]: https://github.com/napari/napari [Cookiecutter]: https://github.com/audreyr/cookiecutter [@napari]: https://github.com/napari [BSD-3]: http://opensource.org/licenses/BSD-3-Clause From c9b119d5cad1b2ae1e073c5481a13cee5e234941 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:03:34 +1100 Subject: [PATCH 16/23] Add docs build & deploy script, based on napari/docs github actions script --- .github/workflows/deploy_docs.yml | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/deploy_docs.yml diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml new file mode 100644 index 0000000..04abed1 --- /dev/null +++ b/.github/workflows/deploy_docs.yml @@ -0,0 +1,53 @@ +name: Build and Deploy Docs + +on: + push: + branches: + - main + tags: + - 'v*' + workflow_dispatch: + +# Only allow one docs build at a time so that overlapping stale builds will get +# cancelled automatically. +concurrency: + group: deploy_docs + cancel-in-progress: true + +jobs: + build-and-deploy: + name: Build & Deploy + runs-on: ubuntu-latest + steps: + - name: Clone repo + uses: actions/checkout@v4 + + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - uses: tlambert03/setup-qt-libs@v1 + + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + python -m pip install "napari[all]" + python -m pip install -e . + + - name: Testing + run: | + python -c 'import napari; print(napari.__version__)' + python -c 'import napari.layers; print(napari.layers.__doc__)' + + - name: Build Docs + uses: aganders3/headless-gui@v2 + with: + run: make docs + + - name: Deploy Docs + uses: peaceiris/actions-gh-pages@v3 + with: + deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} + publish_dir: docs/_build + publish_branch: gh-pages + destination_dir: dev From e13f116ca311933ed88b6a0d022d3db7b4a78f1d Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:05:59 +1100 Subject: [PATCH 17/23] Fix HTML formatting of warning/important/note textboxes (breaks github markdown rendering of formatting slightly, but better to prioritize the official docs website) --- README.md | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index d4cd9d0..4f71831 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ This plugin is built on [`naparimovie`](https://github.com/guiwitz/naparimovie) from [@guiwitz](https://github.com/guiwitz). `naparimovie` was submitted to napari in [PR#851](https://github.com/napari/napari/pull/780) before napari plugin infrastructure existed. ---------------------------------- + ## Overview **napari-animation** provides a framework for the creation of animations in napari. The plugin contains: @@ -39,11 +40,12 @@ This plugin remains under development and contributions are very welcome, please pip install napari-animation ``` -> [!WARNING] -> `napari-animation` uses `ffmpeg` to export animations. If you are using a macOS arm64 computer (Apple Silicon e.g. M1, M2 processor) -> the PyPI package does not include the needed binary for your platform. You will need to install `ffmpeg` using -> `conda` from the [conda-forge channel](https://conda-forge.org/docs/#what-is-conda-forge) (`conda install -c conda-forge ffmpeg`) -> or using [`homebrew`](https://brew.sh) (`brew install ffmpeg`). +```{warning} +`napari-animation` uses `ffmpeg` to export animations. If you are using a macOS arm64 computer (Apple Silicon e.g. M1, M2 processor) +the PyPI package does not include the needed binary for your platform. You will need to install `ffmpeg` using +`conda` from the [conda-forge channel](https://conda-forge.org/docs/#what-is-conda-forge) (`conda install -c conda-forge ffmpeg`) +or using [`homebrew`](https://brew.sh) (`brew install ffmpeg`). +``` ### Conda `napari-animation` is also available for install using `conda` through the [conda-forge channel](https://conda-forge.org/docs/#what-is-conda-forge). @@ -104,9 +106,12 @@ use of the plugin follow. Contributions are very welcome and a detailed contributing guide is coming soon. In the meantime, clone this repository and install it in editable mode using `pip`. We recommend using a virtual environment, for example `conda`. -> [!IMPORTANT] -> Ensure you have a suitable Qt backend for napari! We recommend `PyQt5`. -> For more information, see the napari [Qt backend installation guide](https://napari.org/stable/tutorials/fundamentals/installation.html#choosing-a-different-qt-backend) + + +```{important} +Ensure you have a suitable Qt backend for napari! We recommend `PyQt5`. +For more information, see the napari [Qt backend installation guide](https://napari.org/stable/tutorials/fundamentals/installation.html#choosing-a-different-qt-backend) +``` To set up your development installation, clone this repository, navigate to the clone folder, and install napari-animation in editable mode using `pip`. @@ -121,15 +126,15 @@ Tests are run with `pytest`. You can make sure your `[dev]` installation is working properly by running `pytest .` from within the repository. -> [!NOTE] -> We use [`pre-commit`](https://pre-commit.com) to sort imports and lint with -> [`ruff`](https://github.com/astral-sh/ruff) and format code with -> [`black`](https://github.com/psf/black) automatically prior to each commit. -> To minmize test errors when submitting pull requests, please install `pre-commit` -> in your environment as follows: -> ```sh -> pre-commit install -> ``` +```{note} +We use [`pre-commit`](https://pre-commit.com) to sort imports and lint with +[`ruff`](https://github.com/astral-sh/ruff) and format code with +[`black`](https://github.com/psf/black) automatically prior to each commit. +To minmize test errors when submitting pull requests, please install `pre-commit` +in your environment as follows: + +`pre-commit install` +``` ## Documentation From 5560529c4a5eb4060db9c4445b756617771ea63b Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:08:23 +1100 Subject: [PATCH 18/23] Have only one top level heading on docs homepage --- docs/index.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 4f46ed4..451beda 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,2 @@ -# napari-animation documentation - ```{include} ../README.md -``` \ No newline at end of file +``` From f2750bda70fc8ec24f595bfa0ad300158464c2e1 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:16:17 +1100 Subject: [PATCH 19/23] No link checking is actually being performed, remove cruft --- docs/conf.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index f9d46bc..ed8420c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -301,15 +301,6 @@ def setup(app): app.registry.source_suffix.pop(".ipynb", None) -# linkcheck_anchors_ignore = [r'^!', r'L\d+-L\d+', r'r\d+', r'issuecomment-\d+'] - -# linkcheck_ignore = [ -# 'https://napari.zulipchat.com/', -# '../_tags', -# 'https://en.wikipedia.org/wiki/Napari#/media/File:Tabuaeran_Kiribati.jpg', -# ] - - # def rewrite_github_anchor(app, uri: str): # """Rewrite anchor name of the hyperlink to github.com From d422921551b8c3ad02f7fbd8f474cceff4386b3d Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:17:08 +1100 Subject: [PATCH 20/23] No github hyperlinks are actually being modified, remove this un-used piece of code --- docs/conf.py | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index ed8420c..dfb83ca 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -299,29 +299,3 @@ def setup(app): """ app.registry.source_suffix.pop(".ipynb", None) - - -# def rewrite_github_anchor(app, uri: str): -# """Rewrite anchor name of the hyperlink to github.com - -# The hyperlink anchors in github.com are dynamically generated. This rewrites -# them before checking and makes them comparable. -# """ -# parsed = urlparse(uri) -# if parsed.hostname == "github.com" and parsed.fragment: -# for text in [ -# "L", -# "readme", -# "pullrequestreview", -# "issuecomment", -# "issue", -# ]: -# if parsed.fragment.startswith(text): -# return None -# if re.match(r'r\d+', parsed.fragment): -# return None -# prefixed = parsed.fragment.startswith('user-content-') -# if not prefixed: -# fragment = f'user-content-{parsed.fragment}' -# return urlunparse(parsed._replace(fragment=fragment)) -# return None From 2f3a575446728770b81d3f118c196dd8a1196fce Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:30:34 +1100 Subject: [PATCH 21/23] Allow fallback from VideoScraper to static napari screenshot scraper if no video files found saved to disk --- docs/conf.py | 75 +++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index dfb83ca..24b6521 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,6 +19,8 @@ from pathlib import Path import imageio.v2 as iio +import napari +from sphinx_gallery import scrapers from sphinx_gallery.sorting import ExampleTitleSortKey from napari_animation._version import version as napari_animation_version @@ -204,8 +206,13 @@ def __call__(self, block, block_vars, gallery_conf): self.video_thumbnail(this_video_path) rst += self.rst_video_template(this_video_path) - # Use the `figure_rst` helper function to generate reST for image files - # result = figure_rst(video_names, gallery_conf['src_dir']) + # We want to display either a video OR a napari screenshot, not both! + # If any video files are found, VideoScraper() closes any open napari windows + # so that the static screenshot napari_scraper will not find anything + # For this to work, VideoScraper() must come BEFORE napari_scraper in sphinx_gallery_conf + if len(video_paths) > 0: + napari.Viewer.close_all() + return rst def video_thumbnail(self, video_filename): @@ -227,6 +234,34 @@ def rst_video_template(self, video_filepath): return rst +def napari_scraper(block, block_vars, gallery_conf): + """Basic napari window scraper. + + Looks for any QtMainWindow instances and takes a screenshot of them. + + `app.processEvents()` allows Qt events to propagateo and prevents hanging. + """ + imgpath_iter = block_vars["image_path_iterator"] + + if app := napari.qt.get_app(): + app.processEvents() + else: + return "" + + img_paths = [] + for win, img_path in zip( + reversed(napari._qt.qt_main_window._QtMainWindow._instances), + imgpath_iter, + ): + img_paths.append(img_path) + win._window.screenshot(img_path, canvas_only=False) + + napari.Viewer.close_all() + app.processEvents() + + return scrapers.figure_rst(img_paths, gallery_conf["src_dir"]) + + def reset_napari(gallery_conf, fname): from napari.settings import get_settings from qtpy.QtWidgets import QApplication @@ -240,34 +275,6 @@ def reset_napari(gallery_conf, fname): QApplication.exec_ = lambda _: None -# def napari_scraper(block, block_vars, gallery_conf): -# """Basic napari window scraper. - -# Looks for any QtMainWindow instances and takes a screenshot of them. - -# `app.processEvents()` allows Qt events to propagateo and prevents hanging. -# """ -# imgpath_iter = block_vars['image_path_iterator'] - -# if app := napari.qt.get_app(): -# app.processEvents() -# else: -# return "" - -# img_paths = [] -# for win, img_path in zip( -# reversed(napari._qt.qt_main_window._QtMainWindow._instances), -# imgpath_iter, -# ): -# img_paths.append(img_path) -# win._window.screenshot(img_path, canvas_only=False) - -# napari.Viewer.close_all() -# app.processEvents() - -# return scrapers.figure_rst(img_paths, gallery_conf['src_dir']) - - sphinx_gallery_conf = { # path to your example scripts "examples_dirs": "../examples", @@ -282,6 +289,11 @@ def reset_napari(gallery_conf, fname): "image_scrapers": ( "matplotlib", VideoScraper(), + # We want to display either a video OR a napari screenshot, not both! + # If any video files are found, VideoScraper() closes any open napari windows + # so that the static screenshot napari_scraper will not find anything + # For this to work, VideoScraper() must come BEFORE napari_scraper in sphinx_gallery_conf + napari_scraper, ), "reset_modules": (reset_napari,), "reference_url": {"napari": None}, @@ -294,8 +306,5 @@ def setup(app): * Ignores .ipynb files to prevent sphinx from complaining about multiple files found for document when generating the gallery - * Rewrites github anchors to be comparable - * Adds google calendar api key to meetings schedule page - """ app.registry.source_suffix.pop(".ipynb", None) From 16f5ce3b6693fc96c813c60af5bbb08e93f51221 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:25:16 +1100 Subject: [PATCH 22/23] Update dependencies --- .github/workflows/deploy_docs.yml | 2 +- requirements.txt | 2 +- setup.cfg | 20 +++++++++----------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml index 04abed1..d357edc 100644 --- a/.github/workflows/deploy_docs.yml +++ b/.github/workflows/deploy_docs.yml @@ -32,7 +32,7 @@ jobs: run: | python -m pip install --upgrade pip python -m pip install "napari[all]" - python -m pip install -e . + python -m pip install -e ".[doc]" - name: Testing run: | diff --git a/requirements.txt b/requirements.txt index de9088e..6d951a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ # requirements are in setup.cfg # https://caremad.io/posts/2013/07/setup-vs-requirement/ --e ".[dev,doc]" \ No newline at end of file +-e ".[dev]" \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 00a26a7..adfe8c8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,20 +36,14 @@ install_requires = numpy qtpy scipy - tqdm>=4.56.0 + tqdm>=4.56.0 superqt - [options.extras_require] testing = pytest + pytest-cov pytest-qt -dev = - pre-commit - black - ruff - check-manifest - %(testing)s doc = sphinx>6 sphinx-autobuild @@ -61,7 +55,13 @@ doc = matplotlib myst-nb napari-sphinx-theme>=0.3.0 - +dev = + pre-commit + black + ruff + check-manifest + %(testing)s + %(doc)s [options.entry_points] napari.manifest = @@ -76,13 +76,11 @@ exclude_lines = if TYPE_CHECKING: raise NotImplementedError() - [tool:pytest] addopts = --durations=10 filterwarnings = ignore::DeprecationWarning - [tool:check-manifest] ignore = pre-commit-config.yaml From 7824db78d935d6be567edef9d4c62719978ee81d Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:06:28 +1100 Subject: [PATCH 23/23] Try github actions permission write contents in yaml script, avoids need for separate token --- .github/workflows/deploy_docs.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml index d357edc..10b85a5 100644 --- a/.github/workflows/deploy_docs.yml +++ b/.github/workflows/deploy_docs.yml @@ -18,6 +18,9 @@ jobs: build-and-deploy: name: Build & Deploy runs-on: ubuntu-latest + permissions: + contents: write # so we can write to github pages without a token + steps: - name: Clone repo uses: actions/checkout@v4 @@ -34,11 +37,6 @@ jobs: python -m pip install "napari[all]" python -m pip install -e ".[doc]" - - name: Testing - run: | - python -c 'import napari; print(napari.__version__)' - python -c 'import napari.layers; print(napari.layers.__doc__)' - - name: Build Docs uses: aganders3/headless-gui@v2 with: @@ -47,7 +45,5 @@ jobs: - name: Deploy Docs uses: peaceiris/actions-gh-pages@v3 with: - deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} publish_dir: docs/_build publish_branch: gh-pages - destination_dir: dev