diff --git a/pyunitwizard/__init__.py b/pyunitwizard/__init__.py index de39de2..72f76ca 100644 --- a/pyunitwizard/__init__.py +++ b/pyunitwizard/__init__.py @@ -1,15 +1,22 @@ -""" -PyUnitWizard -Quantities and units assistant -""" +"""PyUnitWizard +Quantities and units assistant.""" + +from __future__ import annotations + +import sys +import types +import warnings # versioningit from ._version import __version__ -def __print_version__(): + +def __print_version__() -> None: print("PyUnitWizard version " + __version__) +from . import api as _api + # Add imports here from .api import ( are_close, @@ -39,6 +46,46 @@ def __print_version__(): from . import constants from . import utils +__all__ = list(_api.__all__) + + +def _create_main_compat_module() -> types.ModuleType: + module = types.ModuleType( + "pyunitwizard.main", + """Compatibility module for historic imports. + + Deprecated in favour of importing from :mod:`pyunitwizard` directly. + """.strip(), + ) + warned = False + + def _emit_warning() -> None: + nonlocal warned + if not warned: + warnings.warn( + "Importing from 'pyunitwizard.main' is deprecated; import from 'pyunitwizard' instead.", + DeprecationWarning, + stacklevel=3, + ) + warned = True + + def __getattr__(name: str) -> object: + if name in _api.__all__: + _emit_warning() + return getattr(_api, name) + raise AttributeError(f"module 'pyunitwizard.main' has no attribute {name!r}") + + def __dir__() -> list[str]: + return sorted(__all__) + + module.__getattr__ = __getattr__ # type: ignore[assignment] + module.__dir__ = __dir__ # type: ignore[assignment] + module.__all__ = tuple(__all__) + return module + + +sys.modules.setdefault("pyunitwizard.main", _create_main_compat_module()) + _kernel.initialize() try: diff --git a/pyunitwizard/main.py b/pyunitwizard/main.py deleted file mode 100644 index b161610..0000000 --- a/pyunitwizard/main.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Compatibility module that re-exports the public API from :mod:`pyunitwizard.api`.""" - -from __future__ import annotations - -from .api.comparison import ( - are_close, - are_compatible, - are_equal, - compatibility, - similarity, -) -from .api.construction import quantity, unit -from .api.conversion import convert, to_string -from .api.extraction import change_value, get_unit, get_value, get_value_and_unit -from .api.introspection import ( - get_dimensionality, - get_form, - is_dimensionless, - is_quantity, - is_unit, -) -from .api.standardization import get_standard_units, standardize -from .api.validation import check - -__all__ = [ - "are_close", - "are_compatible", - "are_equal", - "change_value", - "check", - "compatibility", - "convert", - "get_dimensionality", - "get_form", - "get_standard_units", - "get_unit", - "get_value", - "get_value_and_unit", - "is_dimensionless", - "is_quantity", - "is_unit", - "quantity", - "similarity", - "standardize", - "to_string", - "unit", -] diff --git a/pyunitwizard/utils/sequences/is_sequence.py b/pyunitwizard/utils/sequences/is_sequence.py index 496193d..423e00a 100644 --- a/pyunitwizard/utils/sequences/is_sequence.py +++ b/pyunitwizard/utils/sequences/is_sequence.py @@ -1,4 +1,8 @@ -from ...main import is_quantity +"""Helpers to determine whether objects behave like sequences.""" + +from __future__ import annotations + +from ... import is_quantity import numpy as np def is_sequence(item):