diff --git a/src/nitypes/_typing.py b/src/nitypes/_typing.py new file mode 100644 index 00000000..db8a8759 --- /dev/null +++ b/src/nitypes/_typing.py @@ -0,0 +1,41 @@ +"""Single source for typing backports to avoid depending on typing_extensions at run time.""" + +from __future__ import annotations + +import sys +from typing import TYPE_CHECKING + +if sys.version_info >= (3, 10): + from typing import TypeAlias +elif TYPE_CHECKING: + from typing_extensions import TypeAlias +else: + TypeAlias = None + +if sys.version_info >= (3, 11): + from typing import Self, assert_type +elif TYPE_CHECKING: + from typing_extensions import Self, assert_type +else: + Self = None + + def assert_type(val, typ, /): # noqa: D103 - Missing docstring in public function + pass + + +if sys.version_info >= (3, 12): + from typing import override +elif TYPE_CHECKING: + from typing_extensions import override +else: + + def override(arg, /): # noqa: D103 - Missing docstring in public function + return arg + + +__all__ = [ + "assert_type", + "override", + "Self", + "TypeAlias", +] diff --git a/src/nitypes/time/_conversion.py b/src/nitypes/time/_conversion.py index 4e745c5b..a850c5c9 100644 --- a/src/nitypes/time/_conversion.py +++ b/src/nitypes/time/_conversion.py @@ -1,7 +1,6 @@ from __future__ import annotations import datetime as dt -import sys from collections.abc import Callable from functools import singledispatch from typing import Any, TypeVar, Union, cast @@ -9,11 +8,7 @@ import hightime as ht from nitypes._exceptions import invalid_arg_type, invalid_requested_type - -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias +from nitypes._typing import TypeAlias _AnyDateTime: TypeAlias = Union[dt.datetime, ht.datetime] _TDateTime = TypeVar("_TDateTime", dt.datetime, ht.datetime) diff --git a/src/nitypes/waveform/_analog_waveform.py b/src/nitypes/waveform/_analog_waveform.py index e1d8096a..91f4ff9c 100644 --- a/src/nitypes/waveform/_analog_waveform.py +++ b/src/nitypes/waveform/_analog_waveform.py @@ -2,7 +2,13 @@ import sys from collections.abc import Sequence -from typing import Any, Generic, SupportsIndex, TypeVar, overload +from typing import ( + Any, + Generic, + SupportsIndex, + TypeVar, + overload, +) import numpy as np import numpy.typing as npt diff --git a/src/nitypes/waveform/_extended_properties.py b/src/nitypes/waveform/_extended_properties.py index 2aa73126..a598591c 100644 --- a/src/nitypes/waveform/_extended_properties.py +++ b/src/nitypes/waveform/_extended_properties.py @@ -1,14 +1,9 @@ from __future__ import annotations import operator -import sys -from typing import MutableMapping, Iterator +from typing import Iterator, MutableMapping, Union -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing import Union - from typing_extensions import TypeAlias +from nitypes._typing import TypeAlias # Extended property keys CHANNEL_NAME = "NI_ChannelName" @@ -16,12 +11,8 @@ UNIT_DESCRIPTION = "NI_UnitDescription" -if sys.version_info >= (3, 10): - ExtendedPropertyValue: TypeAlias = bool | float | int | str - """An ExtendedPropertyDictionary value.""" -else: - ExtendedPropertyValue: TypeAlias = Union[bool, float, int, str] - """An ExtendedPropertyDictionary value.""" +ExtendedPropertyValue: TypeAlias = Union[bool, float, int, str] +"""An ExtendedPropertyDictionary value.""" class ExtendedPropertyDictionary(MutableMapping[str, ExtendedPropertyValue]): diff --git a/src/nitypes/waveform/_timing/_conversion.py b/src/nitypes/waveform/_timing/_conversion.py index 6e083506..5d26dfb4 100644 --- a/src/nitypes/waveform/_timing/_conversion.py +++ b/src/nitypes/waveform/_timing/_conversion.py @@ -1,7 +1,6 @@ from __future__ import annotations import datetime as dt -import sys from collections.abc import Callable from functools import singledispatch from typing import Any, TypeVar, Union, cast @@ -9,15 +8,11 @@ import hightime as ht from nitypes._exceptions import invalid_arg_type, invalid_requested_type +from nitypes._typing import TypeAlias from nitypes.time._conversion import convert_datetime, convert_timedelta from nitypes.waveform._timing._precision import PrecisionTiming from nitypes.waveform._timing._standard import Timing -if sys.version_info >= (3, 10): - from typing import TypeAlias -else: - from typing_extensions import TypeAlias - _AnyTiming: TypeAlias = Union[Timing, PrecisionTiming] _TTiming = TypeVar("_TTiming", Timing, PrecisionTiming) diff --git a/tests/unit/time/test_conversion.py b/tests/unit/time/test_conversion.py index f281f8cb..b8e91234 100644 --- a/tests/unit/time/test_conversion.py +++ b/tests/unit/time/test_conversion.py @@ -1,19 +1,14 @@ from __future__ import annotations import datetime as dt -import sys from typing import Any import hightime as ht import pytest +from nitypes._typing import assert_type from nitypes.time import convert_datetime, convert_timedelta -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - ############################################################################### # convert_datetime diff --git a/tests/unit/waveform/_scaling/test_linear.py b/tests/unit/waveform/_scaling/test_linear.py index 7de6f0ef..e6f63c17 100644 --- a/tests/unit/waveform/_scaling/test_linear.py +++ b/tests/unit/waveform/_scaling/test_linear.py @@ -1,19 +1,14 @@ from __future__ import annotations -import sys from typing import SupportsFloat import numpy as np import numpy.typing as npt import pytest +from nitypes._typing import assert_type from nitypes.waveform import LinearScaleMode -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - @pytest.mark.parametrize( "gain, offset", diff --git a/tests/unit/waveform/_scaling/test_none.py b/tests/unit/waveform/_scaling/test_none.py index 1c11e3d5..f7ff29ad 100644 --- a/tests/unit/waveform/_scaling/test_none.py +++ b/tests/unit/waveform/_scaling/test_none.py @@ -1,17 +1,11 @@ from __future__ import annotations -import sys - import numpy as np import numpy.typing as npt +from nitypes._typing import assert_type from nitypes.waveform import NO_SCALING, NoneScaleMode -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - def test___no_scaling___type_is_none_scale_mode() -> None: assert_type(NO_SCALING, NoneScaleMode) diff --git a/tests/unit/waveform/_timing/test_conversion.py b/tests/unit/waveform/_timing/test_conversion.py index 7b7dcf40..f6754c9b 100644 --- a/tests/unit/waveform/_timing/test_conversion.py +++ b/tests/unit/waveform/_timing/test_conversion.py @@ -1,18 +1,13 @@ from __future__ import annotations import datetime as dt -import sys import hightime as ht +from nitypes._typing import assert_type from nitypes.waveform import PrecisionTiming, SampleIntervalMode, Timing from nitypes.waveform._timing import convert_timing -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - def test___standard_to_standard___convert_timing___returns_original_object() -> None: value_in = Timing.create_with_regular_interval( diff --git a/tests/unit/waveform/_timing/test_precision.py b/tests/unit/waveform/_timing/test_precision.py index 24c40185..90e29e0d 100644 --- a/tests/unit/waveform/_timing/test_precision.py +++ b/tests/unit/waveform/_timing/test_precision.py @@ -1,19 +1,14 @@ from __future__ import annotations import datetime as dt -import sys from copy import deepcopy import hightime as ht import pytest +from nitypes._typing import assert_type from nitypes.waveform import PrecisionTiming, SampleIntervalMode -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - ############################################################################### # empty diff --git a/tests/unit/waveform/_timing/test_standard.py b/tests/unit/waveform/_timing/test_standard.py index 10001791..1960d761 100644 --- a/tests/unit/waveform/_timing/test_standard.py +++ b/tests/unit/waveform/_timing/test_standard.py @@ -1,18 +1,13 @@ from __future__ import annotations import datetime as dt -import sys from copy import deepcopy import pytest +from nitypes._typing import assert_type from nitypes.waveform import SampleIntervalMode, Timing -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - ############################################################################### # empty diff --git a/tests/unit/waveform/test_analog_waveform.py b/tests/unit/waveform/test_analog_waveform.py index 1b5e1952..88e807ee 100644 --- a/tests/unit/waveform/test_analog_waveform.py +++ b/tests/unit/waveform/test_analog_waveform.py @@ -3,7 +3,6 @@ import array import datetime as dt import itertools -import sys import weakref from typing import Any, SupportsIndex @@ -12,6 +11,7 @@ import numpy.typing as npt import pytest +from nitypes._typing import assert_type from nitypes.waveform import ( NO_SCALING, AnalogWaveform, @@ -22,11 +22,6 @@ Timing, ) -if sys.version_info >= (3, 11): - from typing import assert_type -else: - from typing_extensions import assert_type - ############################################################################### # create