diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5ff22a5..d8e4568 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,24 +14,49 @@ on: jobs: - build: + check_install: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: True + matrix: + python-version: [3.8, 3.9, "3.10", "3.11"] + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - uses: actions/checkout@v3 + - name: Install poetry + run: pipx install poetry + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: 'poetry' + - name: Install dependencies + run: | + python -m pip install nox_poetry + - name: Test install all + run: pip install -e .[all] + + tests: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: - fail-fast: false + fail-fast: True matrix: - python-version: [3.8, "3.10"] + python-version: ["3.11"] + os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v3 + - name: Install poetry + run: pipx install poetry - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + cache: 'poetry' - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install poetry python -m pip install nox_poetry - name: Test with nox run: nox -s tests diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 46a3a5a..3fec80f 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -21,18 +21,17 @@ jobs: fail-fast: false steps: - uses: actions/checkout@v3 - - name: Set up Python + - name: Install poetry + run: pipx install poetry + - name: Setup python uses: actions/setup-python@v4 with: - python-version: 3.8 + python-version: "3.8" + cache: 'poetry' - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install poetry python -m pip install nox_poetry - - name: Lint - run: nox -s lint - - name: Type checking - run: nox -s type_checking + - name: Run all style checks + run: nox -t style - name: Build docs run: nox -s build_docs diff --git a/kiez/hubness_reduction/mutual_proximity.py b/kiez/hubness_reduction/mutual_proximity.py index be3f950..372f8fa 100644 --- a/kiez/hubness_reduction/mutual_proximity.py +++ b/kiez/hubness_reduction/mutual_proximity.py @@ -8,11 +8,8 @@ import numpy as np from scipy import stats -from sklearn.utils.validation import ( - check_array, - check_consistent_length, - check_is_fitted, -) +from sklearn.utils.validation import (check_array, check_consistent_length, + check_is_fitted) from tqdm.auto import tqdm from .base import HubnessReduction diff --git a/kiez/neighbors/__init__.py b/kiez/neighbors/__init__.py index d19e3b7..c11aa00 100644 --- a/kiez/neighbors/__init__.py +++ b/kiez/neighbors/__init__.py @@ -1,10 +1,12 @@ from class_resolver import ClassResolver + from kiez.neighbors.approximate.faiss import Faiss from kiez.neighbors.approximate.nmslib import NMSLIB from kiez.neighbors.approximate.nng import NNG from kiez.neighbors.approximate.random_projection_trees import Annoy from kiez.neighbors.exact.sklearn_nearest_neighbors import SklearnNN -from kiez.neighbors.neighbor_algorithm_base import NNAlgorithm, NNAlgorithmWithJoblib +from kiez.neighbors.neighbor_algorithm_base import (NNAlgorithm, + NNAlgorithmWithJoblib) __all__ = [ "nn_algorithm_resolver", diff --git a/kiez/neighbors/approximate/nmslib.py b/kiez/neighbors/approximate/nmslib.py index ceaa00b..4386873 100644 --- a/kiez/neighbors/approximate/nmslib.py +++ b/kiez/neighbors/approximate/nmslib.py @@ -7,6 +7,7 @@ from __future__ import annotations import numpy as np + from kiez.neighbors.neighbor_algorithm_base import NNAlgorithm try: diff --git a/kiez/neighbors/approximate/nng.py b/kiez/neighbors/approximate/nng.py index ed4c948..2491cc9 100644 --- a/kiez/neighbors/approximate/nng.py +++ b/kiez/neighbors/approximate/nng.py @@ -9,9 +9,10 @@ import logging import numpy as np +from tqdm.auto import tqdm + from kiez.io.temp_file_handling import create_tempfile_preferably_in_dir from kiez.neighbors.neighbor_algorithm_base import NNAlgorithmWithJoblib -from tqdm.auto import tqdm try: import ngtpy # noqa: autoimport diff --git a/kiez/neighbors/approximate/random_projection_trees.py b/kiez/neighbors/approximate/random_projection_trees.py index 5ececc0..8a83313 100644 --- a/kiez/neighbors/approximate/random_projection_trees.py +++ b/kiez/neighbors/approximate/random_projection_trees.py @@ -11,9 +11,10 @@ from typing import Tuple import numpy as np +from tqdm.auto import tqdm + from kiez.io.temp_file_handling import create_tempfile_preferably_in_dir from kiez.neighbors.neighbor_algorithm_base import NNAlgorithmWithJoblib -from tqdm.auto import tqdm try: import annoy # noqa: autoimport diff --git a/kiez/neighbors/exact/sklearn_nearest_neighbors.py b/kiez/neighbors/exact/sklearn_nearest_neighbors.py index a0ca187..55378c8 100644 --- a/kiez/neighbors/exact/sklearn_nearest_neighbors.py +++ b/kiez/neighbors/exact/sklearn_nearest_neighbors.py @@ -1,7 +1,8 @@ # documentation copied in parts from scikit-learn -from kiez.neighbors.neighbor_algorithm_base import NNAlgorithm from sklearn.neighbors import VALID_METRICS, NearestNeighbors +from kiez.neighbors.neighbor_algorithm_base import NNAlgorithm + class SklearnNN(NNAlgorithm): """Wrapper for scikit learn's NearestNeighbors class diff --git a/noxfile.py b/noxfile.py index cf3e785..0ef9efd 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,7 +1,7 @@ from nox_poetry import Session, session -@session() +@session(tags=["test"]) def tests(session: Session) -> None: args = session.posargs or ["--cov=kiez/", "--cov-report=xml", "tests/"] session.install(".[all]") @@ -13,8 +13,16 @@ def tests(session: Session) -> None: locations = ["kiez", "tests", "noxfile.py"] -@session() +@session(tags=["fix"]) def lint(session: Session) -> None: + args = session.posargs or locations + session.install("black", "isort") + session.run("black", *args) + session.run("isort", *args) + + +@session(tags=["style"]) +def style_checking(session: Session) -> None: args = session.posargs or locations session.install( "pyproject-flake8", @@ -27,13 +35,13 @@ def lint(session: Session) -> None: session.run("pflake8", *args) -@session() +@session(tags=["style"]) def pyroma(session: Session) -> None: session.install("poetry", "pyroma") session.run("pyroma", "--min", "10", ".") -@session() +@session(tags=["style", "docs"]) def doctests(session: Session) -> None: session.install(".[all]") session.install("xdoctest") @@ -41,14 +49,14 @@ def doctests(session: Session) -> None: session.run("xdoctest", "-m", "kiez") -@session() +@session(tags=["style"]) def type_checking(session: Session) -> None: args = session.posargs or locations session.install("mypy") session.run("mypy", "--ignore-missing-imports", *args) -@session() +@session(tags=["docs"]) def build_docs(session: Session) -> None: session.install(".") session.install("sphinx") diff --git a/pyproject.toml b/pyproject.toml index 5b9c990..d1d2cd7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ mypy = "^0.960" [tool.poetry.extras] docs = ["sphinx", "insegel"] -all = ["ngt","annoy","nmslib","faiss-cpu","faiss-gpu","autofaiss"] +all = ["annoy","nmslib","faiss-cpu","faiss-gpu","autofaiss"] ngt = ["ngt"] nmslib = ["nmslib"] annoy = ["annoy"] diff --git a/tests/analysis/test_estimation.py b/tests/analysis/test_estimation.py index 1f040ac..40a4227 100644 --- a/tests/analysis/test_estimation.py +++ b/tests/analysis/test_estimation.py @@ -6,9 +6,10 @@ import numpy as np import pytest +from numpy.testing import assert_array_equal + from kiez.analysis import hubness_score from kiez.analysis.estimation import _calc_atkinson_index, _calc_gini_index -from numpy.testing import assert_array_equal PRE_CALC_NEIGHBORS = np.load("tests/nn_ind.npy") @@ -108,9 +109,9 @@ def test_hubness_return_values_are_self_consistent(k): np.testing.assert_array_equal(occ, occ_true) # Calculate skewness (different method than in module) x0 = occ - occ.mean() - s2 = (x0 ** 2).mean() - m3 = (x0 ** 3).mean() - skew_true = m3 / (s2 ** 1.5) + s2 = (x0**2).mean() + m3 = (x0**3).mean() + skew_true = m3 / (s2**1.5) np.testing.assert_equal(skew, skew_true) diff --git a/tests/evaluate/test_eval_metrics.py b/tests/evaluate/test_eval_metrics.py index f8211eb..e23e67b 100644 --- a/tests/evaluate/test_eval_metrics.py +++ b/tests/evaluate/test_eval_metrics.py @@ -1,4 +1,5 @@ import pytest + from kiez.evaluate import hits diff --git a/tests/hubness_reduction/test_mutual_proximity.py b/tests/hubness_reduction/test_mutual_proximity.py index 5836479..bf1eb75 100644 --- a/tests/hubness_reduction/test_mutual_proximity.py +++ b/tests/hubness_reduction/test_mutual_proximity.py @@ -1,8 +1,9 @@ import numpy as np import pytest +from numpy.testing import assert_array_equal + from kiez import Kiez from kiez.hubness_reduction import MutualProximity -from numpy.testing import assert_array_equal rng = np.random.RandomState(2) diff --git a/tests/io/test_data_loading.py b/tests/io/test_data_loading.py index e2de0f9..e9fe80d 100644 --- a/tests/io/test_data_loading.py +++ b/tests/io/test_data_loading.py @@ -1,8 +1,9 @@ import numpy as np import pytest -from kiez.io.data_loading import _seperate_common_embedding from numpy.testing import assert_array_equal +from kiez.io.data_loading import _seperate_common_embedding + @pytest.mark.parametrize( "input,expected", diff --git a/tests/io/test_temp_file_handling.py b/tests/io/test_temp_file_handling.py index 828f30b..4dd8a0f 100644 --- a/tests/io/test_temp_file_handling.py +++ b/tests/io/test_temp_file_handling.py @@ -1,6 +1,7 @@ import os import pytest + from kiez.io.temp_file_handling import create_tempfile_preferably_in_dir diff --git a/tests/neighbors/test_alignment.py b/tests/neighbors/test_alignment.py index db27945..32f2d8b 100644 --- a/tests/neighbors/test_alignment.py +++ b/tests/neighbors/test_alignment.py @@ -1,10 +1,12 @@ import numpy as np import pytest +from numpy.testing import assert_array_almost_equal, assert_array_equal + from kiez import Kiez -from kiez.hubness_reduction import CSLS, DisSimLocal, LocalScaling, MutualProximity +from kiez.hubness_reduction import (CSLS, DisSimLocal, LocalScaling, + MutualProximity) from kiez.neighbors import NMSLIB, NNG, Annoy, Faiss, SklearnNN from kiez.utils.platform import available_ann_algorithms_on_current_platform -from numpy.testing import assert_array_almost_equal, assert_array_equal P = (1, 3, 4, np.inf, 2) # Euclidean last, for tests against approx NN rng = np.random.RandomState(2) diff --git a/tests/neighbors/test_annoy.py b/tests/neighbors/test_annoy.py index 781b7f1..2c10dd4 100644 --- a/tests/neighbors/test_annoy.py +++ b/tests/neighbors/test_annoy.py @@ -1,8 +1,9 @@ import numpy as np import pytest -from kiez.neighbors import Annoy from numpy.testing import assert_array_equal +from kiez.neighbors import Annoy + rng = np.random.RandomState(2) diff --git a/tests/neighbors/test_base.py b/tests/neighbors/test_base.py index 8f74ec4..48a1f28 100644 --- a/tests/neighbors/test_base.py +++ b/tests/neighbors/test_base.py @@ -1,5 +1,6 @@ import numpy as np import pytest + from kiez.neighbors import NMSLIB, NNG, Annoy, Faiss, SklearnNN rng = np.random.RandomState(2) diff --git a/tests/neighbors/test_faiss.py b/tests/neighbors/test_faiss.py index 5b996ca..892400e 100644 --- a/tests/neighbors/test_faiss.py +++ b/tests/neighbors/test_faiss.py @@ -1,8 +1,9 @@ import numpy as np import pytest -from kiez.neighbors import Faiss from numpy.testing import assert_array_equal +from kiez.neighbors import Faiss + @pytest.mark.parametrize("single_source", [True, False]) def test_different_instantiations(single_source): diff --git a/tests/neighbors/test_hnsw.py b/tests/neighbors/test_hnsw.py index 6678a2f..1e7b963 100644 --- a/tests/neighbors/test_hnsw.py +++ b/tests/neighbors/test_hnsw.py @@ -1,8 +1,9 @@ import numpy as np import pytest -from kiez.neighbors import NMSLIB from numpy.testing import assert_array_equal +from kiez.neighbors import NMSLIB + rng = np.random.RandomState(2) diff --git a/tests/neighbors/test_nng.py b/tests/neighbors/test_nng.py index fed6753..d03945f 100644 --- a/tests/neighbors/test_nng.py +++ b/tests/neighbors/test_nng.py @@ -1,8 +1,9 @@ import numpy as np import pytest -from kiez.neighbors import NNG from numpy.testing import assert_array_equal +from kiez.neighbors import NNG + rng = np.random.RandomState(2) diff --git a/tests/neighbors/test_sklearn.py b/tests/neighbors/test_sklearn.py index ea49892..8154736 100644 --- a/tests/neighbors/test_sklearn.py +++ b/tests/neighbors/test_sklearn.py @@ -1,7 +1,8 @@ import numpy as np -from kiez.neighbors import SklearnNN from numpy.testing import assert_array_equal +from kiez.neighbors import SklearnNN + rng = np.random.RandomState(2) diff --git a/tests/test_kiez.py b/tests/test_kiez.py index d7daa02..18cec5b 100644 --- a/tests/test_kiez.py +++ b/tests/test_kiez.py @@ -3,17 +3,14 @@ import numpy as np import pytest -from kiez import Kiez -from kiez.hubness_reduction import ( - DisSimLocal, - HubnessReduction, - LocalScaling, - NoHubnessReduction, -) -from kiez.neighbors import NMSLIB, NNAlgorithm, SklearnNN from numpy.testing import assert_array_equal from sklearn.neighbors import NearestNeighbors +from kiez import Kiez +from kiez.hubness_reduction import (DisSimLocal, HubnessReduction, + LocalScaling, NoHubnessReduction) +from kiez.neighbors import NMSLIB, NNAlgorithm, SklearnNN + HERE = pathlib.Path(__file__).parent.resolve() rng = np.random.RandomState(2)