diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3fff6ed631..2a57fbf31a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace @@ -26,33 +26,30 @@ repos: args: ['--autofix', '--no-sort-keys', '--indent=4'] - id: end-of-file-fixer - id: mixed-line-ending - - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.3.5 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.7.0 hooks: - id: ruff args: - --fix - repo: https://github.com/asottile/pyupgrade - rev: v3.3.1 + rev: v3.19.0 hooks: - id: pyupgrade - args: [--py37-plus] - name: Upgrade code excluding monai networks + args: [--py39-plus, --keep-runtime-typing] + name: Upgrade code with exceptions exclude: | (?x)( ^versioneer.py| ^monai/_version.py| - ^monai/networks/| # no PEP 604 for torchscript tensorrt - ^monai/losses/ # no PEP 604 for torchscript tensorrt + ^monai/networks/| # avoid typing rewrites + ^monai/apps/detection/utils/anchor_utils.py| # avoid typing rewrites + ^tests/test_compute_panoptic_quality.py # avoid typing rewrites ) - - id: pyupgrade - args: [--py37-plus, --keep-runtime-typing] - name: Upgrade monai networks - files: (?x)(^monai/networks/) - repo: https://github.com/asottile/yesqa - rev: v1.4.0 + rev: v1.5.0 hooks: - id: yesqa name: Unused noqa diff --git a/monai/__init__.py b/monai/__init__.py index f6fc8b0646..d92557a8e1 100644 --- a/monai/__init__.py +++ b/monai/__init__.py @@ -11,12 +11,12 @@ from __future__ import annotations +import logging import os import sys -import logging import warnings -from ._version import get_versions +from ._version import get_versions old_showwarning = warnings.showwarning diff --git a/monai/apps/detection/networks/retinanet_network.py b/monai/apps/detection/networks/retinanet_network.py index ec86c3b0e9..ca6a8f5c19 100644 --- a/monai/apps/detection/networks/retinanet_network.py +++ b/monai/apps/detection/networks/retinanet_network.py @@ -42,7 +42,7 @@ import math import warnings from collections.abc import Callable, Sequence -from typing import Any, Dict +from typing import Any import torch from torch import Tensor, nn @@ -330,7 +330,7 @@ def forward(self, images: Tensor) -> Any: features = self.feature_extractor(images) if isinstance(features, Tensor): feature_maps = [features] - elif torch.jit.isinstance(features, Dict[str, Tensor]): + elif torch.jit.isinstance(features, dict[str, Tensor]): feature_maps = list(features.values()) else: feature_maps = list(features) diff --git a/monai/apps/detection/transforms/array.py b/monai/apps/detection/transforms/array.py index d8ffce4584..301a636b6c 100644 --- a/monai/apps/detection/transforms/array.py +++ b/monai/apps/detection/transforms/array.py @@ -15,7 +15,8 @@ from __future__ import annotations -from typing import Any, Sequence +from collections.abc import Sequence +from typing import Any import numpy as np import torch diff --git a/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py b/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py index a52274b24a..6251ea8e83 100644 --- a/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py +++ b/monai/apps/generation/maisi/networks/autoencoderkl_maisi.py @@ -13,7 +13,7 @@ import gc import logging -from typing import Sequence +from collections.abc import Sequence import torch import torch.nn as nn diff --git a/monai/apps/generation/maisi/networks/controlnet_maisi.py b/monai/apps/generation/maisi/networks/controlnet_maisi.py index 269086d971..7c13fd7bc6 100644 --- a/monai/apps/generation/maisi/networks/controlnet_maisi.py +++ b/monai/apps/generation/maisi/networks/controlnet_maisi.py @@ -11,7 +11,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence import torch diff --git a/monai/apps/pathology/engines/utils.py b/monai/apps/pathology/engines/utils.py index 02249ed640..87ca0f8e76 100644 --- a/monai/apps/pathology/engines/utils.py +++ b/monai/apps/pathology/engines/utils.py @@ -11,7 +11,8 @@ from __future__ import annotations -from typing import Any, Sequence +from collections.abc import Sequence +from typing import Any import torch diff --git a/monai/apps/pathology/inferers/inferer.py b/monai/apps/pathology/inferers/inferer.py index 71259ca7df..392cba221f 100644 --- a/monai/apps/pathology/inferers/inferer.py +++ b/monai/apps/pathology/inferers/inferer.py @@ -11,7 +11,8 @@ from __future__ import annotations -from typing import Any, Callable, Sequence +from collections.abc import Sequence +from typing import Any, Callable import numpy as np import torch diff --git a/monai/apps/pathology/metrics/lesion_froc.py b/monai/apps/pathology/metrics/lesion_froc.py index f4bf51ab28..138488348a 100644 --- a/monai/apps/pathology/metrics/lesion_froc.py +++ b/monai/apps/pathology/metrics/lesion_froc.py @@ -11,7 +11,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Iterable +from collections.abc import Iterable +from typing import TYPE_CHECKING, Any import numpy as np diff --git a/monai/apps/pathology/transforms/post/array.py b/monai/apps/pathology/transforms/post/array.py index 035bce2c69..561ed3ae20 100644 --- a/monai/apps/pathology/transforms/post/array.py +++ b/monai/apps/pathology/transforms/post/array.py @@ -12,7 +12,8 @@ from __future__ import annotations import warnings -from typing import Callable, Sequence +from collections.abc import Sequence +from typing import Callable import numpy as np import torch diff --git a/monai/apps/tcia/utils.py b/monai/apps/tcia/utils.py index 5524b488e9..f023cdbc87 100644 --- a/monai/apps/tcia/utils.py +++ b/monai/apps/tcia/utils.py @@ -12,7 +12,7 @@ from __future__ import annotations import os -from typing import Iterable +from collections.abc import Iterable import monai from monai.config.type_definitions import PathLike diff --git a/monai/apps/utils.py b/monai/apps/utils.py index 0c998146a3..c2e17d3247 100644 --- a/monai/apps/utils.py +++ b/monai/apps/utils.py @@ -136,10 +136,7 @@ def check_hash(filepath: PathLike, val: str | None = None, hash_type: str = "md5 return True actual_hash_func = look_up_option(hash_type.lower(), SUPPORTED_HASH_TYPES) - if sys.version_info >= (3, 9): - actual_hash = actual_hash_func(usedforsecurity=False) # allows checks on FIPS enabled machines - else: - actual_hash = actual_hash_func() + actual_hash = actual_hash_func(usedforsecurity=False) # allows checks on FIPS enabled machines try: with open(filepath, "rb") as f: diff --git a/monai/apps/vista3d/transforms.py b/monai/apps/vista3d/transforms.py index 3e8145cd80..bd7fb19493 100644 --- a/monai/apps/vista3d/transforms.py +++ b/monai/apps/vista3d/transforms.py @@ -12,7 +12,7 @@ from __future__ import annotations import warnings -from typing import Sequence +from collections.abc import Sequence import numpy as np import torch diff --git a/monai/bundle/reference_resolver.py b/monai/bundle/reference_resolver.py index 050cd75fa7..df69b021e1 100644 --- a/monai/bundle/reference_resolver.py +++ b/monai/bundle/reference_resolver.py @@ -13,8 +13,8 @@ import re import warnings -from collections.abc import Sequence -from typing import Any, Iterator +from collections.abc import Iterator, Sequence +from typing import Any from monai.bundle.config_item import ConfigComponent, ConfigExpression, ConfigItem from monai.bundle.utils import DEPRECATED_ID_MAPPING, ID_REF_KEY, ID_SEP_KEY diff --git a/monai/bundle/workflows.py b/monai/bundle/workflows.py index ccdb08e208..3ecd5dfbc5 100644 --- a/monai/bundle/workflows.py +++ b/monai/bundle/workflows.py @@ -16,10 +16,11 @@ import sys import time from abc import ABC, abstractmethod +from collections.abc import Sequence from copy import copy from logging.config import fileConfig from pathlib import Path -from typing import Any, Sequence +from typing import Any from monai.apps.utils import get_logger from monai.bundle.config_parser import ConfigParser diff --git a/monai/config/type_definitions.py b/monai/config/type_definitions.py index 57454a94e1..48c0547e31 100644 --- a/monai/config/type_definitions.py +++ b/monai/config/type_definitions.py @@ -12,7 +12,8 @@ from __future__ import annotations import os -from typing import Collection, Hashable, Iterable, Sequence, TypeVar, Union +from collections.abc import Collection, Hashable, Iterable, Sequence +from typing import TypeVar, Union import numpy as np import torch diff --git a/monai/data/meta_obj.py b/monai/data/meta_obj.py index 0dccaa9e1c..15e6e8be15 100644 --- a/monai/data/meta_obj.py +++ b/monai/data/meta_obj.py @@ -13,8 +13,9 @@ import itertools import pprint +from collections.abc import Iterable from copy import deepcopy -from typing import Any, Iterable +from typing import Any import numpy as np import torch diff --git a/monai/data/meta_tensor.py b/monai/data/meta_tensor.py index 2df4da4a35..ac171e8508 100644 --- a/monai/data/meta_tensor.py +++ b/monai/data/meta_tensor.py @@ -13,8 +13,9 @@ import functools import warnings +from collections.abc import Sequence from copy import deepcopy -from typing import Any, Sequence +from typing import Any import numpy as np import torch diff --git a/monai/engines/evaluator.py b/monai/engines/evaluator.py index 523c3dcbf6..d70a39726b 100644 --- a/monai/engines/evaluator.py +++ b/monai/engines/evaluator.py @@ -12,7 +12,8 @@ from __future__ import annotations import warnings -from typing import TYPE_CHECKING, Any, Callable, Iterable, Sequence +from collections.abc import Iterable, Sequence +from typing import TYPE_CHECKING, Any, Callable import torch from torch.utils.data import DataLoader diff --git a/monai/engines/trainer.py b/monai/engines/trainer.py index bbcc9c880b..a0be86bae5 100644 --- a/monai/engines/trainer.py +++ b/monai/engines/trainer.py @@ -12,7 +12,8 @@ from __future__ import annotations import warnings -from typing import TYPE_CHECKING, Any, Callable, Iterable, Sequence +from collections.abc import Iterable, Sequence +from typing import TYPE_CHECKING, Any, Callable import torch from torch.optim.optimizer import Optimizer diff --git a/monai/engines/utils.py b/monai/engines/utils.py index 11a0000989..8e19a18601 100644 --- a/monai/engines/utils.py +++ b/monai/engines/utils.py @@ -12,8 +12,8 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Callable, Sequence -from typing import TYPE_CHECKING, Any, Mapping, cast +from collections.abc import Callable, Mapping, Sequence +from typing import TYPE_CHECKING, Any, cast import torch import torch.nn as nn diff --git a/monai/handlers/clearml_handlers.py b/monai/handlers/clearml_handlers.py index 1cfd6a33fb..0aa2a5cc08 100644 --- a/monai/handlers/clearml_handlers.py +++ b/monai/handlers/clearml_handlers.py @@ -11,7 +11,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Mapping, Sequence +from collections.abc import Mapping, Sequence +from typing import TYPE_CHECKING, Any from monai.utils import optional_import diff --git a/monai/inferers/utils.py b/monai/inferers/utils.py index bd99765348..edaf736091 100644 --- a/monai/inferers/utils.py +++ b/monai/inferers/utils.py @@ -12,8 +12,8 @@ from __future__ import annotations import itertools -from collections.abc import Callable, Mapping, Sequence -from typing import Any, Iterable +from collections.abc import Callable, Iterable, Mapping, Sequence +from typing import Any import numpy as np import torch diff --git a/monai/losses/hausdorff_loss.py b/monai/losses/hausdorff_loss.py index 6117f27741..c58be2d253 100644 --- a/monai/losses/hausdorff_loss.py +++ b/monai/losses/hausdorff_loss.py @@ -79,7 +79,7 @@ def __init__( Incompatible values. """ - super(HausdorffDTLoss, self).__init__(reduction=LossReduction(reduction).value) + super().__init__(reduction=LossReduction(reduction).value) if other_act is not None and not callable(other_act): raise TypeError(f"other_act must be None or callable but is {type(other_act).__name__}.") if int(sigmoid) + int(softmax) > 1: diff --git a/monai/metrics/utils.py b/monai/metrics/utils.py index 340e54a1d7..96d60c9098 100644 --- a/monai/metrics/utils.py +++ b/monai/metrics/utils.py @@ -12,9 +12,10 @@ from __future__ import annotations import warnings +from collections.abc import Iterable, Sequence from functools import lru_cache, partial from types import ModuleType -from typing import Any, Iterable, Sequence +from typing import Any import numpy as np import torch diff --git a/monai/networks/nets/swin_unetr.py b/monai/networks/nets/swin_unetr.py index 714d986f4b..832135ad06 100644 --- a/monai/networks/nets/swin_unetr.py +++ b/monai/networks/nets/swin_unetr.py @@ -13,6 +13,7 @@ import itertools from collections.abc import Sequence +from typing import Final import numpy as np import torch @@ -20,7 +21,6 @@ import torch.nn.functional as F import torch.utils.checkpoint as checkpoint from torch.nn import LayerNorm -from typing_extensions import Final from monai.networks.blocks import MLPBlock as Mlp from monai.networks.blocks import PatchEmbed, UnetOutBlock, UnetrBasicBlock, UnetrUpBlock diff --git a/monai/transforms/intensity/dictionary.py b/monai/transforms/intensity/dictionary.py index 5dbac485fe..f2b1a2fd40 100644 --- a/monai/transforms/intensity/dictionary.py +++ b/monai/transforms/intensity/dictionary.py @@ -17,7 +17,8 @@ from __future__ import annotations -from typing import Callable, Hashable, Mapping, Sequence +from collections.abc import Hashable, Mapping, Sequence +from typing import Callable import numpy as np diff --git a/monai/transforms/lazy/functional.py b/monai/transforms/lazy/functional.py index 6b95027832..a33d76807c 100644 --- a/monai/transforms/lazy/functional.py +++ b/monai/transforms/lazy/functional.py @@ -11,7 +11,8 @@ from __future__ import annotations -from typing import Any, Mapping, Sequence +from collections.abc import Mapping, Sequence +from typing import Any import torch diff --git a/monai/transforms/spatial/array.py b/monai/transforms/spatial/array.py index 6e39fb2e19..e4ed196eff 100644 --- a/monai/transforms/spatial/array.py +++ b/monai/transforms/spatial/array.py @@ -15,10 +15,10 @@ from __future__ import annotations import warnings -from collections.abc import Callable +from collections.abc import Callable, Sequence from copy import deepcopy from itertools import zip_longest -from typing import Any, Optional, Sequence, Tuple, Union, cast +from typing import Any, Optional, Union, cast import numpy as np import torch @@ -116,7 +116,7 @@ "RandSimulateLowResolution", ] -RandRange = Optional[Union[Sequence[Union[Tuple[float, float], float]], float]] +RandRange = Optional[Union[Sequence[Union[tuple[float, float], float]], float]] class SpatialResample(InvertibleTransform, LazyTransform): diff --git a/monai/transforms/utility/dictionary.py b/monai/transforms/utility/dictionary.py index 79d0be522d..65c721e48e 100644 --- a/monai/transforms/utility/dictionary.py +++ b/monai/transforms/utility/dictionary.py @@ -18,9 +18,9 @@ from __future__ import annotations import re -from collections.abc import Callable, Hashable, Mapping +from collections.abc import Callable, Hashable, Mapping, Sequence from copy import deepcopy -from typing import Any, Sequence, cast +from typing import Any, cast import numpy as np import torch diff --git a/monai/transforms/utils_morphological_ops.py b/monai/transforms/utils_morphological_ops.py index b3134c1865..61d3c5b858 100644 --- a/monai/transforms/utils_morphological_ops.py +++ b/monai/transforms/utils_morphological_ops.py @@ -11,7 +11,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence import torch import torch.nn.functional as F diff --git a/monai/utils/component_store.py b/monai/utils/component_store.py index d1e71eaebf..bf0d632ddd 100644 --- a/monai/utils/component_store.py +++ b/monai/utils/component_store.py @@ -12,9 +12,10 @@ from __future__ import annotations from collections import namedtuple +from collections.abc import Iterable from keyword import iskeyword from textwrap import dedent, indent -from typing import Any, Callable, Iterable, TypeVar +from typing import Any, Callable, TypeVar T = TypeVar("T") diff --git a/monai/utils/decorators.py b/monai/utils/decorators.py index 1c064468e8..a784510c64 100644 --- a/monai/utils/decorators.py +++ b/monai/utils/decorators.py @@ -15,7 +15,8 @@ __all__ = ["RestartGenerator", "MethodReplacer"] -from typing import Callable, Generator +from collections.abc import Generator +from typing import Callable class RestartGenerator: diff --git a/monai/utils/dist.py b/monai/utils/dist.py index c7ff988027..47da2bee6e 100644 --- a/monai/utils/dist.py +++ b/monai/utils/dist.py @@ -11,15 +11,10 @@ from __future__ import annotations -import sys import warnings from collections.abc import Callable from logging import Filter - -if sys.version_info >= (3, 8): - from typing import Literal - -from typing import overload +from typing import Literal, overload import torch import torch.distributed as dist diff --git a/monai/utils/module.py b/monai/utils/module.py index df5fe873ae..1f7f8aecfc 100644 --- a/monai/utils/module.py +++ b/monai/utils/module.py @@ -18,14 +18,14 @@ import re import sys import warnings -from collections.abc import Callable, Collection, Hashable, Mapping +from collections.abc import Callable, Collection, Hashable, Iterable, Mapping from functools import partial, wraps from importlib import import_module from pkgutil import walk_packages from pydoc import locate from re import match from types import FunctionType, ModuleType -from typing import Any, Iterable, cast +from typing import Any, cast import torch diff --git a/monai/utils/state_cacher.py b/monai/utils/state_cacher.py index d37e7abde4..60a074544b 100644 --- a/monai/utils/state_cacher.py +++ b/monai/utils/state_cacher.py @@ -15,8 +15,9 @@ import os import pickle import tempfile +from collections.abc import Hashable from types import ModuleType -from typing import Any, Hashable +from typing import Any import torch from torch.serialization import DEFAULT_PROTOCOL diff --git a/tests/test_dynunet.py b/tests/test_dynunet.py index f3c982056c..7c4882fcbb 100644 --- a/tests/test_dynunet.py +++ b/tests/test_dynunet.py @@ -13,7 +13,8 @@ import platform import unittest -from typing import Any, Sequence +from collections.abc import Sequence +from typing import Any import torch from parameterized import parameterized diff --git a/tests/test_network_consistency.py b/tests/test_network_consistency.py index 4182501808..bcfd448144 100644 --- a/tests/test_network_consistency.py +++ b/tests/test_network_consistency.py @@ -14,8 +14,8 @@ import json import os import unittest +from collections.abc import Sequence from glob import glob -from typing import Sequence from unittest.case import skipIf import torch