Skip to content

Add type hint checking with mypy #460

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add type hint checking with mypy
  • Loading branch information
dstansby committed Nov 11, 2024
commit e89746fe81d3f440ddb0b23c5aae0c203113c2af
7 changes: 7 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,10 @@ repos:
rev: 2024.08.19
hooks:
- id: sp-repo-review

- repo: https://github.com/pre-commit/mirrors-mypy
rev: 'v1.4.0'
hooks:
- id: mypy
args: [--config-file, pyproject.toml]
additional_dependencies: [numpy, pytest, zfpy]
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ def __getattr__(cls, name):

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
latex_elements: dict[str, str] = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
Expand Down
3 changes: 2 additions & 1 deletion numcodecs/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,14 @@
"""

from abc import ABC, abstractmethod
from typing import Optional


class Codec(ABC):
"""Codec abstract base class."""

# override in sub-class
codec_id = None
codec_id: Optional[str] = None
"""Codec identifier."""

@abstractmethod
Expand Down
8 changes: 6 additions & 2 deletions numcodecs/checksum32.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import struct
import zlib
from typing import Literal
from collections.abc import Callable
from typing import TYPE_CHECKING, Literal

import numpy as np

from .abc import Codec
from .compat import ensure_contiguous_ndarray, ndarray_copy
from .jenkins import jenkins_lookup3

if TYPE_CHECKING:
from typing_extensions import Buffer

CHECKSUM_LOCATION = Literal['start', 'end']


class Checksum32(Codec):
# override in sub-class
checksum = None
checksum: Callable[["Buffer", int], int] | None = None
location: CHECKSUM_LOCATION = 'start'

def __init__(self, location: CHECKSUM_LOCATION | None = None):
Expand Down
4 changes: 2 additions & 2 deletions numcodecs/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def ensure_contiguous_ndarray_like(buf, max_buffer_size=None, flatten=True) -> N

# check for datetime or timedelta ndarray, the buffer interface doesn't support those
if arr.dtype.kind in "Mm":
arr = arr.view(np.int64)
arr = arr.view(np.int64) # type: ignore[arg-type]

# check memory is contiguous, if so flatten
if arr.flags.c_contiguous or arr.flags.f_contiguous:
Expand All @@ -117,7 +117,7 @@ def ensure_contiguous_ndarray_like(buf, max_buffer_size=None, flatten=True) -> N
return arr


def ensure_contiguous_ndarray(buf, max_buffer_size=None, flatten=True) -> np.array:
def ensure_contiguous_ndarray(buf, max_buffer_size=None, flatten=True) -> np.ndarray:
"""Convenience function to coerce `buf` to a numpy array, if it is not already a
numpy array. Also ensures that the returned value exports fully contiguous memory,
and supports the new-style buffer interface. If the optional max_buffer_size is
Expand Down
11 changes: 7 additions & 4 deletions numcodecs/lzma.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import contextlib
from types import ModuleType
from typing import Optional

_lzma = None
_lzma: Optional[ModuleType] = None
try:
import lzma as _lzma
except ImportError: # pragma: no cover
with contextlib.suppress(ImportError):
from backports import lzma as _lzma
try:
from backports import lzma as _lzma # type: ignore[no-redef]
except ImportError:
pass


if _lzma:
Expand Down
2 changes: 1 addition & 1 deletion numcodecs/ndarray_like.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, ClassVar, Optional, Protocol, runtime_checkable


class _CachedProtocolMeta(Protocol.__class__):
class _CachedProtocolMeta(type):
"""Custom implementation of @runtime_checkable

The native implementation of @runtime_checkable is slow,
Expand Down
8 changes: 5 additions & 3 deletions numcodecs/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
applications to dynamically register and look-up codec classes."""

import logging
from importlib.metadata import entry_points
from importlib.metadata import EntryPoints, entry_points

from numcodecs.abc import Codec

logger = logging.getLogger("numcodecs")
codec_registry = {}
entries = {}
codec_registry: dict[str, Codec] = {}
entries: dict[str, EntryPoints] = {}


def run_entrypoints():
Expand Down
4 changes: 4 additions & 0 deletions numcodecs/tests/test_lzma.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import itertools
import unittest
from types import ModuleType
from typing import cast

import numpy as np
import pytest
Expand All @@ -20,6 +22,8 @@
check_repr,
)

_lzma = cast(ModuleType, _lzma)

codecs = [
LZMA(),
LZMA(preset=1),
Expand Down
6 changes: 6 additions & 0 deletions numcodecs/tests/test_zfpy.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from types import ModuleType
from typing import cast

import numpy as np
import pytest

Expand All @@ -17,6 +20,9 @@
check_repr,
)

_zfpy = cast(ModuleType, _zfpy)


codecs = [
ZFPY(mode=_zfpy.mode_fixed_rate, rate=-1),
ZFPY(),
Expand Down
6 changes: 4 additions & 2 deletions numcodecs/zfpy.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import warnings
from contextlib import suppress
from importlib.metadata import PackageNotFoundError, version
from types import ModuleType
from typing import Optional

_zfpy = None
_zfpy: Optional[ModuleType] = None

_zfpy_version: tuple = ()
with suppress(PackageNotFoundError):
Expand All @@ -21,7 +23,7 @@
)
else:
with suppress(ImportError):
import zfpy as _zfpy
import zfpy as _zfpy # type: ignore[no-redef]

if _zfpy:
import numpy as np
Expand Down
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,7 @@ ignore = [

[tool.ruff.format]
quote-style = "preserve"

[tool.mypy]
ignore_errors = false
ignore_missing_imports = true