From 1a6718d02362a896e05ba76948f5e8576162e915 Mon Sep 17 00:00:00 2001 From: jfgrimm Date: Fri, 19 Jan 2024 15:51:15 +0000 Subject: [PATCH 1/6] adding easyconfigs: napari-0.4.18-foss-2023a.eb, pydantic-1.10.13-GCCcore-12.3.0.eb, Qtconsole-5.5.1-GCCcore-12.3.0.eb, QtPy-2.4.1-GCCcore-12.3.0.eb, VisPy-0.12.2-gfbf-2023a.eb --- .../n/napari/napari-0.4.18-foss-2023a.eb | 123 ++++++++++++++++++ .../pydantic-1.10.13-GCCcore-12.3.0.eb | 41 ++++++ .../q/QtPy/QtPy-2.4.1-GCCcore-12.3.0.eb | 29 +++++ .../Qtconsole-5.5.1-GCCcore-12.3.0.eb | 32 +++++ .../v/VisPy/VisPy-0.12.2-gfbf-2023a.eb | 46 +++++++ 5 files changed, 271 insertions(+) create mode 100644 easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb create mode 100644 easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb create mode 100644 easybuild/easyconfigs/q/QtPy/QtPy-2.4.1-GCCcore-12.3.0.eb create mode 100644 easybuild/easyconfigs/q/Qtconsole/Qtconsole-5.5.1-GCCcore-12.3.0.eb create mode 100644 easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb diff --git a/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb new file mode 100644 index 000000000000..f450bff7ed2b --- /dev/null +++ b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb @@ -0,0 +1,123 @@ +# Thomas Hoffmann, EMBL Heidelberg, structures-it@emblde, 2023/08 +easyblock = 'PythonBundle' + +name = 'napari' +version = '0.4.18' + +homepage = 'https://napari.org/' +description = """napari is a fast, interactive, multi-dimensional image viewer for Python. It's +designed for browsing, annotating, and analyzing large multi-dimensional images. +It's built on top of Qt (for the GUI), vispy (for performant GPU-based +rendering), and the scientific Python stack (numpy, scipy).""" + +toolchain = {'name': 'foss', 'version': '2023a'} + +builddependencies = [ + ('hatchling', '1.18.0'), + ('poetry', '1.5.1'), +] + +dependencies = [ + ('Python', '3.11.3'), + ('PyQt5', '5.15.10'), + ('SciPy-bundle', '2023.07'), + ('PyYAML', '6.0'), + ('pydantic', '1.10.13'), + ('dask', '2023.9.2'), + ('PyOpenGL', '3.1.7'), + ('imageio', '2.33.1'), + ('tqdm', '4.66.1'), + ('IPython', '8.14.0'), + ('VisPy', '0.12.2'), # vispy<0.13,>=0.12.1 + ('scikit-image', '0.22.0'), + ('matplotlib', '3.7.2'), + ('Qtconsole', '5.5.1'), + ('Pint', '0.23'), + ('wrapt', '1.15.0'), +] + +use_pip = True +sanity_pip_check = True + +exts_list = [ + ('in_n_out', '0.1.9', { + 'checksums': ['89feb944e420faf42d3c2542145681b4d57144355932c2b859695fcdc4f9a2da'], + }), + ('pydantic_compat', '0.1.2', { + 'checksums': ['c5c5bca39ca2d22cad00c02898e400e1920e5127649a8e860637f15566739373'], + }), + ('app_model', '0.2.4', { + 'checksums': ['127cda637003a34b26371c9c68ae5b24d7012682f071a10657a94900c8cd439d'], + }), + ('cachey', '0.2.1', { + 'checksums': ['0310ba8afe52729fa7626325c8d8356a8421c434bf887ac851e58dcf7cf056a6'], + }), + ('lazy_loader', '0.3', { + 'checksums': ['3b68898e34f5b2a29daaaac172c6555512d0f32074f147e2254e4a6d9d838f37'], + }), + ('docstring_parser', '0.15', { + 'checksums': ['48ddc093e8b1865899956fcc03b03e66bb7240c310fac5af81814580c55bf682'], + }), + ('magicgui', '0.8.1', { + 'checksums': ['43553d8f11002a79dd5fee57caff3ba9d3e37d7d50e8ed40efe79b360adc806a'], + }), + ('numpydoc', '1.6.0', { + 'checksums': ['ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d'], + }), + ('psygnal', '0.9.5', { + 'checksums': ['4956ea6c36a75f7fc457558935b67dd8be2594661b4d08eeb3357d69c509c55f'], + }), + ('superqt', '0.6.1', { + 'checksums': ['f1a9e0499c4bbcef34b6f895eb57cd41301b3799242cd030029238124184dade'], + }), + ('napari-console', '0.0.9', { + 'checksums': ['3bc86dd96cf94b1af96bba1043f90a39b1369bb978a8df9038a1ac422e66b532'], + }), + ('napari-plugin-engine', '0.2.0', { + 'checksums': ['fa926f869d70e0d652c005661948cd0c7fee5508ae17d437937f34f5287590b3'], + }), + ('napari-svg', '0.1.10', { + 'checksums': ['18e642c888a71e09c9d1097f25bced1e7ef5dde1771469647bcd77975800f77d'], + }), + ('typer', '0.9.0', { + 'checksums': ['50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2'], + }), + ('pyproject_hooks', '1.0.0', { + 'checksums': ['f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5'], + }), + ('build', '1.0.3', { + 'checksums': ['538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b'], + }), + ('mdurl', '0.1.2', { + 'checksums': ['bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba'], + }), + ('markdown-it-py', '3.0.0', { + 'modulename': 'markdown_it', + 'checksums': ['e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb'], + }), + ('rich', '13.7.0', { + 'checksums': ['5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa'], + }), + ('npe2', '0.7.3', { + 'checksums': ['4bbb45577a7c60e1aa15636040ef4cf7690d22470e08717af689f50ddeffc807'], + }), + ('mypy_extensions', '1.0.0', { + 'checksums': ['75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782'], + }), + (name, version, { + 'checksums': ['daea9ab94124140fc0f715e945dd1dd6dc3056a1cb2f2cc31fc29b80162943e4'], + 'preinstallopts': "sed -i 's|sphinx.*|sphinx|g' setup.cfg && ", + }), +] + +sanity_check_paths = { + 'files': ['bin/%(name)s'], + 'dirs': ['lib/python%(pyshortver)s/site-packages/%(name)s'], +} + +sanity_check_commands = [ + '%(name)s --help', + 'pyrcc5 -version 2>&1 |grep pyrcc5' # make sure PyQt5 module was not built with --no-tools +] + +moduleclass = 'vis' diff --git a/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb b/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb new file mode 100644 index 000000000000..96ad7fb45129 --- /dev/null +++ b/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb @@ -0,0 +1,41 @@ +easyblock = 'PythonBundle' + +name = 'pydantic' +version = '1.10.13' + +homepage = 'https://github.com/samuelcolvin/pydantic' +description = """Data validation and settings management using Python type hinting.""" + +toolchain = {'name': 'GCCcore', 'version': '12.3.0'} + +builddependencies = [ + ('binutils', '2.40'), + ('hatchling', '1.18.0'), + ('maturin', '1.4.0', '-Rust-1.75.0'), +] + +dependencies = [ + ('Python', '3.11.3'), +] + +sanity_pip_check = True +use_pip = True + +exts_list = [ + ('typing_extensions', '4.9.0', { + 'checksums': ['23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783'], + }), + ('annotated-types', '0.6.0', { + 'source_tmpl': 'annotated_types-%(version)s.tar.gz', + 'checksums': ['563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d'], + }), + ('pydantic-core', '2.14.6', { + 'source_tmpl': 'pydantic_core-%(version)s.tar.gz', + 'checksums': ['1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948'], + }), + (name, version, { + 'checksums': ['32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340'], + }), +] + +moduleclass = 'devel' diff --git a/easybuild/easyconfigs/q/QtPy/QtPy-2.4.1-GCCcore-12.3.0.eb b/easybuild/easyconfigs/q/QtPy/QtPy-2.4.1-GCCcore-12.3.0.eb new file mode 100644 index 000000000000..91aea4a371f8 --- /dev/null +++ b/easybuild/easyconfigs/q/QtPy/QtPy-2.4.1-GCCcore-12.3.0.eb @@ -0,0 +1,29 @@ +easyblock = 'PythonPackage' + +name = 'QtPy' +version = '2.4.1' + +homepage = "https://github.com/spyder-ide/qtpy" +description = """QtPy is a small abstraction layer that lets you write applications using a single API call to + either PyQt or PySide. It provides support for PyQt5, PyQt4, PySide2 and PySide.""" + +toolchain = {'name': 'GCCcore', 'version': '12.3.0'} + +sources = [SOURCE_TAR_GZ] +checksums = ['a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987'] + +builddependencies = [ + ('binutils', '2.40'), +] + +dependencies = [ + ('Python', '3.11.3'), + ('PyQt5', '5.15.10'), + ('Python-bundle-PyPI', '2023.06'), +] + +use_pip = True +download_dep_fail = True +sanity_pip_check = True + +moduleclass = 'vis' diff --git a/easybuild/easyconfigs/q/Qtconsole/Qtconsole-5.5.1-GCCcore-12.3.0.eb b/easybuild/easyconfigs/q/Qtconsole/Qtconsole-5.5.1-GCCcore-12.3.0.eb new file mode 100644 index 000000000000..61694a5b190e --- /dev/null +++ b/easybuild/easyconfigs/q/Qtconsole/Qtconsole-5.5.1-GCCcore-12.3.0.eb @@ -0,0 +1,32 @@ +easyblock = 'PythonPackage' + +name = 'Qtconsole' +version = '5.5.1' + +homepage = 'https://jupyter.org/' +description = """A rich Qt-based console for working with Jupyter kernels, supporting rich media +output, session export, and more. +The Qtconsole is a very lightweight application that largely feels like a +terminal, but provides a number of enhancements only possible in a GUI, such as +inline figures, proper multiline editing with syntax highlighting, graphical +calltips, and more.""" + +toolchain = {'name': 'GCCcore', 'version': '12.3.0'} + +sources = [SOURCELOWER_TAR_GZ] +checksums = ['a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc'] + +builddependencies = [('binutils', '2.40')] + +dependencies = [ + ('Python', '3.11.3'), + ('IPython', '8.14.0'), + ('QtPy', '2.4.1'), + ('Jupyter-bundle', '20230823'), +] + +use_pip = True +download_dep_fail = True +sanity_pip_check = True + +moduleclass = 'vis' diff --git a/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb b/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb new file mode 100644 index 000000000000..3b3f8920ab15 --- /dev/null +++ b/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb @@ -0,0 +1,46 @@ +easyblock = 'PythonBundle' + +name = 'VisPy' +version = '0.12.2' + +homepage = 'https://vispy.org' +description = """VisPy is a high-performance interactive 2D/3D data visualization library + leveraging the computational power of modern Graphics Processing Units (GPUs) through the + OpenGL library to display very large datasets.""" + +toolchain = {'name': 'gfbf', 'version': '2023a'} + +dependencies = [ + ('Python', '3.11.3'), + ('SciPy-bundle', '2023.07'), + ('PyQt5', '5.15.10'), + ('matplotlib', '3.7.2'), # for kiwisolver + ('freetype', '2.13.0'), + ('Python-bundle-PyPI', '2023.06'), +] + +use_pip = True +download_dep_fail = True + +# setuptools-scm needs the .git dir to determine the version, otherwise it shows as 0.0.0 +_fix_pip_version = """sed -i 's/setup(/setup(version="%(version)s",/g' setup.py && """ + +exts_list = [ + ('freetype_py', '2.4.0', { + 'modulename': 'freetype', + 'sources': ['freetype-py-2.4.0.zip'], + 'checksums': ['8ad81195d2f8f339aba61700cebfbd77defad149c51f59b75a2a5e37833ae12e'], + 'preinstallopts': _fix_pip_version, + }), + ('hsluv', '5.0.4', { + 'checksums': ['2281f946427a882010042844a38c7bbe9e0d0aaf9d46babe46366ed6f169b72e'], + }), + ('vispy', version, { + 'checksums': ['141c2ddccc1158555bc89f09010c4b1d754487e816357333f31e795a7146a024'], + 'preinstallopts': _fix_pip_version, + }), +] + +sanity_pip_check = True + +moduleclass = 'vis' From a92f5112a57a7d724b6c712ed11e91d2c2d16dd1 Mon Sep 17 00:00:00 2001 From: jfgrimm Date: Mon, 22 Jan 2024 10:39:01 +0000 Subject: [PATCH 2/6] drop download_dep_fail --- easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb | 1 - 1 file changed, 1 deletion(-) diff --git a/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb b/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb index 3b3f8920ab15..ea5153042cc4 100644 --- a/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb +++ b/easybuild/easyconfigs/v/VisPy/VisPy-0.12.2-gfbf-2023a.eb @@ -20,7 +20,6 @@ dependencies = [ ] use_pip = True -download_dep_fail = True # setuptools-scm needs the .git dir to determine the version, otherwise it shows as 0.0.0 _fix_pip_version = """sed -i 's/setup(/setup(version="%(version)s",/g' setup.py && """ From 1a315828b8e11b70eac751b10f3de8b0260c1eff Mon Sep 17 00:00:00 2001 From: jfgrimm Date: Mon, 22 Jan 2024 12:19:24 +0000 Subject: [PATCH 3/6] add PyOpenGL 3.1.7 --- .../PyOpenGL/PyOpenGL-3.1.7-GCCcore-12.3.0.eb | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 easybuild/easyconfigs/p/PyOpenGL/PyOpenGL-3.1.7-GCCcore-12.3.0.eb diff --git a/easybuild/easyconfigs/p/PyOpenGL/PyOpenGL-3.1.7-GCCcore-12.3.0.eb b/easybuild/easyconfigs/p/PyOpenGL/PyOpenGL-3.1.7-GCCcore-12.3.0.eb new file mode 100644 index 000000000000..132e708af8e7 --- /dev/null +++ b/easybuild/easyconfigs/p/PyOpenGL/PyOpenGL-3.1.7-GCCcore-12.3.0.eb @@ -0,0 +1,31 @@ +easyblock = 'PythonBundle' + +name = 'PyOpenGL' +version = '3.1.7' + +homepage = 'http://pyopengl.sourceforge.net' +description = """PyOpenGL is the most common cross platform Python binding to OpenGL and related APIs.""" + +toolchain = {'name': 'GCCcore', 'version': '12.3.0'} + +builddependencies = [ + ('binutils', '2.40'), + ('bzip2', '1.0.8'), +] + +dependencies = [ + ('Python', '3.11.3'), + ('Mesa', '23.1.4'), +] + +use_pip = True +sanity_pip_check = True + +exts_list = [ + (name, version, { + 'modulename': 'OpenGL', + 'checksums': ['eef31a3888e6984fd4d8e6c9961b184c9813ca82604d37fe3da80eb000a76c86'], + }), +] + +moduleclass = 'vis' From 33f32d61b066969af7ebf0a7f873066b1f710b81 Mon Sep 17 00:00:00 2001 From: jfgrimm Date: Thu, 25 Jan 2024 11:59:36 +0000 Subject: [PATCH 4/6] depend on typing-extensions easyconfig --- .../easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb b/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb index 96ad7fb45129..359b3f1f1a3b 100644 --- a/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb +++ b/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb @@ -16,15 +16,13 @@ builddependencies = [ dependencies = [ ('Python', '3.11.3'), + ('typing-extensions', '4.9.0',), ] sanity_pip_check = True use_pip = True exts_list = [ - ('typing_extensions', '4.9.0', { - 'checksums': ['23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783'], - }), ('annotated-types', '0.6.0', { 'source_tmpl': 'annotated_types-%(version)s.tar.gz', 'checksums': ['563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d'], From befc6582a10eb12dfcf30a5d0d2baef7b2ba8d31 Mon Sep 17 00:00:00 2001 From: jfgrimm Date: Thu, 25 Jan 2024 14:00:05 +0000 Subject: [PATCH 5/6] backport pydantic 2 compat for napari 0.4.18 --- .../n/napari/napari-0.4.18-foss-2023a.eb | 14 +- ...apari-0.4.18_pydantic2-compatibility.patch | 827 ++++++++++++++++++ .../pydantic-1.10.13-GCCcore-12.3.0.eb | 39 - 3 files changed, 837 insertions(+), 43 deletions(-) create mode 100644 easybuild/easyconfigs/n/napari/napari-0.4.18_pydantic2-compatibility.patch delete mode 100644 easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb diff --git a/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb index f450bff7ed2b..b6ecb0109d35 100644 --- a/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb +++ b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb @@ -5,9 +5,9 @@ name = 'napari' version = '0.4.18' homepage = 'https://napari.org/' -description = """napari is a fast, interactive, multi-dimensional image viewer for Python. It's +description = """napari is a fast, interactive, multi-dimensional image viewer for Python. It's designed for browsing, annotating, and analyzing large multi-dimensional images. -It's built on top of Qt (for the GUI), vispy (for performant GPU-based +It's built on top of Qt (for the GUI), vispy (for performant GPU-based rendering), and the scientific Python stack (numpy, scipy).""" toolchain = {'name': 'foss', 'version': '2023a'} @@ -22,7 +22,8 @@ dependencies = [ ('PyQt5', '5.15.10'), ('SciPy-bundle', '2023.07'), ('PyYAML', '6.0'), - ('pydantic', '1.10.13'), + # ('pydantic', '1.10.13'), + ('pydantic', '2.5.3'), ('dask', '2023.9.2'), ('PyOpenGL', '3.1.7'), ('imageio', '2.33.1'), @@ -105,8 +106,13 @@ exts_list = [ 'checksums': ['75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782'], }), (name, version, { - 'checksums': ['daea9ab94124140fc0f715e945dd1dd6dc3056a1cb2f2cc31fc29b80162943e4'], + 'patches': ['%(name)s-0.4.18_pydantic2-compatibility.patch'], 'preinstallopts': "sed -i 's|sphinx.*|sphinx|g' setup.cfg && ", + 'checksums': [ + {'napari-0.4.18.tar.gz': 'daea9ab94124140fc0f715e945dd1dd6dc3056a1cb2f2cc31fc29b80162943e4'}, + {'napari-0.4.18_pydantic2-compatibility.patch': + '4f4b828dc2ff680c21428c427d44cebbdfa490233cbbaffe51b9548ab4e2c999'}, + ], }), ] diff --git a/easybuild/easyconfigs/n/napari/napari-0.4.18_pydantic2-compatibility.patch b/easybuild/easyconfigs/n/napari/napari-0.4.18_pydantic2-compatibility.patch new file mode 100644 index 000000000000..c78f0c3c77ed --- /dev/null +++ b/easybuild/easyconfigs/n/napari/napari-0.4.18_pydantic2-compatibility.patch @@ -0,0 +1,827 @@ +Backport pydantic 2.x compatibility from 0.4.19 release candidates to napari 0.4.18 +Based on: https://github.com/napari/napari/commit/e9ea8d06d5f9f8e029f464b3938e6a60df3f6bb8 +diff -Nru napari-0.4.18.orig/napari/components/camera.py napari-0.4.18/napari/components/camera.py +--- napari-0.4.18.orig/napari/components/camera.py 2024-01-25 13:30:10.975544424 +0000 ++++ napari-0.4.18/napari/components/camera.py 2024-01-25 13:30:22.482507550 +0000 +@@ -2,9 +2,9 @@ + from typing import Optional, Tuple + + import numpy as np +-from pydantic import validator + from scipy.spatial.transform import Rotation as R + ++from napari._pydantic_compat import validator + from napari.utils.events import EventedModel + from napari.utils.misc import ensure_n_tuple + from napari.utils.translations import trans +diff -Nru napari-0.4.18.orig/napari/components/dims.py napari-0.4.18/napari/components/dims.py +--- napari-0.4.18.orig/napari/components/dims.py 2024-01-25 13:30:10.976544421 +0000 ++++ napari-0.4.18/napari/components/dims.py 2024-01-25 13:30:22.482507550 +0000 +@@ -7,8 +7,8 @@ + ) + + import numpy as np +-from pydantic import root_validator, validator + ++from napari._pydantic_compat import root_validator, validator + from napari.utils.events import EventedModel + from napari.utils.misc import argsort, reorder_after_dim_reduction + from napari.utils.translations import trans +diff -Nru napari-0.4.18.orig/napari/components/viewer_model.py napari-0.4.18/napari/components/viewer_model.py +--- napari-0.4.18.orig/napari/components/viewer_model.py 2024-01-25 13:30:10.977544418 +0000 ++++ napari-0.4.18/napari/components/viewer_model.py 2024-01-25 13:30:22.483507547 +0000 +@@ -20,9 +20,9 @@ + ) + + import numpy as np +-from pydantic import Extra, Field, PrivateAttr, validator + + from napari import layers ++from napari._pydantic_compat import Extra, Field, PrivateAttr, validator + from napari.components._viewer_mouse_bindings import dims_scroll + from napari.components.camera import Camera + from napari.components.cursor import Cursor +diff -Nru napari-0.4.18.orig/napari/layers/points/_tests/test_points.py napari-0.4.18/napari/layers/points/_tests/test_points.py +--- napari-0.4.18.orig/napari/layers/points/_tests/test_points.py 2024-01-25 13:30:10.979544411 +0000 ++++ napari-0.4.18/napari/layers/points/_tests/test_points.py 2024-01-25 13:30:22.483507547 +0000 +@@ -6,9 +6,9 @@ + import pandas as pd + import pytest + from psygnal.containers import Selection +-from pydantic import ValidationError + from vispy.color import get_colormap + ++from napari._pydantic_compat import ValidationError + from napari._tests.utils import ( + assert_colors_equal, + assert_layer_state_equal, +diff -Nru napari-0.4.18.orig/napari/layers/shapes/_tests/test_shapes.py napari-0.4.18/napari/layers/shapes/_tests/test_shapes.py +--- napari-0.4.18.orig/napari/layers/shapes/_tests/test_shapes.py 2024-01-25 13:30:10.980544408 +0000 ++++ napari-0.4.18/napari/layers/shapes/_tests/test_shapes.py 2024-01-25 13:30:22.483507547 +0000 +@@ -5,8 +5,8 @@ + import numpy as np + import pandas as pd + import pytest +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari._tests.utils import ( + assert_colors_equal, + check_layer_world_data_extent, +diff -Nru napari-0.4.18.orig/napari/layers/_source.py napari-0.4.18/napari/layers/_source.py +--- napari-0.4.18.orig/napari/layers/_source.py 2024-01-25 13:30:10.977544418 +0000 ++++ napari-0.4.18/napari/layers/_source.py 2024-01-25 13:30:22.483507547 +0000 +@@ -6,8 +6,8 @@ + from typing import Optional, Tuple + + from magicgui.widgets import FunctionGui +-from pydantic import BaseModel, validator + ++from napari._pydantic_compat import BaseModel, validator + from napari.layers.base.base import Layer + + +diff -Nru napari-0.4.18.orig/napari/layers/surface/normals.py napari-0.4.18/napari/layers/surface/normals.py +--- napari-0.4.18.orig/napari/layers/surface/normals.py 2024-01-25 13:30:10.980544408 +0000 ++++ napari-0.4.18/napari/layers/surface/normals.py 2024-01-25 13:30:22.483507547 +0000 +@@ -1,7 +1,6 @@ + from enum import Enum, auto + +-from pydantic import Field +- ++from napari._pydantic_compat import Field + from napari.utils.color import ColorValue + from napari.utils.events import EventedModel + +diff -Nru napari-0.4.18.orig/napari/layers/_tests/test_source.py napari-0.4.18/napari/layers/_tests/test_source.py +--- napari-0.4.18.orig/napari/layers/_tests/test_source.py 2024-01-25 13:30:10.977544418 +0000 ++++ napari-0.4.18/napari/layers/_tests/test_source.py 2024-01-25 13:30:22.483507547 +0000 +@@ -1,6 +1,6 @@ +-import pydantic + import pytest + ++from napari._pydantic_compat import ValidationError + from napari.layers import Points + from napari.layers._source import Source, current_source, layer_source + +@@ -46,7 +46,7 @@ + + def test_source_assert_parent(): + assert current_source() == Source() +- with pytest.raises(pydantic.error_wrappers.ValidationError): ++ with pytest.raises(ValidationError): + with layer_source(parent=''): + current_source() + assert current_source() == Source() +diff -Nru napari-0.4.18.orig/napari/layers/utils/color_encoding.py napari-0.4.18/napari/layers/utils/color_encoding.py +--- napari-0.4.18.orig/napari/layers/utils/color_encoding.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/color_encoding.py 2024-01-25 13:30:22.484507544 +0000 +@@ -9,8 +9,8 @@ + ) + + import numpy as np +-from pydantic import Field, parse_obj_as, validator + ++from napari._pydantic_compat import Field, parse_obj_as, validator + from napari.layers.utils.color_transformations import ColorType + from napari.layers.utils.style_encoding import ( + StyleEncoding, +diff -Nru napari-0.4.18.orig/napari/layers/utils/color_manager.py napari-0.4.18/napari/layers/utils/color_manager.py +--- napari-0.4.18.orig/napari/layers/utils/color_manager.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/color_manager.py 2024-01-25 13:30:22.484507544 +0000 +@@ -3,8 +3,8 @@ + from typing import Any, Dict, Optional, Tuple, Union + + import numpy as np +-from pydantic import Field, root_validator, validator + ++from napari._pydantic_compat import Field, root_validator, validator + from napari.layers.utils._color_manager_constants import ColorMode + from napari.layers.utils.color_manager_utils import ( + _validate_colormap_mode, +diff -Nru napari-0.4.18.orig/napari/layers/utils/plane.py napari-0.4.18/napari/layers/utils/plane.py +--- napari-0.4.18.orig/napari/layers/utils/plane.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/plane.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,8 +1,8 @@ + from typing import Tuple + + import numpy as np +-from pydantic import validator + ++from napari._pydantic_compat import validator + from napari.utils.events import EventedModel, SelectableEventedList + from napari.utils.geometry import intersect_line_with_plane_3d + from napari.utils.translations import trans +diff -Nru napari-0.4.18.orig/napari/layers/utils/string_encoding.py napari-0.4.18/napari/layers/utils/string_encoding.py +--- napari-0.4.18.orig/napari/layers/utils/string_encoding.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/string_encoding.py 2024-01-25 13:30:22.484507544 +0000 +@@ -2,8 +2,8 @@ + from typing import Any, Literal, Protocol, Sequence, Union, runtime_checkable + + import numpy as np +-from pydantic import parse_obj_as + ++from napari._pydantic_compat import parse_obj_as + from napari.layers.utils.style_encoding import ( + StyleEncoding, + _ConstantStyleEncoding, +diff -Nru napari-0.4.18.orig/napari/layers/utils/_tests/test_color_manager.py napari-0.4.18/napari/layers/utils/_tests/test_color_manager.py +--- napari-0.4.18.orig/napari/layers/utils/_tests/test_color_manager.py 2024-01-25 13:30:10.980544408 +0000 ++++ napari-0.4.18/napari/layers/utils/_tests/test_color_manager.py 2024-01-25 13:30:22.483507547 +0000 +@@ -3,8 +3,8 @@ + + import numpy as np + import pytest +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari.layers.utils.color_manager import ColorManager, ColorProperties + from napari.utils.colormaps.categorical_colormap import CategoricalColormap + from napari.utils.colormaps.standardize_color import transform_color +diff -Nru napari-0.4.18.orig/napari/layers/utils/_tests/test_plane.py napari-0.4.18/napari/layers/utils/_tests/test_plane.py +--- napari-0.4.18.orig/napari/layers/utils/_tests/test_plane.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/_tests/test_plane.py 2024-01-25 13:30:22.483507547 +0000 +@@ -1,7 +1,7 @@ + import numpy as np + import pytest +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari.layers.utils.plane import ClippingPlaneList, Plane, SlicingPlane + + +diff -Nru napari-0.4.18.orig/napari/layers/utils/_tests/test_style_encoding.py napari-0.4.18/napari/layers/utils/_tests/test_style_encoding.py +--- napari-0.4.18.orig/napari/layers/utils/_tests/test_style_encoding.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/_tests/test_style_encoding.py 2024-01-25 13:30:22.483507547 +0000 +@@ -13,8 +13,8 @@ + import numpy as np + import pandas as pd + import pytest +-from pydantic import Field + ++from napari._pydantic_compat import Field + from napari.layers.utils.style_encoding import ( + _ConstantStyleEncoding, + _DerivedStyleEncoding, +diff -Nru napari-0.4.18.orig/napari/layers/utils/_tests/test_text_manager.py napari-0.4.18/napari/layers/utils/_tests/test_text_manager.py +--- napari-0.4.18.orig/napari/layers/utils/_tests/test_text_manager.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/_tests/test_text_manager.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,8 +1,8 @@ + import numpy as np + import pandas as pd + import pytest +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari._tests.utils import assert_colors_equal + from napari.layers.utils.string_encoding import ( + ConstantStringEncoding, +diff -Nru napari-0.4.18.orig/napari/layers/utils/text_manager.py napari-0.4.18/napari/layers/utils/text_manager.py +--- napari-0.4.18.orig/napari/layers/utils/text_manager.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/layers/utils/text_manager.py 2024-01-25 13:30:22.484507544 +0000 +@@ -4,8 +4,8 @@ + + import numpy as np + import pandas as pd +-from pydantic import PositiveInt, validator + ++from napari._pydantic_compat import PositiveInt, validator + from napari.layers.base._base_constants import Blending + from napari.layers.utils._text_constants import Anchor + from napari.layers.utils._text_utils import get_text_anchors +diff -Nru napari-0.4.18.orig/napari/plugins/_plugin_manager.py napari-0.4.18/napari/plugins/_plugin_manager.py +--- napari-0.4.18.orig/napari/plugins/_plugin_manager.py 2024-01-25 13:30:10.981544405 +0000 ++++ napari-0.4.18/napari/plugins/_plugin_manager.py 2024-01-25 13:30:22.484507544 +0000 +@@ -22,9 +22,9 @@ + PluginManager as PluginManager, + ) + from napari_plugin_engine.hooks import HookCaller +-from pydantic import ValidationError + from typing_extensions import TypedDict + ++from napari._pydantic_compat import ValidationError + from napari.plugins import hook_specifications + from napari.settings import get_settings + from napari.types import AugmentedWidget, LayerData, SampleDict, WidgetCallable +diff -Nru napari-0.4.18.orig/napari/_pydantic_compat.py napari-0.4.18/napari/_pydantic_compat.py +--- napari-0.4.18.orig/napari/_pydantic_compat.py 1970-01-01 01:00:00.000000000 +0100 ++++ napari-0.4.18/napari/_pydantic_compat.py 2024-01-25 13:30:22.482507550 +0000 +@@ -0,0 +1,97 @@ ++try: ++ # pydantic v2 ++ from pydantic.v1 import ( ++ BaseModel, ++ BaseSettings, ++ Extra, ++ Field, ++ PositiveInt, ++ PrivateAttr, ++ ValidationError, ++ color, ++ conlist, ++ constr, ++ errors, ++ main, ++ parse_obj_as, ++ root_validator, ++ types, ++ utils, ++ validator, ++ ) ++ from pydantic.v1.env_settings import ( ++ EnvSettingsSource, ++ SettingsError, ++ SettingsSourceCallable, ++ ) ++ from pydantic.v1.error_wrappers import ErrorWrapper, display_errors ++ from pydantic.v1.fields import SHAPE_LIST, ModelField ++ from pydantic.v1.generics import GenericModel ++ from pydantic.v1.main import ClassAttribute, ModelMetaclass ++ from pydantic.v1.utils import ROOT_KEY, sequence_like ++except ImportError: ++ # pydantic v1 ++ from pydantic import ( ++ BaseModel, ++ BaseSettings, ++ Extra, ++ Field, ++ PositiveInt, ++ PrivateAttr, ++ ValidationError, ++ color, ++ conlist, ++ constr, ++ errors, ++ main, ++ parse_obj_as, ++ root_validator, ++ types, ++ utils, ++ validator, ++ ) ++ from pydantic.env_settings import ( ++ EnvSettingsSource, ++ SettingsError, ++ SettingsSourceCallable, ++ ) ++ from pydantic.error_wrappers import ErrorWrapper, display_errors ++ from pydantic.fields import SHAPE_LIST, ModelField ++ from pydantic.generics import GenericModel ++ from pydantic.main import ClassAttribute, ModelMetaclass ++ from pydantic.utils import ROOT_KEY, sequence_like ++ ++Color = color.Color ++ ++__all__ = ( ++ 'BaseModel', ++ 'BaseSettings', ++ 'ClassAttribute', ++ 'Color', ++ 'EnvSettingsSource', ++ 'ErrorWrapper', ++ 'Extra', ++ 'Field', ++ 'ModelField', ++ 'GenericModel', ++ 'ModelMetaclass', ++ 'PositiveInt', ++ 'PrivateAttr', ++ 'ROOT_KEY', ++ 'SettingsError', ++ 'SettingsSourceCallable', ++ 'SHAPE_LIST', ++ 'ValidationError', ++ 'color', ++ 'conlist', ++ 'constr', ++ 'display_errors', ++ 'errors', ++ 'main', ++ 'parse_obj_as', ++ 'root_validator', ++ 'sequence_like', ++ 'types', ++ 'utils', ++ 'validator', ++) +diff -Nru napari-0.4.18.orig/napari/_qt/dialogs/preferences_dialog.py napari-0.4.18/napari/_qt/dialogs/preferences_dialog.py +--- napari-0.4.18.orig/napari/_qt/dialogs/preferences_dialog.py 2024-01-25 13:30:10.968544447 +0000 ++++ napari-0.4.18/napari/_qt/dialogs/preferences_dialog.py 2024-01-25 13:30:22.482507550 +0000 +@@ -2,7 +2,6 @@ + from enum import EnumMeta + from typing import TYPE_CHECKING, Tuple, cast + +-from pydantic.main import BaseModel, ModelMetaclass + from qtpy.QtCore import QSize, Qt, Signal + from qtpy.QtWidgets import ( + QDialog, +@@ -14,10 +13,10 @@ + QVBoxLayout, + ) + ++from napari._pydantic_compat import BaseModel, ModelField, ModelMetaclass + from napari.utils.translations import trans + + if TYPE_CHECKING: +- from pydantic.fields import ModelField + from qtpy.QtGui import QCloseEvent, QKeyEvent + + +diff -Nru napari-0.4.18.orig/napari/_qt/dialogs/_tests/test_preferences_dialog.py napari-0.4.18/napari/_qt/dialogs/_tests/test_preferences_dialog.py +--- napari-0.4.18.orig/napari/_qt/dialogs/_tests/test_preferences_dialog.py 2024-01-25 13:30:10.968544447 +0000 ++++ napari-0.4.18/napari/_qt/dialogs/_tests/test_preferences_dialog.py 2024-01-25 13:30:22.482507550 +0000 +@@ -1,7 +1,7 @@ + import pytest +-from pydantic import BaseModel + from qtpy.QtCore import Qt + ++from napari._pydantic_compat import BaseModel + from napari._qt.dialogs.preferences_dialog import ( + PreferencesDialog, + QMessageBox, +diff -Nru napari-0.4.18.orig/napari/settings/_appearance.py napari-0.4.18/napari/settings/_appearance.py +--- napari-0.4.18.orig/napari/settings/_appearance.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_appearance.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,5 +1,4 @@ +-from pydantic import Field +- ++from napari._pydantic_compat import Field + from napari.settings._fields import Theme + from napari.utils.events.evented_model import EventedModel + from napari.utils.theme import available_themes +diff -Nru napari-0.4.18.orig/napari/settings/_application.py napari-0.4.18/napari/settings/_application.py +--- napari-0.4.18.orig/napari/settings/_application.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_application.py 2024-01-25 13:30:22.484507544 +0000 +@@ -3,8 +3,8 @@ + from typing import List, Optional, Tuple + + from psutil import virtual_memory +-from pydantic import Field, validator + ++from napari._pydantic_compat import Field, validator + from napari.settings._constants import LoopMode + from napari.settings._fields import Language + from napari.utils._base import _DEFAULT_LOCALE +diff -Nru napari-0.4.18.orig/napari/settings/_base.py napari-0.4.18/napari/settings/_base.py +--- napari-0.4.18.orig/napari/settings/_base.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_base.py 2024-01-25 13:30:22.484507544 +0000 +@@ -9,10 +9,13 @@ + from typing import TYPE_CHECKING, Dict, List, Optional, Sequence, Tuple, cast + from warnings import warn + +-from pydantic import BaseModel, BaseSettings, ValidationError +-from pydantic.env_settings import SettingsError +-from pydantic.error_wrappers import display_errors +- ++from napari._pydantic_compat import ( ++ BaseModel, ++ BaseSettings, ++ SettingsError, ++ ValidationError, ++ display_errors, ++) + from napari.settings._yaml import PydanticYamlMixin + from napari.utils.events import EmitterGroup, EventedModel + from napari.utils.misc import deep_update +@@ -23,8 +26,10 @@ + if TYPE_CHECKING: + from typing import AbstractSet, Any, Union + +- from pydantic.env_settings import EnvSettingsSource, SettingsSourceCallable +- ++ from napari._pydantic_compat import ( ++ EnvSettingsSource, ++ SettingsSourceCallable, ++ ) + from napari.utils.events import Event + + IntStr = Union[int, str] +@@ -33,7 +38,7 @@ + MappingIntStrAny = Mapping[IntStr, Any] + + +-class EventedSettings(BaseSettings, EventedModel): # type: ignore[misc] ++class EventedSettings(BaseSettings, EventedModel): + """A variant of EventedModel designed for settings. + + Pydantic's BaseSettings model will attempt to determine the values of any +@@ -116,7 +121,7 @@ + """Return the path to/from which settings be saved/loaded.""" + return self._config_path + +- def dict( # type: ignore [override] ++ def dict( + self, + *, + include: Union[AbstractSetIntStr, MappingIntStrAny] = None, # type: ignore +@@ -241,7 +246,7 @@ + the return list to change the priority of sources. + """ + cls._env_settings = nested_env_settings(env_settings) +- return ( # type: ignore [return-value] ++ return ( + init_settings, + cls._env_settings, + cls._config_file_settings_source, +diff -Nru napari-0.4.18.orig/napari/settings/_experimental.py napari-0.4.18/napari/settings/_experimental.py +--- napari-0.4.18.orig/napari/settings/_experimental.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_experimental.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,7 +1,6 @@ + from typing import Union + +-from pydantic import Field +- ++from napari._pydantic_compat import Field + from napari.settings._base import EventedSettings + from napari.utils.translations import trans + +diff -Nru napari-0.4.18.orig/napari/settings/_napari_settings.py napari-0.4.18/napari/settings/_napari_settings.py +--- napari-0.4.18.orig/napari/settings/_napari_settings.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_napari_settings.py 2024-01-25 13:30:22.484507544 +0000 +@@ -2,8 +2,7 @@ + from pathlib import Path + from typing import Any, Optional + +-from pydantic import Field +- ++from napari._pydantic_compat import Field + from napari.settings._appearance import AppearanceSettings + from napari.settings._application import ApplicationSettings + from napari.settings._base import ( +diff -Nru napari-0.4.18.orig/napari/settings/_plugins.py napari-0.4.18/napari/settings/_plugins.py +--- napari-0.4.18.orig/napari/settings/_plugins.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_plugins.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,8 +1,8 @@ + from typing import Dict, List, Set + +-from pydantic import Field + from typing_extensions import TypedDict + ++from napari._pydantic_compat import Field + from napari.settings._base import EventedSettings + from napari.utils.translations import trans + +diff -Nru napari-0.4.18.orig/napari/settings/_shortcuts.py napari-0.4.18/napari/settings/_shortcuts.py +--- napari-0.4.18.orig/napari/settings/_shortcuts.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_shortcuts.py 2024-01-25 13:30:22.484507544 +0000 +@@ -1,7 +1,6 @@ + from typing import Dict, List + +-from pydantic import Field, validator +- ++from napari._pydantic_compat import Field, validator + from napari.utils.events.evented_model import EventedModel + from napari.utils.shortcuts import default_shortcuts + from napari.utils.translations import trans +diff -Nru napari-0.4.18.orig/napari/settings/_tests/test_settings.py napari-0.4.18/napari/settings/_tests/test_settings.py +--- napari-0.4.18.orig/napari/settings/_tests/test_settings.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_tests/test_settings.py 2024-01-25 13:30:22.484507544 +0000 +@@ -2,11 +2,11 @@ + import os + from pathlib import Path + +-import pydantic + import pytest + from yaml import safe_load + + from napari import settings ++from napari._pydantic_compat import Field, ValidationError + from napari.settings import CURRENT_SCHEMA_VERSION, NapariSettings + from napari.utils.theme import get_theme, register_theme + +@@ -74,7 +74,7 @@ + data = "appearance:\n theme: 1" + fake_path = tmp_path / 'fake_path.yml' + fake_path.write_text(data) +- with pytest.raises(pydantic.ValidationError): ++ with pytest.raises(ValidationError): + NapariSettings(fake_path) + + +@@ -108,8 +108,8 @@ + fake_path = tmp_path / 'fake_path.yml' + fake_path.write_text(data) + +- settings = NapariSettings(fake_path) +- assert getattr(settings, "non_existing_section", None) is None ++ settings_ = NapariSettings(fake_path) ++ assert getattr(settings_, "non_existing_section", None) is None + + + def test_settings_to_dict(test_settings): +@@ -145,11 +145,11 @@ + + + def test_settings_model(test_settings): +- with pytest.raises(pydantic.error_wrappers.ValidationError): ++ with pytest.raises(ValidationError): + # Should be string + test_settings.appearance.theme = 1 + +- with pytest.raises(pydantic.error_wrappers.ValidationError): ++ with pytest.raises(ValidationError): + # Should be a valid string + test_settings.appearance.theme = "vaporwave" + +@@ -159,7 +159,7 @@ + custom_theme_name = "_test_blue_" + + # No theme registered yet, this should fail +- with pytest.raises(pydantic.error_wrappers.ValidationError): ++ with pytest.raises(ValidationError): + test_settings.appearance.theme = custom_theme_name + + blue_theme = get_theme('dark', True) +@@ -219,7 +219,7 @@ + + def test_settings_env_variables_fails(monkeypatch): + monkeypatch.setenv('NAPARI_APPEARANCE_THEME', 'FOOBAR') +- with pytest.raises(pydantic.ValidationError): ++ with pytest.raises(ValidationError): + NapariSettings() + + +@@ -228,7 +228,7 @@ + from napari.settings._base import EventedSettings + + class Sub(EventedSettings): +- x: int = pydantic.Field(1, env='varname') ++ x: int = Field(1, env='varname') + + class T(NapariSettings): + sub: Sub +diff -Nru napari-0.4.18.orig/napari/settings/_yaml.py napari-0.4.18/napari/settings/_yaml.py +--- napari-0.4.18.orig/napari/settings/_yaml.py 2024-01-25 13:30:10.984544395 +0000 ++++ napari-0.4.18/napari/settings/_yaml.py 2024-01-25 13:30:22.485507540 +0000 +@@ -3,9 +3,9 @@ + from enum import Enum + from typing import TYPE_CHECKING, Type + +-from pydantic import BaseModel + from yaml import SafeDumper, dump_all + ++from napari._pydantic_compat import BaseModel + from napari.settings._fields import Version + + if TYPE_CHECKING: +@@ -77,7 +77,7 @@ + exclude_none=exclude_none, + ) + if self.__custom_root_type__: +- from pydantic.utils import ROOT_KEY ++ from napari._pydantic_compat import ROOT_KEY + + data = data[ROOT_KEY] + return self._yaml_dump(data, dumper, **dumps_kwargs) +diff -Nru napari-0.4.18.orig/napari/utils/colormaps/colormap.py napari-0.4.18/napari/utils/colormaps/colormap.py +--- napari-0.4.18.orig/napari/utils/colormaps/colormap.py 2024-01-25 13:30:10.985544392 +0000 ++++ napari-0.4.18/napari/utils/colormaps/colormap.py 2024-01-25 13:33:20.714011699 +0000 +@@ -2,7 +2,7 @@ + from typing import Optional + + import numpy as np +-from pydantic import PrivateAttr, validator ++from napari._pydantic_compat import Field, PrivateAttr, validator + + from napari.utils.color import ColorArray + from napari.utils.colormaps.colorbars import make_colorbar +diff -Nru napari-0.4.18.orig/napari/utils/events/containers/_selection.py napari-0.4.18/napari/utils/events/containers/_selection.py +--- napari-0.4.18.orig/napari/utils/events/containers/_selection.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/containers/_selection.py 2024-01-25 13:30:22.485507540 +0000 +@@ -5,7 +5,7 @@ + from napari.utils.translations import trans + + if TYPE_CHECKING: +- from pydantic.fields import ModelField ++ from napari._pydantic_compat import ModelField + + _T = TypeVar("_T") + _S = TypeVar("_S") +@@ -140,7 +140,7 @@ + @classmethod + def validate(cls, v, field: 'ModelField'): + """Pydantic validator.""" +- from pydantic.utils import sequence_like ++ from napari._pydantic_compat import sequence_like + + if isinstance(v, dict): + data = v.get("selection", []) +@@ -180,7 +180,7 @@ + errors.append(error) + + if errors: +- from pydantic import ValidationError ++ from napari._pydantic_compat import ValidationError + + raise ValidationError(errors, cls) # type: ignore + obj = cls(data=data) +diff -Nru napari-0.4.18.orig/napari/utils/events/containers/_set.py napari-0.4.18/napari/utils/events/containers/_set.py +--- napari-0.4.18.orig/napari/utils/events/containers/_set.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/containers/_set.py 2024-01-25 13:30:22.485507540 +0000 +@@ -8,7 +8,7 @@ + _T = TypeVar("_T") + + if TYPE_CHECKING: +- from pydantic.fields import ModelField ++ from napari._pydantic_compat import ModelField + + + class EventedSet(MutableSet[_T]): +@@ -165,7 +165,7 @@ + @classmethod + def validate(cls, v, field: ModelField): + """Pydantic validator.""" +- from pydantic.utils import sequence_like ++ from napari._pydantic_compat import sequence_like + + if not sequence_like(v): + raise TypeError( +@@ -185,7 +185,7 @@ + if error: + errors.append(error) + if errors: +- from pydantic import ValidationError ++ from napari._pydantic_compat import ValidationError + + raise ValidationError(errors, cls) # type: ignore + return cls(v) +diff -Nru napari-0.4.18.orig/napari/utils/events/custom_types.py napari-0.4.18/napari/utils/events/custom_types.py +--- napari-0.4.18.orig/napari/utils/events/custom_types.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/custom_types.py 2024-01-25 13:30:22.485507540 +0000 +@@ -11,12 +11,13 @@ + ) + + import numpy as np +-from pydantic import errors, types ++ ++from napari._pydantic_compat import errors, types + + if TYPE_CHECKING: + from decimal import Decimal + +- from pydantic.fields import ModelField ++ from napari._pydantic_compat import ModelField + + Number = Union[int, float, Decimal] + +diff -Nru napari-0.4.18.orig/napari/utils/events/debugging.py napari-0.4.18/napari/utils/events/debugging.py +--- napari-0.4.18.orig/napari/utils/events/debugging.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/debugging.py 2024-01-25 13:30:22.485507540 +0000 +@@ -4,8 +4,7 @@ + from textwrap import indent + from typing import TYPE_CHECKING, ClassVar, Set + +-from pydantic import BaseSettings, Field, PrivateAttr +- ++from napari._pydantic_compat import BaseSettings, Field, PrivateAttr + from napari.utils.misc import ROOT_DIR + from napari.utils.translations import trans + +@@ -39,8 +38,12 @@ + # to include/exclude when printing events. + include_emitters: Set[str] = Field(default_factory=set) + include_events: Set[str] = Field(default_factory=set) +- exclude_emitters: Set[str] = {'TransformChain', 'Context'} +- exclude_events: Set[str] = {'status', 'position'} ++ exclude_emitters: Set[str] = Field( ++ default_factory=lambda: {'TransformChain', 'Context'} ++ ) ++ exclude_events: Set[str] = Field( ++ default_factory=lambda: {'status', 'position'} ++ ) + # stack depth to show + stack_depth: int = 20 + # how many sub-emit nesting levels to show +diff -Nru napari-0.4.18.orig/napari/utils/events/evented_model.py napari-0.4.18/napari/utils/events/evented_model.py +--- napari-0.4.18.orig/napari/utils/events/evented_model.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/evented_model.py 2024-01-25 13:30:22.485507540 +0000 +@@ -5,8 +5,14 @@ + from typing import Any, Callable, ClassVar, Dict, Set, Union + + import numpy as np +-from pydantic import BaseModel, PrivateAttr, main, utils + ++from napari._pydantic_compat import ( ++ BaseModel, ++ ModelMetaclass, ++ PrivateAttr, ++ main, ++ utils, ++) + from napari.utils.events.event import EmitterGroup, Event + from napari.utils.misc import pick_equality_operator + from napari.utils.translations import trans +@@ -63,7 +69,7 @@ + main.ClassAttribute = utils.ClassAttribute + + +-class EventedMetaclass(main.ModelMetaclass): ++class EventedMetaclass(ModelMetaclass): + """pydantic ModelMetaclass that preps "equality checking" operations. + + A metaclass is the thing that "constructs" a class, and ``ModelMetaclass`` +diff -Nru napari-0.4.18.orig/napari/utils/events/_tests/test_evented_model.py napari-0.4.18/napari/utils/events/_tests/test_evented_model.py +--- napari-0.4.18.orig/napari/utils/events/_tests/test_evented_model.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/_tests/test_evented_model.py 2024-01-25 13:30:22.485507540 +0000 +@@ -9,8 +9,8 @@ + import pytest + from dask import delayed + from dask.delayed import Delayed +-from pydantic import Field + ++from napari._pydantic_compat import Field + from napari.utils.events import EmitterGroup, EventedModel + from napari.utils.events.custom_types import Array + from napari.utils.misc import StringEnum +diff -Nru napari-0.4.18.orig/napari/utils/events/_tests/test_selection.py napari-0.4.18/napari/utils/events/_tests/test_selection.py +--- napari-0.4.18.orig/napari/utils/events/_tests/test_selection.py 2024-01-25 13:30:10.986544389 +0000 ++++ napari-0.4.18/napari/utils/events/_tests/test_selection.py 2024-01-25 13:30:22.485507540 +0000 +@@ -1,8 +1,8 @@ + from unittest.mock import Mock + + import pytest +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari.utils.events import EventedModel, Selection + + +diff -Nru napari-0.4.18.orig/napari/utils/_tests/test_theme.py napari-0.4.18/napari/utils/_tests/test_theme.py +--- napari-0.4.18.orig/napari/utils/_tests/test_theme.py 2024-01-25 13:30:10.985544392 +0000 ++++ napari-0.4.18/napari/utils/_tests/test_theme.py 2024-01-25 13:30:22.485507540 +0000 +@@ -5,8 +5,8 @@ + from npe2 import PluginManager, PluginManifest, __version__ as npe2_version + from npe2.manifest.schema import ContributionPoints + from packaging.version import parse as parse_version +-from pydantic import ValidationError + ++from napari._pydantic_compat import ValidationError + from napari.resources._icons import PLUGIN_FILE_NAME + from napari.settings import get_settings + from napari.utils.theme import ( +diff -Nru napari-0.4.18.orig/napari/utils/theme.py napari-0.4.18/napari/utils/theme.py +--- napari-0.4.18.orig/napari/utils/theme.py 2024-01-25 13:30:10.987544386 +0000 ++++ napari-0.4.18/napari/utils/theme.py 2024-01-25 13:30:22.485507540 +0000 +@@ -8,9 +8,8 @@ + from typing import List, Union + + import npe2 +-from pydantic import validator +-from pydantic.color import Color + ++from napari._pydantic_compat import Color, validator + from napari._vendor import darkdetect + from napari.resources._icons import ( + PLUGIN_FILE_NAME, +diff -Nru napari-0.4.18.orig/setup.cfg napari-0.4.18/setup.cfg +--- napari-0.4.18.orig/setup.cfg 2024-01-25 13:30:10.988544382 +0000 ++++ napari-0.4.18/setup.cfg 2024-01-25 13:34:10.674857084 +0000 +@@ -63,7 +63,7 @@ + pint>=0.17 + psutil>=5.0 + psygnal>=0.3.4 +- pydantic>=1.9.0,<2 ++ pydantic>=1.9.0 + pygments>=2.6.0 + PyOpenGL>=3.1.0 + PyYAML>=5.1 diff --git a/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb b/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb deleted file mode 100644 index 359b3f1f1a3b..000000000000 --- a/easybuild/easyconfigs/p/pydantic/pydantic-1.10.13-GCCcore-12.3.0.eb +++ /dev/null @@ -1,39 +0,0 @@ -easyblock = 'PythonBundle' - -name = 'pydantic' -version = '1.10.13' - -homepage = 'https://github.com/samuelcolvin/pydantic' -description = """Data validation and settings management using Python type hinting.""" - -toolchain = {'name': 'GCCcore', 'version': '12.3.0'} - -builddependencies = [ - ('binutils', '2.40'), - ('hatchling', '1.18.0'), - ('maturin', '1.4.0', '-Rust-1.75.0'), -] - -dependencies = [ - ('Python', '3.11.3'), - ('typing-extensions', '4.9.0',), -] - -sanity_pip_check = True -use_pip = True - -exts_list = [ - ('annotated-types', '0.6.0', { - 'source_tmpl': 'annotated_types-%(version)s.tar.gz', - 'checksums': ['563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d'], - }), - ('pydantic-core', '2.14.6', { - 'source_tmpl': 'pydantic_core-%(version)s.tar.gz', - 'checksums': ['1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948'], - }), - (name, version, { - 'checksums': ['32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340'], - }), -] - -moduleclass = 'devel' From aad287788dfa31af3f680d2994482ba42f4a3bd1 Mon Sep 17 00:00:00 2001 From: Simon Branford <4967+branfosj@users.noreply.github.com> Date: Thu, 22 Feb 2024 14:26:59 +0000 Subject: [PATCH 6/6] remove commented out line --- easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb | 1 - 1 file changed, 1 deletion(-) diff --git a/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb index b6ecb0109d35..91cd347f95bd 100644 --- a/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb +++ b/easybuild/easyconfigs/n/napari/napari-0.4.18-foss-2023a.eb @@ -22,7 +22,6 @@ dependencies = [ ('PyQt5', '5.15.10'), ('SciPy-bundle', '2023.07'), ('PyYAML', '6.0'), - # ('pydantic', '1.10.13'), ('pydantic', '2.5.3'), ('dask', '2023.9.2'), ('PyOpenGL', '3.1.7'),