From ea813294c5c931246614215f7a24edbb455d4e4d Mon Sep 17 00:00:00 2001 From: Rok Mandeljc Date: Fri, 31 Mar 2023 17:28:12 +0200 Subject: [PATCH 1/4] hooks: update scikit-image hooks for compatibility with 0.19.x series Update the `skimage.filters` hook to account for the lazy module loading within this module. --- news/565.update.rst | 2 ++ .../hooks/stdhooks/hook-skimage.filters.py | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 news/565.update.rst diff --git a/news/565.update.rst b/news/565.update.rst new file mode 100644 index 00000000..5e37b101 --- /dev/null +++ b/news/565.update.rst @@ -0,0 +1,2 @@ +Update ``scikit-image`` hooks for compatibility with the 0.19.x series; +account for lazy module loading in ``skimage.filters``. diff --git a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py index 36661bbb..c3b269dd 100644 --- a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py +++ b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py @@ -10,9 +10,11 @@ # SPDX-License-Identifier: GPL-2.0-or-later # ------------------------------------------------------------------ -from PyInstaller.utils.hooks import is_module_satisfies +from PyInstaller.utils.hooks import is_module_satisfies, collect_submodules -# The following missing module prevents import of skimage.feature -# with skimage 0.18.x. -if is_module_satisfies("scikit_image >= 0.18.0"): +if is_module_satisfies("scikit_image >= 0.19.0"): + # In scikit-image 0.19.0, `skimage.filters` switched to lazy module loading, so we need to collect all submodules. + hiddenimports = collect_submodules('skimage.filters', filter=lambda name: name != 'skimage.filters.tests') +elif is_module_satisfies("scikit_image >= 0.18.0"): + # The following missing module prevents import of skimage.feature with skimage 0.18.x. hiddenimports = ['skimage.filters.rank.core_cy_3d', ] From b1f05d02a53aa0968ce09ca5b2aa74f69002cc4e Mon Sep 17 00:00:00 2001 From: Rok Mandeljc Date: Fri, 31 Mar 2023 17:57:35 +0200 Subject: [PATCH 2/4] hooks: update scikit-image hooks for compatibility with v0.20.0 Account for introducion of the `lazy_loader` in the main package and in `skimage.data` and `skimage.filters`; collect the `__init__.pyi` files (required by `lazy_loader`), and collect submodules where necessary. Also collect the data files that are now required by `skimage.morphology`. --- news/565.update.1.rst | 4 ++++ .../hooks/stdhooks/hook-skimage.data.py | 19 +++++++++++++++++++ .../hooks/stdhooks/hook-skimage.filters.py | 12 ++++++++---- .../hooks/stdhooks/hook-skimage.morphology.py | 17 +++++++++++++++++ .../hooks/stdhooks/hook-skimage.py | 17 +++++++++++++++++ 5 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 news/565.update.1.rst create mode 100644 src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.data.py create mode 100644 src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.morphology.py create mode 100644 src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.py diff --git a/news/565.update.1.rst b/news/565.update.1.rst new file mode 100644 index 00000000..65ac5533 --- /dev/null +++ b/news/565.update.1.rst @@ -0,0 +1,4 @@ +Update ``scikit-image`` hooks for compatibility with the 0.20.x series; +account for switch to ``lazy_module`` in ``skimage.data`` and +``skimage.filters`` as well as in main package. Collect new data files +that are now required by ``skimage.morphology``. diff --git a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.data.py b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.data.py new file mode 100644 index 00000000..7afee380 --- /dev/null +++ b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.data.py @@ -0,0 +1,19 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2023 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE.GPL.txt, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ + +from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules + +# As of scikit-image 0.20.0, we need to collect the __init__.pyi file for `lazy_loader`, as well as collect submodules +# due to lazy loading. +if is_module_satisfies('scikit-image >= 0.20.0'): + datas = collect_data_files("skimage.data", includes=["*.pyi"]) + hiddenimports = collect_submodules('skimage.data', filter=lambda name: name != 'skimage.data.tests') diff --git a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py index c3b269dd..2e401337 100644 --- a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py +++ b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.filters.py @@ -10,11 +10,15 @@ # SPDX-License-Identifier: GPL-2.0-or-later # ------------------------------------------------------------------ -from PyInstaller.utils.hooks import is_module_satisfies, collect_submodules +from PyInstaller.utils.hooks import is_module_satisfies, collect_data_files, collect_submodules -if is_module_satisfies("scikit_image >= 0.19.0"): - # In scikit-image 0.19.0, `skimage.filters` switched to lazy module loading, so we need to collect all submodules. +if is_module_satisfies("scikit-image >= 0.19.0"): + # In scikit-image 0.19.x, `skimage.filters` switched to lazy module loading, so we need to collect all submodules. hiddenimports = collect_submodules('skimage.filters', filter=lambda name: name != 'skimage.filters.tests') -elif is_module_satisfies("scikit_image >= 0.18.0"): + + # In scikit-image 0.20.0, `lazy_loader` is used, so we need to collect `__init__.pyi` file. + if is_module_satisfies("scikit-image >= 0.20.0"): + datas = collect_data_files("skimage.filters", includes=["*.pyi"]) +elif is_module_satisfies("scikit-image >= 0.18.0"): # The following missing module prevents import of skimage.feature with skimage 0.18.x. hiddenimports = ['skimage.filters.rank.core_cy_3d', ] diff --git a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.morphology.py b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.morphology.py new file mode 100644 index 00000000..68b65fd4 --- /dev/null +++ b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.morphology.py @@ -0,0 +1,17 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2023 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE.GPL.txt, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ + +from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies + +# As of scikit-image 0.20.0, we need to collect .npy data files for `skimage.morphology` +if is_module_satisfies('scikit-image >= 0.20'): + datas = collect_data_files("skimage.morphology", includes=["*.npy"]) diff --git a/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.py b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.py new file mode 100644 index 00000000..e2567d06 --- /dev/null +++ b/src/_pyinstaller_hooks_contrib/hooks/stdhooks/hook-skimage.py @@ -0,0 +1,17 @@ +# ------------------------------------------------------------------ +# Copyright (c) 2023 PyInstaller Development Team. +# +# This file is distributed under the terms of the GNU General Public +# License (version 2.0 or later). +# +# The full license is available in LICENSE.GPL.txt, distributed with +# this software. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ------------------------------------------------------------------ + +from PyInstaller.utils.hooks import collect_data_files, is_module_satisfies + +# As of scikit-image 0.20.0, we need to collect the __init__.pyi file for `lazy_loader`. +if is_module_satisfies('scikit-image >= 0.20.0'): + datas = collect_data_files("skimage", includes=["*.pyi"]) From 9117191552cba7abaccd260d50732d69f078dc58 Mon Sep 17 00:00:00 2001 From: Rok Mandeljc Date: Fri, 31 Mar 2023 18:00:56 +0200 Subject: [PATCH 3/4] tests: test_skimage: drop test for skimage.viewer The `skimage.viewer` module was removed in scikit-image 0.20.0, so remove the test. --- src/_pyinstaller_hooks_contrib/tests/test_libraries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_pyinstaller_hooks_contrib/tests/test_libraries.py b/src/_pyinstaller_hooks_contrib/tests/test_libraries.py index 58e19a45..72307da6 100644 --- a/src/_pyinstaller_hooks_contrib/tests/test_libraries.py +++ b/src/_pyinstaller_hooks_contrib/tests/test_libraries.py @@ -487,7 +487,7 @@ def test_pydivert(pyi_builder): @pytest.mark.parametrize('submodule', [ 'color', 'data', 'draw', 'exposure', 'feature', 'filters', 'future', 'graph', 'io', 'measure', 'metrics', 'morphology', 'registration', - 'restoration', 'segmentation', 'transform', 'util', 'viewer' + 'restoration', 'segmentation', 'transform', 'util' ]) def test_skimage(pyi_builder, submodule): pyi_builder.test_source(""" From 5dfaacdbca5f88b7c88c18fa809938f05f4be5de Mon Sep 17 00:00:00 2001 From: Rok Mandeljc Date: Sat, 1 Apr 2023 00:28:24 +0200 Subject: [PATCH 4/4] tests: add scikit-image to requirements-test-libraries.txt --- requirements-test-libraries.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-test-libraries.txt b/requirements-test-libraries.txt index 03c6d618..9d35a366 100644 --- a/requirements-test-libraries.txt +++ b/requirements-test-libraries.txt @@ -120,6 +120,7 @@ exchangelib==4.9.0 NBT==1.5.1 minecraft-launcher-lib==5.3; python_version >= '3.8' scikit-learn==1.2.2; python_version >= '3.8' +scikit-image==0.20.0; python_version >= '3.8' # ------------------- Platform (OS) specifics