From e78d4c8916206b96aec789e372c17fcf3333b4b4 Mon Sep 17 00:00:00 2001 From: Robin De Schepper Date: Thu, 30 Nov 2023 18:32:31 +0100 Subject: [PATCH] Add `isort` to pre commit hooks and CI (#780) * isort config * isort * set black profile * black isort * removed double set of black profile * hike required python to 3.9 * fix isort MPI * fix circular import * fix imports after merge * revert merge trigger * fix isort --- .github/workflows/isort.yml | 19 ++++++++ .pre-commit-config.yaml | 9 +++- bsb/_encoding.py | 4 +- bsb/_util.py | 5 +-- bsb/cell_types.py | 2 +- bsb/cli/__init__.py | 9 ++-- bsb/cli/commands/__init__.py | 1 + bsb/cli/commands/_commands.py | 14 +++--- bsb/cli/commands/_projects.py | 8 ++-- bsb/config/__init__.py | 44 ++++++++++--------- bsb/config/_attrs.py | 30 ++++++------- bsb/config/_compile.py | 1 - bsb/config/_config.py | 23 ++++------ bsb/config/_distributions.py | 7 ++- bsb/config/_make.py | 26 ++++++----- bsb/config/refs.py | 2 +- bsb/config/types.py | 14 +++--- bsb/connectivity/__init__.py | 4 +- bsb/connectivity/detailed/__init__.py | 7 +-- .../detailed/fiber_intersection.py | 10 +++-- bsb/connectivity/detailed/shared.py | 8 ++-- bsb/connectivity/detailed/touch_detection.py | 10 +++-- .../detailed/voxel_intersection.py | 12 ++--- bsb/connectivity/general.py | 3 +- bsb/connectivity/import_.py | 6 +-- bsb/connectivity/strategy.py | 14 +++--- bsb/core.py | 38 +++++++--------- bsb/exceptions.py | 3 +- bsb/mixins.py | 5 +-- bsb/morphologies/__init__.py | 16 ++++--- bsb/morphologies/selector.py | 21 ++++----- bsb/option.py | 8 ++-- bsb/options.py | 7 +-- bsb/placement/__init__.py | 10 ++--- bsb/placement/arrays.py | 9 ++-- bsb/placement/distributor.py | 20 +++++---- bsb/placement/import_.py | 10 ++--- bsb/placement/indicator.py | 9 ++-- bsb/placement/particle.py | 14 +++--- bsb/placement/satellite.py | 12 ++--- bsb/placement/strategy.py | 21 ++++----- bsb/plugins.py | 4 +- bsb/postprocessing.py | 5 ++- bsb/profiling.py | 15 ++++--- bsb/reporting.py | 13 +++--- bsb/services/__init__.py | 1 - bsb/services/_util.py | 3 +- bsb/services/mpi.py | 5 ++- bsb/services/mpilock.py | 3 +- bsb/services/pool.py | 5 ++- bsb/simulation/__init__.py | 3 +- bsb/simulation/_backends.py | 3 +- bsb/simulation/adapter.py | 6 +-- bsb/simulation/cell.py | 4 +- bsb/simulation/component.py | 1 + bsb/simulation/results.py | 2 +- bsb/simulation/simulation.py | 15 ++++--- bsb/simulation/targetting.py | 1 + bsb/storage/__init__.py | 8 ++-- bsb/storage/_chunks.py | 1 + bsb/storage/_files.py | 25 ++++++----- bsb/storage/fs/__init__.py | 5 ++- bsb/storage/fs/file_store.py | 2 +- bsb/storage/interfaces.py | 8 ++-- bsb/topology/__init__.py | 7 +-- bsb/topology/_layout.py | 1 + bsb/topology/partition.py | 25 ++++++----- bsb/topology/region.py | 7 +-- bsb/trees.py | 3 +- bsb/voxels.py | 8 ++-- docs/getting-started/getting_started.py | 4 +- docs/getting-started/include_morphos.py | 7 +-- examples/atlas/allen_structures.py | 5 ++- examples/distributors/morphology_generator.py | 5 ++- .../space_aware_morphology_distributor.py | 3 +- examples/morphologies/labels.py | 3 +- examples/morphologies/neuromorpho.py | 2 +- examples/networks/access_placement.py | 3 +- examples/networks/create_from_cfg.py | 2 +- examples/networks/reconfiguring.py | 2 +- .../simulation/nest/repeated_simulations.py | 3 +- examples/simulation/parameter_sweep.py | 8 ++-- pyproject.toml | 5 +++ tests/test_chunks.py | 2 +- tests/test_cli.py | 17 ++++--- tests/test_compilation.py | 7 +-- tests/test_configuration.py | 22 +++++----- tests/test_connectivity.py | 22 +++++----- tests/test_core.py | 10 +++-- tests/test_distributors.py | 10 +++-- tests/test_entities.py | 8 +++- tests/test_fiber_intersection.py | 10 ++++- tests/test_issues.py | 3 +- tests/test_morphologies.py | 21 +++++---- tests/test_options.py | 17 +++---- tests/test_placement.py | 27 ++++++------ tests/test_postprocessing.py | 15 ++++--- tests/test_selectors.py | 23 +++++++--- tests/test_simulation.py | 10 ++--- tests/test_topology.py | 7 ++- tests/test_trees.py | 3 +- tests/test_util.py | 8 +--- tests/test_voxels.py | 15 ++++--- 103 files changed, 562 insertions(+), 431 deletions(-) create mode 100644 .github/workflows/isort.yml diff --git a/.github/workflows/isort.yml b/.github/workflows/isort.yml new file mode 100644 index 000000000..61a76d293 --- /dev/null +++ b/.github/workflows/isort.yml @@ -0,0 +1,19 @@ +name: Run isort +on: + - push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install apt dependencies + run: | + sudo apt update + # Install `libopenmpi` for MPI + sudo apt install openmpi-bin libopenmpi-dev + - run: pip install -e .[parallel] + - uses: isort/isort-action@master \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 86e3a1c78..1baeee938 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,11 @@ repos: - - repo: https://github.com/psf/black + - repo: https://github.com/psf/black-pre-commit-mirror rev: 23.11.0 hooks: - id: black - language_version: python3 + language_version: python3.11 + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) \ No newline at end of file diff --git a/bsb/_encoding.py b/bsb/_encoding.py index 51e774649..f4ec46205 100644 --- a/bsb/_encoding.py +++ b/bsb/_encoding.py @@ -1,5 +1,7 @@ -import numpy as np import itertools + +import numpy as np + from ._util import obj_str_insert diff --git a/bsb/_util.py b/bsb/_util.py index 87ca07e5a..b0edcf11e 100644 --- a/bsb/_util.py +++ b/bsb/_util.py @@ -1,13 +1,12 @@ +import contextlib as _ctxlib +import functools import itertools as _it import os as _os import sys as _sys -import contextlib as _ctxlib import typing import numpy as np - import numpy as _np -import functools ichain = _it.chain.from_iterable diff --git a/bsb/cell_types.py b/bsb/cell_types.py index 91c498a41..6155b74d0 100644 --- a/bsb/cell_types.py +++ b/bsb/cell_types.py @@ -4,9 +4,9 @@ import typing from . import config +from ._util import obj_str_insert from .config import types from .placement.indicator import PlacementIndications -from ._util import obj_str_insert if typing.TYPE_CHECKING: from .core import Scaffold diff --git a/bsb/cli/__init__.py b/bsb/cli/__init__.py index 7184f9ed9..beb8966c6 100644 --- a/bsb/cli/__init__.py +++ b/bsb/cli/__init__.py @@ -1,9 +1,10 @@ +import builtins +import inspect +import sys + from .._contexts import get_cli_context, reset_cli_context -from .commands import load_root_command from ..exceptions import * -import sys -import inspect -import builtins +from .commands import load_root_command def handle_cli(): diff --git a/bsb/cli/commands/__init__.py b/bsb/cli/commands/__init__.py index ebe7c46da..322d66cee 100644 --- a/bsb/cli/commands/__init__.py +++ b/bsb/cli/commands/__init__.py @@ -7,6 +7,7 @@ BSB. """ import argparse + from ...exceptions import CommandError from ...reporting import report diff --git a/bsb/cli/commands/_commands.py b/bsb/cli/commands/_commands.py index f87d4dddf..cfa0de857 100644 --- a/bsb/cli/commands/_commands.py +++ b/bsb/cli/commands/_commands.py @@ -1,17 +1,18 @@ """ Contains builtin commands. """ +import itertools from uuid import uuid4 -from . import BaseCommand -from ...option import BsbOption +import errr + from ..._options import ConfigOption -from ...core import from_storage, Scaffold -from ...storage import open_storage from ...config import from_file +from ...core import Scaffold, from_storage from ...exceptions import NodeNotFoundError -import itertools -import errr +from ...option import BsbOption +from ...storage import open_storage +from . import BaseCommand class XScale(BsbOption, name="x", cli=("x",), env=("BSB_CONFIG_NETWORK_X",)): @@ -227,6 +228,7 @@ class CacheCommand(BaseCommand, name="cache"): # pragma: nocover def handler(self, context): import shutil from datetime import datetime + from ...storage._util import _cache_path if context.clear: diff --git a/bsb/cli/commands/_projects.py b/bsb/cli/commands/_projects.py index dcadffdd8..416e41e74 100644 --- a/bsb/cli/commands/_projects.py +++ b/bsb/cli/commands/_projects.py @@ -1,9 +1,11 @@ -from . import BaseCommand -from ...reporting import report -from ... import config import pathlib + import toml +from ... import config +from ...reporting import report +from . import BaseCommand + class ProjectNewCommand(BaseCommand, name="new"): def get_options(self): diff --git a/bsb/config/__init__.py b/bsb/config/__init__.py index 02ec6cd07..e380f31b1 100644 --- a/bsb/config/__init__.py +++ b/bsb/config/__init__.py @@ -6,42 +6,46 @@ config.attr/dict/list/ref/reflist`` to populate your classes with powerful attributes. """ -import os -import sys +import builtins import glob import itertools +import os +import sys +import traceback import typing from importlib.machinery import ModuleSpec from shutil import copy2 as copy_file -import builtins -import traceback +from .. import plugins +from .._util import ichain +from ..exceptions import ConfigTemplateNotFoundError, ParserError, PluginError +from . import parsers from ._attrs import ( + ConfigurationAttribute, attr, - list, + catch_all, dict, + dynamic, file, + list, node, - root, - dynamic, + pluggable, + property, + provide, ref, reflist, + root, slot, - property, - provide, unset, - pluggable, - catch_all, - ConfigurationAttribute, ) -from .._util import ichain -from ._make import walk_node_attributes, walk_nodes, compose_nodes, get_config_attributes -from ._hooks import on, before, after, run_hook, has_hook from ._distributions import Distribution -from .. import plugins -from ..exceptions import ConfigTemplateNotFoundError, ParserError, PluginError -from . import parsers - +from ._hooks import after, before, has_hook, on, run_hook +from ._make import ( + compose_nodes, + get_config_attributes, + walk_node_attributes, + walk_nodes, +) _path = __path__ ConfigurationAttribute.__module__ = __name__ @@ -56,7 +60,7 @@ # ConfigurationModule should not inherit from `ModuleType`, otherwise Sphinx doesn't # document all the properties. class ConfigurationModule: - from . import types, refs + from . import refs, types def __init__(self, name): self.__name__ = name diff --git a/bsb/config/_attrs.py b/bsb/config/_attrs.py index 3c55ba464..36b900416 100644 --- a/bsb/config/_attrs.py +++ b/bsb/config/_attrs.py @@ -1,34 +1,34 @@ """ An attrs-inspired class annotation system, but my A stands for amateuristic. """ +import builtins import traceback import errr +from ..exceptions import ( + BootError, + CastError, + CfgReferenceError, + NoReferenceAttributeSignal, + RequirementError, +) +from ..services import MPI +from ._compile import _wrap_reserved from ._hooks import run_hook from ._make import ( MISSING, + _resolve_references, compile_class, - compile_postnew, - compile_new, compile_isc, - make_get_node_name, + compile_new, + compile_postnew, make_dictable, + make_get_node_name, make_tree, - wrap_root_postnew, walk_nodes, - _resolve_references, -) -from ._compile import _wrap_reserved -from ..exceptions import ( - RequirementError, - NoReferenceAttributeSignal, - CastError, - CfgReferenceError, - BootError, + wrap_root_postnew, ) -from ..services import MPI -import builtins def root(root_cls): diff --git a/bsb/config/_compile.py b/bsb/config/_compile.py index a7173b0f4..60d7a25d2 100644 --- a/bsb/config/_compile.py +++ b/bsb/config/_compile.py @@ -1,7 +1,6 @@ import functools from inspect import signature as _inspect_signature - _reserved_keywords = ["_parent", "_key"] diff --git a/bsb/config/_config.py b/bsb/config/_config.py index 84e3e905f..ac9d76aaf 100644 --- a/bsb/config/_config.py +++ b/bsb/config/_config.py @@ -1,24 +1,19 @@ import typing +import numpy as np + from .. import config -from . import types +from .._util import merge_dicts from ..cell_types import CellType -from ._attrs import _boot_nodes, cfgdict, cfglist +from ..connectivity import ConnectionStrategy from ..placement import PlacementStrategy +from ..postprocessing import PostProcessingHook +from ..simulation.simulation import Simulation from ..storage._files import CodeDependencyNode, MorphologyDependencyNode from ..storage.interfaces import StorageNode -from ..connectivity import ConnectionStrategy -from ..simulation.simulation import Simulation -from ..postprocessing import PostProcessingHook -from .._util import merge_dicts -from ..topology import ( - get_partitions, - create_topology, - RegionGroup, - Region, - Partition, -) -import numpy as np +from ..topology import Partition, Region, RegionGroup, create_topology, get_partitions +from . import types +from ._attrs import _boot_nodes, cfgdict, cfglist if typing.TYPE_CHECKING: from ..core import Scaffold diff --git a/bsb/config/_distributions.py b/bsb/config/_distributions.py index 7565473b3..fa1454953 100644 --- a/bsb/config/_distributions.py +++ b/bsb/config/_distributions.py @@ -1,9 +1,12 @@ import typing +import errr +import numpy as np +import scipy.stats.distributions as _distributions + from .. import config -from . import types from ..exceptions import DistributionCastError -import scipy.stats.distributions as _distributions, errr, numpy as np +from . import types if typing.TYPE_CHECKING: from ..core import Scaffold diff --git a/bsb/config/_make.py b/bsb/config/_make.py index 712a37726..9b84d0a5c 100644 --- a/bsb/config/_make.py +++ b/bsb/config/_make.py @@ -1,24 +1,26 @@ +import importlib +import inspect +import os +import sys +import types +import warnings +from re import sub + +import errr + from ..exceptions import ( CastError, - RequirementError, ConfigurationWarning, + DynamicClassError, DynamicClassInheritanceError, + DynamicObjectNotFoundError, + PluginError, + RequirementError, UnfitClassCastError, - DynamicClassError, UnresolvedClassCastError, - PluginError, - DynamicObjectNotFoundError, ) from ..reporting import warn from ._hooks import overrides -from re import sub -import warnings -import errr -import importlib -import inspect -import sys -import os -import types def _has_own_init(meta_subject, kwargs): diff --git a/bsb/config/refs.py b/bsb/config/refs.py index c07455dbb..9a6647b76 100644 --- a/bsb/config/refs.py +++ b/bsb/config/refs.py @@ -74,7 +74,7 @@ def __call__(self, root, here): return merged def is_ref(self, value): - from ..topology import Region, Partition + from ..topology import Partition, Region return isinstance(value, Region) or isinstance(value, Partition) diff --git a/bsb/config/types.py b/bsb/config/types.py index 473f7bbfd..3851cc2b2 100644 --- a/bsb/config/types.py +++ b/bsb/config/types.py @@ -2,18 +2,20 @@ import builtins import inspect import math -import numpy as np from weakref import WeakKeyDictionary -from ._compile import _reserved_kw_passes, _wrap_reserved -from ._make import _load_object + +import numpy as np + from ..exceptions import ( - ClassMapMissingError, CastError, - NoneReferenceError, + ClassMapMissingError, InvalidReferenceError, - TypeHandlingError, + NoneReferenceError, RequirementError, + TypeHandlingError, ) +from ._compile import _reserved_kw_passes, _wrap_reserved +from ._make import _load_object class TypeHandler(abc.ABC): diff --git a/bsb/connectivity/__init__.py b/bsb/connectivity/__init__.py index b57123ca0..d0eac7e85 100644 --- a/bsb/connectivity/__init__.py +++ b/bsb/connectivity/__init__.py @@ -1,5 +1,5 @@ -from .strategy import ConnectionStrategy from .detailed import * +from .detailed.fiber_intersection import FiberTransform, QuiverTransform from .general import * from .import_ import CsvImportConnectivity -from .detailed.fiber_intersection import FiberTransform, QuiverTransform +from .strategy import ConnectionStrategy diff --git a/bsb/connectivity/detailed/__init__.py b/bsb/connectivity/detailed/__init__.py index 48db696a7..e5d1c831e 100644 --- a/bsb/connectivity/detailed/__init__.py +++ b/bsb/connectivity/detailed/__init__.py @@ -1,8 +1,9 @@ -from ..strategy import ConnectionStrategy -from importlib import import_module +import inspect +import os from glob import glob -import os, inspect +from importlib import import_module +from ..strategy import ConnectionStrategy # Scan the whole directory for python files, then import any ConnectionStrategies into # this module. diff --git a/bsb/connectivity/detailed/fiber_intersection.py b/bsb/connectivity/detailed/fiber_intersection.py index 83d446638..7ccc329a9 100644 --- a/bsb/connectivity/detailed/fiber_intersection.py +++ b/bsb/connectivity/detailed/fiber_intersection.py @@ -1,12 +1,14 @@ +import abc + import numpy as np -from ..strategy import ConnectionStrategy -from .shared import Intersectional +from rtree import index + from ... import config from ...config import types from ...exceptions import * from ...reporting import warn -import abc -from rtree import index +from ..strategy import ConnectionStrategy +from .shared import Intersectional class FiberTransform(abc.ABC): diff --git a/bsb/connectivity/detailed/shared.py b/bsb/connectivity/detailed/shared.py index 535ecaadb..9cdd89492 100644 --- a/bsb/connectivity/detailed/shared.py +++ b/bsb/connectivity/detailed/shared.py @@ -1,11 +1,13 @@ -from itertools import chain from functools import cache +from itertools import chain + import numpy as np + from ... import config from ...config import types -from ...storage import Chunk -from ...reporting import warn from ...exceptions import ConnectivityWarning +from ...reporting import warn +from ...storage import Chunk class Intersectional: diff --git a/bsb/connectivity/detailed/touch_detection.py b/bsb/connectivity/detailed/touch_detection.py index d21086478..f73a164d5 100644 --- a/bsb/connectivity/detailed/touch_detection.py +++ b/bsb/connectivity/detailed/touch_detection.py @@ -1,10 +1,12 @@ -import numpy as np -from ..strategy import ConnectionStrategy -from .shared import Intersectional -from ...reporting import report, warn from random import sample as sample_elements + +import numpy as np + from ... import config from ...config import types +from ...reporting import report, warn +from ..strategy import ConnectionStrategy +from .shared import Intersectional class TouchInformation: diff --git a/bsb/connectivity/detailed/voxel_intersection.py b/bsb/connectivity/detailed/voxel_intersection.py index f6a532442..aeeb41453 100644 --- a/bsb/connectivity/detailed/voxel_intersection.py +++ b/bsb/connectivity/detailed/voxel_intersection.py @@ -1,12 +1,14 @@ -import numpy as np -from numpy.random import default_rng import itertools import random -from ..strategy import ConnectionStrategy -from .shared import Intersectional + +import numpy as np +from numpy.random import default_rng + from ... import config -from ...config import types from ..._util import ichain +from ...config import types +from ..strategy import ConnectionStrategy +from .shared import Intersectional _rng = default_rng() diff --git a/bsb/connectivity/general.py b/bsb/connectivity/general.py index 9babc6c34..30d2b7440 100644 --- a/bsb/connectivity/general.py +++ b/bsb/connectivity/general.py @@ -3,10 +3,11 @@ import typing import numpy as np -from .strategy import ConnectionStrategy + from .. import config from ..config import types from ..mixins import InvertedRoI +from .strategy import ConnectionStrategy if typing.TYPE_CHECKING: from ..config import Distribution diff --git a/bsb/connectivity/import_.py b/bsb/connectivity/import_.py index 5ac3071cf..b41014275 100644 --- a/bsb/connectivity/import_.py +++ b/bsb/connectivity/import_.py @@ -6,16 +6,16 @@ import psutil from tqdm import tqdm -from ..exceptions import ConfigurationError -from .strategy import ConnectionStrategy from .. import config from ..config import refs +from ..exceptions import ConfigurationError from ..mixins import NotParallel from ..storage.interfaces import PlacementSet +from .strategy import ConnectionStrategy if typing.TYPE_CHECKING: - from ..storage import FileDependencyNode from ..cell_types import CellType + from ..storage import FileDependencyNode from ..topology import Partition diff --git a/bsb/connectivity/strategy.py b/bsb/connectivity/strategy.py index d3c0e252d..a7abacbd2 100644 --- a/bsb/connectivity/strategy.py +++ b/bsb/connectivity/strategy.py @@ -1,20 +1,20 @@ +import abc import typing +from itertools import chain from .. import config +from .._util import ichain, obj_str_insert from ..config import refs, types +from ..mixins import HasDependencies from ..profiling import node_meter from ..reporting import report, warn -from .._util import obj_str_insert, ichain -from ..mixins import HasDependencies -import abc -from itertools import chain if typing.TYPE_CHECKING: - from ..core import Scaffold from ..cell_types import CellType - from ..storage.interfaces import PlacementSet - from ..morphologies import MorphologySet from ..connectivity import ConnectionStrategy + from ..core import Scaffold + from ..morphologies import MorphologySet + from ..storage.interfaces import PlacementSet @config.node diff --git a/bsb/core.py b/bsb/core.py index 88c2ec7db..ea8c75890 100644 --- a/bsb/core.py +++ b/bsb/core.py @@ -1,38 +1,34 @@ -import time -import os import itertools +import os +import time import typing + import numpy as np -from .placement import PlacementStrategy +from ._util import obj_str_insert +from .config._config import Configuration from .connectivity import ConnectionStrategy -from .storage import Chunk, Storage, _util as _storutil, open_storage -from .exceptions import ( - InputError, - NodeNotFoundError, - RedoError, - ScaffoldError, -) +from .exceptions import InputError, NodeNotFoundError, RedoError, ScaffoldError +from .placement import PlacementStrategy +from .profiling import meter from .reporting import report, warn -from .config._config import Configuration -from .services.pool import create_job_pool from .services import MPI +from .services.pool import create_job_pool from .simulation import get_simulation_adapter -from ._util import obj_str_insert -from .profiling import meter +from .storage import Chunk, Storage, open_storage if typing.TYPE_CHECKING: + from .cell_types import CellType + from .config._config import NetworkNode as Network + from .postprocessing import PostProcessingHook + from .simulation.simulation import Simulation from .storage.interfaces import ( - PlacementSet, ConnectivitySet, - MorphologyRepository, FileStore, + MorphologyRepository, + PlacementSet, ) - from .config._config import NetworkNode as Network - from .simulation.simulation import Simulation - from .topology import Region, Partition - from .cell_types import CellType - from .postprocessing import PostProcessingHook + from .topology import Partition, Region @meter() diff --git a/bsb/exceptions.py b/bsb/exceptions.py index ec228f3b5..47c8373c1 100644 --- a/bsb/exceptions.py +++ b/bsb/exceptions.py @@ -1,4 +1,5 @@ -from errr import make_tree as _t, exception as _e +from errr import exception as _e +from errr import make_tree as _t _t( globals(), diff --git a/bsb/mixins.py b/bsb/mixins.py index cd94bdf5d..0e7b1199d 100644 --- a/bsb/mixins.py +++ b/bsb/mixins.py @@ -1,11 +1,10 @@ import abc as _abc +import itertools from graphlib import TopologicalSorter +from . import _util as _gutil from .reporting import report from .storage import Chunk -from . import _util as _gutil - -import itertools def _queue_placement(self, pool, chunk_size): diff --git a/bsb/morphologies/__init__.py b/bsb/morphologies/__init__.py index 6a23b20b5..08fe4a801 100644 --- a/bsb/morphologies/__init__.py +++ b/bsb/morphologies/__init__.py @@ -15,24 +15,26 @@ # In the simulation step, these (possibly dynamically modified) morphologies are passed # to the cell model instantiators. +import functools import inspect import itertools -import functools -import morphio -import numpy as np from collections import deque from pathlib import Path + +import morphio +import numpy as np from scipy.spatial.transform import Rotation + +from .. import _util as _gutil from .._encoding import EncodedLabels -from ..voxels import VoxelSet from ..exceptions import ( - MorphologyError, - MorphologyDataError, EmptyBranchError, + MorphologyDataError, + MorphologyError, MorphologyWarning, ) from ..reporting import warn -from .. import _util as _gutil +from ..voxels import VoxelSet class MorphologySet: diff --git a/bsb/morphologies/selector.py b/bsb/morphologies/selector.py index 119a7e6ee..2cfebaccb 100644 --- a/bsb/morphologies/selector.py +++ b/bsb/morphologies/selector.py @@ -1,19 +1,20 @@ +import abc +import concurrent +import re +import tempfile import typing +import urllib +import warnings +from concurrent.futures import ThreadPoolExecutor + +import requests -from ..config import types from .. import config +from ..config import types from ..config._attrs import cfglist +from ..exceptions import MissingMorphologyError, SelectorError from ..services import MPI -import concurrent -from concurrent.futures import ThreadPoolExecutor -import requests -import abc -import warnings -import re -import urllib -import tempfile from . import Morphology -from ..exceptions import MissingMorphologyError, SelectorError if typing.TYPE_CHECKING: from ..core import Scaffold diff --git a/bsb/option.py b/bsb/option.py index 1e695fc5b..5a5190c23 100644 --- a/bsb/option.py +++ b/bsb/option.py @@ -1,11 +1,13 @@ """ This module contains the classes required to construct options. """ +import argparse +import functools import os -import toml import pathlib -import functools -import argparse + +import toml + from .exceptions import OptionError diff --git a/bsb/options.py b/bsb/options.py index 213f23beb..05dfa7576 100644 --- a/bsb/options.py +++ b/bsb/options.py @@ -27,13 +27,14 @@ def get_default(self): # Store the module magic for unpolluted namespace copy _module_magic = globals().copy() -import sys, types +import sys +import types + +from . import option as _bsboptmod from .exceptions import OptionError, ReadOnlyOptionError from .plugins import discover -from . import option as _bsboptmod from .reporting import report - _options = {} _project_options = {} _module_options = {} diff --git a/bsb/placement/__init__.py b/bsb/placement/__init__.py index 72f96b337..1fba47471 100644 --- a/bsb/placement/__init__.py +++ b/bsb/placement/__init__.py @@ -1,9 +1,7 @@ -from .strategy import ( - PlacementStrategy, - FixedPositions, - Entities, -) -from .import_ import ImportPlacement, CsvImportPlacement +# The strategy module needs to be imported before any module that uses the `NotParallel` mixin. +from .strategy import PlacementStrategy # isort: skip from .arrays import ParallelArrayPlacement +from .import_ import CsvImportPlacement, ImportPlacement from .particle import ParticlePlacement, RandomPlacement from .satellite import Satellite +from .strategy import Entities, FixedPositions diff --git a/bsb/placement/arrays.py b/bsb/placement/arrays.py index 397330bcc..4ff319f43 100644 --- a/bsb/placement/arrays.py +++ b/bsb/placement/arrays.py @@ -1,10 +1,13 @@ -from .strategy import PlacementStrategy -import math, numpy as np +import math + +import numpy as np + from .. import config from ..config import types from ..mixins import NotParallel -from ..storage import Chunk from ..reporting import report, warn +from ..storage import Chunk +from .strategy import PlacementStrategy @config.node diff --git a/bsb/placement/distributor.py b/bsb/placement/distributor.py index 1c7dccbc5..b00709f54 100644 --- a/bsb/placement/distributor.py +++ b/bsb/placement/distributor.py @@ -1,18 +1,20 @@ +import abc +import uuid +from dataclasses import dataclass +from typing import List + +import numpy as np +from scipy.spatial.transform import Rotation + from .. import config from .._util import rotation_matrix_from_vectors from ..config.types import ndarray -from ..storage import NrrdDependencyNode -from ..topology.partition import Partition from ..exceptions import EmptySelectionError -from ..profiling import node_meter from ..morphologies import MorphologySet, RotationSet +from ..profiling import node_meter +from ..storage import NrrdDependencyNode +from ..topology.partition import Partition from .indicator import PlacementIndications -from dataclasses import dataclass -import numpy as np -from scipy.spatial.transform import Rotation -import abc -import uuid -from typing import List @dataclass diff --git a/bsb/placement/import_.py b/bsb/placement/import_.py index 385e57761..6de81e857 100644 --- a/bsb/placement/import_.py +++ b/bsb/placement/import_.py @@ -4,20 +4,20 @@ import typing from collections import defaultdict -import psutil import numpy as np +import psutil from tqdm import tqdm -from .strategy import PlacementStrategy -from ..storage import Chunk -from ..exceptions import ConfigurationError from .. import config from ..config import refs +from ..exceptions import ConfigurationError from ..mixins import NotParallel +from ..storage import Chunk +from .strategy import PlacementStrategy if typing.TYPE_CHECKING: - from ..storage import FileDependencyNode from ..cell_types import CellType + from ..storage import FileDependencyNode from ..topology import Partition diff --git a/bsb/placement/indicator.py b/bsb/placement/indicator.py index 6c3fdd179..0b5f847b6 100644 --- a/bsb/placement/indicator.py +++ b/bsb/placement/indicator.py @@ -1,15 +1,16 @@ import typing -from ..config._attrs import cfglist -from ..exceptions import IndicatorError, PlacementRelationError, PlacementError +import numpy as np + from .. import config from ..config import refs, types +from ..config._attrs import cfglist +from ..exceptions import IndicatorError, PlacementError, PlacementRelationError from ..morphologies.selector import MorphologySelector -import numpy as np if typing.TYPE_CHECKING: - from ..core import Scaffold from ..cell_types import CellType + from ..core import Scaffold @config.node diff --git a/bsb/placement/particle.py b/bsb/placement/particle.py index bf326b8ca..ed29a5ebc 100644 --- a/bsb/placement/particle.py +++ b/bsb/placement/particle.py @@ -1,12 +1,14 @@ -from .strategy import PlacementStrategy -from ..voxels import VoxelSet -from ..exceptions import * -from ..reporting import report, warn -from .. import config import itertools + import numpy as np -from sklearn.neighbors import KDTree from rtree import index +from sklearn.neighbors import KDTree + +from .. import config +from ..exceptions import * +from ..reporting import report, warn +from ..voxels import VoxelSet +from .strategy import PlacementStrategy class _VoxelBasedParticleSystem: diff --git a/bsb/placement/satellite.py b/bsb/placement/satellite.py index cf8cf58ec..4211e1c9e 100644 --- a/bsb/placement/satellite.py +++ b/bsb/placement/satellite.py @@ -1,13 +1,15 @@ +import math import typing +from itertools import chain -from .strategy import PlacementStrategy -import math, numpy as np +import numpy as np + +from .. import config +from ..config import refs, types from ..exceptions import * from ..reporting import report, warn -from .. import config -from ..config import types, refs -from itertools import chain from .indicator import PlacementIndicator +from .strategy import PlacementStrategy if typing.TYPE_CHECKING: from ..cell_types import CellType diff --git a/bsb/placement/strategy.py b/bsb/placement/strategy.py index e236f7c41..9102c34ee 100644 --- a/bsb/placement/strategy.py +++ b/bsb/placement/strategy.py @@ -1,29 +1,30 @@ +import abc +import itertools import typing +import numpy as np + from .. import config +from .._util import obj_str_insert +from ..config import refs, types from ..config._attrs import cfgdict, cfglist from ..exceptions import ( - EmptySelectionError, DistributorError, + EmptySelectionError, MissingSourceError, SourceQualityError, ) +from ..mixins import HasDependencies from ..profiling import node_meter from ..reporting import report -from ..config import refs, types -from ..mixins import HasDependencies -from .._util import obj_str_insert -from ..voxels import VoxelSet from ..storage import Chunk -from .indicator import PlacementIndications, PlacementIndicator +from ..voxels import VoxelSet from .distributor import DistributorsNode -import numpy as np -import itertools -import abc +from .indicator import PlacementIndications, PlacementIndicator if typing.TYPE_CHECKING: - from ..core import Scaffold from ..cell_types import CellType + from ..core import Scaffold from ..topology import Partition diff --git a/bsb/plugins.py b/bsb/plugins.py index 2ba2fe955..46ed8bd67 100644 --- a/bsb/plugins.py +++ b/bsb/plugins.py @@ -4,10 +4,12 @@ """ +import types from importlib.metadata import entry_points + import errr + from .exceptions import PluginError -import types # Before 3.10 `importlib.metadata` was provisional, and didn't have `select` yet. diff --git a/bsb/postprocessing.py b/bsb/postprocessing.py index d47927231..5f14e1f9c 100644 --- a/bsb/postprocessing.py +++ b/bsb/postprocessing.py @@ -1,8 +1,9 @@ -from .reporting import report, warn import numpy as np -from .exceptions import MorphologyError, MorphologyDataError, ConnectivityWarning + from . import config from .config import refs +from .exceptions import ConnectivityWarning, MorphologyDataError, MorphologyError +from .reporting import report, warn @config.dynamic(attr_name="strategy") diff --git a/bsb/profiling.py b/bsb/profiling.py index 8501864eb..d6c683740 100644 --- a/bsb/profiling.py +++ b/bsb/profiling.py @@ -1,15 +1,16 @@ -from functools import cache +import atexit import cProfile -import bsb.options -from bsb.services import MPI -from time import time -from uuid import uuid4 +import functools import pickle -import atexit import sys import traceback -import functools import warnings +from functools import cache +from time import time +from uuid import uuid4 + +import bsb.options +from bsb.services import MPI class Meter: diff --git a/bsb/reporting.py b/bsb/reporting.py index b1959cdab..a15284851 100644 --- a/bsb/reporting.py +++ b/bsb/reporting.py @@ -1,13 +1,12 @@ -from os import PathLike - -from .services import MPI -from . import exceptions as _exc -import functools -import warnings import base64 -import sys +import functools import io +import sys +import warnings +from os import PathLike +from . import exceptions as _exc +from .services import MPI _preamble = chr(240) + chr(80) + chr(85) + chr(248) + chr(228) _preamble_bar = chr(191) * 3 diff --git a/bsb/services/__init__.py b/bsb/services/__init__.py index 61e60394e..eacfce0a5 100644 --- a/bsb/services/__init__.py +++ b/bsb/services/__init__.py @@ -18,7 +18,6 @@ from .pool import JobPool as _JobPool # noqa - JobPool = _JobPool """ JobPool service diff --git a/bsb/services/_util.py b/bsb/services/_util.py index abaa2bb98..fd21b1594 100644 --- a/bsb/services/_util.py +++ b/bsb/services/_util.py @@ -1,6 +1,7 @@ -from ..exceptions import * import importlib +from ..exceptions import * + class ErrorModule: def __init__(self, message): diff --git a/bsb/services/mpi.py b/bsb/services/mpi.py index 008f11391..4494df8e2 100644 --- a/bsb/services/mpi.py +++ b/bsb/services/mpi.py @@ -1,9 +1,10 @@ -from ._util import MockModule -from ..exceptions import DependencyError import functools import os import warnings +from ..exceptions import DependencyError +from ._util import MockModule + class MPIService: def __init__(self): diff --git a/bsb/services/mpilock.py b/bsb/services/mpilock.py index b24d5a084..287fe06a3 100644 --- a/bsb/services/mpilock.py +++ b/bsb/services/mpilock.py @@ -1,7 +1,8 @@ # TODO: check for parallel support in the hdf5 provider, if it has it, provide noop -from ._util import MockModule import numpy as np +from ._util import MockModule + class MockedWindowController: def __init__(self, comm=None, master=0): diff --git a/bsb/services/pool.py b/bsb/services/pool.py index 008fd5fbf..455528aff 100644 --- a/bsb/services/pool.py +++ b/bsb/services/pool.py @@ -36,10 +36,11 @@ class name, ``_name`` for the job name and ``_c`` for the chunk. These are used """ -from ._util import MockModule, ErrorModule -from . import MPI import concurrent.futures +from . import MPI +from ._util import ErrorModule, MockModule + class _MissingMPIPoolExecutor(ErrorModule): pass diff --git a/bsb/simulation/__init__.py b/bsb/simulation/__init__.py index c031a67eb..50b2a7068 100644 --- a/bsb/simulation/__init__.py +++ b/bsb/simulation/__init__.py @@ -1,6 +1,7 @@ +from dataclasses import dataclass as _dc + from .adapter import SimulatorAdapter as _SimAdapter from .simulation import Simulation as _Sim -from dataclasses import dataclass as _dc @_dc diff --git a/bsb/simulation/_backends.py b/bsb/simulation/_backends.py index 6f1969f09..d704ec87e 100644 --- a/bsb/simulation/_backends.py +++ b/bsb/simulation/_backends.py @@ -1,6 +1,7 @@ -from .. import plugins import functools +from .. import plugins + @functools.cache def get_backends(): diff --git a/bsb/simulation/adapter.py b/bsb/simulation/adapter.py index eb4be7e33..72f691422 100644 --- a/bsb/simulation/adapter.py +++ b/bsb/simulation/adapter.py @@ -1,12 +1,12 @@ import abc import typing -from .results import SimulationResult +from .results import SimulationResult if typing.TYPE_CHECKING: - from .simulation import Simulation - from .cell import CellModel from ..storage import PlacementSet + from .cell import CellModel + from .simulation import Simulation class SimulationData: diff --git a/bsb/simulation/cell.py b/bsb/simulation/cell.py index 847951576..5ea759b0f 100644 --- a/bsb/simulation/cell.py +++ b/bsb/simulation/cell.py @@ -1,10 +1,10 @@ import typing -from .component import SimulationComponent -from .parameter import Parameter from .. import config from ..config import refs from ..config._attrs import cfglist +from .component import SimulationComponent +from .parameter import Parameter if typing.TYPE_CHECKING: from ..cell_types import CellType diff --git a/bsb/simulation/component.py b/bsb/simulation/component.py index 16feb3422..98aa36c42 100644 --- a/bsb/simulation/component.py +++ b/bsb/simulation/component.py @@ -1,4 +1,5 @@ import abc + from .. import config from .._util import obj_str_insert diff --git a/bsb/simulation/results.py b/bsb/simulation/results.py index 64e26620a..d0cdd8c52 100644 --- a/bsb/simulation/results.py +++ b/bsb/simulation/results.py @@ -1,7 +1,7 @@ +import traceback import typing from ..reporting import warn -import traceback if typing.TYPE_CHECKING: import neo diff --git a/bsb/simulation/simulation.py b/bsb/simulation/simulation.py index 730a436b6..991667429 100644 --- a/bsb/simulation/simulation.py +++ b/bsb/simulation/simulation.py @@ -1,21 +1,22 @@ +import itertools import types +import typing +from time import time + import numpy as np -from ..config._attrs import cfgdict, cfglist -from time import time -import itertools from .. import config +from ..config import types as cfgtypes +from ..config._attrs import cfgdict, cfglist from ._backends import get_simulation_nodes from .cell import CellModel from .connection import ConnectionModel from .device import DeviceModel -from ..config import types as cfgtypes -import typing if typing.TYPE_CHECKING: - from ..core import Scaffold - from ..connectivity import ConnectionStrategy from ..cell_types import CellType + from ..connectivity import ConnectionStrategy + from ..core import Scaffold from ..storage.interfaces import ConnectivitySet diff --git a/bsb/simulation/targetting.py b/bsb/simulation/targetting.py index 5d9c1a912..201ffe411 100755 --- a/bsb/simulation/targetting.py +++ b/bsb/simulation/targetting.py @@ -6,6 +6,7 @@ import numpy as np from numpy.random import default_rng + from .. import config from ..config import refs, types diff --git a/bsb/storage/__init__.py b/bsb/storage/__init__.py index 1d35aa364..38e50a3a0 100644 --- a/bsb/storage/__init__.py +++ b/bsb/storage/__init__.py @@ -11,13 +11,11 @@ consumers and can be used independent of the underlying storage engine, which is the end goal of this module. """ -from typing import Type - from inspect import isclass +from typing import Type -from .interfaces import ConnectivitySet, PlacementSet, FileStore, MorphologyRepository -from ..exceptions import UnknownStorageEngineError from .. import plugins +from ..exceptions import UnknownStorageEngineError from ..services import MPI from ._chunks import Chunk, chunklist from ._files import ( @@ -26,7 +24,7 @@ NrrdDependencyNode, YamlDependencyNode, ) - +from .interfaces import ConnectivitySet, FileStore, MorphologyRepository, PlacementSet # Pretend `Chunk` is defined here, for UX. It's only defined in `_chunks` to avoid # circular imports anyway. diff --git a/bsb/storage/_chunks.py b/bsb/storage/_chunks.py index 62e96298b..71c05d2f8 100644 --- a/bsb/storage/_chunks.py +++ b/bsb/storage/_chunks.py @@ -2,6 +2,7 @@ import numpy as np import numpy.typing as npt + from ..exceptions import ChunkError _iinfo = np.iinfo(np.int16) diff --git a/bsb/storage/_files.py b/bsb/storage/_files.py index 7b3959d4d..f0ff3bf5b 100644 --- a/bsb/storage/_files.py +++ b/bsb/storage/_files.py @@ -1,30 +1,31 @@ -import typing - import abc as _abc import contextlib as _cl import datetime as _dt +import email.utils as _eml +import functools as _ft +import hashlib as _hl +import os as _os +import pathlib as _pl import tempfile as _tf import time as _t +import typing +import typing as _tp import urllib.parse as _up import urllib.request as _ur -import pathlib as _pl -import os as _os -import functools as _ft -import typing as _tp -import requests as _rq -import email.utils as _eml +import warnings + import nrrd as _nrrd -import hashlib as _hl +import requests as _rq import yaml -from .._util import obj_str_insert from .. import config +from .._util import obj_str_insert from ..config import types from ..config._attrs import cfglist if _tp.TYPE_CHECKING: - from ..storage.interfaces import FileStore from ..morphologies import Morphology + from ..storage.interfaces import FileStore def _is_uri(url): @@ -310,8 +311,8 @@ def create_session(self): # Weak DH key on neuromorpho.org # https://stackoverflow.com/a/76217135/1016004 from requests.adapters import HTTPAdapter - from urllib3.util import create_urllib3_context from urllib3 import PoolManager + from urllib3.util import create_urllib3_context class DHAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False, **kwargs): diff --git a/bsb/storage/fs/__init__.py b/bsb/storage/fs/__init__.py index d799a725a..05c24eeaa 100644 --- a/bsb/storage/fs/__init__.py +++ b/bsb/storage/fs/__init__.py @@ -1,3 +1,4 @@ +import os import shutil from datetime import datetime @@ -5,9 +6,9 @@ from ... import config from ...services import MPILock -from ..interfaces import Engine, NoopLock, StorageNode as IStorageNode +from ..interfaces import Engine, NoopLock +from ..interfaces import StorageNode as IStorageNode from .file_store import FileStore -import os class FileSystemEngine(Engine): diff --git a/bsb/storage/fs/file_store.py b/bsb/storage/fs/file_store.py index 35e24905e..805f91749 100644 --- a/bsb/storage/fs/file_store.py +++ b/bsb/storage/fs/file_store.py @@ -1,9 +1,9 @@ +import base64 import json import os import time import typing from uuid import uuid4 -import base64 from ..interfaces import FileStore as IFileStore diff --git a/bsb/storage/interfaces.py b/bsb/storage/interfaces.py index 8ae0ea4eb..f9c8d9e83 100644 --- a/bsb/storage/interfaces.py +++ b/bsb/storage/interfaces.py @@ -1,15 +1,15 @@ import abc +import functools import typing from pathlib import Path -import functools + import numpy as np -from ._chunks import Chunk from .. import config, plugins +from .._util import immutable, obj_str_insert from ..morphologies import Morphology from ..trees import BoxTree -from .._util import obj_str_insert, immutable - +from ._chunks import Chunk if typing.TYPE_CHECKING: from ..cell_types import CellType diff --git a/bsb/topology/__init__.py b/bsb/topology/__init__.py index d63b6879a..e401a4f2f 100644 --- a/bsb/topology/__init__.py +++ b/bsb/topology/__init__.py @@ -2,11 +2,12 @@ Topology module """ -from .region import Region, RegionGroup, Stack -from .partition import Partition, Layer, AllenStructure, NrrdVoxels -from ._layout import box_layout import numpy as np +from ._layout import box_layout +from .partition import AllenStructure, Layer, NrrdVoxels, Partition +from .region import Region, RegionGroup, Stack + def create_topology(regions, ldc, mdc): """ diff --git a/bsb/topology/_layout.py b/bsb/topology/_layout.py index ad3d8d7f8..489fe3794 100644 --- a/bsb/topology/_layout.py +++ b/bsb/topology/_layout.py @@ -1,4 +1,5 @@ import abc + import numpy as np diff --git a/bsb/topology/partition.py b/bsb/topology/partition.py index daba83ada..1417f8f52 100644 --- a/bsb/topology/partition.py +++ b/bsb/topology/partition.py @@ -1,29 +1,30 @@ """ Module for the Partition configuration nodes and its dependencies. """ +import abc +import collections +import functools +import json import typing -from ._layout import Layout, RhomboidData +import nrrd +import numpy as np + from .. import config from ..config import types from ..exceptions import ( - RequirementError, - LayoutError, - ConfigurationError, AllenApiError, + ConfigurationError, + LayoutError, NodeNotFoundError, + RequirementError, ) +from ..reporting import report +from ..storage import Chunk from ..storage._files import NrrdDependencyNode from ..storage._util import _cached_file from ..voxels import VoxelSet -from ..storage import Chunk -from ..reporting import report -import numpy as np -import collections -import functools -import nrrd -import json -import abc +from ._layout import Layout, RhomboidData if typing.TYPE_CHECKING: from ..core import Scaffold diff --git a/bsb/topology/region.py b/bsb/topology/region.py index 0e618fe26..709f8b794 100644 --- a/bsb/topology/region.py +++ b/bsb/topology/region.py @@ -1,14 +1,15 @@ """ Module for the Region types. """ +import abc import typing -from ._layout import Layout +import numpy as np + from .. import config from ..config import refs, types from ..reporting import warn -import numpy as np -import abc +from ._layout import Layout if typing.TYPE_CHECKING: from ..core import Scaffold diff --git a/bsb/trees.py b/bsb/trees.py index 6e5ffc9a3..5dd04ce74 100644 --- a/bsb/trees.py +++ b/bsb/trees.py @@ -3,9 +3,10 @@ problems. """ -from rtree import index as rtree import abc +from rtree import index as rtree + class BoxTreeInterface(abc.ABC): """ diff --git a/bsb/voxels.py b/bsb/voxels.py index 6e0c97889..8a453f6b9 100644 --- a/bsb/voxels.py +++ b/bsb/voxels.py @@ -1,9 +1,11 @@ -from .trees import BoxTree -from .exceptions import EmptyVoxelSetError -import numpy as np import functools import itertools +import numpy as np + +from .exceptions import EmptyVoxelSetError +from .trees import BoxTree + class VoxelData(np.ndarray): """ diff --git a/docs/getting-started/getting_started.py b/docs/getting-started/getting_started.py index b13c562e3..852554e56 100644 --- a/docs/getting-started/getting_started.py +++ b/docs/getting-started/getting_started.py @@ -1,7 +1,7 @@ -from bsb.core import Scaffold +import bsb.options from bsb.config import from_json +from bsb.core import Scaffold from bsb.plotting import plot_network -import bsb.options bsb.options.verbosity = 3 config = from_json("network_configuration.json") diff --git a/docs/getting-started/include_morphos.py b/docs/getting-started/include_morphos.py index c46020beb..0809cb0cd 100644 --- a/docs/getting-started/include_morphos.py +++ b/docs/getting-started/include_morphos.py @@ -1,8 +1,9 @@ -from bsb.core import Scaffold -from bsb.config import from_json -from bsb.topology import Stack from bsb_plotting import plot_network + import bsb.options +from bsb.config import from_json +from bsb.core import Scaffold +from bsb.topology import Stack bsb.options.verbosity = 3 config = from_json("network_configuration.json") diff --git a/examples/atlas/allen_structures.py b/examples/atlas/allen_structures.py index 5037d189c..833dded71 100644 --- a/examples/atlas/allen_structures.py +++ b/examples/atlas/allen_structures.py @@ -1,6 +1,7 @@ -from bsb.topology import AllenStructure -import numpy as np import nrrd +import numpy as np + +from bsb.topology import AllenStructure # For this example, we'll be looking into the declive: struct = "DEC" diff --git a/examples/distributors/morphology_generator.py b/examples/distributors/morphology_generator.py index 62d5c6113..0b4101a5c 100644 --- a/examples/distributors/morphology_generator.py +++ b/examples/distributors/morphology_generator.py @@ -1,7 +1,8 @@ -from bsb.placement.distributor import MorphologyGenerator -from bsb.morphologies import Morphology, Branch import numpy as np +from bsb.morphologies import Branch, Morphology +from bsb.placement.distributor import MorphologyGenerator + class TouchTheBottomMorphologies(MorphologyGenerator, classmap_entry="touchdown"): def generate(self, positions, morphologies, context): diff --git a/examples/distributors/space_aware_morphology_distributor.py b/examples/distributors/space_aware_morphology_distributor.py index ca4c07d7a..153900daf 100644 --- a/examples/distributors/space_aware_morphology_distributor.py +++ b/examples/distributors/space_aware_morphology_distributor.py @@ -1,7 +1,8 @@ -from bsb.placement.distributor import MorphologyDistributor import numpy as np from scipy.stats.distributions import norm +from bsb.placement.distributor import MorphologyDistributor + class SmallerTopMorphologies(MorphologyDistributor, classmap_entry="small_top"): def distribute(self, positions, morphologies, context): diff --git a/examples/morphologies/labels.py b/examples/morphologies/labels.py index fbb7f483e..de34001fa 100644 --- a/examples/morphologies/labels.py +++ b/examples/morphologies/labels.py @@ -1,6 +1,7 @@ -from bsb.core import from_storage import numpy as np +from bsb.core import from_storage + # Load the morphology network = from_storage("network.hdf5") morpho = network.morphologies.load("my_morphology") diff --git a/examples/morphologies/neuromorpho.py b/examples/morphologies/neuromorpho.py index 18414743c..52d3bc15f 100644 --- a/examples/morphologies/neuromorpho.py +++ b/examples/morphologies/neuromorpho.py @@ -1,5 +1,5 @@ -from bsb.core import Scaffold from bsb.config import from_json +from bsb.core import Scaffold cfg = from_json("network_configuration.json") network = Scaffold(cfg) diff --git a/examples/networks/access_placement.py b/examples/networks/access_placement.py index ade1508ca..b93f463e5 100644 --- a/examples/networks/access_placement.py +++ b/examples/networks/access_placement.py @@ -1,7 +1,8 @@ # How to access and work with the placement data of a network -from bsb.core import from_storage import numpy as np +from bsb.core import from_storage + network = from_storage("network.hdf5") for cell_type in network.cell_types: ps = cell_type.get_placement_set() diff --git a/examples/networks/create_from_cfg.py b/examples/networks/create_from_cfg.py index e1fae771a..aaeb418f1 100644 --- a/examples/networks/create_from_cfg.py +++ b/examples/networks/create_from_cfg.py @@ -1,6 +1,6 @@ # Create a network from a custom configuration object. -from bsb.core import Scaffold from bsb.config import Configuration +from bsb.core import Scaffold cfg = Configuration() # Let's set a file name for the network diff --git a/examples/networks/reconfiguring.py b/examples/networks/reconfiguring.py index 5a89daa06..4edacfbfe 100644 --- a/examples/networks/reconfiguring.py +++ b/examples/networks/reconfiguring.py @@ -1,6 +1,6 @@ # Example that shows how to overwrite the configuration inside of an existing network -from bsb.output import HDF5Formatter from bsb.config import JSONConfig +from bsb.output import HDF5Formatter config = JSONConfig("new_config.json") HDF5Formatter.reconfigure("my_network.hdf5", config) diff --git a/examples/simulation/nest/repeated_simulations.py b/examples/simulation/nest/repeated_simulations.py index 1ec1d366e..38a554096 100644 --- a/examples/simulation/nest/repeated_simulations.py +++ b/examples/simulation/nest/repeated_simulations.py @@ -1,6 +1,7 @@ -from bsb.core import from_storage import os +from bsb.core import from_storage + network = from_storage("my_network.hdf5") simulation = network.create_adapter("my_simulation") diff --git a/examples/simulation/parameter_sweep.py b/examples/simulation/parameter_sweep.py index 4577a3f49..38376a929 100644 --- a/examples/simulation/parameter_sweep.py +++ b/examples/simulation/parameter_sweep.py @@ -1,13 +1,13 @@ -from bsb.core import from_storage - # A module with cerebellar cell models import dbbs_models +# A module to read HDF5 data +import h5py + # A module to run NEURON simulations in isolation import nrnsub -# A module to read HDF5 data -import h5py +from bsb.core import from_storage # Read the network file network = from_storage("my_network.hdf5") diff --git a/pyproject.toml b/pyproject.toml index 02c8af1c1..32940cb70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ authors = [{ name = "Robin De Schepper", email = "robingilbert.deschepper@unipv. readme = "README.md" license = { file = "LICENSE" } classifiers = ["License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)"] +requires-python = ">=3.9" dynamic = ["version", "description"] dependencies = [ "numpy~=1.19", @@ -80,8 +81,12 @@ docs = [ dev = [ "pre-commit~=3.5", "black~=23.11", + "isort~=5.12", "snakeviz~=2.1" ] [tool.black] line-length = 90 + +[tool.isort] +profile = "black" \ No newline at end of file diff --git a/tests/test_chunks.py b/tests/test_chunks.py index 9b857a60e..db2ca568c 100644 --- a/tests/test_chunks.py +++ b/tests/test_chunks.py @@ -1,6 +1,6 @@ -import numpy as np import unittest +import numpy as np from bsb_test import NumpyTestCase, skip_parallel, timeout from bsb.core import Scaffold diff --git a/tests/test_cli.py b/tests/test_cli.py index 10d4809e7..5d6510f4b 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,16 +1,17 @@ -import sys import os - +import sys import unittest + from bsb_test import skip_parallel class TestCLI(unittest.TestCase): @skip_parallel def test_availability(self): - import bsb import subprocess + import bsb + # Ensure that the current interpreter can be detected from the subprocess via PATH os.environ["PATH"] += ":" + os.path.join(sys.prefix, "bin") our_version = bytes(f"bsb {bsb.__version__}", encoding="utf-8") @@ -22,7 +23,8 @@ def test_availability(self): self.assertEqual(our_version, cli_version, "Could not access the BSB through CLI") def test_defaults(self): - import bsb.options, bsb.exceptions + import bsb.exceptions + import bsb.options # Test the default verbosity self.assertEqual(1, bsb.options.verbosity) @@ -31,7 +33,9 @@ def test_defaults(self): # self.assertRaises(bsb.exceptions.OptionError, lambda: bsb.options.config) def test_env_descriptor(self): - import os, bsb.options + import os + + import bsb.options from bsb.option import BsbOption class TestOption(BsbOption, name="_test_", env=("GRZLGRK",), script=("GRZLGRK",)): @@ -82,7 +86,8 @@ def test_plugins(self): pass def test_register(self): - import bsb.options, bsb.exceptions + import bsb.exceptions + import bsb.options from bsb.option import BsbOption # Test that registering an option into the module works diff --git a/tests/test_compilation.py b/tests/test_compilation.py index 0dd8359f3..1a025b722 100644 --- a/tests/test_compilation.py +++ b/tests/test_compilation.py @@ -1,9 +1,10 @@ import unittest -from bsb.core import Scaffold -from bsb.config import from_json, Configuration -from bsb.exceptions import InputError + from bsb_test import NetworkFixture, RandomStorageFixture, get_config_path +from bsb.config import Configuration, from_json +from bsb.core import Scaffold +from bsb.exceptions import InputError single_neuron_path = get_config_path("test_single_neuron.json") multi_neuron_path = get_config_path("test_double_neuron.json") diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 7c72877e9..4183626dc 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -1,27 +1,27 @@ -import unittest +import json import sys +import unittest + import numpy as np -import json +from bsb_test import RandomStorageFixture, get_config_path, get_data_path +from bsb import config +from bsb.config import Configuration, _attrs, compose_nodes, types from bsb.config.refs import Reference from bsb.core import Scaffold -from bsb import config -from bsb.config import Configuration, _attrs, compose_nodes -from bsb.config import types from bsb.exceptions import ( + CastError, CfgReferenceError, - RequirementError, + ClassMapMissingError, ConfigurationWarning, - CastError, - UnfitClassCastError, DynamicClassInheritanceError, - UnresolvedClassCastError, DynamicObjectNotFoundError, - ClassMapMissingError, + RequirementError, + UnfitClassCastError, + UnresolvedClassCastError, ) from bsb.storage import NrrdDependencyNode, YamlDependencyNode from bsb.topology.region import RegionGroup -from bsb_test import RandomStorageFixture, get_config_path, get_data_path @config.root diff --git a/tests/test_connectivity.py b/tests/test_connectivity.py index 0bc2e9193..8abd49731 100644 --- a/tests/test_connectivity.py +++ b/tests/test_connectivity.py @@ -1,19 +1,21 @@ -from bsb.core import Scaffold -from bsb.services import MPI -from bsb.config import Configuration, from_file -from bsb.morphologies import Morphology, Branch +import unittest +from collections import defaultdict + +import numpy as np from bsb_test import ( - NumpyTestCase, FixedPosConfigFixture, - RandomStorageFixture, MorphologiesFixture, NetworkFixture, - skip_parallel, + NumpyTestCase, + RandomStorageFixture, get_config_path, + skip_parallel, ) -import unittest -import numpy as np -from collections import defaultdict + +from bsb.config import Configuration, from_file +from bsb.core import Scaffold +from bsb.morphologies import Branch, Morphology +from bsb.services import MPI class TestAllToAll( diff --git a/tests/test_core.py b/tests/test_core.py index 8e7ed151a..1dbc3e2ec 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,10 +1,12 @@ -import unittest import os +import unittest + +from bsb_test import RandomStorageFixture + +from bsb import core +from bsb.config import Configuration from bsb.core import Scaffold from bsb.storage.interfaces import PlacementSet -from bsb.config import Configuration -from bsb import core -from bsb_test import RandomStorageFixture class TestCore(unittest.TestCase): diff --git a/tests/test_distributors.py b/tests/test_distributors.py index b9c3ffb21..e5a37ed14 100644 --- a/tests/test_distributors.py +++ b/tests/test_distributors.py @@ -1,15 +1,17 @@ import unittest + import numpy as np -from bsb.exceptions import DistributorError, DatasetNotFoundError, EmptySelectionError -from bsb.core import Scaffold +from bsb_test import get_data_path, skip_parallel + from bsb.config import Configuration -from bsb_test import skip_parallel, get_data_path +from bsb.core import Scaffold +from bsb.exceptions import DatasetNotFoundError, DistributorError, EmptySelectionError +from bsb.morphologies import Morphology from bsb.placement.distributor import ( MorphologyDistributor, MorphologyGenerator, VolumetricRotations, ) -from bsb.morphologies import Morphology class OneNoneDistributor(MorphologyDistributor): diff --git a/tests/test_entities.py b/tests/test_entities.py index 78507c329..b6119f1b0 100644 --- a/tests/test_entities.py +++ b/tests/test_entities.py @@ -1,4 +1,10 @@ -import unittest, os, sys, numpy as np, h5py, importlib +import importlib +import os +import sys +import unittest + +import h5py +import numpy as np sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, os.path.join(os.path.dirname(__file__))) diff --git a/tests/test_fiber_intersection.py b/tests/test_fiber_intersection.py index edcbb00ec..8beb00765 100644 --- a/tests/test_fiber_intersection.py +++ b/tests/test_fiber_intersection.py @@ -1,9 +1,15 @@ -import unittest, os, sys, numpy as np, h5py, importlib +import importlib +import os +import sys +import unittest + +import h5py +import numpy as np sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, os.path.join(os.path.dirname(__file__))) -from bsb.core import Scaffold from bsb.config import from_json +from bsb.core import Scaffold def relative_to_tests_folder(path): diff --git a/tests/test_issues.py b/tests/test_issues.py index 9eec071d5..f0f2063ba 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -1,5 +1,6 @@ -import unittest import os +import unittest + from bsb import config from bsb.config.refs import Reference from bsb.exceptions import CfgReferenceError diff --git a/tests/test_morphologies.py b/tests/test_morphologies.py index 2e8ee4e7e..1aa591eab 100644 --- a/tests/test_morphologies.py +++ b/tests/test_morphologies.py @@ -1,19 +1,24 @@ -import re -import unittest, os, sys, numpy as np, h5py -import json import itertools +import json +import os +import re +import sys +import unittest + +import h5py +import numpy as np +from bsb_test import NumpyTestCase, RandomStorageFixture, get_morphology_path +from scipy.spatial.transform import Rotation +from bsb._encoding import EncodedLabels from bsb.config._config import Configuration from bsb.core import Scaffold +from bsb.exceptions import * +from bsb.morphologies import Branch, Morphology, MorphologySet, RotationSet from bsb.services import MPI -from bsb.morphologies import Morphology, Branch, MorphologySet, RotationSet -from bsb._encoding import EncodedLabels from bsb.storage import Storage from bsb.storage._files import MorphologyDependencyNode, MorphologyOperation from bsb.storage.interfaces import StoredMorphology -from bsb.exceptions import * -from bsb_test import get_morphology_path, NumpyTestCase, RandomStorageFixture -from scipy.spatial.transform import Rotation class TestIO(NumpyTestCase, unittest.TestCase): diff --git a/tests/test_options.py b/tests/test_options.py index 0edf05a89..1178c680e 100644 --- a/tests/test_options.py +++ b/tests/test_options.py @@ -1,20 +1,21 @@ -import unittest -import pathlib import os +import pathlib import sys -import toml import tempfile +import unittest +import toml + +from bsb import options +from bsb._contexts import get_cli_context +from bsb.cli import handle_command from bsb.exceptions import * from bsb.option import ( - _pyproject_content, _pyproject_bsb, - _save_pyproject_bsb, + _pyproject_content, _pyproject_path, + _save_pyproject_bsb, ) -from bsb import options -from bsb.cli import handle_command -from bsb._contexts import get_cli_context class TestCLIOption(unittest.TestCase): diff --git a/tests/test_placement.py b/tests/test_placement.py index 5dace9b87..b8b434c27 100644 --- a/tests/test_placement.py +++ b/tests/test_placement.py @@ -1,23 +1,22 @@ -import unittest, os, sys, numpy as np, h5py +import unittest +from time import sleep + +import numpy as np +from bsb_test import NumpyTestCase, RandomStorageFixture, get_config_path, timeout from bsb import config +from bsb.cell_types import CellType +from bsb.config import Configuration, from_json from bsb.connectivity import ConnectionStrategy -from bsb.mixins import NotParallel - -sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) -sys.path.insert(0, os.path.join(os.path.dirname(__file__))) -from bsb.services import MPI from bsb.core import Scaffold -from bsb.config import Configuration, from_json -from bsb.cell_types import CellType -from bsb.topology import Region, Partition -from bsb.voxels import VoxelSet, VoxelData from bsb.exceptions import * -from bsb.storage import Chunk +from bsb.mixins import NotParallel from bsb.placement import PlacementStrategy, RandomPlacement -from bsb.services.pool import JobPool, FakeFuture, create_job_pool -from bsb_test import get_config_path, timeout, RandomStorageFixture, NumpyTestCase -from time import sleep +from bsb.services import MPI +from bsb.services.pool import FakeFuture, JobPool, create_job_pool +from bsb.storage import Chunk +from bsb.topology import Partition, Region +from bsb.voxels import VoxelData, VoxelSet def test_dud(scaffold, x, y): diff --git a/tests/test_postprocessing.py b/tests/test_postprocessing.py index f572a1311..07788c42d 100644 --- a/tests/test_postprocessing.py +++ b/tests/test_postprocessing.py @@ -1,10 +1,13 @@ -import unittest, os, sys, numpy as np, h5py, importlib +import importlib +import os +import sys +import unittest + +import h5py +import numpy as np + from bsb.core import Scaffold -from bsb.exceptions import ( - MorphologyDataError, - MorphologyError, - MissingMorphologyError, -) +from bsb.exceptions import MissingMorphologyError, MorphologyDataError, MorphologyError from bsb.postprocessing import SpoofDetails diff --git a/tests/test_selectors.py b/tests/test_selectors.py index 48fb04988..eb26b5d40 100644 --- a/tests/test_selectors.py +++ b/tests/test_selectors.py @@ -1,16 +1,25 @@ -import unittest, os, sys, numpy as np, h5py, json, string, random +import json +import os +import random +import string +import sys +import unittest + +import h5py +import numpy as np sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, os.path.join(os.path.dirname(__file__))) -from bsb.morphologies.selector import NameSelector, NeuroMorphoSelector -from bsb.core import Scaffold -from bsb.services import MPI +from bsb_test import skip_nointernet, skip_parallel + from bsb.cell_types import CellType -from bsb.config import from_json, Configuration -from bsb.morphologies import Morphology, Branch +from bsb.config import Configuration, from_json +from bsb.core import Scaffold from bsb.exceptions import * +from bsb.morphologies import Branch, Morphology +from bsb.morphologies.selector import NameSelector, NeuroMorphoSelector +from bsb.services import MPI from bsb.storage.interfaces import StoredMorphology -from bsb_test import skip_parallel, skip_nointernet def spoof(*names): diff --git a/tests/test_simulation.py b/tests/test_simulation.py index 4b6604cbf..68ad2617c 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -1,11 +1,9 @@ -from bsb.core import Scaffold -from bsb_test import ( - NumpyTestCase, - FixedPosConfigFixture, - RandomStorageFixture, -) import unittest +from bsb_test import FixedPosConfigFixture, NumpyTestCase, RandomStorageFixture + +from bsb.core import Scaffold + @unittest.skip("todo: Move this test from bsb-core to bsb") class TestSimulate( diff --git a/tests/test_topology.py b/tests/test_topology.py index e8ea0cf0d..ed5290a07 100644 --- a/tests/test_topology.py +++ b/tests/test_topology.py @@ -1,8 +1,11 @@ +import unittest + +import numpy as np +from bsb_test import get_data_path + from bsb import topology from bsb.config import Configuration from bsb.exceptions import * -import unittest, numpy as np -from bsb_test import get_data_path def single_layer(): diff --git a/tests/test_trees.py b/tests/test_trees.py index 3188a91a7..8c0a63b3b 100644 --- a/tests/test_trees.py +++ b/tests/test_trees.py @@ -1,7 +1,8 @@ +import inspect import os import sys import unittest -import inspect + from bsb.voxels import VoxelSet sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) diff --git a/tests/test_util.py b/tests/test_util.py index b6e8aaefc..faa4fe6c7 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,17 +1,13 @@ import unittest -import numpy as np +import numpy as np +from bsb_test import FixedPosConfigFixture, NumpyTestCase, RandomStorageFixture from scipy.spatial.transform import Rotation from bsb._util import rotation_matrix_from_vectors from bsb.core import Scaffold from bsb.storage import FileDependency from bsb.storage._files import NeuroMorphoScheme -from bsb_test import ( - FixedPosConfigFixture, - RandomStorageFixture, - NumpyTestCase, -) class TestNetworkUtil( diff --git a/tests/test_voxels.py b/tests/test_voxels.py index 0c61f3624..5f6a36006 100644 --- a/tests/test_voxels.py +++ b/tests/test_voxels.py @@ -1,12 +1,15 @@ -import unittest -import numpy as np import random -from bsb.voxels import VoxelSet, VoxelData -from bsb.storage import Chunk -from bsb.morphologies import Branch, Morphology +import unittest +from itertools import chain as _ic +from itertools import count as _ico + import bsb_test -from itertools import count as _ico, chain as _ic +import numpy as np + from bsb.exceptions import EmptyVoxelSetError +from bsb.morphologies import Branch, Morphology +from bsb.storage import Chunk +from bsb.voxels import VoxelData, VoxelSet class TestVoxelSet(bsb_test.NumpyTestCase, unittest.TestCase):