napari-plugin-manager 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. napari_plugin_manager-0.1.0/.github/dependabot.yml +10 -0
  2. napari_plugin_manager-0.1.0/.github/workflows/deploy_docs.yml +60 -0
  3. napari_plugin_manager-0.1.0/.github/workflows/test_and_deploy.yml +106 -0
  4. napari_plugin_manager-0.1.0/.gitignore +119 -0
  5. napari_plugin_manager-0.1.0/.pre-commit-config.yaml +30 -0
  6. napari_plugin_manager-0.1.0/LICENSE +29 -0
  7. napari_plugin_manager-0.1.0/Makefile +43 -0
  8. napari_plugin_manager-0.1.0/PKG-INFO +255 -0
  9. napari_plugin_manager-0.1.0/README.md +175 -0
  10. napari_plugin_manager-0.1.0/docs/__init__.py +0 -0
  11. napari_plugin_manager-0.1.0/docs/_static/custom.css +0 -0
  12. napari_plugin_manager-0.1.0/docs/_static/favicon/logo-noborder-180.png +0 -0
  13. napari_plugin_manager-0.1.0/docs/_static/favicon/logo-silhouette-192.png +0 -0
  14. napari_plugin_manager-0.1.0/docs/_static/favicon/logo-silhouette-dark-light.svg +28 -0
  15. napari_plugin_manager-0.1.0/docs/_templates/navbar-project.html +4 -0
  16. napari_plugin_manager-0.1.0/docs/_toc.yml +4 -0
  17. napari_plugin_manager-0.1.0/docs/conf.py +150 -0
  18. napari_plugin_manager-0.1.0/docs/developers/contributing.md +186 -0
  19. napari_plugin_manager-0.1.0/docs/index.md +2 -0
  20. napari_plugin_manager-0.1.0/images/description.png +0 -0
  21. napari_plugin_manager-0.1.0/images/filter.png +0 -0
  22. napari_plugin_manager-0.1.0/images/install.png +0 -0
  23. napari_plugin_manager-0.1.0/images/logo.png +0 -0
  24. napari_plugin_manager-0.1.0/images/status.png +0 -0
  25. napari_plugin_manager-0.1.0/images/uninstall.png +0 -0
  26. napari_plugin_manager-0.1.0/images/update.png +0 -0
  27. napari_plugin_manager-0.1.0/napari_plugin_manager/__init__.py +0 -0
  28. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/__init__.py +0 -0
  29. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/conftest.py +63 -0
  30. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/test_installer_process.py +338 -0
  31. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/test_npe2api.py +51 -0
  32. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/test_qt_plugin_dialog.py +563 -0
  33. napari_plugin_manager-0.1.0/napari_plugin_manager/_tests/test_utils.py +27 -0
  34. napari_plugin_manager-0.1.0/napari_plugin_manager/_version.py +16 -0
  35. napari_plugin_manager-0.1.0/napari_plugin_manager/npe2api.py +131 -0
  36. napari_plugin_manager-0.1.0/napari_plugin_manager/qt_package_installer.py +660 -0
  37. napari_plugin_manager-0.1.0/napari_plugin_manager/qt_plugin_dialog.py +1495 -0
  38. napari_plugin_manager-0.1.0/napari_plugin_manager/qt_widgets.py +14 -0
  39. napari_plugin_manager-0.1.0/napari_plugin_manager/styles.qss +352 -0
  40. napari_plugin_manager-0.1.0/napari_plugin_manager/utils.py +22 -0
  41. napari_plugin_manager-0.1.0/napari_plugin_manager.egg-info/PKG-INFO +255 -0
  42. napari_plugin_manager-0.1.0/napari_plugin_manager.egg-info/SOURCES.txt +46 -0
  43. napari_plugin_manager-0.1.0/napari_plugin_manager.egg-info/dependency_links.txt +1 -0
  44. napari_plugin_manager-0.1.0/napari_plugin_manager.egg-info/requires.txt +23 -0
  45. napari_plugin_manager-0.1.0/napari_plugin_manager.egg-info/top_level.txt +1 -0
  46. napari_plugin_manager-0.1.0/pyproject.toml +208 -0
  47. napari_plugin_manager-0.1.0/setup.cfg +4 -0
  48. napari_plugin_manager-0.1.0/tox.ini +47 -0
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "monthly"
7
+ groups:
8
+ github-actions:
9
+ patterns:
10
+ - "*"
@@ -0,0 +1,60 @@
1
+ name: Deploy Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - 'v*'
9
+ workflow_dispatch:
10
+
11
+ # Only allow one docs build at a time so that overlapping stale builds will get
12
+ # cancelled automatically.
13
+ concurrency:
14
+ group: deploy_docs
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ build-and-deploy:
19
+ name: Build & Deploy
20
+ runs-on: ubuntu-latest
21
+
22
+ permissions:
23
+ contents: write # so we can write to github pages without a token
24
+ pages: write # to deploy to Pages
25
+ id-token: write # to verify the deployment originates from an appropriate source
26
+
27
+ steps:
28
+ - name: Clone repo
29
+ uses: actions/checkout@v4
30
+
31
+ - uses: actions/setup-python@v5
32
+ with:
33
+ python-version: "3.10"
34
+
35
+ - uses: tlambert03/setup-qt-libs@v1
36
+
37
+ - name: Install Dependencies
38
+ run: |
39
+ python -m pip install --upgrade pip
40
+ python -m pip install "napari[all]"
41
+ python -m pip install -e ".[docs]"
42
+
43
+ - name: Build Docs
44
+ uses: aganders3/headless-gui@v2
45
+ with:
46
+ run: make docs
47
+
48
+ - name: Check file tree contents
49
+ run: tree
50
+
51
+ # At a minimum this job should upload artifacts using actions/upload-pages-artifact
52
+ - name: Upload GitHub Pages artifact
53
+ uses: actions/upload-pages-artifact@v3
54
+ with:
55
+ name: github-pages
56
+ path: docs/_build
57
+
58
+ - name: Deploy to GitHub Pages
59
+ id: deployment
60
+ uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action
@@ -0,0 +1,106 @@
1
+ # This workflow will upload a Python Package using Twine when a release is created
2
+ # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
3
+
4
+ name: test and deploy
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ tags:
11
+ - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
12
+ pull_request:
13
+ branches:
14
+ - main
15
+ workflow_dispatch:
16
+
17
+ concurrency:
18
+ # Concurrency group that uses the workflow name and PR number if available
19
+ # or commit SHA as a fallback. If a new build is triggered under that
20
+ # concurrency group while a previous build is running it will be canceled.
21
+ # Repeated pushes to a PR will cancel all previous builds, while multiple
22
+ # merges to main will not cancel.
23
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
24
+ cancel-in-progress: true
25
+
26
+ jobs:
27
+ test:
28
+ name: ${{ matrix.platform }}, py${{ matrix.python-version }}, napari ${{ matrix.napari }}
29
+ runs-on: ${{ matrix.platform }}
30
+ strategy:
31
+ fail-fast: false
32
+ matrix:
33
+ platform: [ubuntu-latest, windows-latest, macos-13]
34
+ python-version: ["3.9", "3.10", "3.11"]
35
+ napari: ["latest", "repo"]
36
+ exclude:
37
+ # TODO: Remove when we have a napari release with the plugin manager changes
38
+ - napari: "latest"
39
+ # TODO: PyQt / PySide wheels missing
40
+ - python-version: "3.11"
41
+ platform: "windows-latest"
42
+
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+
46
+ - name: Set up Python ${{ matrix.python-version }}
47
+ uses: actions/setup-python@v5
48
+ with:
49
+ python-version: ${{ matrix.python-version }}
50
+
51
+ - uses: tlambert03/setup-qt-libs@v1
52
+
53
+ # strategy borrowed from vispy for installing opengl libs on windows
54
+ - name: Install Windows OpenGL
55
+ if: runner.os == 'Windows'
56
+ run: |
57
+ git clone --depth 1 https://github.com/pyvista/gl-ci-helpers.git
58
+ powershell gl-ci-helpers/appveyor/install_opengl.ps1
59
+ if (Test-Path -Path "C:\Windows\system32\opengl32.dll" -PathType Leaf) {Exit 0} else {Exit 1}
60
+
61
+ - name: Install dependencies
62
+ run: |
63
+ python -m pip install --upgrade pip
64
+ pip install setuptools tox tox-gh-actions
65
+
66
+ - name: Test with tox
67
+ uses: aganders3/headless-gui@v2
68
+ with:
69
+ run: python -m tox -vv
70
+ env:
71
+ PYVISTA_OFF_SCREEN: True # required for opengl on windows
72
+ NAPARI: ${{ matrix.napari }}
73
+ FORCE_COLOR: 1
74
+ # PySide6 only functional with Python 3.10+
75
+ TOX_SKIP_ENV: ".*py39-PySide6.*"
76
+
77
+ - name: Coverage
78
+ uses: codecov/codecov-action@v4
79
+ env:
80
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
81
+
82
+ deploy:
83
+ # this will run when you have tagged a commit, starting with "v*"
84
+ # and requires that you have put your twine API key in your
85
+ # github secrets (see readme for details)
86
+ needs: [test]
87
+ runs-on: ubuntu-latest
88
+ if: contains(github.ref, 'tags')
89
+ permissions:
90
+ id-token: write
91
+ steps:
92
+ - uses: actions/checkout@v4
93
+ - name: Set up Python
94
+ uses: actions/setup-python@v5
95
+ with:
96
+ python-version: "3.x"
97
+ - name: Install dependencies
98
+ run: |
99
+ python -m pip install --upgrade pip
100
+ pip install -U setuptools build
101
+ - name: Build
102
+ run: |
103
+ git tag
104
+ python -m build
105
+ - name: Publish package distributions to PyPI
106
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,119 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ env/
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+
27
+ # PyInstaller
28
+ # Usually these files are written by a python script from a template
29
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ *.manifest
31
+ *.spec
32
+
33
+ # Installer logs
34
+ pip-log.txt
35
+ pip-delete-this-directory.txt
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .coverage
41
+ .coverage.*
42
+ .cache
43
+ nosetests.xml
44
+ coverage.xml
45
+ *,cover
46
+ .hypothesis/
47
+ .napari_cache
48
+
49
+ # Translations
50
+ *.mo
51
+ *.pot
52
+
53
+ # Django stuff:
54
+ *.log
55
+ local_settings.py
56
+
57
+ # Flask instance folder
58
+ instance/
59
+
60
+ # Sphinx documentation
61
+ docs/_build/
62
+
63
+ # MkDocs documentation
64
+ /site/
65
+
66
+ # PyBuilder
67
+ target/
68
+
69
+ # IPython Notebook
70
+ .ipynb_checkpoints
71
+
72
+ # pyenv
73
+ .python-version
74
+
75
+ # OS
76
+ .DS_Store
77
+
78
+ # written by setuptools_scm
79
+ */_version.py
80
+
81
+ # pycharm stuff
82
+ .idea/
83
+
84
+ # ruff stuff
85
+ .ruff_cache/
86
+
87
+ # spyder stuff
88
+ .spyproject/
89
+
90
+ # Environment variables file
91
+ .env
92
+
93
+ # Sphinx documentation
94
+ docs/_build/
95
+
96
+ # MkDocs documentation
97
+ /site/
98
+
99
+ # PyBuilder
100
+ target/
101
+
102
+ # IPython Notebook
103
+ .ipynb_checkpoints
104
+
105
+ # pyenv
106
+ .python-version
107
+
108
+ # OS
109
+ .DS_Store
110
+
111
+ # written by setuptools_scm
112
+ */_version.py
113
+
114
+ # vscode
115
+ .vscode
116
+
117
+ # Images
118
+ docs/images/
119
+
@@ -0,0 +1,30 @@
1
+ repos:
2
+ - repo: https://github.com/MarcoGorelli/absolufy-imports
3
+ rev: v0.3.1
4
+ hooks:
5
+ - id: absolufy-imports
6
+ - repo: https://github.com/hadialqattan/pycln
7
+ rev: v2.4.0
8
+ hooks:
9
+ - id: pycln
10
+ - repo: https://github.com/psf/black-pre-commit-mirror
11
+ rev: 24.4.2
12
+ hooks:
13
+ - id: black
14
+ pass_filenames: true
15
+ - repo: https://github.com/astral-sh/ruff-pre-commit
16
+ rev: v0.5.0
17
+ hooks:
18
+ - id: ruff
19
+ - repo: https://github.com/seddonym/import-linter
20
+ rev: v2.0
21
+ hooks:
22
+ - id: import-linter
23
+ stages: [manual]
24
+ - repo: https://github.com/python-jsonschema/check-jsonschema
25
+ rev: 0.28.6
26
+ hooks:
27
+ - id: check-github-workflows
28
+
29
+ ci:
30
+ autoupdate_schedule: monthly
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2018, Napari
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,43 @@
1
+ .PHONY: docs clean
2
+
3
+ SPHINXOPTS =
4
+
5
+ mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
6
+ current_dir := $(dir $(mkfile_path))
7
+ docs_dir := $(current_dir)docs
8
+
9
+ clean:
10
+ echo clean
11
+ echo $(current_dir)
12
+ rm -rf $(docs_dir)/_build/
13
+ rm -rf $(docs_dir)/images/
14
+ mkdir $(docs_dir)/images/
15
+ cp images/*.png $(docs_dir)/images/
16
+
17
+ docs-build:
18
+ NAPARI_CONFIG="" NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -b html docs/ docs/_build $(SPHINXOPTS)
19
+
20
+ docs-xvfb:
21
+ NAPARI_CONFIG="" NAPARI_APPLICATION_IPY_INTERACTIVE=0 xvfb-run --auto-servernum sphinx-build -b html docs/ docs/_build $(SPHINXOPTS)
22
+
23
+ docs: clean docs-build
24
+
25
+ serve:
26
+ python -m http.server -d $(docs_dir)/_build
27
+ # Implies noplot, but no clean - call 'make clean' manually if needed
28
+ # Autogenerated paths need to be ignored to prevent reload loops
29
+ html-live:
30
+ NAPARI_APPLICATION_IPY_INTERACTIVE=0 \
31
+ sphinx-autobuild \
32
+ -b html \
33
+ docs/ \
34
+ docs/_build \
35
+ --open-browser \
36
+ --port=0 \
37
+ $(SPHINXOPTS)
38
+
39
+ html-noplot: clean
40
+ NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -b html docs/ docs/_build $(SPHINXOPTS)
41
+
42
+ linkcheck-files:
43
+ NAPARI_APPLICATION_IPY_INTERACTIVE=0 sphinx-build -b linkcheck --color docs/ docs/_build ${FILES} $(SPHINXOPTS)
@@ -0,0 +1,255 @@
1
+ Metadata-Version: 2.1
2
+ Name: napari-plugin-manager
3
+ Version: 0.1.0
4
+ Summary: Install plugins for napari, in napari.
5
+ Author-email: napari team <napari-steering-council@googlegroups.com>
6
+ License: BSD 3-Clause License
7
+
8
+ Copyright (c) 2018, Napari
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ * Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ * Redistributions in binary form must reproduce the above copyright notice,
18
+ this list of conditions and the following disclaimer in the documentation
19
+ and/or other materials provided with the distribution.
20
+
21
+ * Neither the name of the copyright holder nor the names of its
22
+ contributors may be used to endorse or promote products derived from
23
+ this software without specific prior written permission.
24
+
25
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+
36
+ Project-URL: homepage, https://github.com/napari/napari-plugin-manager
37
+ Classifier: Development Status :: 3 - Alpha
38
+ Classifier: Environment :: X11 Applications :: Qt
39
+ Classifier: Intended Audience :: Education
40
+ Classifier: Intended Audience :: Science/Research
41
+ Classifier: License :: OSI Approved :: BSD License
42
+ Classifier: Programming Language :: C
43
+ Classifier: Programming Language :: Python
44
+ Classifier: Programming Language :: Python :: 3 :: Only
45
+ Classifier: Programming Language :: Python :: 3.9
46
+ Classifier: Programming Language :: Python :: 3.10
47
+ Classifier: Programming Language :: Python :: 3.11
48
+ Classifier: Topic :: Scientific/Engineering
49
+ Classifier: Topic :: Scientific/Engineering :: Visualization
50
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
51
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
52
+ Classifier: Topic :: Utilities
53
+ Classifier: Operating System :: Microsoft :: Windows
54
+ Classifier: Operating System :: POSIX
55
+ Classifier: Operating System :: Unix
56
+ Classifier: Operating System :: MacOS
57
+ Requires-Python: >=3.8
58
+ Description-Content-Type: text/markdown
59
+ License-File: LICENSE
60
+ Requires-Dist: npe2
61
+ Requires-Dist: qtpy
62
+ Requires-Dist: superqt
63
+ Requires-Dist: pip
64
+ Provides-Extra: dev
65
+ Requires-Dist: PyQt5; extra == "dev"
66
+ Requires-Dist: pre-commit; extra == "dev"
67
+ Provides-Extra: testing
68
+ Requires-Dist: pytest; extra == "testing"
69
+ Requires-Dist: virtualenv; extra == "testing"
70
+ Requires-Dist: pytest-cov; extra == "testing"
71
+ Requires-Dist: pytest-qt; extra == "testing"
72
+ Provides-Extra: docs
73
+ Requires-Dist: sphinx>6; extra == "docs"
74
+ Requires-Dist: sphinx-autobuild; extra == "docs"
75
+ Requires-Dist: sphinx-external-toc; extra == "docs"
76
+ Requires-Dist: sphinx-copybutton; extra == "docs"
77
+ Requires-Dist: sphinx-favicon; extra == "docs"
78
+ Requires-Dist: myst-nb; extra == "docs"
79
+ Requires-Dist: napari-sphinx-theme>=0.3.0; extra == "docs"
80
+
81
+ # napari-plugin-manager
82
+
83
+ [![License](https://img.shields.io/pypi/l/napari-plugin-manager.svg?color=green)](https://github.com/napari/napari-plugin-manager/raw/main/LICENSE)
84
+ [![PyPI](https://img.shields.io/pypi/v/napari-plugin-manager.svg?color=green)](https://pypi.org/project/napari-plugin-manager)
85
+ [![Python Version](https://img.shields.io/pypi/pyversions/napari-plugin-manager.svg?color=green)](https://python.org)
86
+ [![tests](https://github.com/napari/napari-plugin-manager/actions/workflows/test_and_deploy.yml/badge.svg)](https://github.com/napari/napari-plugin-manager/actions/workflows/test_and_deploy.yml)
87
+ [![codecov](https://codecov.io/gh/napari/napari-plugin-manager/branch/main/graph/badge.svg)](https://codecov.io/gh/napari/napari-plugin-manager)
88
+
89
+ [napari] plugin manager to provide a graphical user interface for installing
90
+ [napari] plugins.
91
+
92
+ You can read the documentation at [napari.org/napari-plugin-manager](https://napari.org/napari-plugin-manager).
93
+
94
+ ## Overview
95
+
96
+ The `napari-plugin-manager` used to be part of the [napari] codebase before the 0.5.x release
97
+ series. It's now maintained as a separate project and package to allow uncoupled iterations outside
98
+ of the `napari` release cycle.
99
+
100
+ Future work will allow other applications with a plugin ecosytem to customize and
101
+ use the `plugin-manager`. This package remains under active development and contributions
102
+ are very welcome. Please [open an issue] to discuss potential improvements.
103
+
104
+ This package currently provides:
105
+
106
+ - A package installer process queue that supports both [pip] and [conda] installs.
107
+ - An easy to use GUI for searching, installing, uninstalling and updating plugins that make part of
108
+ the napari ecosystem. Each plugin entry provides a summary and information on the authors that
109
+ created the package. The REST API used to query for plugins and plugin information is provided by
110
+ the [npe2api service](https://api.napari.org).
111
+ - The ability to install other packages via URL of by dragging and dropping artifacts from [PyPI].
112
+
113
+ ![Screenshot of the napari-plugin-manager interface, showcasing the plugin descriptions](./images/description.png)
114
+
115
+ `napari-plugin-manager` knows how to detect if napari was installed using `conda` or `pip` and
116
+ provide the appropriate default installer tool on the `Installation Info` dropdown for each plugin.
117
+
118
+ `conda` provides an efficient dependency solver that guarantees the stability and correctness of
119
+ the napari installation and work environment. This is the reason why `conda` is the default tool
120
+ used for the [napari
121
+ bundle](https://napari.org/stable/tutorials/fundamentals/installation_bundle_conda.html), a 1-click
122
+ installer available for Mac, Linux and Windows. This installation method is best if you mainly want
123
+ to use napari as a standalone GUI app. However, certain plugins may not be supported.
124
+
125
+ ## Installation
126
+
127
+ ### PyPI
128
+
129
+ `napari-plugin-manager` is available through the Python Package Index and can be installed using [pip].
130
+
131
+ ```bash
132
+ pip install napari-plugin-manager
133
+ ```
134
+
135
+ ### Conda
136
+
137
+ `napari-plugin-manager` is also available for install using [conda] through the [conda-forge channel](https://conda-forge.org/docs/#what-is-conda-forge).
138
+
139
+
140
+ ```bash
141
+ conda install napari-plugin-manager -c conda-forge
142
+ ```
143
+
144
+ ## Using the napari plugin manager
145
+
146
+ ### Enabling/Disabling plugins
147
+
148
+ Installed plugins found on the current napari installation are displayed on the top list of the UI.
149
+
150
+ Users of napari can choose to enable/disable a specific plugin by checking/unchecking the checkbox
151
+ to the left of each plugin item in the list.
152
+
153
+ ### Filtering
154
+
155
+ You can filter available plugins by name or description by typing on the search box
156
+ on the top left corner of the UI. Only plugins that match the filter criteria will be shown.
157
+
158
+ In the image below filtering by the word `arcos` yields a single plugin, the
159
+ `arcos-gui` plugin. Notice that plugins that provide a display name, will show
160
+ the package name to the right in parenthesis.
161
+
162
+ ![Screenshot of the napari-plugin-manager interface showcasing the filtering features with the query 'arcos'](./images/filter.png)
163
+
164
+ ### Refreshing
165
+
166
+ If a new plugin has been released but it is not available on the list, you can click on the
167
+ `Refresh` button located at the top right corner, to clear the cache and load all newly
168
+ available plugins.
169
+
170
+ ### Installing a plugin
171
+
172
+ To install a plugin:
173
+
174
+ 1. Select it by scrolling the available plugins list on the bottom, or by directly
175
+ filtering by name or description.
176
+ 2. Select the tool (`conda` or `pip`) and version on the `Installation Info` dropdown.
177
+ 3. Start the installation process by clicking on the `Install` button.
178
+
179
+ You can cancel the process at any time by clicking the `Cancel` button of each plugin.
180
+
181
+ **Note**: Not all napari plugins are currently available on conda via the
182
+ [conda-forge channel](https://anaconda.org/conda-forge/). Some plugins will require
183
+ a restart to be properly configured.
184
+
185
+ ![Screenshot of the napari-plugin-manager showing the process of installing a plugin](./images/install.png)
186
+
187
+ ### Uninstalling a plugin
188
+
189
+ To uninstall a plugin:
190
+
191
+ 1. Select it by scrolling the installed plugins list on the top, or by directly
192
+ filtering by name or description.
193
+ 2. Start the removal process by clicking on the `Uninstall` button.
194
+
195
+ You can cancel the process at any time by clicking the `Cancel` button of each plugin.
196
+
197
+ **Note**: Some plugins will require a restart to be properly removed.
198
+
199
+ ![Screenshot of the napari-plugin-manager showing the process of uninstalling a plugin](./images/uninstall.png)
200
+
201
+ ### Updating a plugin
202
+
203
+ When a new version of an installed plugin is available, an `Update (vX.Y.Z)`
204
+ button will appear to the left of the `Installation Info` dropdown.
205
+
206
+ To update a plugin:
207
+
208
+ 1. Select it by scrolling the install plugins list on the top, or by directly
209
+ filtering by name or description.
210
+ 2. Start the update process by clicking on the `Update (vX.Y.Z)` button.
211
+
212
+ You can cancel the process at any time by clicking the `Cancel` button of each plugin.
213
+
214
+ ![Screenshot of the napari-plugin-manager showing the process of updating a plugin](./images/update.png)
215
+
216
+ ### Batch actions
217
+
218
+ You don't need wait for one action to finish before you can start another one. You can add more
219
+ tasks to the queue (install/uninstall/update) by clicking on the corresponding action buttons
220
+ plugin by plugin. The actions will be carried out sequentially and in the order in which you
221
+ started them.
222
+
223
+ You can cancel all the started installer actions at any time by clicking `Cancel all`
224
+ button at the bottom of the UI.
225
+
226
+ ## Troubleshooting
227
+
228
+ In order to visualize more detailed information on the installer process output, you can
229
+ click on the `Show status` button located at the bottom left corner of the UI. To hide
230
+ this detailed information you can click on the `Hide status` button.
231
+
232
+ Some issues that you might experience when using the installer include:
233
+
234
+ * Incompatible packages due to conflicting dependencies.
235
+ * Network connectivity errors.
236
+
237
+ ![Screenshot of the napari-plugin-amanger interface showcasing the status information, which is initially hidden by default.](./images/status.png)
238
+
239
+ ## License
240
+
241
+ Distributed under the terms of the [BSD-3] license, "napari-plugin-manager" is free and open source
242
+ software.
243
+
244
+ ## Issues
245
+
246
+ If you encounter any problems, please [file an issue] along with a detailed description.
247
+
248
+ [napari]: https://github.com/napari/napari
249
+ [@napari]: https://github.com/napari
250
+ [BSD-3]: http://opensource.org/licenses/BSD-3-Clause
251
+ [file an issue]: https://github.com/napari/napari-plugin-manager/issues
252
+ [open an issue]: https://github.com/napari/napari-plugin-manager/issues
253
+ [pip]: https://pypi.org/project/pip/
254
+ [conda]: https://conda.org
255
+ [PyPI]: https://pypi.org/