Skip to content

Commit 62c4192

Browse files
Merge pull request #765 from fractal-analytics-platform/pydantic_v2
Relax pydantic requirements || Switch to transitional pydantic.v1
2 parents 371bbc0 + 600be9a commit 62c4192

33 files changed

+385
-304
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* Refactor Cellpose Task inputs: Support independent normalization of 2 input channels in the Cellpose task (\#738).
99
* Rename `task.cellpose_transforms` into `tasks.cellpose_utils` (\#738).
1010
* Development:
11+
* Switch to transitional pydantic.v1 imports, changes pydantic requirement to `==1.10.16` or `>=2.6.3` (\#760).
1112
* Support JSON-Schema generation for `Enum` task arguments (\#749).
1213
* Make JSON-Schema generation tools more flexible, to simplify testing (\#749).
1314
* Update documentation (\#751).

fractal_tasks_core/__init__.py

+20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
import logging
22

33

4+
def _check_pydantic_version():
5+
"""
6+
Temporary check for pydantic version.
7+
To be removed after moving to pydantic v2 is complete.
8+
"""
9+
import importlib.metadata
10+
from packaging import version
11+
12+
pydantic_version = version.parse(importlib.metadata.version("pydantic"))
13+
pydantic_v1 = version.parse("1.10.16")
14+
pydantic_v2 = version.parse("2.6.3")
15+
if pydantic_version != pydantic_v1 and pydantic_version < pydantic_v2:
16+
raise ImportError(
17+
f"Pydantic version {pydantic_version} is not supported. "
18+
f"Please use version =={pydantic_v1} or >={pydantic_v2}."
19+
)
20+
21+
22+
_check_pydantic_version()
23+
424
logging.basicConfig(
525
level=logging.INFO, format="%(asctime)s; %(levelname)s; %(message)s"
626
)

fractal_tasks_core/channels.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
from typing import Union
1919

2020
import zarr
21-
from pydantic import BaseModel
22-
from pydantic import validator
21+
from pydantic.v1 import BaseModel
22+
from pydantic.v1 import validator
2323

2424
from fractal_tasks_core import __OME_NGFF_VERSION__
2525

fractal_tasks_core/dev/lib_args_schemas.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
from typing import Optional
2222

2323
from docstring_parser import parse as docparse
24-
from pydantic.decorator import ALT_V_ARGS
25-
from pydantic.decorator import ALT_V_KWARGS
26-
from pydantic.decorator import V_DUPLICATE_KWARGS
27-
from pydantic.decorator import V_POSITIONAL_ONLY_NAME
28-
from pydantic.decorator import ValidatedFunction
24+
from pydantic.v1.decorator import ALT_V_ARGS
25+
from pydantic.v1.decorator import ALT_V_KWARGS
26+
from pydantic.v1.decorator import V_DUPLICATE_KWARGS
27+
from pydantic.v1.decorator import V_POSITIONAL_ONLY_NAME
28+
from pydantic.v1.decorator import ValidatedFunction
2929

3030
from fractal_tasks_core.dev.lib_descriptions import (
3131
_get_class_attrs_descriptions,

fractal_tasks_core/dev/lib_signature_constraints.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
from pathlib import Path
1616
from typing import Callable
1717

18-
from pydantic.decorator import ALT_V_ARGS
19-
from pydantic.decorator import ALT_V_KWARGS
20-
from pydantic.decorator import V_DUPLICATE_KWARGS
21-
from pydantic.decorator import V_POSITIONAL_ONLY_NAME
18+
from pydantic.v1.decorator import ALT_V_ARGS
19+
from pydantic.v1.decorator import ALT_V_KWARGS
20+
from pydantic.v1.decorator import V_DUPLICATE_KWARGS
21+
from pydantic.v1.decorator import V_POSITIONAL_ONLY_NAME
2222

2323
FORBIDDEN_PARAM_NAMES = (
2424
"args",

fractal_tasks_core/dev/task_models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from typing import Any
1919
from typing import Optional
2020

21-
from pydantic import BaseModel
21+
from pydantic.v1 import BaseModel
2222

2323

2424
class _BaseTask(BaseModel):

fractal_tasks_core/labels.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from typing import Optional
1717

1818
import zarr.hierarchy
19-
from pydantic.error_wrappers import ValidationError
19+
from pydantic.v1.error_wrappers import ValidationError
2020

2121
from fractal_tasks_core.ngff import NgffImageMeta
2222
from fractal_tasks_core.zarr_utils import OverwriteNotAllowedError

fractal_tasks_core/ngff/specs.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from typing import Optional
88
from typing import Union
99

10-
from pydantic import BaseModel
11-
from pydantic import Field
12-
from pydantic import validator
10+
from pydantic.v1 import BaseModel
11+
from pydantic.v1 import Field
12+
from pydantic.v1 import validator
1313

1414

1515
logger = logging.getLogger(__name__)

fractal_tasks_core/roi/v1_checks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import anndata as ad
1919
import zarr
20-
from pydantic.error_wrappers import ValidationError
20+
from pydantic.v1.error_wrappers import ValidationError
2121

2222
from fractal_tasks_core.tables.v1 import MaskingROITableAttrs
2323

fractal_tasks_core/tables/v1.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
import anndata as ad
1212
import zarr.hierarchy
1313
from anndata.experimental import write_elem
14-
from pydantic import BaseModel
15-
from pydantic import validator
16-
from pydantic.error_wrappers import ValidationError
14+
from pydantic.v1 import BaseModel
15+
from pydantic.v1 import validator
16+
from pydantic.v1.error_wrappers import ValidationError
1717

1818
from fractal_tasks_core.zarr_utils import OverwriteNotAllowedError
1919

fractal_tasks_core/tasks/apply_registration_to_image.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import dask.array as da
2222
import numpy as np
2323
import zarr
24-
from pydantic.decorator import validate_arguments
24+
from pydantic.v1.decorator import validate_arguments
2525

2626
from fractal_tasks_core.ngff import load_NgffImageMeta
2727
from fractal_tasks_core.ngff.zarr_utils import load_NgffWellMeta

fractal_tasks_core/tasks/calculate_registration_image_based.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import dask.array as da
1919
import numpy as np
2020
import zarr
21-
from pydantic.decorator import validate_arguments
21+
from pydantic.v1.decorator import validate_arguments
2222
from skimage.registration import phase_cross_correlation
2323

2424
from fractal_tasks_core.channels import get_channel_from_image_zarr

fractal_tasks_core/tasks/cellpose_segmentation.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import pandas as pd
2727
import zarr
2828
from cellpose import models
29-
from pydantic import Field
30-
from pydantic.decorator import validate_arguments
29+
from pydantic.v1 import Field
30+
from pydantic.v1.decorator import validate_arguments
3131

3232
import fractal_tasks_core
3333
from fractal_tasks_core.labels import prepare_label_group

fractal_tasks_core/tasks/cellpose_utils.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
from typing import Optional
1717

1818
import numpy as np
19-
from pydantic import BaseModel
20-
from pydantic import Field
21-
from pydantic import root_validator
22-
from pydantic import validator
19+
from pydantic.v1 import BaseModel
20+
from pydantic.v1 import Field
21+
from pydantic.v1 import root_validator
22+
from pydantic.v1 import validator
2323

2424
from fractal_tasks_core.channels import ChannelInputModel
2525
from fractal_tasks_core.channels import ChannelNotFoundError

fractal_tasks_core/tasks/cellvoyager_to_ome_zarr_compute.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import zarr
1919
from anndata import read_zarr
2020
from dask.array.image import imread
21-
from pydantic.decorator import validate_arguments
21+
from pydantic.v1.decorator import validate_arguments
2222

2323
from fractal_tasks_core.cellvoyager.filenames import (
2424
glob_with_multiple_patterns,

fractal_tasks_core/tasks/cellvoyager_to_ome_zarr_init.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from typing import Optional
1818

1919
import pandas as pd
20-
from pydantic.decorator import validate_arguments
20+
from pydantic.v1.decorator import validate_arguments
2121

2222
import fractal_tasks_core
2323
from fractal_tasks_core.cellvoyager.filenames import (

fractal_tasks_core/tasks/cellvoyager_to_ome_zarr_init_multiplex.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import pandas as pd
2020
import zarr
21-
from pydantic.decorator import validate_arguments
21+
from pydantic.v1.decorator import validate_arguments
2222
from zarr.errors import ContainsGroupError
2323

2424
import fractal_tasks_core

fractal_tasks_core/tasks/copy_ome_zarr_hcs_plate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from typing import Any
1717

1818
import zarr
19-
from pydantic.decorator import validate_arguments
19+
from pydantic.v1.decorator import validate_arguments
2020

2121
import fractal_tasks_core
2222
from fractal_tasks_core.ngff.specs import NgffPlateMeta

fractal_tasks_core/tasks/find_registration_consensus.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import anndata as ad
1919
import zarr
20-
from pydantic.decorator import validate_arguments
20+
from pydantic.v1.decorator import validate_arguments
2121

2222
from fractal_tasks_core.roi import (
2323
are_ROI_table_columns_valid,

fractal_tasks_core/tasks/illumination_correction.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import dask.array as da
2323
import numpy as np
2424
import zarr
25-
from pydantic.decorator import validate_arguments
25+
from pydantic.v1.decorator import validate_arguments
2626
from skimage.io import imread
2727

2828
from fractal_tasks_core.channels import get_omero_channel_list
@@ -106,7 +106,6 @@ def illumination_correction(
106106
# Advanced parameters
107107
suffix: str = "_illum_corr",
108108
) -> dict[str, Any]:
109-
110109
"""
111110
Applies illumination correction to the images in the OME-Zarr.
112111

fractal_tasks_core/tasks/image_based_registration_hcs_init.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import logging
1616
from typing import Any
1717

18-
from pydantic.decorator import validate_arguments
18+
from pydantic.v1.decorator import validate_arguments
1919

2020
from fractal_tasks_core.tasks._registration_utils import (
2121
create_well_acquisition_dict,

fractal_tasks_core/tasks/import_ome_zarr.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import dask.array as da
1919
import zarr
20-
from pydantic.decorator import validate_arguments
20+
from pydantic.v1.decorator import validate_arguments
2121

2222
from fractal_tasks_core.channels import update_omero_channels
2323
from fractal_tasks_core.ngff import detect_ome_ngff_type

fractal_tasks_core/tasks/init_group_by_well_for_multiplexing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"""
1515
import logging
1616

17-
from pydantic.decorator import validate_arguments
17+
from pydantic.v1.decorator import validate_arguments
1818

1919
from fractal_tasks_core.tasks._registration_utils import (
2020
create_well_acquisition_dict,

fractal_tasks_core/tasks/io_models.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from typing import Literal
22
from typing import Optional
33

4-
from pydantic import BaseModel
5-
from pydantic import Field
6-
from pydantic import validator
4+
from pydantic.v1 import BaseModel
5+
from pydantic.v1 import Field
6+
from pydantic.v1 import validator
77

88
from fractal_tasks_core.channels import ChannelInputModel
99
from fractal_tasks_core.channels import OmeroChannel

fractal_tasks_core/tasks/maximum_intensity_projection.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import anndata as ad
1919
import dask.array as da
2020
import zarr
21-
from pydantic.decorator import validate_arguments
21+
from pydantic.v1.decorator import validate_arguments
2222
from zarr.errors import ContainsArrayError
2323

2424
from fractal_tasks_core.ngff import load_NgffImageMeta

fractal_tasks_core/tasks/napari_workflows_wrapper.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import pandas as pd
2323
import zarr
2424
from napari_workflows._io_yaml_v1 import load_workflow
25-
from pydantic.decorator import validate_arguments
25+
from pydantic.v1.decorator import validate_arguments
2626

2727
import fractal_tasks_core
2828
from fractal_tasks_core.channels import get_channel_from_image_zarr
@@ -208,7 +208,7 @@ def napari_workflows_wrapper(
208208
if image_inputs:
209209
img_array = da.from_zarr(f"{zarr_url}/{level}")
210210
# Loop over image inputs and assign corresponding channel of the image
211-
for (name, params) in image_inputs:
211+
for name, params in image_inputs:
212212
channel = get_channel_from_image_zarr(
213213
image_zarr_path=zarr_url,
214214
wavelength_id=params.channel.wavelength_id,
@@ -261,7 +261,7 @@ def napari_workflows_wrapper(
261261
upscale_labels = True
262262
# Loop over label inputs and load corresponding (upscaled) image
263263
input_label_arrays = {}
264-
for (name, params) in label_inputs:
264+
for name, params in label_inputs:
265265
label_name = params.label_name
266266
label_array_raw = da.from_zarr(
267267
f"{zarr_url}/labels/{label_name}/{level}"
@@ -393,7 +393,7 @@ def napari_workflows_wrapper(
393393

394394
# Loop over label outputs and (1) set zattrs, (2) create zarr group
395395
output_label_zarr_groups: dict[str, Any] = {}
396-
for (name, out_params) in label_outputs:
396+
for name, out_params in label_outputs:
397397

398398
# (1a) Rescale OME-NGFF datasets (relevant for level>0)
399399
if not ngff_image_meta.multiscale.axes[0].name == "c":
@@ -467,7 +467,7 @@ def napari_workflows_wrapper(
467467
if out_params.type == "dataframe"
468468
]
469469
output_dataframe_lists: dict[str, list] = {}
470-
for (name, out_params) in dataframe_outputs:
470+
for name, out_params in dataframe_outputs:
471471
output_dataframe_lists[name] = []
472472
logger.info(f"Prepared output with {name=} and {out_params=}")
473473
logger.info(f"{output_dataframe_lists=}")
@@ -581,7 +581,7 @@ def napari_workflows_wrapper(
581581

582582
# Output handling: "dataframe" type (for each output, concatenate ROI
583583
# dataframes, clean up, and store in a AnnData table on-disk)
584-
for (name, out_params) in dataframe_outputs:
584+
for name, out_params in dataframe_outputs:
585585
table_name = out_params.table_name
586586
# Concatenate all FOV dataframes
587587
list_dfs = output_dataframe_lists[name]
@@ -617,7 +617,7 @@ def napari_workflows_wrapper(
617617

618618
# Output handling: "label" type (for each output, build and write to disk
619619
# pyramid of coarser levels)
620-
for (name, out_params) in label_outputs:
620+
for name, out_params in label_outputs:
621621
label_name = out_params.label_name
622622
build_pyramid(
623623
zarrurl=f"{zarr_url}/labels/{label_name}",

0 commit comments

Comments
 (0)