napari-copick 0.0.1__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.
@@ -0,0 +1,19 @@
1
+ # Validates PR title follows conventional commits
2
+ name: conventional-commits
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ types:
7
+ - edited
8
+ - opened
9
+ - synchronize
10
+ - reopened
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+ jobs:
16
+ conventional_commit_title:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: chanzuckerberg/github-actions/.github/actions/conventional-commits@v6.4.0
@@ -0,0 +1,23 @@
1
+ name: Python Linting
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ pre_commit_checks:
10
+ name: pre-commit checks
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v3
14
+ - uses: actions/setup-python@v4
15
+ with:
16
+ python-version: "3.12.5"
17
+ - name: Install action-validator with asdf
18
+ uses: asdf-vm/actions/install@v3
19
+ with:
20
+ tool_versions: |
21
+ action-validator 0.6.0
22
+ - name: check linting
23
+ uses: pre-commit/action@v3.0.1
@@ -0,0 +1,64 @@
1
+ name: Create Release PRs
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ permissions:
10
+ contents: write
11
+ issues: write
12
+ pull-requests: write
13
+
14
+ jobs:
15
+ release-please:
16
+ concurrency:
17
+ group: ${{ github.workflow }}-${{ github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: release please
23
+ uses: googleapis/release-please-action@v4
24
+ id: release
25
+ with:
26
+ manifest-file: ".release-please.manifest.json"
27
+ config-file: "release-please.config.json"
28
+ target-branch: "main"
29
+ token: ${{ secrets.GITHUB_TOKEN }}
30
+
31
+ outputs:
32
+ paths_released: ${{ steps.release.outputs.paths_released }}
33
+
34
+ publish-pypi-package:
35
+ name: Build and publish Python package to PyPI
36
+ runs-on: ubuntu-latest
37
+ needs: release-please
38
+ if: contains(needs.release-please.outputs.paths_released, '.')
39
+ environment:
40
+ name: pypi
41
+ url: https://pypi.org/p/napari-copick
42
+ permissions:
43
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
44
+ steps:
45
+ - name: Checkout ref branch
46
+ uses: actions/checkout@v4
47
+ with:
48
+ ref: ${{ github.ref }}
49
+ fetch-depth: 0
50
+
51
+ - name: Install uv
52
+ uses: astral-sh/setup-uv@v6
53
+ with:
54
+ version: "0.7.13"
55
+ python-version: "3.12"
56
+
57
+ - name: build
58
+ run: |
59
+ uv build
60
+
61
+ - name: Publish distribution 📦 to PyPI
62
+ uses: pypa/gh-action-pypi-publish@release/v1
63
+ with:
64
+ packages-dir: dist
@@ -0,0 +1,60 @@
1
+ # This workflows 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: tests
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ - npe2
11
+ tags:
12
+ - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
13
+ pull_request:
14
+ branches:
15
+ - main
16
+ - npe2
17
+ workflow_dispatch:
18
+
19
+ jobs:
20
+ test:
21
+ name: ${{ matrix.platform }} py${{ matrix.python-version }}
22
+ runs-on: ${{ matrix.platform }}
23
+ timeout-minutes: 30
24
+ strategy:
25
+ matrix:
26
+ platform: [ubuntu-latest, windows-latest, macos-latest]
27
+ python-version: ['3.9', '3.10']
28
+
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v6
34
+ with:
35
+ version: "0.7.13"
36
+ python-version: ${{ matrix.python-version }}
37
+
38
+ # these libraries enable testing on Qt on linux
39
+ - uses: tlambert03/setup-qt-libs@v1
40
+
41
+ # strategy borrowed from vispy for installing opengl libs on windows
42
+ - name: Install Windows OpenGL
43
+ if: runner.os == 'Windows'
44
+ run: |
45
+ git clone --depth 1 https://github.com/pyvista/gl-ci-helpers.git
46
+ powershell gl-ci-helpers/appveyor/install_opengl.ps1
47
+
48
+ - name: Install napari-copick
49
+ run: uv sync --locked --extra testing --extra dev
50
+
51
+ # this runs the platform-specific tests declared in tox.ini
52
+ - name: Test with tox
53
+ uses: aganders3/headless-gui@v1
54
+ with:
55
+ run: uv run tox
56
+ env:
57
+ PLATFORM: ${{ matrix.platform }}
58
+
59
+ - name: Coverage
60
+ uses: codecov/codecov-action@v3
@@ -0,0 +1,84 @@
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
+ # Pycharm and VSCode
70
+ .idea/
71
+ venv/
72
+ .vscode/
73
+
74
+ # IPython Notebook
75
+ .ipynb_checkpoints
76
+
77
+ # pyenv
78
+ .python-version
79
+
80
+ # OS
81
+ .DS_Store
82
+
83
+ # written by setuptools_scm
84
+ **/_version.py
@@ -0,0 +1,9 @@
1
+ <!-- This file is a placeholder for customizing description of your plugin
2
+ on the napari hub if you wish. The readme file will be used by default if
3
+ you wish not to do any customization for the napari hub listing.
4
+
5
+ If you need some help writing a good description, check out our
6
+ [guide](https://github.com/chanzuckerberg/napari-hub/wiki/Writing-the-Perfect-Description-for-your-Plugin)
7
+ -->
8
+
9
+ The developer has not yet provided a napari-hub specific description.
@@ -0,0 +1,27 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: check-docstring-first
6
+ - id: end-of-file-fixer
7
+ - id: trailing-whitespace
8
+ exclude: ^\.napari-hub/.*
9
+ - id: check-yaml # checks for correct yaml syntax for github actions ex.
10
+ - repo: https://github.com/astral-sh/ruff-pre-commit
11
+ rev: v0.3.4
12
+ hooks:
13
+ - id: ruff
14
+ - repo: https://github.com/psf/black
15
+ rev: 24.3.0
16
+ hooks:
17
+ - id: black
18
+ - repo: https://github.com/tlambert03/napari-plugin-checks
19
+ rev: v0.3.0
20
+ hooks:
21
+ - id: napari-plugin-checks
22
+ # https://mypy.readthedocs.io/en/stable/
23
+ # you may wish to add this as well!
24
+ # - repo: https://github.com/pre-commit/mirrors-mypy
25
+ # rev: v1.9.0
26
+ # hooks:
27
+ # - id: mypy
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.0.1"
3
+ }
@@ -0,0 +1,22 @@
1
+
2
+ The MIT License (MIT)
3
+
4
+ Copyright (c) 2024 Kyle Harrington
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
@@ -0,0 +1,5 @@
1
+ include LICENSE
2
+ include README.md
3
+
4
+ recursive-exclude * __pycache__
5
+ recursive-exclude * *.py[co]
@@ -0,0 +1,182 @@
1
+ Metadata-Version: 2.4
2
+ Name: napari-copick
3
+ Version: 0.0.1
4
+ Summary: A plugin for collaborative annotation in cryoET using copick
5
+ Project-URL: Repository, https://github.com/kephale/napari-copick
6
+ Project-URL: Issues, https://github.com/kephale/napari-copick/issues
7
+ Project-URL: Documentation, https://github.com/kephale/napari-copick#README.md
8
+ Project-URL: Bug Tracker, https://github.com/kephale/napari-copick/issues
9
+ Project-URL: Source Code, https://github.com/kephale/napari-copick
10
+ Project-URL: User Support, https://github.com/kephale/napari-copick/issues
11
+ Author-email: Kyle Harrington <czi@kyleharrington.com>
12
+ License:
13
+ The MIT License (MIT)
14
+
15
+ Copyright (c) 2024 Kyle Harrington
16
+
17
+ Permission is hereby granted, free of charge, to any person obtaining a copy
18
+ of this software and associated documentation files (the "Software"), to deal
19
+ in the Software without restriction, including without limitation the rights
20
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
21
+ copies of the Software, and to permit persons to whom the Software is
22
+ furnished to do so, subject to the following conditions:
23
+
24
+ The above copyright notice and this permission notice shall be included in
25
+ all copies or substantial portions of the Software.
26
+
27
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
30
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
32
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
33
+ THE SOFTWARE.
34
+ License-File: LICENSE
35
+ Keywords: annotation,copick,cryo-et,cryoet,napari,plugin,tomography
36
+ Classifier: Development Status :: 2 - Pre-Alpha
37
+ Classifier: Framework :: napari
38
+ Classifier: Intended Audience :: Developers
39
+ Classifier: License :: OSI Approved :: MIT License
40
+ Classifier: Operating System :: OS Independent
41
+ Classifier: Programming Language :: Python
42
+ Classifier: Programming Language :: Python :: 3
43
+ Classifier: Programming Language :: Python :: 3 :: Only
44
+ Classifier: Programming Language :: Python :: 3.9
45
+ Classifier: Programming Language :: Python :: 3.10
46
+ Classifier: Programming Language :: Python :: 3.11
47
+ Classifier: Programming Language :: Python :: 3.12
48
+ Classifier: Programming Language :: Python :: 3.13
49
+ Classifier: Programming Language :: Python :: Implementation :: CPython
50
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
51
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
52
+ Requires-Python: >=3.9
53
+ Requires-Dist: copick
54
+ Requires-Dist: fsspec
55
+ Requires-Dist: magicgui
56
+ Requires-Dist: napari-ome-zarr
57
+ Requires-Dist: numpy
58
+ Requires-Dist: pydantic>=2
59
+ Requires-Dist: qtpy
60
+ Requires-Dist: scikit-image
61
+ Requires-Dist: trimesh
62
+ Requires-Dist: zarr
63
+ Provides-Extra: dev
64
+ Requires-Dist: black>=25.1.0; extra == 'dev'
65
+ Requires-Dist: hatch-vcs>=0.4.0; extra == 'dev'
66
+ Requires-Dist: hatchling>=1.25.0; extra == 'dev'
67
+ Requires-Dist: pre-commit>=4.2.0; extra == 'dev'
68
+ Requires-Dist: ruff>=0.12.0; extra == 'dev'
69
+ Provides-Extra: testing
70
+ Requires-Dist: napari; extra == 'testing'
71
+ Requires-Dist: pyqt6; extra == 'testing'
72
+ Requires-Dist: pytest; extra == 'testing'
73
+ Requires-Dist: pytest-cov; extra == 'testing'
74
+ Requires-Dist: pytest-qt; extra == 'testing'
75
+ Requires-Dist: tox; extra == 'testing'
76
+ Requires-Dist: tox-gh-actions; extra == 'testing'
77
+ Requires-Dist: tox-uv; extra == 'testing'
78
+ Description-Content-Type: text/markdown
79
+
80
+ # napari-copick
81
+
82
+ [![License MIT](https://img.shields.io/pypi/l/napari-copick.svg?color=green)](https://github.com/kephale/napari-copick/raw/main/LICENSE)
83
+ [![PyPI](https://img.shields.io/pypi/v/napari-copick.svg?color=green)](https://pypi.org/project/napari-copick)
84
+ [![Python Version](https://img.shields.io/pypi/pyversions/napari-copick.svg?color=green)](https://python.org)
85
+ [![tests](https://github.com/kephale/napari-copick/workflows/tests/badge.svg)](https://github.com/kephale/napari-copick/actions)
86
+ [![codecov](https://codecov.io/gh/kephale/napari-copick/branch/main/graph/badge.svg)](https://codecov.io/gh/kephale/napari-copick)
87
+ [![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-copick)](https://napari-hub.org/plugins/napari-copick)
88
+
89
+ A plugin for collaborative annotation in cryoET using copick
90
+
91
+ ----------------------------------
92
+
93
+ This [napari] plugin was generated with [Cookiecutter] using [@napari]'s [cookiecutter-napari-plugin] template.
94
+
95
+ <!--
96
+ Don't miss the full getting started guide to set up your new package:
97
+ https://github.com/napari/cookiecutter-napari-plugin#getting-started
98
+
99
+ and review the napari docs for plugin developers:
100
+ https://napari.org/stable/plugins/index.html
101
+ -->
102
+
103
+ ## Installation
104
+
105
+ You can install `napari-copick` via [pip]:
106
+
107
+ pip install napari-copick
108
+
109
+ To install latest development version:
110
+
111
+ pip install git+https://github.com/kephale/napari-copick.git
112
+
113
+ ## Usage
114
+
115
+ ### Using a copick config file
116
+
117
+ ```bash
118
+ python -m napari_copick.widget --config_path path/to/copick_config.json
119
+ ```
120
+
121
+ ### Using dataset IDs from CZ cryoET Data Portal
122
+
123
+ ```bash
124
+ python -m napari_copick.widget --dataset_ids 10440 10441 --overlay_root /path/to/overlay_root
125
+ ```
126
+
127
+ You can specify multiple dataset IDs separated by spaces.
128
+
129
+ ### GUI Usage
130
+
131
+ The plugin provides an intuitive interface with two loading options:
132
+
133
+ 1. **Load Config File**: Opens a file dialog to select a copick configuration JSON file
134
+ 2. **Load from Dataset IDs**: Opens a dialog to enter CZ cryoET Data Portal dataset IDs and overlay root path
135
+
136
+ After loading, you'll see a hierarchical tree of the project structure that you can navigate to access tomograms, segmentations, and picks.
137
+
138
+ ### Tomogram Handling
139
+
140
+ napari-copick now handles multiscale zarr arrays directly:
141
+
142
+ - Automatically detects and loads all available resolution levels
143
+ - Creates a proper multiscale image stack using napari's native multiscale API
144
+ - Uses dask for efficient lazy loading of large tomogram data
145
+ - Applies appropriate scaling factors based on the voxel size metadata
146
+
147
+ This direct zarr handling provides better performance and more flexibility compared to relying on external plugins.
148
+
149
+ ## Contributing
150
+
151
+ Contributions are very welcome. Tests can be run with [tox], please ensure
152
+ the coverage at least stays the same before you submit a pull request.
153
+
154
+ ## License
155
+
156
+ Distributed under the terms of the [MIT] license,
157
+ "napari-copick" is free and open source software
158
+
159
+ ## Issues
160
+
161
+ If you encounter any problems, please [file an issue] along with a detailed description.
162
+
163
+ [napari]: https://github.com/napari/napari
164
+ [Cookiecutter]: https://github.com/audreyr/cookiecutter
165
+ [@napari]: https://github.com/napari
166
+ [MIT]: http://opensource.org/licenses/MIT
167
+ [cookiecutter-napari-plugin]: https://github.com/napari/cookiecutter-napari-plugin
168
+
169
+ [file an issue]: https://github.com/kephale/napari-copick/issues
170
+
171
+ [napari]: https://github.com/napari/napari
172
+ [tox]: https://tox.readthedocs.io/en/latest/
173
+ [pip]: https://pypi.org/project/pip/
174
+ [PyPI]: https://pypi.org/
175
+
176
+ ## Code of Conduct
177
+
178
+ This project adheres to the Contributor Covenant [code of conduct](https://github.com/chanzuckerberg/.github/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [opensource@chanzuckerberg.com](mailto:opensource@chanzuckerberg.com).
179
+
180
+ ## Reporting Security Issues
181
+
182
+ If you believe you have found a security issue, please responsibly disclose by contacting us at [security@chanzuckerberg.com](mailto:security@chanzuckerberg.com).
@@ -0,0 +1,103 @@
1
+ # napari-copick
2
+
3
+ [![License MIT](https://img.shields.io/pypi/l/napari-copick.svg?color=green)](https://github.com/kephale/napari-copick/raw/main/LICENSE)
4
+ [![PyPI](https://img.shields.io/pypi/v/napari-copick.svg?color=green)](https://pypi.org/project/napari-copick)
5
+ [![Python Version](https://img.shields.io/pypi/pyversions/napari-copick.svg?color=green)](https://python.org)
6
+ [![tests](https://github.com/kephale/napari-copick/workflows/tests/badge.svg)](https://github.com/kephale/napari-copick/actions)
7
+ [![codecov](https://codecov.io/gh/kephale/napari-copick/branch/main/graph/badge.svg)](https://codecov.io/gh/kephale/napari-copick)
8
+ [![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-copick)](https://napari-hub.org/plugins/napari-copick)
9
+
10
+ A plugin for collaborative annotation in cryoET using copick
11
+
12
+ ----------------------------------
13
+
14
+ This [napari] plugin was generated with [Cookiecutter] using [@napari]'s [cookiecutter-napari-plugin] template.
15
+
16
+ <!--
17
+ Don't miss the full getting started guide to set up your new package:
18
+ https://github.com/napari/cookiecutter-napari-plugin#getting-started
19
+
20
+ and review the napari docs for plugin developers:
21
+ https://napari.org/stable/plugins/index.html
22
+ -->
23
+
24
+ ## Installation
25
+
26
+ You can install `napari-copick` via [pip]:
27
+
28
+ pip install napari-copick
29
+
30
+ To install latest development version:
31
+
32
+ pip install git+https://github.com/kephale/napari-copick.git
33
+
34
+ ## Usage
35
+
36
+ ### Using a copick config file
37
+
38
+ ```bash
39
+ python -m napari_copick.widget --config_path path/to/copick_config.json
40
+ ```
41
+
42
+ ### Using dataset IDs from CZ cryoET Data Portal
43
+
44
+ ```bash
45
+ python -m napari_copick.widget --dataset_ids 10440 10441 --overlay_root /path/to/overlay_root
46
+ ```
47
+
48
+ You can specify multiple dataset IDs separated by spaces.
49
+
50
+ ### GUI Usage
51
+
52
+ The plugin provides an intuitive interface with two loading options:
53
+
54
+ 1. **Load Config File**: Opens a file dialog to select a copick configuration JSON file
55
+ 2. **Load from Dataset IDs**: Opens a dialog to enter CZ cryoET Data Portal dataset IDs and overlay root path
56
+
57
+ After loading, you'll see a hierarchical tree of the project structure that you can navigate to access tomograms, segmentations, and picks.
58
+
59
+ ### Tomogram Handling
60
+
61
+ napari-copick now handles multiscale zarr arrays directly:
62
+
63
+ - Automatically detects and loads all available resolution levels
64
+ - Creates a proper multiscale image stack using napari's native multiscale API
65
+ - Uses dask for efficient lazy loading of large tomogram data
66
+ - Applies appropriate scaling factors based on the voxel size metadata
67
+
68
+ This direct zarr handling provides better performance and more flexibility compared to relying on external plugins.
69
+
70
+ ## Contributing
71
+
72
+ Contributions are very welcome. Tests can be run with [tox], please ensure
73
+ the coverage at least stays the same before you submit a pull request.
74
+
75
+ ## License
76
+
77
+ Distributed under the terms of the [MIT] license,
78
+ "napari-copick" is free and open source software
79
+
80
+ ## Issues
81
+
82
+ If you encounter any problems, please [file an issue] along with a detailed description.
83
+
84
+ [napari]: https://github.com/napari/napari
85
+ [Cookiecutter]: https://github.com/audreyr/cookiecutter
86
+ [@napari]: https://github.com/napari
87
+ [MIT]: http://opensource.org/licenses/MIT
88
+ [cookiecutter-napari-plugin]: https://github.com/napari/cookiecutter-napari-plugin
89
+
90
+ [file an issue]: https://github.com/kephale/napari-copick/issues
91
+
92
+ [napari]: https://github.com/napari/napari
93
+ [tox]: https://tox.readthedocs.io/en/latest/
94
+ [pip]: https://pypi.org/project/pip/
95
+ [PyPI]: https://pypi.org/
96
+
97
+ ## Code of Conduct
98
+
99
+ This project adheres to the Contributor Covenant [code of conduct](https://github.com/chanzuckerberg/.github/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [opensource@chanzuckerberg.com](mailto:opensource@chanzuckerberg.com).
100
+
101
+ ## Reporting Security Issues
102
+
103
+ If you believe you have found a security issue, please responsibly disclose by contacting us at [security@chanzuckerberg.com](mailto:security@chanzuckerberg.com).
@@ -0,0 +1,3 @@
1
+ ## Reporting Security Issues
2
+
3
+ If you believe you have found a security issue, please responsibly disclose by contacting us at [security@chanzuckerberg.com](mailto:security@chanzuckerberg.com).