plate-overview 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,78 @@
1
+ # Tests on every push and PR; publishes to PyPI on a v* tag.
2
+ # Trusted publishing (OIDC) — no API token in secrets. Configure the
3
+ # `pypi` environment and the PyPI publisher before the first tag.
4
+ name: tests
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
+ group: ${{ github.workflow }}-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ test:
23
+ name: ${{ matrix.platform }} py${{ matrix.python-version }}
24
+ runs-on: ${{ matrix.platform }}
25
+ timeout-minutes: 30
26
+ strategy:
27
+ fail-fast: false
28
+ matrix:
29
+ platform: [ubuntu-latest, windows-latest, macos-latest]
30
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
31
+
32
+ steps:
33
+ - uses: actions/checkout@v7
34
+ with:
35
+ # setuptools_scm derives the version from tags.
36
+ fetch-depth: 0
37
+
38
+ - name: Setup python
39
+ uses: astral-sh/setup-uv@v7
40
+ with:
41
+ python-version: ${{ matrix.python-version }}
42
+ activate-environment: "true"
43
+
44
+ # This runs the platform-specific tests declared in tox.ini.
45
+ - name: Test with tox
46
+ run: uvx --with tox-gh-actions tox
47
+ env:
48
+ PLATFORM: ${{ matrix.platform }}
49
+
50
+ - name: Coverage
51
+ uses: codecov/codecov-action@v7
52
+
53
+ build-and-inspect-package:
54
+ name: Build & inspect package.
55
+ runs-on: ubuntu-latest
56
+
57
+ steps:
58
+ - uses: actions/checkout@v7
59
+ with:
60
+ fetch-depth: 0
61
+ - uses: hynek/build-and-inspect-python-package@v3.0.1
62
+
63
+ deploy:
64
+ # Runs when a commit tagged v* is pushed.
65
+ needs: [test, build-and-inspect-package]
66
+ runs-on: ubuntu-latest
67
+ if: contains(github.ref, 'tags')
68
+ environment: pypi
69
+ permissions:
70
+ id-token: write
71
+ steps:
72
+ - name: Download built artifact to dist/
73
+ uses: actions/download-artifact@v8
74
+ with:
75
+ name: Packages
76
+ path: dist
77
+ - name: Publish to PyPI
78
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,97 @@
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
85
+
86
+ # emacs files
87
+ *.el
88
+
89
+ # personal testing emacs org-mode file
90
+ README.org
91
+ notebook.org
92
+
93
+ # workshop
94
+ workshop/
95
+
96
+ # local triage notes and agent briefs (not published to the tracker)
97
+ .triage/
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Versions are derived from git tags by `setuptools_scm` — never hand-edit
9
+ a version anywhere in this repo.
10
+
11
+ ## [Unreleased]
12
+
13
+ ## [0.0.1] - 2026-09-10
14
+
15
+ ### Added
16
+
17
+ - Repository scaffold: packaging, tox, CI, and a headless smoke test.
18
+ No renderer yet; see #1.
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Max Ferrin
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.4
2
+ Name: plate-overview
3
+ Version: 0.0.1
4
+ Summary: Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate
5
+ Author: Max Ferrin
6
+ Author-email: ferrinmax@gmail.com
7
+ License: BSD 3-Clause License
8
+
9
+ Copyright (c) 2026, Max Ferrin
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
+ 1. Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ 2. 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
+ 3. 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: Bug Tracker, https://github.com/ferrinm/plate-overview/issues
37
+ Project-URL: Documentation, https://github.com/ferrinm/plate-overview#README.md
38
+ Project-URL: Source Code, https://github.com/ferrinm/plate-overview
39
+ Project-URL: User Support, https://github.com/ferrinm/plate-overview/issues
40
+ Classifier: Development Status :: 2 - Pre-Alpha
41
+ Classifier: Intended Audience :: Science/Research
42
+ Classifier: License :: OSI Approved :: BSD License
43
+ Classifier: Operating System :: OS Independent
44
+ Classifier: Programming Language :: Python
45
+ Classifier: Programming Language :: Python :: 3
46
+ Classifier: Programming Language :: Python :: 3 :: Only
47
+ Classifier: Programming Language :: Python :: 3.10
48
+ Classifier: Programming Language :: Python :: 3.11
49
+ Classifier: Programming Language :: Python :: 3.12
50
+ Classifier: Programming Language :: Python :: 3.13
51
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
52
+ Requires-Python: >=3.10
53
+ Description-Content-Type: text/markdown
54
+ License-File: LICENSE
55
+ Requires-Dist: numpy
56
+ Requires-Dist: Pillow
57
+ Requires-Dist: matplotlib
58
+ Dynamic: license-file
59
+
60
+ # plate-overview
61
+
62
+ Whole-plate overview images for multiwell fluorescence microscopy: one
63
+ thumbnail per well, laid out in plate geometry, with each channel's
64
+ contrast normalized **across the whole plate** so wells are comparable
65
+ to each other by eye.
66
+
67
+ Vendor-neutral. This package knows nothing about acquisition formats —
68
+ you hand it pixels through a small typed port and it draws.
69
+
70
+ > **Status: pre-alpha, empty.** The renderer has not landed yet. See
71
+ > [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
72
+ > which extracts it, and #1 here.
73
+
74
+ ## Why this exists as its own package
75
+
76
+ There is exactly one renderer. Every acquisition format reaches it
77
+ through an adapter, so overviews from different instruments stay
78
+ comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
79
+ Thunder `.lif` adapter is the second.
80
+
81
+ ## Design notes
82
+
83
+ [CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
84
+ the resampling rule.
85
+
86
+ ## Install
87
+
88
+ ```bash
89
+ pip install plate-overview
90
+ ```
91
+
92
+ ## Contributing
93
+
94
+ Two house rules beyond the usual:
95
+
96
+ - **No real acquisition data, anywhere.** No fixture, example, sidecar
97
+ or docstring may derive from a real acquisition. No plate
98
+ identifiers, no operator-bearing paths, no source filenames. Test
99
+ fixtures are synthetic. This repository is public and the upstream
100
+ acquisitions are not.
101
+ - **Output paths are basenames.** The JSON sidecar records a filename,
102
+ never an absolute path, so a sidecar pasted into an issue does not
103
+ leak a filesystem layout.
104
+
105
+ ## License
106
+
107
+ BSD 3-Clause. See [LICENSE](LICENSE).
@@ -0,0 +1,48 @@
1
+ # plate-overview
2
+
3
+ Whole-plate overview images for multiwell fluorescence microscopy: one
4
+ thumbnail per well, laid out in plate geometry, with each channel's
5
+ contrast normalized **across the whole plate** so wells are comparable
6
+ to each other by eye.
7
+
8
+ Vendor-neutral. This package knows nothing about acquisition formats —
9
+ you hand it pixels through a small typed port and it draws.
10
+
11
+ > **Status: pre-alpha, empty.** The renderer has not landed yet. See
12
+ > [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
13
+ > which extracts it, and #1 here.
14
+
15
+ ## Why this exists as its own package
16
+
17
+ There is exactly one renderer. Every acquisition format reaches it
18
+ through an adapter, so overviews from different instruments stay
19
+ comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
20
+ Thunder `.lif` adapter is the second.
21
+
22
+ ## Design notes
23
+
24
+ [CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
25
+ the resampling rule.
26
+
27
+ ## Install
28
+
29
+ ```bash
30
+ pip install plate-overview
31
+ ```
32
+
33
+ ## Contributing
34
+
35
+ Two house rules beyond the usual:
36
+
37
+ - **No real acquisition data, anywhere.** No fixture, example, sidecar
38
+ or docstring may derive from a real acquisition. No plate
39
+ identifiers, no operator-bearing paths, no source filenames. Test
40
+ fixtures are synthetic. This repository is public and the upstream
41
+ acquisitions are not.
42
+ - **Output paths are basenames.** The JSON sidecar records a filename,
43
+ never an absolute path, so a sidecar pasted into an issue does not
44
+ leak a filesystem layout.
45
+
46
+ ## License
47
+
48
+ BSD 3-Clause. See [LICENSE](LICENSE).
@@ -0,0 +1,105 @@
1
+ [project]
2
+ name = "plate-overview"
3
+ dynamic = ["version"]
4
+ description = "Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate"
5
+ readme = "README.md"
6
+ license = {file = "LICENSE"}
7
+ authors = [
8
+ {name = "Max Ferrin"},
9
+ {email = "ferrinmax@gmail.com"},
10
+ ]
11
+ classifiers = [
12
+ "Development Status :: 2 - Pre-Alpha",
13
+ "Intended Audience :: Science/Research",
14
+ "License :: OSI Approved :: BSD License",
15
+ "Operating System :: OS Independent",
16
+ "Programming Language :: Python",
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3 :: Only",
19
+ "Programming Language :: Python :: 3.10",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Topic :: Scientific/Engineering :: Image Processing",
24
+ ]
25
+ requires-python = ">=3.10"
26
+ # Headless by design: no GUI toolkit, no acquisition-format reader.
27
+ # A consumer supplies pixels through the render port; this package draws.
28
+ dependencies = [
29
+ "numpy",
30
+ "Pillow",
31
+ "matplotlib",
32
+ ]
33
+
34
+ [dependency-groups]
35
+ dev = [
36
+ "tox-uv",
37
+ "pytest",
38
+ "pytest-cov",
39
+ ]
40
+
41
+ [project.urls]
42
+ "Bug Tracker" = "https://github.com/ferrinm/plate-overview/issues"
43
+ "Documentation" = "https://github.com/ferrinm/plate-overview#README.md"
44
+ "Source Code" = "https://github.com/ferrinm/plate-overview"
45
+ "User Support" = "https://github.com/ferrinm/plate-overview/issues"
46
+
47
+ [build-system]
48
+ requires = ["setuptools>=42.0.0", "setuptools_scm"]
49
+ build-backend = "setuptools.build_meta"
50
+
51
+ [tool.setuptools]
52
+ include-package-data = true
53
+
54
+ [tool.setuptools.packages.find]
55
+ where = ["src"]
56
+
57
+ [tool.setuptools.package-data]
58
+ "*" = ["py.typed"]
59
+
60
+ [tool.setuptools_scm]
61
+ write_to = "src/plate_overview/_version.py"
62
+ fallback_version = "0.0.1+nogit"
63
+
64
+ [tool.pytest.ini_options]
65
+ minversion = "6.0"
66
+ addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
67
+ xfail_strict = true
68
+ log_cli_level = "INFO"
69
+ testpaths = ["tests"]
70
+
71
+ [tool.black]
72
+ line-length = 79
73
+ target-version = ['py310', 'py311', 'py312', 'py313']
74
+
75
+ [tool.ruff]
76
+ line-length = 79
77
+ lint.select = [
78
+ "E", "F", "W", # flake8
79
+ "UP", # pyupgrade
80
+ "I", # isort
81
+ "BLE", # flake8-blind-exception
82
+ "B", # flake8-bugbear
83
+ "A", # flake8-builtins
84
+ "C4", # flake8-comprehensions
85
+ "ISC", # flake8-implicit-str-concat
86
+ "G", # flake8-logging-format
87
+ "PIE", # flake8-pie
88
+ "SIM", # flake8-simplify
89
+ ]
90
+ lint.ignore = [
91
+ "E501", # line too long. let black handle this
92
+ ]
93
+
94
+ exclude = [
95
+ ".eggs",
96
+ ".git",
97
+ ".mypy_cache",
98
+ ".ruff_cache",
99
+ ".tox",
100
+ ".venv",
101
+ "_build",
102
+ "build",
103
+ "dist",
104
+ ]
105
+ fix = true
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,19 @@
1
+ """Vendor-neutral whole-plate QC montages.
2
+
3
+ One thumbnail per well, laid out in plate geometry, with each channel's
4
+ contrast normalized across the whole plate so wells are comparable to
5
+ each other by eye.
6
+
7
+ This package knows nothing about acquisition formats. A consumer
8
+ implements a narrow render port and this package draws.
9
+
10
+ Nothing is exported yet — the renderer is extracted in
11
+ https://github.com/ferrinm/PyPhenix/issues/32.
12
+ """
13
+
14
+ try:
15
+ from ._version import version as __version__
16
+ except ImportError: # pragma: no cover - source checkout without metadata
17
+ __version__ = "unknown"
18
+
19
+ __all__ = ["__version__"]
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '0.0.1'
22
+ __version_tuple__ = version_tuple = (0, 0, 1)
23
+
24
+ __commit_id__ = commit_id = 'g5c8667e41'
File without changes
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.4
2
+ Name: plate-overview
3
+ Version: 0.0.1
4
+ Summary: Vendor-neutral whole-plate QC montages: one thumbnail per well, contrast normalized across the plate
5
+ Author: Max Ferrin
6
+ Author-email: ferrinmax@gmail.com
7
+ License: BSD 3-Clause License
8
+
9
+ Copyright (c) 2026, Max Ferrin
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
+ 1. Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ 2. 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
+ 3. 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: Bug Tracker, https://github.com/ferrinm/plate-overview/issues
37
+ Project-URL: Documentation, https://github.com/ferrinm/plate-overview#README.md
38
+ Project-URL: Source Code, https://github.com/ferrinm/plate-overview
39
+ Project-URL: User Support, https://github.com/ferrinm/plate-overview/issues
40
+ Classifier: Development Status :: 2 - Pre-Alpha
41
+ Classifier: Intended Audience :: Science/Research
42
+ Classifier: License :: OSI Approved :: BSD License
43
+ Classifier: Operating System :: OS Independent
44
+ Classifier: Programming Language :: Python
45
+ Classifier: Programming Language :: Python :: 3
46
+ Classifier: Programming Language :: Python :: 3 :: Only
47
+ Classifier: Programming Language :: Python :: 3.10
48
+ Classifier: Programming Language :: Python :: 3.11
49
+ Classifier: Programming Language :: Python :: 3.12
50
+ Classifier: Programming Language :: Python :: 3.13
51
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
52
+ Requires-Python: >=3.10
53
+ Description-Content-Type: text/markdown
54
+ License-File: LICENSE
55
+ Requires-Dist: numpy
56
+ Requires-Dist: Pillow
57
+ Requires-Dist: matplotlib
58
+ Dynamic: license-file
59
+
60
+ # plate-overview
61
+
62
+ Whole-plate overview images for multiwell fluorescence microscopy: one
63
+ thumbnail per well, laid out in plate geometry, with each channel's
64
+ contrast normalized **across the whole plate** so wells are comparable
65
+ to each other by eye.
66
+
67
+ Vendor-neutral. This package knows nothing about acquisition formats —
68
+ you hand it pixels through a small typed port and it draws.
69
+
70
+ > **Status: pre-alpha, empty.** The renderer has not landed yet. See
71
+ > [ferrinm/PyPhenix#32](https://github.com/ferrinm/PyPhenix/issues/32),
72
+ > which extracts it, and #1 here.
73
+
74
+ ## Why this exists as its own package
75
+
76
+ There is exactly one renderer. Every acquisition format reaches it
77
+ through an adapter, so overviews from different instruments stay
78
+ comparable. `pyphenix` (Opera Phenix) is the first consumer. A Leica
79
+ Thunder `.lif` adapter is the second.
80
+
81
+ ## Design notes
82
+
83
+ [CONTEXT.md](CONTEXT.md) covers the render port, the gathering loop, and
84
+ the resampling rule.
85
+
86
+ ## Install
87
+
88
+ ```bash
89
+ pip install plate-overview
90
+ ```
91
+
92
+ ## Contributing
93
+
94
+ Two house rules beyond the usual:
95
+
96
+ - **No real acquisition data, anywhere.** No fixture, example, sidecar
97
+ or docstring may derive from a real acquisition. No plate
98
+ identifiers, no operator-bearing paths, no source filenames. Test
99
+ fixtures are synthetic. This repository is public and the upstream
100
+ acquisitions are not.
101
+ - **Output paths are basenames.** The JSON sidecar records a filename,
102
+ never an absolute path, so a sidecar pasted into an issue does not
103
+ leak a filesystem layout.
104
+
105
+ ## License
106
+
107
+ BSD 3-Clause. See [LICENSE](LICENSE).
@@ -0,0 +1,19 @@
1
+ .gitignore
2
+ CHANGELOG.md
3
+ LICENSE
4
+ README.md
5
+ pyproject.toml
6
+ tox.ini
7
+ uv.lock
8
+ .github/workflows/test_and_deploy.yml
9
+ src/plate_overview/__init__.py
10
+ src/plate_overview/_version.py
11
+ src/plate_overview/py.typed
12
+ src/plate_overview.egg-info/PKG-INFO
13
+ src/plate_overview.egg-info/SOURCES.txt
14
+ src/plate_overview.egg-info/dependency_links.txt
15
+ src/plate_overview.egg-info/requires.txt
16
+ src/plate_overview.egg-info/scm_file_list.json
17
+ src/plate_overview.egg-info/scm_version.json
18
+ src/plate_overview.egg-info/top_level.txt
19
+ tests/test_packaging.py
@@ -0,0 +1,3 @@
1
+ numpy
2
+ Pillow
3
+ matplotlib
@@ -0,0 +1,15 @@
1
+ {
2
+ "files": [
3
+ ".github/workflows/test_and_deploy.yml",
4
+ ".gitignore",
5
+ "CHANGELOG.md",
6
+ "LICENSE",
7
+ "README.md",
8
+ "pyproject.toml",
9
+ "src/plate_overview/__init__.py",
10
+ "src/plate_overview/py.typed",
11
+ "tests/test_packaging.py",
12
+ "tox.ini",
13
+ "uv.lock"
14
+ ]
15
+ }