diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 96342aa8..34799a4f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,17 +2,14 @@ exclude: 'dev' repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-merge-conflict # checks for files that contain merge conflict strings - id: check-toml # checks toml files for parseable syntax - id: debug-statements # checks for debugger imports and py37+ `breakpoint()` calls in python source -# - id: trailing-whitespace # needs more checks -# args: [--markdown-linebreak-ext=md] -# exclude: 'discretisedfield/tests/test_sample/.*' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.11 + rev: v0.4.4 hooks: # Run the linter. - id: ruff diff --git a/discretisedfield/__init__.py b/discretisedfield/__init__.py index 6251a144..d83bc86b 100644 --- a/discretisedfield/__init__.py +++ b/discretisedfield/__init__.py @@ -1,18 +1,19 @@ """Finite-difference fields.""" + import importlib.metadata import pathlib import matplotlib.pyplot as plt import pytest -from . import tools # noqa: F401 -from .field import Field # noqa: F401 -from .field_rotator import FieldRotator # noqa: F401 -from .interact import interact # noqa: F401 -from .line import Line # noqa: F401 -from .mesh import Mesh # noqa: F401 -from .operators import integrate # noqa: F401 -from .region import Region # noqa: F401 +from . import tools as tools +from .field import Field as Field +from .field_rotator import FieldRotator as FieldRotator +from .interact import interact as interact +from .line import Line as Line +from .mesh import Mesh as Mesh +from .operators import integrate as integrate +from .region import Region as Region # Enable default plotting style. plt.style.use(pathlib.Path(__file__).parent / "plotting" / "plotting-style.mplstyle") diff --git a/discretisedfield/field.py b/discretisedfield/field.py index 00fb2a48..046476b1 100644 --- a/discretisedfield/field.py +++ b/discretisedfield/field.py @@ -601,7 +601,7 @@ def vdim_mapping(self, vdim_mapping): def _r_dim_mapping(self): """Map dims to vdims.""" reversed_mapping = {val: key for key, val in self.vdim_mapping.items()} - return {dim: reversed_mapping.get(dim, None) for dim in self.mesh.region.dims} + return {dim: reversed_mapping.get(dim) for dim in self.mesh.region.dims} def __abs__(self): """Absolute value of the field. @@ -1647,12 +1647,12 @@ def __truediv__(self, other): 2. Divide vector field by a scalar. - >>> f1 = df.Field(mesh, nvdim=3, value=(0, 10, 5)) + >>> f1 = df.Field(mesh, nvdim=3, value=(20, 10, 5)) >>> res = f1 / 5 # discretisedfield.Field.__mul__ is called >>> res.mean() - array([0., 2., 1.]) - >>> (10 / f1).mean() # division by a vector is not allowed - array([inf, 1., 2.]) + array([4., 2., 1.]) + >>> (10 / f1).mean() + array([0.5, 1. , 2. ]) .. seealso:: :py:func:`~discretisedfield.Field.__mul__` diff --git a/discretisedfield/io/__init__.py b/discretisedfield/io/__init__.py index 2076b57b..3346626c 100644 --- a/discretisedfield/io/__init__.py +++ b/discretisedfield/io/__init__.py @@ -5,6 +5,7 @@ and :py:func:`discretisedfield.Field.fromfile` instead. """ + import json import pathlib diff --git a/discretisedfield/io/ovf2vtk.py b/discretisedfield/io/ovf2vtk.py index c2ae7c1c..b144d695 100644 --- a/discretisedfield/io/ovf2vtk.py +++ b/discretisedfield/io/ovf2vtk.py @@ -1,4 +1,5 @@ """OVF to VTK file conversion.""" + import argparse import discretisedfield as df diff --git a/discretisedfield/mesh.py b/discretisedfield/mesh.py index 6038945d..c17f0909 100644 --- a/discretisedfield/mesh.py +++ b/discretisedfield/mesh.py @@ -1544,7 +1544,7 @@ def dV(self): 8.0 """ - return np.product(self.cell) + return np.prod(self.cell) def scale(self, factor, reference_point=None, inplace=False): """Scale the underlying region and all subregions. diff --git a/discretisedfield/plotting/__init__.py b/discretisedfield/plotting/__init__.py index 3ad09ae3..c742840b 100644 --- a/discretisedfield/plotting/__init__.py +++ b/discretisedfield/plotting/__init__.py @@ -1,14 +1,14 @@ """Matplotlib based plotting.""" -# ruff: noqa: F401 -from discretisedfield.plotting import util -from discretisedfield.plotting.hv import Hv -from discretisedfield.plotting.k3d_field import K3dField -from discretisedfield.plotting.k3d_mesh import K3dMesh -from discretisedfield.plotting.k3d_region import K3dRegion -from discretisedfield.plotting.mpl import add_colorwheel -from discretisedfield.plotting.mpl_field import MplField -from discretisedfield.plotting.mpl_mesh import MplMesh -from discretisedfield.plotting.mpl_region import MplRegion -from discretisedfield.plotting.pyvista_field import PyVistaField -from discretisedfield.plotting.pyvista_mesh import PyVistaMesh -from discretisedfield.plotting.pyvista_region import PyVistaRegion + +from discretisedfield.plotting import util as util +from discretisedfield.plotting.hv import Hv as Hv +from discretisedfield.plotting.k3d_field import K3dField as K3dField +from discretisedfield.plotting.k3d_mesh import K3dMesh as K3dMesh +from discretisedfield.plotting.k3d_region import K3dRegion as K3dRegion +from discretisedfield.plotting.mpl import add_colorwheel as add_colorwheel +from discretisedfield.plotting.mpl_field import MplField as MplField +from discretisedfield.plotting.mpl_mesh import MplMesh as MplMesh +from discretisedfield.plotting.mpl_region import MplRegion as MplRegion +from discretisedfield.plotting.pyvista_field import PyVistaField as PyVistaField +from discretisedfield.plotting.pyvista_mesh import PyVistaMesh as PyVistaMesh +from discretisedfield.plotting.pyvista_region import PyVistaRegion as PyVistaRegion diff --git a/discretisedfield/plotting/hv.py b/discretisedfield/plotting/hv.py index a7178931..0c6d3d0c 100644 --- a/discretisedfield/plotting/hv.py +++ b/discretisedfield/plotting/hv.py @@ -1,4 +1,5 @@ """Holoviews-based plotting.""" + import contextlib import copy import functools diff --git a/discretisedfield/plotting/k3d_field.py b/discretisedfield/plotting/k3d_field.py index bcd71218..88e41dd7 100644 --- a/discretisedfield/plotting/k3d_field.py +++ b/discretisedfield/plotting/k3d_field.py @@ -1,4 +1,5 @@ """K3d based plotting.""" + import k3d import matplotlib import numpy as np diff --git a/discretisedfield/plotting/mpl.py b/discretisedfield/plotting/mpl.py index 6078d4b1..2b96688d 100644 --- a/discretisedfield/plotting/mpl.py +++ b/discretisedfield/plotting/mpl.py @@ -1,4 +1,5 @@ """Matplotlib-based plotting.""" + import abc import matplotlib.pyplot as plt diff --git a/discretisedfield/plotting/mpl_field.py b/discretisedfield/plotting/mpl_field.py index 56e3be37..2bb9ab51 100644 --- a/discretisedfield/plotting/mpl_field.py +++ b/discretisedfield/plotting/mpl_field.py @@ -1,4 +1,5 @@ """Matplotlib-based plotting.""" + import warnings import matplotlib.pyplot as plt diff --git a/discretisedfield/tests/test_field.py b/discretisedfield/tests/test_field.py index 2b0a533a..e63dd936 100644 --- a/discretisedfield/tests/test_field.py +++ b/discretisedfield/tests/test_field.py @@ -3997,16 +3997,16 @@ def test_pyvista_scalar(test_field): def test_pyvista_volume(test_field): # Default - test_field.a.pyvista.volume() + test_field.c.pyvista.volume() # Colormap - test_field.a.pyvista.volume(cmap="hsv") + test_field.c.pyvista.volume(cmap="hsv") # Multiplier - test_field.a.pyvista.volume(multiplier=1e-6) + test_field.c.pyvista.volume(multiplier=1e-6) # 3D - test_field.pyvista.volume(scalars=test_field.vdims[0]) + test_field.pyvista.volume(scalars=test_field.vdims[2]) # Plotter plotter = pv.Plotter() diff --git a/discretisedfield/tools/__init__.py b/discretisedfield/tools/__init__.py index d63619a6..52d1dc14 100644 --- a/discretisedfield/tools/__init__.py +++ b/discretisedfield/tools/__init__.py @@ -1,13 +1,11 @@ """Convenience tools""" -# ruff: noqa: F401 -from .tools import ( - count_bps, - count_large_cell_angle_regions, - demag_field, - demag_tensor, - emergent_magnetic_field, - max_neighbouring_cell_angle, - neighbouring_cell_angle, - topological_charge, - topological_charge_density, -) + +from .tools import count_bps as count_bps +from .tools import count_large_cell_angle_regions as count_large_cell_angle_regions +from .tools import demag_field as demag_field +from .tools import demag_tensor as demag_tensor +from .tools import emergent_magnetic_field as emergent_magnetic_field +from .tools import max_neighbouring_cell_angle as max_neighbouring_cell_angle +from .tools import neighbouring_cell_angle as neighbouring_cell_angle +from .tools import topological_charge as topological_charge +from .tools import topological_charge_density as topological_charge_density diff --git a/discretisedfield/tools/tools.py b/discretisedfield/tools/tools.py index 37d4dc8b..74e42d50 100644 --- a/discretisedfield/tools/tools.py +++ b/discretisedfield/tools/tools.py @@ -273,9 +273,9 @@ def topological_charge(field, /, method="continuous", absolute=False): q = topological_charge_density(field, method=method) if absolute: - return float(abs(q).integrate()) + return abs(q).integrate().item() else: - return float(q.integrate()) + return q.integrate().item() def emergent_magnetic_field(field): diff --git a/discretisedfield/util/__init__.py b/discretisedfield/util/__init__.py index ec30703b..7e3145d9 100644 --- a/discretisedfield/util/__init__.py +++ b/discretisedfield/util/__init__.py @@ -1,2 +1,4 @@ -# ruff: noqa: F401 -from .util import array2tuple, assemble_index, bergluescher_angle, rescale_xarray +from .util import array2tuple as array2tuple +from .util import assemble_index as assemble_index +from .util import bergluescher_angle as bergluescher_angle +from .util import rescale_xarray as rescale_xarray diff --git a/pyproject.toml b/pyproject.toml index 60e69bb2..c8ca26c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,10 +68,12 @@ repository = "https://github.com/ubermag/discretisedfield" [project.scripts] ovf2vtk = "discretisedfield.io.ovf2vtk:ovf2vtk" -[tool.ruff] -ignore-init-module-imports = true # do not remove unused imports in __init__ and warn instead + +[tool.coverage.run] +omit = ["discretisedfield/tests/*"] [tool.ruff.lint] +ignore-init-module-imports = true # do not remove unused imports in __init__ and warn instead select = [ "B", # flake8-bugbear "E", # pycodestyle @@ -97,15 +99,20 @@ ignore = [ [tool.ruff.lint.isort] known-local-folder = ["discretisedfield"] -[tool.ruff.per-file-ignores] -"*.ipynb" = ["B018", "E501", "F811"] -# F811: 'redefined-while-unused'; many false positives in notebooks because ipywidgets decorated functions are not recognised -# E501: line too long -# B018: "Found useless expression. Either assign it to a variable or remove it." - +[tool.ruff.lint.per-file-ignores] +"*.ipynb" = [ + "B018", # "Found useless expression. Either assign it to a variable or remove it."; false positives when using implicit __repr__ in the notebook + "E501", # line too long + "F811", # 'redefined-while-unused'; many false positives in notebooks because ipywidgets decorated functions are not recognised +] -[tool.coverage.run] -omit = ["discretisedfield/tests/*"] +[tool.pytest.ini_options] +filterwarnings = [ + "error", + "ignore:((.|\n)*)Sentinel is not a public part of the traitlets API((.|\n)*)", # dependency of k3d + "ignore:((.|\n)*)`ipykernel.pylab.backend_inline` is deprecated((.|\n)*)", # dependency of ipywidgets + "ignore:((.|\n)*)Automatic coloring is only supported for 3d fields.((.|\n)*)", # Our warning +] [tool.setuptools.packages.find] include = ["discretisedfield*"] diff --git a/setup.cfg b/setup.cfg index 96139012..a73006a5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,30 +1,2 @@ -[flake8] -exclude = - .git, - __pycache__, - build, - dev, - dist, - setup.py -# black has a longer default line length -max-line-length = 88 -# D107: missing docstring in __init__ -# E203: withespace before ':', required for black -# RST210: Inline strong start-string without end-string. # complains about "**kwargs" in docstrings -extend-ignore = D107,RST210,E203 -per-file-ignores = - # imported but unused - __init__.py: F401 - # ignore missing docstrings in tests - test_*.py: D100,D101,D102,D103 -docstring-convention: numpy -# flake8-rst-docstrings: -rst-roles = - py:class, - py:func, -rst-directives = - seealso, - plot, - [codespell] skip = .*,build/*,dev/*,dist/* diff --git a/tasks.py b/tasks.py index e8b7c286..87849430 100644 --- a/tasks.py +++ b/tasks.py @@ -1,4 +1,5 @@ """Tasks to release the package.""" + import os import shutil