[ENH]: Consistency of logging #239

Merged
synchon merged 20 commits from update/logging-consistency into main 2026-06-15 09:02:42 +00:00
80 changed files with 284 additions and 100 deletions

View file

@ -0,0 +1 @@
Improve logging consistency of components by `Synchon Mandal`_

View file

@ -23,6 +23,7 @@ DataGrabbers, Preprocessors, Markers, etc., following the *junifer* way.
:caption: Contents: :caption: Contents:
extension extension
logging
datagrabber datagrabber
marker marker
preprocessor preprocessor

View file

@ -0,0 +1,38 @@
.. include:: ../links.inc
.. _logging_in_extension:
Logging in a ``junifer`` extension
==================================
It is important to have proper logging in your code and ``junifer`` makes it trivial to do so for your extensions.
For DataGrabber:
.. code-block:: python
from junifer.datagrabber import logger
For Preprocessor:
.. code-block:: python
from junifer.preprocess import logger
For Marker:
.. code-block:: python
from junifer.marker import logger
For Storage:
.. code-block:: python
from junifer.storage import logger
Importing the correct logger will give you a properly set up logger which will fit right in with the rest of ``junifer``\'s log output.

View file

@ -10,6 +10,8 @@ import os
import shutil import shutil
from pathlib import Path from pathlib import Path
import structlog
from ..api.queue_context import GnuParallelLocalAdapter, HTCondorAdapter from ..api.queue_context import GnuParallelLocalAdapter, HTCondorAdapter
from ..datagrabber import BaseDataGrabber from ..datagrabber import BaseDataGrabber
from ..markers import BaseMarker from ..markers import BaseMarker
@ -27,11 +29,14 @@ from ..typing import (
PreprocessorLike, PreprocessorLike,
StorageLike, StorageLike,
) )
from ..utils import logger, raise_error, warn_with_log, yaml from ..utils import raise_error, warn_with_log, yaml
__all__ = ["collect", "list_elements", "queue", "reset", "run"] __all__ = ["collect", "list_elements", "queue", "reset", "run"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="api")
def _get_datagrabber(datagrabber_config: dict) -> DataGrabberLike: def _get_datagrabber(datagrabber_config: dict) -> DataGrabberLike:
"""Get DataGrabber. """Get DataGrabber.

View file

@ -9,12 +9,13 @@ from pathlib import Path
from typing import Any from typing import Any
from ...typing import Elements from ...typing import Elements
from ...utils import logger, make_executable, raise_error, run_ext_cmd from ...utils import make_executable, raise_error, run_ext_cmd
from .queue_context_adapter import ( from .queue_context_adapter import (
EnvKind, EnvKind,
EnvShell, EnvShell,
QueueContextAdapter, QueueContextAdapter,
QueueContextEnv, QueueContextEnv,
logger,
) )

View file

@ -10,12 +10,13 @@ from pathlib import Path
from typing import Any from typing import Any
from ...typing import Elements from ...typing import Elements
from ...utils import logger, make_executable, raise_error, run_ext_cmd from ...utils import make_executable, raise_error, run_ext_cmd
from .queue_context_adapter import ( from .queue_context_adapter import (
EnvKind, EnvKind,
EnvShell, EnvShell,
QueueContextAdapter, QueueContextAdapter,
QueueContextEnv, QueueContextEnv,
logger,
) )

View file

@ -19,6 +19,7 @@ else:
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from enum import Enum from enum import Enum
import structlog
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
from ...utils import raise_error from ...utils import raise_error
@ -26,6 +27,9 @@ from ...utils import raise_error
__all__ = ["EnvKind", "EnvShell", "QueueContextAdapter", "QueueContextEnv"] __all__ = ["EnvKind", "EnvShell", "QueueContextAdapter", "QueueContextEnv"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="api")
class EnvKind(str, Enum): class EnvKind(str, Enum):
"""Accepted Python environment kind.""" """Accepted Python environment kind."""

View file

@ -10,13 +10,17 @@ import sys
from pathlib import Path from pathlib import Path
import pandas as pd import pandas as pd
import structlog
from ..typing import Elements from ..typing import Elements
from ..utils import logger, raise_error, warn_with_log, yaml from ..utils import raise_error, warn_with_log, yaml
__all__ = ["parse_elements", "parse_yaml"] __all__ = ["parse_elements", "parse_yaml"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="cli")
def parse_yaml(filepath: str | Path) -> dict: # noqa: C901 def parse_yaml(filepath: str | Path) -> dict: # noqa: C901
"""Parse YAML. """Parse YAML.

View file

@ -9,7 +9,7 @@ import numpy as np
from numpy.typing import ArrayLike from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
__all__ = ["ANTsCoordinatesWarper"] __all__ = ["ANTsCoordinatesWarper"]
@ -46,6 +46,9 @@ class ANTsCoordinatesWarper:
The transformed coordinates. The transformed coordinates.
""" """
# Imported here to avoid circular import
from ._coordinates import logger
logger.debug("Using ANTs for coordinates transformation") logger.debug("Using ANTs for coordinates transformation")
# Create element-specific tempdir for storing post-warping assets # Create element-specific tempdir for storing post-warping assets

View file

@ -9,10 +9,11 @@ from typing import Any
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import structlog
from junifer_data import get from junifer_data import get
from numpy.typing import ArrayLike from numpy.typing import ArrayLike
from ...utils import logger, raise_error from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import JUNIFER_DATA_PARAMS, get_dataset_path, get_native_warper from ..utils import JUNIFER_DATA_PARAMS, get_dataset_path, get_native_warper
from ._ants_coordinates_warper import ANTsCoordinatesWarper from ._ants_coordinates_warper import ANTsCoordinatesWarper
@ -21,6 +22,9 @@ from ._fsl_coordinates_warper import FSLCoordinatesWarper
__all__ = ["CoordinatesRegistry"] __all__ = ["CoordinatesRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class CoordinatesRegistry(BasePipelineDataRegistry): class CoordinatesRegistry(BasePipelineDataRegistry):
"""Class for coordinates data registry. """Class for coordinates data registry.

View file

@ -9,7 +9,7 @@ import numpy as np
from numpy.typing import ArrayLike from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
__all__ = ["FSLCoordinatesWarper"] __all__ = ["FSLCoordinatesWarper"]
@ -46,6 +46,9 @@ class FSLCoordinatesWarper:
The transformed coordinates. The transformed coordinates.
""" """
# Imported here to avoid circular import
from ._coordinates import logger
logger.debug("Using FSL for coordinates transformation") logger.debug("Using FSL for coordinates transformation")
# Create element-specific tempdir for storing post-warping assets # Create element-specific tempdir for storing post-warping assets

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib import nibabel as nib
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm from ..template_spaces import get_template, get_xfm
@ -71,6 +71,9 @@ class ANTsMapsWarper:
If ``warp_data`` is None when ``dst="T1w"``. If ``warp_data`` is None when ``dst="T1w"``.
""" """
# Imported here to avoid circular import
from ._maps import logger
# Create element-scoped tempdir so that warped maps is # Create element-scoped tempdir so that warped maps is
# available later as nibabel stores file path reference for # available later as nibabel stores file path reference for
# loading on computation # loading on computation

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib import nibabel as nib
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
if TYPE_CHECKING: if TYPE_CHECKING:
@ -53,6 +53,9 @@ class FSLMapsWarper:
The transformed maps image. The transformed maps image.
""" """
# Imported here to avoid circular import
from ._maps import logger
logger.debug("Using FSL for maps transformation") logger.debug("Using FSL for maps transformation")
# Create element-scoped tempdir so that warped maps is # Create element-scoped tempdir so that warped maps is

View file

@ -9,9 +9,10 @@ from typing import TYPE_CHECKING, Any, Optional
import nibabel as nib import nibabel as nib
import nilearn.image as nimg import nilearn.image as nimg
import numpy as np import numpy as np
import structlog
from junifer_data import get from junifer_data import get
from ...utils import logger, raise_error from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import ( from ..utils import (
JUNIFER_DATA_PARAMS, JUNIFER_DATA_PARAMS,
@ -29,6 +30,9 @@ if TYPE_CHECKING:
__all__ = ["MapsRegistry"] __all__ = ["MapsRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class MapsRegistry(BasePipelineDataRegistry): class MapsRegistry(BasePipelineDataRegistry):
"""Class for maps data registry. """Class for maps data registry.

View file

@ -10,7 +10,7 @@ import nibabel as nib
import numpy as np import numpy as np
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm from ..template_spaces import get_template, get_xfm
@ -92,6 +92,9 @@ class ANTsMaskWarper:
If ``warp_data`` is None when ``dst="T1w"``. If ``warp_data`` is None when ``dst="T1w"``.
""" """
# Imported here to avoid circular import
from ._masks import logger
# Create element-scoped tempdir so that warped mask is # Create element-scoped tempdir so that warped mask is
# available later as nibabel stores file path reference for # available later as nibabel stores file path reference for
# loading on computation # loading on computation

View file

@ -10,7 +10,7 @@ import nibabel as nib
import numpy as np import numpy as np
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
if TYPE_CHECKING: if TYPE_CHECKING:
@ -74,6 +74,9 @@ class FSLMaskWarper:
The transformed mask image. The transformed mask image.
""" """
# Imported here to avoid circular import
from ._masks import logger
logger.debug("Using FSL for mask transformation") logger.debug("Using FSL for mask transformation")
# Create element-scoped tempdir so that warped mask is # Create element-scoped tempdir so that warped mask is

View file

@ -15,6 +15,7 @@ from typing import (
import nibabel as nib import nibabel as nib
import nilearn.image as nimg import nilearn.image as nimg
import numpy as np import numpy as np
import structlog
from junifer_data import get from junifer_data import get
from nilearn.masking import ( from nilearn.masking import (
compute_background_mask, compute_background_mask,
@ -22,7 +23,7 @@ from nilearn.masking import (
intersect_masks, intersect_masks,
) )
from ...utils import logger, raise_error from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..template_spaces import get_template from ..template_spaces import get_template
from ..utils import ( from ..utils import (
@ -41,6 +42,9 @@ if TYPE_CHECKING:
__all__ = ["MaskRegistry", "compute_brain_mask"] __all__ = ["MaskRegistry", "compute_brain_mask"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
def compute_brain_mask( def compute_brain_mask(
target_data: dict[str, Any], target_data: dict[str, Any],

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib import nibabel as nib
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm from ..template_spaces import get_template, get_xfm
@ -71,6 +71,9 @@ class ANTsParcellationWarper:
If ``warp_data`` is None when ``dst="T1w"``. If ``warp_data`` is None when ``dst="T1w"``.
""" """
# Imported here to avoid circular import
from ._parcellations import logger
# Create element-scoped tempdir so that warped parcellation is # Create element-scoped tempdir so that warped parcellation is
# available later as nibabel stores file path reference for # available later as nibabel stores file path reference for
# loading on computation # loading on computation

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib import nibabel as nib
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
if TYPE_CHECKING: if TYPE_CHECKING:
@ -53,6 +53,9 @@ class FSLParcellationWarper:
The transformed parcellation image. The transformed parcellation image.
""" """
# Imported here to avoid circular import
from ._parcellations import logger
logger.debug("Using FSL for parcellation transformation") logger.debug("Using FSL for parcellation transformation")
# Create element-scoped tempdir so that warped parcellation is # Create element-scoped tempdir so that warped parcellation is

View file

@ -13,9 +13,10 @@ import nibabel as nib
import nilearn.image as nimg import nilearn.image as nimg
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import structlog
from junifer_data import get from junifer_data import get
from ...utils import logger, raise_error, warn_with_log from ...utils import raise_error, warn_with_log
from ..pipeline_data_registry_base import BasePipelineDataRegistry from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import ( from ..utils import (
JUNIFER_DATA_PARAMS, JUNIFER_DATA_PARAMS,
@ -36,6 +37,9 @@ __all__ = [
"merge_parcellations", "merge_parcellations",
] ]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class ParcellationRegistry(BasePipelineDataRegistry): class ParcellationRegistry(BasePipelineDataRegistry):
"""Class for parcellation data registry. """Class for parcellation data registry.
@ -58,8 +62,12 @@ class ParcellationRegistry(BasePipelineDataRegistry):
# The built-in parcellations are files that are shipped with the # The built-in parcellations are files that are shipped with the
# junifer-data dataset. # junifer-data dataset.
# Make built-in and external dictionaries for validation later # Make built-in and external dictionaries for validation later
self._builtin = {} self._builtin: dict[
self._external = {} str, dict[str, str | int | Path | list[str] | list[int]]
] = {}
self._external: dict[
str, dict[str, str | int | Path | list[str] | list[int]]
] = {}
# Add SUIT # Add SUIT
self._builtin.update( self._builtin.update(

View file

@ -8,15 +8,19 @@ from typing import Any, Union
import nibabel as nib import nibabel as nib
import numpy as np import numpy as np
import structlog
from junifer_data import get from junifer_data import get
from templateflow import api as tflow from templateflow import api as tflow
from ..utils import logger, raise_error from ..utils import raise_error
from .utils import JUNIFER_DATA_PARAMS, closest_resolution, get_dataset_path from .utils import JUNIFER_DATA_PARAMS, closest_resolution, get_dataset_path
__all__ = ["get_template", "get_xfm"] __all__ = ["get_template", "get_xfm"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
def get_xfm(src: str, dst: str) -> Path: # pragma: no cover def get_xfm(src: str, dst: str) -> Path: # pragma: no cover
"""Fetch warp files to convert from ``src`` to ``dst``. """Fetch warp files to convert from ``src`` to ``dst``.

View file

@ -8,8 +8,9 @@ from collections.abc import MutableMapping
from pathlib import Path from pathlib import Path
import numpy as np import numpy as np
import structlog
from ..utils import config, logger, raise_error from ..utils import config, raise_error
__all__ = [ __all__ = [
@ -21,6 +22,8 @@ __all__ = [
"get_native_warper", "get_native_warper",
] ]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
# junifer-data version constant # junifer-data version constant
JUNIFER_DATA_VERSION = "7" JUNIFER_DATA_VERSION = "7"

View file

@ -26,10 +26,11 @@ __all__ = [
"DataType", "DataType",
"ConfoundsFormat", "ConfoundsFormat",
"register_confounds_format", "register_confounds_format",
"logger",
] ]
# These 4 need to be in this order, otherwise it is a circular import # These 4 need to be in this order, otherwise it is a circular import
from .base import BaseDataGrabber, DataType from .base import BaseDataGrabber, DataType, logger
from .datalad_base import DataladDataGrabber from .datalad_base import DataladDataGrabber
from .pattern import ( from .pattern import (
PatternDataGrabber, PatternDataGrabber,

View file

@ -11,16 +11,20 @@ from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Annotated, Any from typing import Annotated, Any
import structlog
from aenum import Enum as AEnum from aenum import Enum as AEnum
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
from ..pipeline import UpdateMetaMixin from ..pipeline import UpdateMetaMixin
from ..typing import Element, Elements from ..typing import Element, Elements
from ..utils import ensure_list, logger, raise_error from ..utils import ensure_list, raise_error
__all__ = ["BaseDataGrabber", "DataType"] __all__ = ["BaseDataGrabber", "DataType"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="datagrabber", step="datagrabber")
class DataType(str, AEnum): class DataType(str, AEnum):
"""Accepted data type.""" """Accepted data type."""
@ -64,11 +68,16 @@ class BaseDataGrabber(BaseModel, ABC, UpdateMetaMixin):
datadir: Path datadir: Path
def model_post_init(self, context: Any): # noqa: D102 def model_post_init(self, context: Any): # noqa: D102
logger.debug("Initializing BaseDataGrabber")
logger.debug(f"\tdatadir = {self.datadir}")
logger.debug(f"\ttypes = {self.types}")
# Run extra validation for datagrabbers and fail early if needed # Run extra validation for datagrabbers and fail early if needed
self.validate_datagrabber_params() self.validate_datagrabber_params()
# Convert to correct data type
self.types = [
DataType(t) if isinstance(t, str) else t for t in self.types
]
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
def validate_datagrabber_params(self) -> None: def validate_datagrabber_params(self) -> None:
"""Run extra logical validation for datagrabber. """Run extra logical validation for datagrabber.

View file

@ -20,8 +20,8 @@ from pydantic import AnyUrl, Field, field_validator
from ..api.decorators import register_datagrabber from ..api.decorators import register_datagrabber
from ..pipeline import WorkDirManager from ..pipeline import WorkDirManager
from ..typing import Element from ..typing import Element
from ..utils import config, logger, raise_error, warn_with_log from ..utils import config, raise_error, warn_with_log
from .base import BaseDataGrabber from .base import BaseDataGrabber, logger
__all__ = ["DataladDataGrabber"] __all__ = ["DataladDataGrabber"]

View file

@ -16,8 +16,8 @@ from pydantic import Field
from ..api.decorators import register_datagrabber from ..api.decorators import register_datagrabber
from ..typing import DataGrabberPatterns, Elements from ..typing import DataGrabberPatterns, Elements
from ..utils import logger, raise_error from ..utils import raise_error
from .base import BaseDataGrabber from .base import BaseDataGrabber, logger
from .pattern_validation_mixin import PatternValidationMixin from .pattern_validation_mixin import PatternValidationMixin

View file

@ -8,7 +8,7 @@
from pydantic import ConfigDict from pydantic import ConfigDict
from ..api.decorators import register_datagrabber from ..api.decorators import register_datagrabber
from ..utils import logger from .base import logger
from .datalad_base import DataladDataGrabber from .datalad_base import DataladDataGrabber
from .pattern import PatternDataGrabber from .pattern import PatternDataGrabber

View file

@ -16,9 +16,9 @@ from collections.abc import Iterator, MutableMapping
from aenum import extend_enum from aenum import extend_enum
from ..datagrabber import DataType
from ..typing import DataGrabberPatterns from ..typing import DataGrabberPatterns
from ..utils import logger, raise_error, warn_with_log from ..utils import raise_error, warn_with_log
from .base import DataType, logger
__all__ = [ __all__ = [

View file

@ -8,15 +8,18 @@ from pathlib import Path
import nibabel as nib import nibabel as nib
import pandas as pd import pandas as pd
import structlog
from pydantic import BaseModel from pydantic import BaseModel
from ..api.decorators import register_datareader from ..api.decorators import register_datareader
from ..pipeline import PipelineStepMixin, UpdateMetaMixin from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..utils.logging import logger, warn_with_log from ..utils.logging import warn_with_log
__all__ = ["DefaultDataReader"] __all__ = ["DefaultDataReader"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="datareader", step="datareader")
# Map each file extension to a type # Map each file extension to a type
_extensions = { _extensions = {

View file

@ -23,9 +23,10 @@ __all__ = [
"TemporalSNRParcels", "TemporalSNRParcels",
"TemporalSNRSpheres", "TemporalSNRSpheres",
"BrainPrint", "BrainPrint",
"logger",
] ]
from .base import BaseMarker from .base import BaseMarker, logger
from .ets_rss import RSSETSMarker from .ets_rss import RSSETSMarker
from .maps_aggregation import MapsAggregation from .maps_aggregation import MapsAggregation
from .parcel_aggregation import ParcelAggregation from .parcel_aggregation import ParcelAggregation

View file

@ -8,17 +8,21 @@ from abc import ABC, abstractmethod
from copy import deepcopy from copy import deepcopy
from typing import Any, ClassVar from typing import Any, ClassVar
import structlog
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
from ..datagrabber import DataType from ..datagrabber import DataType
from ..pipeline import PipelineStepMixin, UpdateMetaMixin from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..storage import StorageType from ..storage import StorageType
from ..typing import MarkerInOutMappings, StorageLike from ..typing import MarkerInOutMappings, StorageLike
from ..utils import logger, raise_error from ..utils import raise_error
__all__ = ["BaseMarker"] __all__ = ["BaseMarker"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="markers", step="marker")
class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin): class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
"""Abstract base class for marker. """Abstract base class for marker.
@ -84,6 +88,9 @@ class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
self.validate_marker_params() self.validate_marker_params()
# Set default name if not provided # Set default name if not provided
self.name = self.__class__.__name__ if self.name is None else self.name self.name = self.__class__.__name__ if self.name is None else self.name
logger.info(
f"Parameters: {self.model_dump(mode='json')}", component=self.name
)
@property @property
def valid_inputs(self) -> list[DataType]: def valid_inputs(self) -> list[DataType]:

View file

@ -24,8 +24,8 @@ from ..external.BrainPrint.brainprint.surfaces import surf_to_vtk
from ..pipeline import ExtDep, WorkDirManager from ..pipeline import ExtDep, WorkDirManager
from ..storage import StorageType from ..storage import StorageType
from ..typing import Dependencies, ExternalDependencies, MarkerInOutMappings from ..typing import Dependencies, ExternalDependencies, MarkerInOutMappings
from ..utils import logger, run_ext_cmd from ..utils import run_ext_cmd
from .base import BaseMarker from .base import BaseMarker, logger
__all__ = ["BrainPrint"] __all__ = ["BrainPrint"]

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...utils import logger, warn_with_log from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase from .complexity_base import ComplexityBase

View file

@ -15,8 +15,8 @@ from ..api.decorators import register_marker
from ..datagrabber import DataType from ..datagrabber import DataType
from ..storage import StorageType from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list, ensure_list_or_none, logger from ..utils import ensure_list, ensure_list_or_none
from .base import BaseMarker from .base import BaseMarker, logger
from .parcel_aggregation import ParcelAggregation from .parcel_aggregation import ParcelAggregation
from .utils import _ets from .utils import _ets

View file

@ -15,8 +15,9 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import ExternalDependencies from ...typing import ExternalDependencies
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
from ...utils.singleton import Singleton from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -17,8 +17,8 @@ from nilearn import image as nimg
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...typing import Dependencies from ...typing import Dependencies
from ...utils import logger
from ...utils.singleton import Singleton from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -20,8 +20,8 @@ from pydantic import BeforeValidator, PositiveFloat
from ...datagrabber import DataType from ...datagrabber import DataType
from ...storage import StorageType from ...storage import StorageType
from ...typing import ConditionalDependencies, MarkerInOutMappings from ...typing import ConditionalDependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger from ...utils import ensure_list_or_none
from ..base import BaseMarker from ..base import BaseMarker, logger
from ._afni_falff import AFNIALFF from ._afni_falff import AFNIALFF
from ._junifer_falff import JuniferALFF from ._junifer_falff import JuniferALFF

View file

@ -7,7 +7,7 @@ from typing import Any
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import logger from ..base import logger
from ..maps_aggregation import MapsAggregation from ..maps_aggregation import MapsAggregation
from .falff_base import ALFFBase from .falff_base import ALFFBase

View file

@ -12,7 +12,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import ensure_list, logger from ...utils import ensure_list
from ..base import logger
from ..parcel_aggregation import ParcelAggregation from ..parcel_aggregation import ParcelAggregation
from .falff_base import ALFFBase from .falff_base import ALFFBase

View file

@ -12,7 +12,7 @@ from pydantic import PositiveFloat
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import logger from ..base import logger
from ..sphere_aggregation import SphereAggregation from ..sphere_aggregation import SphereAggregation
from .falff_base import ALFFBase from .falff_base import ALFFBase

View file

@ -13,8 +13,8 @@ from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...storage import StorageType from ...storage import StorageType
from ...typing import Dependencies, MarkerInOutMappings from ...typing import Dependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger, raise_error from ...utils import ensure_list_or_none, raise_error
from ..base import BaseMarker from ..base import BaseMarker, logger
from ..parcel_aggregation import ParcelAggregation from ..parcel_aggregation import ParcelAggregation
from ..utils import _correlate_dataframes from ..utils import _correlate_dataframes

View file

@ -14,8 +14,8 @@ from ..datagrabber import DataType
from ..stats import get_aggfunc_by_name from ..stats import get_aggfunc_by_name
from ..storage import StorageType from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log from ..utils import ensure_list_or_none, raise_error, warn_with_log
from .base import BaseMarker from .base import BaseMarker, logger
__all__ = ["MapsAggregation"] __all__ = ["MapsAggregation"]

View file

@ -20,11 +20,10 @@ from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ( from ..utils import (
ensure_list, ensure_list,
ensure_list_or_none, ensure_list_or_none,
logger,
raise_error, raise_error,
warn_with_log, warn_with_log,
) )
from .base import BaseMarker from .base import BaseMarker, logger
__all__ = ["ParcelAggregation"] __all__ = ["ParcelAggregation"]

View file

@ -15,8 +15,9 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import ExternalDependencies from ...typing import ExternalDependencies
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
from ...utils.singleton import Singleton from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -19,8 +19,9 @@ from nilearn import masking as nmask
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...typing import Dependencies from ...typing import Dependencies
from ...utils import logger, raise_error from ...utils import raise_error
from ...utils.singleton import Singleton from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING: if TYPE_CHECKING:

View file

@ -17,8 +17,8 @@ from pydantic import BeforeValidator
from ...datagrabber import DataType from ...datagrabber import DataType
from ...storage import StorageType from ...storage import StorageType
from ...typing import ConditionalDependencies, MarkerInOutMappings from ...typing import ConditionalDependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger from ...utils import ensure_list_or_none
from ..base import BaseMarker from ..base import BaseMarker, logger
from ._afni_reho import AFNIReHo from ._afni_reho import AFNIReHo
from ._junifer_reho import JuniferReHo from ._junifer_reho import JuniferReHo

View file

@ -9,7 +9,7 @@ import numpy as np
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import logger from ..base import logger
from ..maps_aggregation import MapsAggregation from ..maps_aggregation import MapsAggregation
from .reho_base import ReHoBase from .reho_base import ReHoBase

View file

@ -10,7 +10,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import ensure_list, logger from ...utils import ensure_list
from ..base import logger
from ..parcel_aggregation import ParcelAggregation from ..parcel_aggregation import ParcelAggregation
from .reho_base import ReHoBase from .reho_base import ReHoBase

View file

@ -10,7 +10,7 @@ from pydantic import PositiveFloat
from ...api.decorators import register_marker from ...api.decorators import register_marker
from ...datagrabber import DataType from ...datagrabber import DataType
from ...utils import logger from ..base import logger
from ..sphere_aggregation import SphereAggregation from ..sphere_aggregation import SphereAggregation
from .reho_base import ReHoBase from .reho_base import ReHoBase

View file

@ -15,8 +15,8 @@ from ..external.nilearn import JuniferNiftiSpheresMasker
from ..stats import get_aggfunc_by_name from ..stats import get_aggfunc_by_name
from ..storage import StorageType from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log from ..utils import ensure_list_or_none, raise_error, warn_with_log
from .base import BaseMarker from .base import BaseMarker, logger
__all__ = ["SphereAggregation"] __all__ = ["SphereAggregation"]

View file

@ -5,13 +5,17 @@
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import structlog
from ..typing import StorageLike from ..typing import StorageLike
from ..utils import logger, raise_error, warn_with_log from ..utils import raise_error, warn_with_log
__all__ = ["read_transform"] __all__ = ["read_transform"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="onthefly")
def read_transform( def read_transform(
storage: StorageLike, storage: StorageLike,

View file

@ -7,14 +7,19 @@
from collections import Counter from collections import Counter
from pathlib import Path from pathlib import Path
import structlog
from ..datareader import DefaultDataReader from ..datareader import DefaultDataReader
from ..pipeline import DataObjectDumper, PipelineStepMixin, WorkDirManager from ..pipeline import DataObjectDumper, PipelineStepMixin, WorkDirManager
from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike
from ..utils import config, logger, raise_error from ..utils import config, raise_error
__all__ = ["MarkerCollection"] __all__ = ["MarkerCollection"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class MarkerCollection: class MarkerCollection:
"""Class for marker collection. """Class for marker collection.

View file

@ -8,13 +8,18 @@
import importlib import importlib
from collections.abc import Mapping from collections.abc import Mapping
import structlog
from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike
from ..utils import logger, raise_error from ..utils import raise_error
from ..utils.singleton import Singleton from ..utils.singleton import Singleton
__all__ = ["PipelineComponentRegistry"] __all__ = ["PipelineComponentRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class PipelineComponentRegistry(metaclass=Singleton): class PipelineComponentRegistry(metaclass=Singleton):
"""Class for pipeline component registry. """Class for pipeline component registry.

View file

@ -10,7 +10,7 @@ from typing import Any
from pydantic import validate_call from pydantic import validate_call
from ..utils.logging import raise_error, warn_with_log from ..utils import raise_error, warn_with_log
__all__ = ["ExtDep", "check_ext_dependencies"] __all__ = ["ExtDep", "check_ext_dependencies"]

View file

@ -8,12 +8,16 @@ import shutil
import tempfile import tempfile
from pathlib import Path from pathlib import Path
from ..utils import logger import structlog
from ..utils.singleton import Singleton from ..utils.singleton import Singleton
__all__ = ["WorkDirManager"] __all__ = ["WorkDirManager"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class WorkDirManager(metaclass=Singleton): class WorkDirManager(metaclass=Singleton):
"""Class for working directory manager. """Class for working directory manager.

View file

@ -9,9 +9,10 @@ __all__ = [
"SmoothingImpl", "SmoothingImpl",
"TemporalSlicer", "TemporalSlicer",
"TemporalFilter", "TemporalFilter",
"logger",
] ]
from .base import BasePreprocessor from .base import BasePreprocessor, logger
from .confounds import fMRIPrepConfoundRemover, Confounds, Strategy from .confounds import fMRIPrepConfoundRemover, Confounds, Strategy
from .warping import SpaceWarper, SpaceWarpingImpl from .warping import SpaceWarper, SpaceWarpingImpl
from .smoothing import Smoothing, SmoothingImpl from .smoothing import Smoothing, SmoothingImpl

View file

@ -22,8 +22,8 @@ from ..data import get_data
from ..datagrabber import DataType from ..datagrabber import DataType
from ..pipeline import WorkDirManager from ..pipeline import WorkDirManager
from ..typing import Dependencies from ..typing import Dependencies
from ..utils import ensure_list_or_none, logger from ..utils import ensure_list_or_none
from .base import BasePreprocessor from .base import BasePreprocessor, logger
__all__ = ["TemporalFilter"] __all__ = ["TemporalFilter"]

View file

@ -14,8 +14,8 @@ from ..api.decorators import register_preprocessor
from ..datagrabber import DataType from ..datagrabber import DataType
from ..pipeline import WorkDirManager from ..pipeline import WorkDirManager
from ..typing import Dependencies from ..typing import Dependencies
from ..utils import logger, raise_error from ..utils import raise_error
from .base import BasePreprocessor from .base import BasePreprocessor, logger
__all__ = ["TemporalSlicer"] __all__ = ["TemporalSlicer"]

View file

@ -8,15 +8,19 @@ from abc import ABC, abstractmethod
from collections.abc import Sequence from collections.abc import Sequence
from typing import Annotated, Any, ClassVar from typing import Annotated, Any, ClassVar
import structlog
from pydantic import BaseModel, BeforeValidator, ConfigDict from pydantic import BaseModel, BeforeValidator, ConfigDict
from ..datagrabber import DataType from ..datagrabber import DataType
from ..pipeline import PipelineStepMixin, UpdateMetaMixin from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..utils import ensure_list_or_none, logger, raise_error from ..utils import ensure_list_or_none, raise_error
__all__ = ["BasePreprocessor"] __all__ = ["BasePreprocessor"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="preprocess", step="preprocessing")
class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin): class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
"""Abstract base class for preprocessor. """Abstract base class for preprocessor.
@ -97,6 +101,10 @@ class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
DataType(t) if isinstance(t, str) else t DataType(t) if isinstance(t, str) else t
for t in self.required_data_types for t in self.required_data_types
] ]
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
@property @property
def valid_inputs(self) -> list[DataType]: def valid_inputs(self) -> list[DataType]:

View file

@ -35,8 +35,8 @@ from ...data import get_data
from ...datagrabber import DataType from ...datagrabber import DataType
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...typing import Dependencies from ...typing import Dependencies
from ...utils import ensure_list_or_none, logger, raise_error from ...utils import ensure_list_or_none, raise_error
from ..base import BasePreprocessor from ..base import BasePreprocessor, logger
__all__ = ["Confounds", "Strategy", "fMRIPrepConfoundRemover"] __all__ = ["Confounds", "Strategy", "fMRIPrepConfoundRemover"]

View file

@ -12,7 +12,8 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
from ..base import logger
__all__ = ["AFNISmoothing"] __all__ = ["AFNISmoothing"]

View file

@ -12,7 +12,8 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, run_ext_cmd from ...utils import run_ext_cmd
from ..base import logger
__all__ = ["FSLSmoothing"] __all__ = ["FSLSmoothing"]

View file

@ -15,7 +15,7 @@ from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager from ...pipeline import WorkDirManager
from ...typing import Dependencies from ...typing import Dependencies
from ...utils import logger from ..base import logger
__all__ = ["NilearnSmoothing"] __all__ = ["NilearnSmoothing"]

View file

@ -17,8 +17,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_preprocessor from ...api.decorators import register_preprocessor
from ...datagrabber import DataType from ...datagrabber import DataType
from ...typing import ConditionalDependencies from ...typing import ConditionalDependencies
from ...utils import ensure_list_or_none, logger from ...utils import ensure_list_or_none
from ..base import BasePreprocessor from ..base import BasePreprocessor, logger
from ._afni_smoothing import AFNISmoothing from ._afni_smoothing import AFNISmoothing
from ._fsl_smoothing import FSLSmoothing from ._fsl_smoothing import FSLSmoothing
from ._nilearn_smoothing import NilearnSmoothing from ._nilearn_smoothing import NilearnSmoothing

View file

@ -14,7 +14,8 @@ import numpy as np
from ...data import get_template, get_xfm from ...data import get_template, get_xfm
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, raise_error, run_ext_cmd from ...utils import raise_error, run_ext_cmd
from ..base import logger
__all__ = ["ANTsWarper"] __all__ = ["ANTsWarper"]

View file

@ -13,7 +13,8 @@ import numpy as np
from ...pipeline import ExtDep, WorkDirManager from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, raise_error, run_ext_cmd from ...utils import raise_error, run_ext_cmd
from ..base import logger
__all__ = ["FSLWarper"] __all__ = ["FSLWarper"]

View file

@ -13,8 +13,8 @@ from templateflow import api as tflow
from ...api.decorators import register_preprocessor from ...api.decorators import register_preprocessor
from ...datagrabber import DataType from ...datagrabber import DataType
from ...typing import ConditionalDependencies from ...typing import ConditionalDependencies
from ...utils import ensure_list_or_none, logger, raise_error from ...utils import ensure_list_or_none, raise_error
from ..base import BasePreprocessor from ..base import BasePreprocessor, logger
from ._ants_warper import ANTsWarper from ._ants_warper import ANTsWarper
from ._fsl_warper import FSLWarper from ._fsl_warper import FSLWarper

View file

@ -9,11 +9,12 @@ from enum import Enum
from typing import Any from typing import Any
import numpy as np import numpy as np
import structlog
from pydantic import validate_call from pydantic import validate_call
from scipy.stats import mode, trim_mean from scipy.stats import mode, trim_mean
from scipy.stats.mstats import winsorize from scipy.stats.mstats import winsorize
from .utils import logger, raise_error from .utils import raise_error
__all__ = [ __all__ = [
@ -24,6 +25,9 @@ __all__ = [
"winsorized_mean", "winsorized_mean",
] ]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="stats")
class AggFunc(str, Enum): class AggFunc(str, Enum):
"""Accepted aggregation function names. """Accepted aggregation function names.

View file

@ -6,9 +6,10 @@ __all__ = [
"PandasBaseFeatureStorage", "PandasBaseFeatureStorage",
"SQLiteFeatureStorage", "SQLiteFeatureStorage",
"Upsert", "Upsert",
"logger",
] ]
from .base import BaseFeatureStorage, MatrixKind, StorageType from .base import BaseFeatureStorage, MatrixKind, StorageType, logger
from .hdf5 import HDF5FeatureStorage from .hdf5 import HDF5FeatureStorage
from .pandas_base import PandasBaseFeatureStorage from .pandas_base import PandasBaseFeatureStorage
from .sqlite import SQLiteFeatureStorage, Upsert from .sqlite import SQLiteFeatureStorage, Upsert

View file

@ -12,9 +12,10 @@ from typing import Any, ClassVar
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import structlog
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
from ..utils import logger, raise_error from ..utils import raise_error
__all__ = ["BaseFeatureStorage", "MatrixKind", "StorageType"] __all__ = ["BaseFeatureStorage", "MatrixKind", "StorageType"]
@ -28,6 +29,10 @@ class MatrixKind(str, Enum):
Full = "full" Full = "full"
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="storage", step="storage")
class StorageType(str, Enum): class StorageType(str, Enum):
"""Accepted storage type.""" """Accepted storage type."""
@ -79,6 +84,10 @@ class BaseFeatureStorage(BaseModel, ABC):
"does not exist, creating now" "does not exist, creating now"
) )
self.uri.parent.mkdir(parents=True, exist_ok=True) self.uri.parent.mkdir(parents=True, exist_ok=True)
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
def validate_input(self, input_: list[str]) -> None: def validate_input(self, input_: list[str]) -> None:
"""Validate the input to the pipeline step. """Validate the input to the pipeline step.

View file

@ -22,8 +22,8 @@ from ..external.h5io.h5io import (
read_hdf5, read_hdf5,
write_hdf5, write_hdf5,
) )
from ..utils import logger, raise_error from ..utils import raise_error
from .base import BaseFeatureStorage, MatrixKind, StorageType from .base import BaseFeatureStorage, MatrixKind, StorageType, logger
from .utils import ( from .utils import (
element_to_prefix, element_to_prefix,
matrix_to_vector, matrix_to_vector,

View file

@ -16,8 +16,8 @@ from sqlalchemy import create_engine, inspect
from tqdm import tqdm from tqdm import tqdm
from ..api.decorators import register_storage from ..api.decorators import register_storage
from ..utils import logger, raise_error, warn_with_log from ..utils import raise_error, warn_with_log
from .base import MatrixKind from .base import MatrixKind, logger
from .pandas_base import PandasBaseFeatureStorage from .pandas_base import PandasBaseFeatureStorage
from .utils import ( from .utils import (
element_to_prefix, element_to_prefix,

View file

@ -12,8 +12,8 @@ from importlib.metadata import PackageNotFoundError, version
import numpy as np import numpy as np
from pydantic import validate_call from pydantic import validate_call
from ..utils import logger, raise_error from ..utils import raise_error
from .base import MatrixKind from .base import MatrixKind, logger
__all__ = [ __all__ = [

View file

@ -111,7 +111,8 @@ structlog.configure(
cache_logger_on_first_use=True, cache_logger_on_first_use=True,
) )
logger = logging.getLogger("junifer") _log = structlog.get_logger("junifer")
logger = _log.bind(pkg="utils")
# Remove datalad logger handlers to avoid duplicate logging # Remove datalad logger handlers to avoid duplicate logging
_datalad_lgr_hdlrs = datalad.log.lgr.handlers _datalad_lgr_hdlrs = datalad.log.lgr.handlers