From b6a6f6237b0e363c3240848d5a1cfa5d10f9bacb Mon Sep 17 00:00:00 2001 From: Nathaniel Starkman Date: Mon, 8 Jul 2024 14:42:56 -0400 Subject: [PATCH] refactor: move optional deps (#132) * refactor: move optional_deps * build: gala opt dep * test: add interop test Signed-off-by: nstarman --- .github/workflows/ci.yml | 43 ++++++++++++++++--- conftest.py | 9 ++++ pyproject.toml | 3 +- src/unxt/__init__.py | 7 +++ .../optional_deps.py => _optional_deps.py} | 0 src/unxt/_unxt_interop_gala/__init__.py | 5 +++ .../unitsystems.py} | 12 +----- src/unxt/_utils/__init__.py | 3 -- src/unxt/unitsystems/__init__.py | 9 +--- 9 files changed, 64 insertions(+), 27 deletions(-) rename src/unxt/{_utils/optional_deps.py => _optional_deps.py} (100%) create mode 100644 src/unxt/_unxt_interop_gala/__init__.py rename src/unxt/{unitsystems/_compat.py => _unxt_interop_gala/unitsystems.py} (65%) delete mode 100644 src/unxt/_utils/__init__.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05d3ddc..271e087 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ env: FORCE_COLOR: 3 jobs: - pre-commit: + format: name: Format runs-on: ubuntu-latest steps: @@ -27,9 +27,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.x" - - uses: pre-commit/action@v3.0.1 - with: - extra_args: --hook-stage manual --all-files + # - uses: pre-commit/action@v3.0.1 + # with: + # extra_args: --hook-stage manual --all-files - name: Run PyLint run: | echo "::add-matcher::$GITHUB_WORKSPACE/.github/matchers/pylint.json" @@ -38,7 +38,7 @@ jobs: checks: name: Check Python ${{ matrix.python-version }} on ${{ matrix.runs-on }} runs-on: ${{ matrix.runs-on }} - needs: [pre-commit] + needs: [format] strategy: fail-fast: false matrix: @@ -71,3 +71,36 @@ jobs: uses: codecov/codecov-action@v4.5.0 with: token: ${{ secrets.CODECOV_TOKEN }} + + check_interop: + name: Check Python ${{ matrix.python-version }} on ${{ matrix.runs-on }} + runs-on: ${{ matrix.runs-on }} + needs: [format] + strategy: + fail-fast: false + matrix: + python-version: ["3.12"] + runs-on: [ubuntu-latest] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + allow-prereleases: true + + - name: Install package + run: python -m pip install .[all,test] + + - name: Test package + run: >- + python -m pytest src docs tests -ra --cov --cov-report=xml + --cov-report=term --durations=20 + + - name: Upload coverage report + uses: codecov/codecov-action@v4.5.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/conftest.py b/conftest.py index 677ccdd..2a60778 100644 --- a/conftest.py +++ b/conftest.py @@ -2,6 +2,7 @@ import platform from doctest import ELLIPSIS, NORMALIZE_WHITESPACE +from importlib.util import find_spec from sybil import Sybil from sybil.parsers.rest import DocTestParser, PythonCodeBlockParser, SkipParser @@ -22,3 +23,11 @@ parsers=parsers, patterns=["*.rst", "*.py"], ).pytest() + + +# TODO: via separate optional_deps package +HAS_GALA = find_spec("gala") is not None + +collect_ignore_glob = [] +if not HAS_GALA: + collect_ignore_glob.append("src/unxt/_unxt_interop_gala/*") diff --git a/pyproject.toml b/pyproject.toml index 236c5b5..c1b67d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,8 @@ requires-python = ">=3.10" [project.optional-dependencies] - all = [] + all = ["unxt[gala]"] + gala = ["gala"] dev = ["unxt[docs]", "unxt[test]"] docs = [ "sphinx>=7.0", diff --git a/src/unxt/__init__.py b/src/unxt/__init__.py index e81dd27..6ad534b 100644 --- a/src/unxt/__init__.py +++ b/src/unxt/__init__.py @@ -8,10 +8,14 @@ experimental, # noqa: F401 unitsystems, ) +from ._optional_deps import HAS_GALA from ._quantity import * from ._version import version as __version__ from .unitsystems import AbstractUnitSystem, UnitSystem, unitsystem +if HAS_GALA: + from . import _unxt_interop_gala # noqa: F401 + __all__ = [ "__version__", # units systems @@ -21,3 +25,6 @@ "unitsystem", # convenience constructor ] __all__ += _quantity.__all__ + +# Clean up namespace +del HAS_GALA, _quantity diff --git a/src/unxt/_utils/optional_deps.py b/src/unxt/_optional_deps.py similarity index 100% rename from src/unxt/_utils/optional_deps.py rename to src/unxt/_optional_deps.py diff --git a/src/unxt/_unxt_interop_gala/__init__.py b/src/unxt/_unxt_interop_gala/__init__.py new file mode 100644 index 0000000..ba5c419 --- /dev/null +++ b/src/unxt/_unxt_interop_gala/__init__.py @@ -0,0 +1,5 @@ +"""Tools for representing systems of units using ``astropy.units``.""" + +__all__: list[str] = [] + +from . import unitsystems # noqa: F401 diff --git a/src/unxt/unitsystems/_compat.py b/src/unxt/_unxt_interop_gala/unitsystems.py similarity index 65% rename from src/unxt/unitsystems/_compat.py rename to src/unxt/_unxt_interop_gala/unitsystems.py index 347b6db..6c6352c 100644 --- a/src/unxt/unitsystems/_compat.py +++ b/src/unxt/_unxt_interop_gala/unitsystems.py @@ -3,21 +3,13 @@ __all__: list[str] = [] -try: # TODO: less hacky way of supporting optional dependencies - import pytest -except ImportError: # pragma: no cover - pass -else: - _ = pytest.importorskip("gala") - -from gala.units import ( +from gala.units import ( # pylint: disable=import-error DimensionlessUnitSystem as GalaDimensionlessUnitSystem, UnitSystem as GalaUnitSystem, ) from plum import dispatch -from ._core import DimensionlessUnitSystem, UnitSystem -from ._realizations import dimensionless +from unxt.unitsystems import DimensionlessUnitSystem, UnitSystem, dimensionless @dispatch diff --git a/src/unxt/_utils/__init__.py b/src/unxt/_utils/__init__.py deleted file mode 100644 index 84afbb3..0000000 --- a/src/unxt/_utils/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""`unxt` utils.""" - -__all__: list[str] = [] diff --git a/src/unxt/unitsystems/__init__.py b/src/unxt/unitsystems/__init__.py index f8a14d6..79c5fb7 100644 --- a/src/unxt/unitsystems/__init__.py +++ b/src/unxt/unitsystems/__init__.py @@ -5,7 +5,6 @@ from ._core import * from ._realizations import * from ._utils import * -from unxt._utils.optional_deps import HAS_GALA __all__: list[str] = [] __all__ += _base.__all__ @@ -13,11 +12,5 @@ __all__ += _realizations.__all__ __all__ += _utils.__all__ -if HAS_GALA: - from . import _compat - from ._compat import * - - __all__ += _compat.__all__ - # Clean up namespace -del _core, _utils, _realizations, HAS_GALA +del _core, _utils, _realizations