diff --git a/.github/workflows/test_lint.yml b/.github/workflows/test_lint.yml index bb92caee3..46e872fb4 100644 --- a/.github/workflows/test_lint.yml +++ b/.github/workflows/test_lint.yml @@ -48,7 +48,7 @@ jobs: - name: Force opencv-python-headless run: | pip uninstall -y opencv-python - pip install opencv-python-headless + pip install "numpy<2.0" opencv-python-headless - name: Test with pytest run: | pytest -v --color=yes --cov=allencell_ml_segmenter --cov-report=xml diff --git a/.github/workflows/test_lint_pr.yaml b/.github/workflows/test_lint_pr.yaml index 282a0b3f0..276a4f60b 100644 --- a/.github/workflows/test_lint_pr.yaml +++ b/.github/workflows/test_lint_pr.yaml @@ -16,4 +16,4 @@ jobs: strategy: matrix: os: [macos-latest, windows-latest] - python-version: ["3.9", "3.10"] + python-version: ["3.10"] diff --git a/.github/workflows/test_lint_push.yml b/.github/workflows/test_lint_push.yml index 5bc4b4811..0ea9e6b6f 100644 --- a/.github/workflows/test_lint_push.yml +++ b/.github/workflows/test_lint_push.yml @@ -14,4 +14,4 @@ jobs: strategy: matrix: os: [ubuntu-latest] - python-version: ["3.9", "3.10"] + python-version: ["3.10"] diff --git a/docs/user_docs/conf.py b/docs/user_docs/conf.py index 3d69276c7..912434deb 100644 --- a/docs/user_docs/conf.py +++ b/docs/user_docs/conf.py @@ -10,7 +10,7 @@ project = "Segmenter ML Plugin for napari" copyright = "2024, Allen Institute for Cell Science" author = "Segmenter ML plugin team" -release = "1.0.0" +release = "1.0.1rc1" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index 00f65e4f7..8f952f071 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,10 +8,10 @@ build-backend = "setuptools.build_meta" # https://peps.python.org/pep-0621/ [project] name = "allencell-segmenter-ml" -version = "1.0.0" +version = "1.0.1rc1" description = "A plugin to leverage ML segmentation in napari" readme = "README.md" -requires-python = ">=3.9,<3.11" +requires-python = ">=3.10,<3.11" license = { file = "LICENSE" } classifiers = [ @@ -24,14 +24,13 @@ classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Scientific/Engineering :: Image Processing", ] dependencies = [ "npe2>=0.6.2", - "numpy", + "numpy<2.0", "hydra-core==1.3.2", "bioio==1.1.0", "bioio-base==1.0.4", @@ -51,7 +50,7 @@ Documentation = "https://github.com/AllenCell/allencell-ml-segmenter#README.md" # https://peps.python.org/pep-0621/#dependencies-optional-dependencies [project.optional-dependencies] napari = [ - "napari>=0.4.18", + "napari>=0.6.2", "pyqt5", ] @@ -67,7 +66,7 @@ test_lint = [ "mypy", "toml", "bumpver", - "napari>=0.4.18", + "napari>=0.6.2", "magicgui" ] @@ -118,7 +117,7 @@ where = ["src"] # https://pypi.org/project/bumpver [tool.bumpver] -current_version = "1.0.0" +current_version = "1.0.1rc1" version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = true diff --git a/src/allencell_ml_segmenter/__init__.py b/src/allencell_ml_segmenter/__init__.py index c2c6fbbbf..c0faa6bdd 100644 --- a/src/allencell_ml_segmenter/__init__.py +++ b/src/allencell_ml_segmenter/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.0.0" +__version__ = "1.0.1rc1" from allencell_ml_segmenter.napari.napari_reader import napari_get_reader from allencell_ml_segmenter.napari.sample_data import make_sample_data diff --git a/src/allencell_ml_segmenter/_tests/main/test_main_widget.py b/src/allencell_ml_segmenter/_tests/main/test_main_widget.py index 17ffae9e7..6b800e781 100644 --- a/src/allencell_ml_segmenter/_tests/main/test_main_widget.py +++ b/src/allencell_ml_segmenter/_tests/main/test_main_widget.py @@ -13,6 +13,8 @@ from allencell_ml_segmenter.main.main_widget import MainWidget from unittest.mock import Mock, patch import napari +from napari.utils.events import EmitterGroup + # IMPORTANT NOTE: MainWidget is different from the other widgets since we do not directly # instantiate it in our code. So, it will always receive a napari.Viewer object in @@ -21,6 +23,20 @@ # but for now I'm just mocking it here. +class FakeLayers: + def __init__(self): + self.events = EmitterGroup( + source=self, + inserting=None, + inserted=None, + removing=None, + removed=None, + moving=None, + moved=None, + changed=None, + ) # all napari layer events + + @pytest.fixture def main_widget(qtbot: QtBot) -> MainWidget: """ @@ -155,10 +171,14 @@ def test_experiments_home_initialized(qtbot: QtBot) -> None: settings.set_user_experiments_path( None ) # Simulates state where users has not yet chosen an experiments home. + viewer = Mock( + spec="napari.Viewer" + ) # set up fake viewer with layers that can emit events + viewer.layers = FakeLayers() # ACT MainWidget( - Mock(spec=napari.Viewer), settings + viewer, settings ) # If the users settings does not find an experiments home path, it will prompt the user for one and persist it. # ASSERT diff --git a/src/allencell_ml_segmenter/main/viewer.py b/src/allencell_ml_segmenter/main/viewer.py index a1783403e..82fcfdbfd 100644 --- a/src/allencell_ml_segmenter/main/viewer.py +++ b/src/allencell_ml_segmenter/main/viewer.py @@ -121,7 +121,12 @@ def get_layers_nonthreshold(self) -> list[Layer]: def subscribe_layers_change_event( self, function: Callable[[NapariEvent], None] ) -> None: - self.viewer.events.layers_change.connect(function) + # keeps layer list synced with the layer checkboxes in our plugin when + # items are added, removed, moved, or changed + self.viewer.layers.events.changed.connect(function) + self.viewer.layers.events.inserted.connect(function) + self.viewer.layers.events.removed.connect(function) + self.viewer.layers.events.moved.connect(function) def _get_layer_by_name(self, name: str) -> Optional[Layer]: layers: list[Layer] = self.get_layers()