Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
20 changes: 12 additions & 8 deletions narwhals/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,17 @@
]


def __getattr__(name: _t.Literal["__version__"]) -> str: # type: ignore[misc]
if name == "__version__":
global __version__ # noqa: PLW0603
if not _t.TYPE_CHECKING:
Comment thread
dangotbanned marked this conversation as resolved.

from importlib import metadata
def __getattr__(name: str) -> _t.Any:
if name == "__version__":
global __version__ # noqa: PLW0603

__version__ = metadata.version(__name__)
return __version__
msg = f"module {__name__!r} has no attribute {name!r}"
raise AttributeError(msg)
from importlib import metadata

__version__ = metadata.version(__name__)
return __version__
msg = f"module {__name__!r} has no attribute {name!r}"
raise AttributeError(msg)
else: # pragma: no cover
...
21 changes: 21 additions & 0 deletions tests/version_test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from __future__ import annotations

import re
from collections.abc import Callable
from importlib.metadata import distribution
from os import environ
from pathlib import Path
from typing import TYPE_CHECKING, Any

import pytest

import narwhals as nw
from narwhals._utils import parse_version
Expand Down Expand Up @@ -35,3 +39,20 @@ def test_package_version() -> None:
assert version_comp <= parse_version(pyproject_version)
dist_version = distribution("narwhals").version
assert version == dist_version


def test_package_getattr() -> None:
pytest.importorskip("typing_extensions")
from typing_extensions import assert_type

ok = nw.__version__
assert_type(ok, str)
also_ok = nw.all
assert_type(also_ok, Callable[[], nw.Expr])

if TYPE_CHECKING:
bad = nw.not_real # type: ignore[attr-defined]
assert_type(bad, Any)

with pytest.raises(AttributeError):
very_bad = nw.not_real # type: ignore[attr-defined] # noqa: F841
Loading