junifer 0.0.6.dev205__py3-none-any.whl → 0.0.6.dev219__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- junifer/_version.py +2 -2
- junifer/conftest.py +25 -0
- junifer/data/coordinates/_coordinates.py +2 -3
- junifer/data/masks/_masks.py +2 -3
- junifer/data/parcellations/_parcellations.py +2 -3
- junifer/data/pipeline_data_registry_base.py +2 -1
- junifer/datagrabber/hcp1200/tests/test_hcp1200.py +6 -1
- junifer/markers/falff/_afni_falff.py +2 -3
- junifer/markers/falff/_junifer_falff.py +2 -3
- junifer/markers/reho/_afni_reho.py +2 -3
- junifer/markers/reho/_junifer_reho.py +2 -3
- junifer/pipeline/pipeline_component_registry.py +2 -3
- junifer/pipeline/tests/test_workdir_manager.py +42 -0
- junifer/pipeline/workdir_manager.py +19 -5
- junifer/{pipeline → utils}/singleton.py +19 -14
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/METADATA +1 -1
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/RECORD +22 -21
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/AUTHORS.rst +0 -0
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/LICENSE.md +0 -0
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/WHEEL +0 -0
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.6.dev205.dist-info → junifer-0.0.6.dev219.dist-info}/top_level.txt +0 -0
    
        junifer/_version.py
    CHANGED
    
    | @@ -12,5 +12,5 @@ __version__: str | |
| 12 12 | 
             
            __version_tuple__: VERSION_TUPLE
         | 
| 13 13 | 
             
            version_tuple: VERSION_TUPLE
         | 
| 14 14 |  | 
| 15 | 
            -
            __version__ = version = '0.0.6. | 
| 16 | 
            -
            __version_tuple__ = version_tuple = (0, 0, 6, ' | 
| 15 | 
            +
            __version__ = version = '0.0.6.dev219'
         | 
| 16 | 
            +
            __version_tuple__ = version_tuple = (0, 0, 6, 'dev219')
         | 
    
        junifer/conftest.py
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            """Provide conftest for pytest."""
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
         | 
| 4 | 
            +
            # License: AGPL
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            import pytest
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            from junifer.utils.singleton import Singleton
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            @pytest.fixture(autouse=True)
         | 
| 12 | 
            +
            def reset_singletons() -> None:
         | 
| 13 | 
            +
                """Reset all singletons."""
         | 
| 14 | 
            +
                to_clean = ["WorkDirManager"]
         | 
| 15 | 
            +
                to_remove = [
         | 
| 16 | 
            +
                    v for k, v in Singleton.instances.items() if k.__name__ in to_clean
         | 
| 17 | 
            +
                ]
         | 
| 18 | 
            +
                Singleton.instances = {
         | 
| 19 | 
            +
                    k: v
         | 
| 20 | 
            +
                    for k, v in Singleton.instances.items()
         | 
| 21 | 
            +
                    if k.__name__ not in to_clean
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
                # Force deleting the singletons
         | 
| 24 | 
            +
                for elem in to_remove:
         | 
| 25 | 
            +
                    del elem
         | 
| @@ -11,8 +11,8 @@ import numpy as np | |
| 11 11 | 
             
            import pandas as pd
         | 
| 12 12 | 
             
            from numpy.typing import ArrayLike
         | 
| 13 13 |  | 
| 14 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 15 14 | 
             
            from ...utils import logger, raise_error
         | 
| 15 | 
            +
            from ...utils.singleton import Singleton
         | 
| 16 16 | 
             
            from ..pipeline_data_registry_base import BasePipelineDataRegistry
         | 
| 17 17 | 
             
            from ._ants_coordinates_warper import ANTsCoordinatesWarper
         | 
| 18 18 | 
             
            from ._fsl_coordinates_warper import FSLCoordinatesWarper
         | 
| @@ -21,8 +21,7 @@ from ._fsl_coordinates_warper import FSLCoordinatesWarper | |
| 21 21 | 
             
            __all__ = ["CoordinatesRegistry"]
         | 
| 22 22 |  | 
| 23 23 |  | 
| 24 | 
            -
             | 
| 25 | 
            -
            class CoordinatesRegistry(BasePipelineDataRegistry):
         | 
| 24 | 
            +
            class CoordinatesRegistry(BasePipelineDataRegistry, metaclass=Singleton):
         | 
| 26 25 | 
             
                """Class for coordinates data registry.
         | 
| 27 26 |  | 
| 28 27 | 
             
                This class is a singleton and is used for managing available coordinates
         | 
    
        junifer/data/masks/_masks.py
    CHANGED
    
    | @@ -25,8 +25,8 @@ from nilearn.masking import ( | |
| 25 25 | 
             
                intersect_masks,
         | 
| 26 26 | 
             
            )
         | 
| 27 27 |  | 
| 28 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 29 28 | 
             
            from ...utils import logger, raise_error
         | 
| 29 | 
            +
            from ...utils.singleton import Singleton
         | 
| 30 30 | 
             
            from ..pipeline_data_registry_base import BasePipelineDataRegistry
         | 
| 31 31 | 
             
            from ..template_spaces import get_template
         | 
| 32 32 | 
             
            from ..utils import closest_resolution
         | 
| @@ -126,8 +126,7 @@ def compute_brain_mask( | |
| 126 126 | 
             
                return new_img_like(target_img, mask)  # type: ignore
         | 
| 127 127 |  | 
| 128 128 |  | 
| 129 | 
            -
             | 
| 130 | 
            -
            class MaskRegistry(BasePipelineDataRegistry):
         | 
| 129 | 
            +
            class MaskRegistry(BasePipelineDataRegistry, metaclass=Singleton):
         | 
| 131 130 | 
             
                """Class for mask data registry.
         | 
| 132 131 |  | 
| 133 132 | 
             
                This class is a singleton and is used for managing available mask
         | 
| @@ -20,8 +20,8 @@ import numpy as np | |
| 20 20 | 
             
            import pandas as pd
         | 
| 21 21 | 
             
            from nilearn import datasets, image
         | 
| 22 22 |  | 
| 23 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 24 23 | 
             
            from ...utils import logger, raise_error, warn_with_log
         | 
| 24 | 
            +
            from ...utils.singleton import Singleton
         | 
| 25 25 | 
             
            from ..pipeline_data_registry_base import BasePipelineDataRegistry
         | 
| 26 26 | 
             
            from ..utils import closest_resolution
         | 
| 27 27 | 
             
            from ._ants_parcellation_warper import ANTsParcellationWarper
         | 
| @@ -38,8 +38,7 @@ __all__ = [ | |
| 38 38 | 
             
            ]
         | 
| 39 39 |  | 
| 40 40 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
            class ParcellationRegistry(BasePipelineDataRegistry):
         | 
| 41 | 
            +
            class ParcellationRegistry(BasePipelineDataRegistry, metaclass=Singleton):
         | 
| 43 42 | 
             
                """Class for parcellation data registry.
         | 
| 44 43 |  | 
| 45 44 | 
             
                This class is a singleton and is used for managing available parcellation
         | 
| @@ -7,12 +7,13 @@ from abc import ABC, abstractmethod | |
| 7 7 | 
             
            from typing import Any, List, Mapping
         | 
| 8 8 |  | 
| 9 9 | 
             
            from ..utils import raise_error
         | 
| 10 | 
            +
            from ..utils.singleton import ABCSingleton
         | 
| 10 11 |  | 
| 11 12 |  | 
| 12 13 | 
             
            __all__ = ["BasePipelineDataRegistry"]
         | 
| 13 14 |  | 
| 14 15 |  | 
| 15 | 
            -
            class BasePipelineDataRegistry(ABC):
         | 
| 16 | 
            +
            class BasePipelineDataRegistry(ABC, metaclass=ABCSingleton):
         | 
| 16 17 | 
             
                """Abstract base class for pipeline data registry.
         | 
| 17 18 |  | 
| 18 19 | 
             
                For every interface that is required, one needs to provide a concrete
         | 
| @@ -3,6 +3,9 @@ | |
| 3 3 | 
             
            # Authors: Synchon Mandal <s.mandal@fz-juelich.de>
         | 
| 4 4 | 
             
            # License: AGPL
         | 
| 5 5 |  | 
| 6 | 
            +
            import shutil
         | 
| 7 | 
            +
            import tempfile
         | 
| 8 | 
            +
            from pathlib import Path
         | 
| 6 9 | 
             
            from typing import Iterable, Optional
         | 
| 7 10 |  | 
| 8 11 | 
             
            import pytest
         | 
| @@ -17,7 +20,8 @@ URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" | |
| 17 20 | 
             
            @pytest.fixture(scope="module")
         | 
| 18 21 | 
             
            def hcpdg() -> Iterable[DataladHCP1200]:
         | 
| 19 22 | 
             
                """Return a HCP1200 DataGrabber."""
         | 
| 20 | 
            -
                 | 
| 23 | 
            +
                tmpdir = Path(tempfile.gettempdir())
         | 
| 24 | 
            +
                dg = DataladHCP1200(datadir=tmpdir / "datadir")
         | 
| 21 25 | 
             
                # Set URI to Gin
         | 
| 22 26 | 
             
                dg.uri = URI
         | 
| 23 27 | 
             
                # Set correct root directory
         | 
| @@ -26,6 +30,7 @@ def hcpdg() -> Iterable[DataladHCP1200]: | |
| 26 30 | 
             
                    for t_elem in dg.get_elements():
         | 
| 27 31 | 
             
                        dg[t_elem]
         | 
| 28 32 | 
             
                    yield dg
         | 
| 33 | 
            +
                shutil.rmtree(tmpdir / "datadir", ignore_errors=True)
         | 
| 29 34 |  | 
| 30 35 |  | 
| 31 36 | 
             
            @pytest.mark.parametrize(
         | 
| @@ -18,8 +18,8 @@ from typing import ( | |
| 18 18 | 
             
            import nibabel as nib
         | 
| 19 19 |  | 
| 20 20 | 
             
            from ...pipeline import WorkDirManager
         | 
| 21 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 22 21 | 
             
            from ...utils import logger, run_ext_cmd
         | 
| 22 | 
            +
            from ...utils.singleton import Singleton
         | 
| 23 23 |  | 
| 24 24 |  | 
| 25 25 | 
             
            if TYPE_CHECKING:
         | 
| @@ -29,8 +29,7 @@ if TYPE_CHECKING: | |
| 29 29 | 
             
            __all__ = ["AFNIALFF"]
         | 
| 30 30 |  | 
| 31 31 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
            class AFNIALFF:
         | 
| 32 | 
            +
            class AFNIALFF(metaclass=Singleton):
         | 
| 34 33 | 
             
                """Class for computing ALFF using AFNI.
         | 
| 35 34 |  | 
| 36 35 | 
             
                This class uses AFNI's 3dRSFC to compute ALFF. It's designed as a singleton
         | 
| @@ -19,8 +19,8 @@ import scipy as sp | |
| 19 19 | 
             
            from nilearn import image as nimg
         | 
| 20 20 |  | 
| 21 21 | 
             
            from ...pipeline import WorkDirManager
         | 
| 22 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 23 22 | 
             
            from ...utils import logger
         | 
| 23 | 
            +
            from ...utils.singleton import Singleton
         | 
| 24 24 |  | 
| 25 25 |  | 
| 26 26 | 
             
            if TYPE_CHECKING:
         | 
| @@ -30,8 +30,7 @@ if TYPE_CHECKING: | |
| 30 30 | 
             
            __all__ = ["JuniferALFF"]
         | 
| 31 31 |  | 
| 32 32 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
            class JuniferALFF:
         | 
| 33 | 
            +
            class JuniferALFF(metaclass=Singleton):
         | 
| 35 34 | 
             
                """Class for computing ALFF using junifer.
         | 
| 36 35 |  | 
| 37 36 | 
             
                It's designed as a singleton with caching for efficient computation.
         | 
| @@ -18,8 +18,8 @@ from typing import ( | |
| 18 18 | 
             
            import nibabel as nib
         | 
| 19 19 |  | 
| 20 20 | 
             
            from ...pipeline import WorkDirManager
         | 
| 21 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 22 21 | 
             
            from ...utils import logger, run_ext_cmd
         | 
| 22 | 
            +
            from ...utils.singleton import Singleton
         | 
| 23 23 |  | 
| 24 24 |  | 
| 25 25 | 
             
            if TYPE_CHECKING:
         | 
| @@ -29,8 +29,7 @@ if TYPE_CHECKING: | |
| 29 29 | 
             
            __all__ = ["AFNIReHo"]
         | 
| 30 30 |  | 
| 31 31 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
            class AFNIReHo:
         | 
| 32 | 
            +
            class AFNIReHo(metaclass=Singleton):
         | 
| 34 33 | 
             
                """Class for computing ReHo using AFNI.
         | 
| 35 34 |  | 
| 36 35 | 
             
                This class uses AFNI's 3dReHo to compute ReHo. It's designed as a singleton
         | 
| @@ -20,8 +20,8 @@ from nilearn import image as nimg | |
| 20 20 | 
             
            from nilearn import masking as nmask
         | 
| 21 21 |  | 
| 22 22 | 
             
            from ...pipeline import WorkDirManager
         | 
| 23 | 
            -
            from ...pipeline.singleton import singleton
         | 
| 24 23 | 
             
            from ...utils import logger, raise_error
         | 
| 24 | 
            +
            from ...utils.singleton import Singleton
         | 
| 25 25 |  | 
| 26 26 |  | 
| 27 27 | 
             
            if TYPE_CHECKING:
         | 
| @@ -31,8 +31,7 @@ if TYPE_CHECKING: | |
| 31 31 | 
             
            __all__ = ["JuniferReHo"]
         | 
| 32 32 |  | 
| 33 33 |  | 
| 34 | 
            -
             | 
| 35 | 
            -
            class JuniferReHo:
         | 
| 34 | 
            +
            class JuniferReHo(metaclass=Singleton):
         | 
| 36 35 | 
             
                """Class for computing ReHo using junifer.
         | 
| 37 36 |  | 
| 38 37 | 
             
                It's designed as a singleton with caching for efficient computation.
         | 
| @@ -9,7 +9,7 @@ import importlib | |
| 9 9 | 
             
            from typing import TYPE_CHECKING, Dict, List, Mapping, Optional, Union
         | 
| 10 10 |  | 
| 11 11 | 
             
            from ..utils import logger, raise_error
         | 
| 12 | 
            -
            from .singleton import  | 
| 12 | 
            +
            from ..utils.singleton import Singleton
         | 
| 13 13 |  | 
| 14 14 |  | 
| 15 15 | 
             
            if TYPE_CHECKING:
         | 
| @@ -21,8 +21,7 @@ if TYPE_CHECKING: | |
| 21 21 | 
             
            __all__ = ["PipelineComponentRegistry"]
         | 
| 22 22 |  | 
| 23 23 |  | 
| 24 | 
            -
             | 
| 25 | 
            -
            class PipelineComponentRegistry:
         | 
| 24 | 
            +
            class PipelineComponentRegistry(metaclass=Singleton):
         | 
| 26 25 | 
             
                """Class for pipeline component registry.
         | 
| 27 26 |  | 
| 28 27 | 
             
                This class is a singleton and is used for managing pipeline components.
         | 
| @@ -102,3 +102,45 @@ def test_workdir_manager_get_and_delete_tempdir(tmp_path: Path) -> None: | |
| 102 102 | 
             
                workdir_mgr._cleanup()
         | 
| 103 103 | 
             
                # Should remove temporary directory
         | 
| 104 104 | 
             
                assert workdir_mgr.root_tempdir is None
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            def test_workdir_manager_no_cleanup(tmp_path: Path) -> None:
         | 
| 107 | 
            +
                """Test WorkDirManager correctly bypasses cleanup.
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                Parameters
         | 
| 110 | 
            +
                ----------
         | 
| 111 | 
            +
                tmp_path : pathlib.Path
         | 
| 112 | 
            +
                    The path to the test directory.
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                """
         | 
| 115 | 
            +
                workdir_mgr = WorkDirManager(cleanup=False)
         | 
| 116 | 
            +
                workdir_mgr.workdir = tmp_path
         | 
| 117 | 
            +
                # Check no root temporary directory
         | 
| 118 | 
            +
                assert workdir_mgr.root_tempdir is None
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                tempdir = workdir_mgr.get_tempdir()
         | 
| 121 | 
            +
                assert tempdir.exists()
         | 
| 122 | 
            +
                # Should create a temporary directory
         | 
| 123 | 
            +
                assert workdir_mgr.root_tempdir is not None
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                workdir_mgr.delete_tempdir(tempdir)
         | 
| 126 | 
            +
                workdir_mgr._cleanup()
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                # Should remove temporary directory
         | 
| 129 | 
            +
                assert workdir_mgr.root_tempdir is None
         | 
| 130 | 
            +
                # But the temporary directory should still exist
         | 
| 131 | 
            +
                assert tempdir.exists()
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                # Now the same but for the element directory
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                # Check no element directory
         | 
| 136 | 
            +
                assert workdir_mgr.elementdir is None
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                tempdir = workdir_mgr.get_element_tempdir()
         | 
| 139 | 
            +
                # Should create a temporary directory
         | 
| 140 | 
            +
                assert workdir_mgr.elementdir is not None
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                workdir_mgr.cleanup_elementdir()
         | 
| 143 | 
            +
                # Should remove temporary directory
         | 
| 144 | 
            +
                assert workdir_mgr.elementdir is None
         | 
| 145 | 
            +
                # But the temporary directory should still exist
         | 
| 146 | 
            +
                assert tempdir.exists()
         | 
| @@ -10,14 +10,13 @@ from pathlib import Path | |
| 10 10 | 
             
            from typing import Optional, Union
         | 
| 11 11 |  | 
| 12 12 | 
             
            from ..utils import logger
         | 
| 13 | 
            -
            from .singleton import  | 
| 13 | 
            +
            from ..utils.singleton import Singleton
         | 
| 14 14 |  | 
| 15 15 |  | 
| 16 16 | 
             
            __all__ = ["WorkDirManager"]
         | 
| 17 17 |  | 
| 18 18 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
            class WorkDirManager:
         | 
| 19 | 
            +
            class WorkDirManager(metaclass=Singleton):
         | 
| 21 20 | 
             
                """Class for working directory manager.
         | 
| 22 21 |  | 
| 23 22 | 
             
                This class is a singleton and is used for managing temporary and working
         | 
| @@ -40,15 +39,20 @@ class WorkDirManager: | |
| 40 39 | 
             
                    The path to the element directory.
         | 
| 41 40 | 
             
                root_tempdir : pathlib.Path or None
         | 
| 42 41 | 
             
                    The path to the root temporary directory.
         | 
| 42 | 
            +
                cleanup : bool, optional
         | 
| 43 | 
            +
                    If False, the directories are not cleaned up after the object is
         | 
| 44 | 
            +
                    destroyed. This is useful for debugging purposes (default True).
         | 
| 43 45 |  | 
| 44 46 | 
             
                """
         | 
| 45 47 |  | 
| 46 | 
            -
                def __init__( | 
| 48 | 
            +
                def __init__(
         | 
| 49 | 
            +
                    self, workdir: Optional[Union[str, Path]] = None, cleanup=True
         | 
| 50 | 
            +
                ) -> None:
         | 
| 47 51 | 
             
                    """Initialize the class."""
         | 
| 48 52 | 
             
                    self._workdir = Path(workdir) if isinstance(workdir, str) else workdir
         | 
| 49 53 | 
             
                    self._elementdir = None
         | 
| 50 54 | 
             
                    self._root_tempdir = None
         | 
| 51 | 
            -
             | 
| 55 | 
            +
                    self._cleanup_dirs = cleanup
         | 
| 52 56 | 
             
                    self._set_default_workdir()
         | 
| 53 57 |  | 
| 54 58 | 
             
                def _set_default_workdir(self) -> None:
         | 
| @@ -73,6 +77,9 @@ class WorkDirManager: | |
| 73 77 |  | 
| 74 78 | 
             
                def _cleanup(self) -> None:
         | 
| 75 79 | 
             
                    """Clean up the element and temporary directories."""
         | 
| 80 | 
            +
                    if self._cleanup_dirs is False:
         | 
| 81 | 
            +
                        self._root_tempdir = None
         | 
| 82 | 
            +
                        return
         | 
| 76 83 | 
             
                    # Remove element directory
         | 
| 77 84 | 
             
                    self.cleanup_elementdir()
         | 
| 78 85 | 
             
                    # Remove root temporary directory
         | 
| @@ -172,6 +179,8 @@ class WorkDirManager: | |
| 172 179 | 
             
                        The temporary directory path to be deleted.
         | 
| 173 180 |  | 
| 174 181 | 
             
                    """
         | 
| 182 | 
            +
                    if self._cleanup_dirs is False:
         | 
| 183 | 
            +
                        return
         | 
| 175 184 | 
             
                    logger.debug(f"Deleting element temporary directory at {tempdir}")
         | 
| 176 185 | 
             
                    shutil.rmtree(tempdir, ignore_errors=True)
         | 
| 177 186 |  | 
| @@ -183,6 +192,9 @@ class WorkDirManager: | |
| 183 192 | 
             
                    can lead to required intermediate files not being found.
         | 
| 184 193 |  | 
| 185 194 | 
             
                    """
         | 
| 195 | 
            +
                    if self._cleanup_dirs is False:
         | 
| 196 | 
            +
                        self._elementdir = None
         | 
| 197 | 
            +
                        return
         | 
| 186 198 | 
             
                    if self._elementdir is not None:
         | 
| 187 199 | 
             
                        logger.debug(
         | 
| 188 200 | 
             
                            "Deleting element directory at "
         | 
| @@ -245,5 +257,7 @@ class WorkDirManager: | |
| 245 257 | 
             
                        The temporary directory path to be deleted.
         | 
| 246 258 |  | 
| 247 259 | 
             
                    """
         | 
| 260 | 
            +
                    if self._cleanup_dirs is False:
         | 
| 261 | 
            +
                        return
         | 
| 248 262 | 
             
                    logger.debug(f"Deleting temporary directory at {tempdir}")
         | 
| 249 263 | 
             
                    shutil.rmtree(tempdir, ignore_errors=True)
         | 
| @@ -1,15 +1,17 @@ | |
| 1 1 | 
             
            """Provide a singleton class to be used by pipeline components."""
         | 
| 2 2 |  | 
| 3 3 | 
             
            # Authors: Synchon Mandal <s.mandal@fz-juelich.de>
         | 
| 4 | 
            +
            #          Federico Raimondo <f.raimondo@fz-juelich.de>
         | 
| 4 5 | 
             
            # License: AGPL
         | 
| 5 6 |  | 
| 6 | 
            -
            from  | 
| 7 | 
            +
            from abc import ABCMeta
         | 
| 8 | 
            +
            from typing import Any, ClassVar, Dict, Type
         | 
| 7 9 |  | 
| 8 10 |  | 
| 9 | 
            -
            __all__ = [" | 
| 11 | 
            +
            __all__ = ["Singleton", "ABCSingleton"]
         | 
| 10 12 |  | 
| 11 13 |  | 
| 12 | 
            -
             | 
| 14 | 
            +
            class Singleton(type):
         | 
| 13 15 | 
             
                """Make a class singleton.
         | 
| 14 16 |  | 
| 15 17 | 
             
                Parameters
         | 
| @@ -17,15 +19,11 @@ def singleton(cls: Type) -> Type: | |
| 17 19 | 
             
                cls : class
         | 
| 18 20 | 
             
                    The class to designate as singleton.
         | 
| 19 21 |  | 
| 20 | 
            -
                Returns
         | 
| 21 | 
            -
                -------
         | 
| 22 | 
            -
                class
         | 
| 23 | 
            -
                    The only instance of the class.
         | 
| 24 | 
            -
             | 
| 25 22 | 
             
                """
         | 
| 26 | 
            -
                instances: Dict = {}
         | 
| 27 23 |  | 
| 28 | 
            -
                 | 
| 24 | 
            +
                instances: ClassVar[Dict] = {}
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def __call__(cls, *args: Any, **kwargs: Any) -> Type:
         | 
| 29 27 | 
             
                    """Get the only instance for a class.
         | 
| 30 28 |  | 
| 31 29 | 
             
                    Parameters
         | 
| @@ -41,8 +39,15 @@ def singleton(cls: Type) -> Type: | |
| 41 39 | 
             
                        The only instance of the class.
         | 
| 42 40 |  | 
| 43 41 | 
             
                    """
         | 
| 44 | 
            -
                    if cls not in instances:
         | 
| 45 | 
            -
                        instances[cls] =  | 
| 46 | 
            -
             | 
| 42 | 
            +
                    if cls not in cls.instances:
         | 
| 43 | 
            +
                        cls.instances[cls] = super(Singleton, cls).__call__(  # noqa: UP008
         | 
| 44 | 
            +
                            *args, **kwargs
         | 
| 45 | 
            +
                        )
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    return cls.instances[cls]
         | 
| 48 | 
            +
             | 
| 49 | 
            +
             | 
| 50 | 
            +
            class ABCSingleton(ABCMeta, Singleton):
         | 
| 51 | 
            +
                """Make an abstract class a singleton."""
         | 
| 47 52 |  | 
| 48 | 
            -
                 | 
| 53 | 
            +
                pass
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.1
         | 
| 2 2 | 
             
            Name: junifer
         | 
| 3 | 
            -
            Version: 0.0.6. | 
| 3 | 
            +
            Version: 0.0.6.dev219
         | 
| 4 4 | 
             
            Summary: JUelich NeuroImaging FEature extractoR
         | 
| 5 5 | 
             
            Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
         | 
| 6 6 | 
             
            Maintainer-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
         | 
| @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            junifer/__init__.py,sha256=2McgH1yNue6Z1V26-uN_mfMjbTcx4CLhym-DMBl5xA4,266
         | 
| 2 2 | 
             
            junifer/__init__.pyi,sha256=uPLuY27S7AY4kFzJX0ncCpzHnWJdztveMJpY3Di-wwQ,482
         | 
| 3 | 
            -
            junifer/_version.py,sha256= | 
| 3 | 
            +
            junifer/_version.py,sha256=CjqUG_Y4LDEZ8B4jqZpARBHOYed_438kYzl-7CnGiQU,428
         | 
| 4 | 
            +
            junifer/conftest.py,sha256=PWYkkRDU8ly2lYwv7VBKMHje4et6HX7Yey3Md_I2KbA,613
         | 
| 4 5 | 
             
            junifer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 5 6 | 
             
            junifer/stats.py,sha256=BjQb2lfTGDP9l4UuQYmJFcJJNRfbJDGlNvC06SJaDDE,6237
         | 
| 6 7 | 
             
            junifer/api/__init__.py,sha256=aAXW_KAEGQ8aAP5Eni2G1R4MWBF7UgjKOgM6akLuJco,252
         | 
| @@ -72,14 +73,14 @@ junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py,sha256=b9hjc1mgO--PS | |
| 72 73 | 
             
            junifer/data/__init__.py,sha256=xJDI2QKtdjcNzpd1oVFM3guh1SFHM6jKstl7pFmzOuk,267
         | 
| 73 74 | 
             
            junifer/data/__init__.pyi,sha256=qYszjUYcbFi_2zO23MnbA2HhTW-Ad2oh1pqPQYd6yt0,542
         | 
| 74 75 | 
             
            junifer/data/_dispatch.py,sha256=_hmlIXuuuLJBbY5VH6lohJzhbMB7KEhFkVFwRDEdR_E,6189
         | 
| 75 | 
            -
            junifer/data/pipeline_data_registry_base.py,sha256= | 
| 76 | 
            +
            junifer/data/pipeline_data_registry_base.py,sha256=8UyrkXHVr7JdeVfD2xgIRQlrlH3lR2RLHUfnqbw0EyI,1989
         | 
| 76 77 | 
             
            junifer/data/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 77 78 | 
             
            junifer/data/template_spaces.py,sha256=9uZuFztBGNZk3mhUI2h0oQMajjx6Wv31Fx11pGlDI20,6510
         | 
| 78 79 | 
             
            junifer/data/utils.py,sha256=R-AMuerRiJLU4aMK9_WWXFJn2yOuXtZ-YKrdHvFjZf4,1454
         | 
| 79 80 | 
             
            junifer/data/coordinates/__init__.py,sha256=ffM8rwcHLgHAWixJbKrATrbUKzX940V1UF6RAxZdUMg,186
         | 
| 80 81 | 
             
            junifer/data/coordinates/__init__.pyi,sha256=Z-Ti5XD3HigkZ8uYN6oYsLqw40-F1GvTVQ5QAy08Wng,88
         | 
| 81 82 | 
             
            junifer/data/coordinates/_ants_coordinates_warper.py,sha256=Q08zC0MBQPwj94V8G6ZGdRoYA7V3ACNCDlcFlLXc0j8,2809
         | 
| 82 | 
            -
            junifer/data/coordinates/_coordinates.py,sha256= | 
| 83 | 
            +
            junifer/data/coordinates/_coordinates.py,sha256=0zem18y7vT9d_lBAUwF6EqxoUG29qD_nblI0RDx8oH4,11960
         | 
| 83 84 | 
             
            junifer/data/coordinates/_fsl_coordinates_warper.py,sha256=9R0JiyYWXogMr1i6DLepXkjb1aeTZ3CUoxvAPuxNGls,2568
         | 
| 84 85 | 
             
            junifer/data/coordinates/VOIs/meta/AutobiographicalMemory_VOIs.txt,sha256=9af38naeL18Tlt_gy_ep6vyTAxOB336JYjbo5FvP8PQ,686
         | 
| 85 86 | 
             
            junifer/data/coordinates/VOIs/meta/CogAC_VOIs.txt,sha256=Sr5_E712OLdeQRyUcDNM0wLBvZIyO6gc9Q7KkyJHX1A,398
         | 
| @@ -105,7 +106,7 @@ junifer/data/masks/__init__.py,sha256=eEEhHglyVEx1LrqwXjq3cOmjf4sTsgBstRx5-k7zIQ | |
| 105 106 | 
             
            junifer/data/masks/__init__.pyi,sha256=lcgr8gmWDPibC4RxnWBXb8DDpIkO73Aax09u6VXiJJI,114
         | 
| 106 107 | 
             
            junifer/data/masks/_ants_mask_warper.py,sha256=6bBqFO9HNoYG5eYw4IVNZEv2sL58Koz-YXCdpM7U6NQ,4937
         | 
| 107 108 | 
             
            junifer/data/masks/_fsl_mask_warper.py,sha256=mxxJy4WYbbMHEZSpNaBL1RDT4H0RmhA4u8fp7oOW_k4,2567
         | 
| 108 | 
            -
            junifer/data/masks/_masks.py,sha256= | 
| 109 | 
            +
            junifer/data/masks/_masks.py,sha256=2RMG9UL2GU11GgLaEoKPvrWVLtOVVf5etrTbEUefJm8,20960
         | 
| 109 110 | 
             
            junifer/data/masks/tests/test_masks.py,sha256=RDYe8Z46M_hHdZn3hOvdqQXqiMlxJ6454gD3d1ee3zM,16132
         | 
| 110 111 | 
             
            junifer/data/masks/ukb/UKB_15K_GM_template.nii.gz,sha256=jcX1pDOrDsoph8cPMNFVKH5gZYio5G4rJNpOFXm9wJI,946636
         | 
| 111 112 | 
             
            junifer/data/masks/vickery-patil/CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean.nii.gz,sha256=j6EY8EtRnUuRxeKgD65Q6B0GPEPIALKDJEIje1TfnAU,88270
         | 
| @@ -115,7 +116,7 @@ junifer/data/parcellations/__init__.py,sha256=6-Ysil3NyZ69V6rWx4RO15_d-iDKizfbHu | |
| 115 116 | 
             
            junifer/data/parcellations/__init__.pyi,sha256=lhBHTbMDizzqUqVHrx2eyfPFodrTBgMFeTgxfESSkQ8,140
         | 
| 116 117 | 
             
            junifer/data/parcellations/_ants_parcellation_warper.py,sha256=1oOY_O0Ft0NOkGjk4Cx8lyChy7QYJRZbOtdQfDpo4jI,5399
         | 
| 117 118 | 
             
            junifer/data/parcellations/_fsl_parcellation_warper.py,sha256=PwGXT1fEchjIIyQJVr53Ksssf6hHJTtJwgJj8t65LTA,2839
         | 
| 118 | 
            -
            junifer/data/parcellations/_parcellations.py,sha256= | 
| 119 | 
            +
            junifer/data/parcellations/_parcellations.py,sha256=qgAZ1A17PMHEzKtZoEvdfL0VScMy1RIaOJ_C03x-Za0,65780
         | 
| 119 120 | 
             
            junifer/data/parcellations/tests/test_parcellations.py,sha256=43h7lR7nEvo9vTK-AeUDMk0XdGTqyzQI8isYl8dWw6s,38339
         | 
| 120 121 | 
             
            junifer/data/tests/test_data_utils.py,sha256=_DaiC8K79gs9HFHxr-udNeE2YTM6JA0-1i-K2cqK9qA,1087
         | 
| 121 122 | 
             
            junifer/data/tests/test_template_spaces.py,sha256=PJulN7xHpAcSOTY-UzTG_WPywZEBSlAZGiNG4gzk1_8,3144
         | 
| @@ -143,7 +144,7 @@ junifer/datagrabber/hcp1200/__init__.pyi,sha256=2ttZanYSzCsB195_xfXUyztPsVIF02AR | |
| 143 144 | 
             
            junifer/datagrabber/hcp1200/datalad_hcp1200.py,sha256=hngQYLv4b8tC9Ep2X5A5R_L2sFM3ZJ8dmWTr_OlRLAA,2463
         | 
| 144 145 | 
             
            junifer/datagrabber/hcp1200/hcp1200.py,sha256=AfVPd44CdyMcrUTOfps2PSpTQrXde68QeZaLGkXUTn4,6116
         | 
| 145 146 | 
             
            junifer/datagrabber/hcp1200/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 146 | 
            -
            junifer/datagrabber/hcp1200/tests/test_hcp1200.py,sha256= | 
| 147 | 
            +
            junifer/datagrabber/hcp1200/tests/test_hcp1200.py,sha256=17LK9fRAKmRQipo8UAgLOx9rA8G-91cTR_V_uAfKffk,10945
         | 
| 147 148 | 
             
            junifer/datagrabber/tests/test_base.py,sha256=fZdVhNhvfht9lpTHrAUf5E6mAfNNUP7OTQ5KLaBQ1gI,3506
         | 
| 148 149 | 
             
            junifer/datagrabber/tests/test_datalad_base.py,sha256=71erxpAECuy8iLtkmq_SRqfP4sKQf4uEb3O8CThBHT0,16285
         | 
| 149 150 | 
             
            junifer/datagrabber/tests/test_dmcc13_benchmark.py,sha256=DcqkDXXBoabHFVbxekGR2NZyGeugGlxpOwXIwy38Ofg,9109
         | 
| @@ -207,8 +208,8 @@ junifer/markers/complexity/tests/test_sample_entropy.py,sha256=rfbiguVq7CUwYIvYB | |
| 207 208 | 
             
            junifer/markers/complexity/tests/test_weighted_perm_entropy.py,sha256=yDWKEaUbxrnrG6J2NlktLfwSBre5OuXd63kEof7t8PM,2373
         | 
| 208 209 | 
             
            junifer/markers/falff/__init__.py,sha256=qxdx_3FsVrn7h3gtbocK0ZmvqZwPQZGKuVkPm31ejNM,217
         | 
| 209 210 | 
             
            junifer/markers/falff/__init__.pyi,sha256=X-q2zBjUX0imQ37yN2Cg5gKfDvq8sh_9y2hRH4g5ufY,120
         | 
| 210 | 
            -
            junifer/markers/falff/_afni_falff.py,sha256= | 
| 211 | 
            -
            junifer/markers/falff/_junifer_falff.py,sha256= | 
| 211 | 
            +
            junifer/markers/falff/_afni_falff.py,sha256=6kHNWU9k-U6_wlCnysDK90svCqcRggVGOD4SjHnoI9I,4528
         | 
| 212 | 
            +
            junifer/markers/falff/_junifer_falff.py,sha256=UPu3myI6cNoDU1FB0t4Y71KOubPG1xBntdgZysOHiro,4424
         | 
| 212 213 | 
             
            junifer/markers/falff/falff_base.py,sha256=1VjEZMd7BpXDc2subm0VzZNxFp6uxMb9QjBmMC6tDVg,4903
         | 
| 213 214 | 
             
            junifer/markers/falff/falff_parcels.py,sha256=RuACr7qjxJ6fDo8KrbO2fUwpLtzLQXPr9WX4n--XUb0,6029
         | 
| 214 215 | 
             
            junifer/markers/falff/falff_spheres.py,sha256=ZjcPLg29LBfsCLD8iZk0pW0nItH5uLmsn4nlLoUNB78,6668
         | 
| @@ -232,8 +233,8 @@ junifer/markers/functional_connectivity/tests/test_functional_connectivity_parce | |
| 232 233 | 
             
            junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py,sha256=OU2FWAH0Gb4gEOF0m1PAoo5xLKVPetNkwV-ssQTZ1Yw,4157
         | 
| 233 234 | 
             
            junifer/markers/reho/__init__.py,sha256=WZf4A0XaRThjl8SlFOhvTLUfhTHp5koLxZgowsgTSAE,211
         | 
| 234 235 | 
             
            junifer/markers/reho/__init__.pyi,sha256=_aFb-Ry_EP2OMU6xRL4GlfuDpSl_egHllL-fz7vXjcE,118
         | 
| 235 | 
            -
            junifer/markers/reho/_afni_reho.py,sha256= | 
| 236 | 
            -
            junifer/markers/reho/_junifer_reho.py,sha256= | 
| 236 | 
            +
            junifer/markers/reho/_afni_reho.py,sha256=eMHTaj2-zEHVgkz96Xx30Wn5sAGhXO-JmgItQAI9eNo,6476
         | 
| 237 | 
            +
            junifer/markers/reho/_junifer_reho.py,sha256=GFaKoEPUiLk9YRLXTfWplEhQmYipXWkPQj-7YvMXKO0,9314
         | 
| 237 238 | 
             
            junifer/markers/reho/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 238 239 | 
             
            junifer/markers/reho/reho_base.py,sha256=Tdnl5SJ66p461UJ-UilEGKrMdEPwGMemN_QIQgmc8o8,4065
         | 
| 239 240 | 
             
            junifer/markers/reho/reho_parcels.py,sha256=tfGasSaAI-ioxVBTD2L_4gJQthoAq5Fp9e5iRS3mXhI,6404
         | 
| @@ -262,18 +263,17 @@ junifer/onthefly/tests/test_read_transform.py,sha256=D2C3IpXQHdsJSF07v8rEwGntLGX | |
| 262 263 | 
             
            junifer/pipeline/__init__.py,sha256=rxKQGRwc6_sts1KhVIcVVpuXeiFABf11mQQ2h5jgA3U,194
         | 
| 263 264 | 
             
            junifer/pipeline/__init__.pyi,sha256=hhcvNcABhtLaUQiZdTjo5sMWC3rtDkwVshL0sxD5JAE,399
         | 
| 264 265 | 
             
            junifer/pipeline/marker_collection.py,sha256=1xcJqeOZ_IerB7PAMN1itWBv8UR6lUW9xXRoIu4qLXU,5557
         | 
| 265 | 
            -
            junifer/pipeline/pipeline_component_registry.py,sha256= | 
| 266 | 
            +
            junifer/pipeline/pipeline_component_registry.py,sha256=XE4lSSd6STp2VBhsaG21-tfe8kRt97N-1zwE26fF7Yc,9501
         | 
| 266 267 | 
             
            junifer/pipeline/pipeline_step_mixin.py,sha256=wakimkG8GC0PWkFHMHIfgzM2yak41xLrzbVRH0oe8D4,7613
         | 
| 267 268 | 
             
            junifer/pipeline/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 268 | 
            -
            junifer/pipeline/singleton.py,sha256=c5U8Xn10MQqaXjlLzxLbw3AmSYW6aTw_iSL0rDkbuMU,1011
         | 
| 269 269 | 
             
            junifer/pipeline/update_meta_mixin.py,sha256=A_gYCPqdPlM0Xpum9TjJowb41O7ntxQg6y4YOgYeyy4,1564
         | 
| 270 270 | 
             
            junifer/pipeline/utils.py,sha256=CAp0P7rZST7bsJ9lSlkvZgIJebHW2cIm8VXTuu1A6tE,10291
         | 
| 271 | 
            -
            junifer/pipeline/workdir_manager.py,sha256= | 
| 271 | 
            +
            junifer/pipeline/workdir_manager.py,sha256=T7-sZY_Gj0SM7p9N1ATjUFK2T-6CYIMQeYwHpBz96Gs,8616
         | 
| 272 272 | 
             
            junifer/pipeline/tests/test_marker_collection.py,sha256=edBHfmwMTXG_q0ZagApbAbkFNoegi3hVEQiNcBtZOKc,6959
         | 
| 273 273 | 
             
            junifer/pipeline/tests/test_pipeline_component_registry.py,sha256=ww_akEhtvE1_fsWbX5Yd5w_G2Ki6w_5MInfihwwRYFk,5800
         | 
| 274 274 | 
             
            junifer/pipeline/tests/test_pipeline_step_mixin.py,sha256=_ykZzyNzREXy-r_yv1gY_jquLZzVBl8qwYrVORCKY_k,7807
         | 
| 275 275 | 
             
            junifer/pipeline/tests/test_update_meta_mixin.py,sha256=UeWwpUi-Q5WVd36Fgfn_utXplSVXMSjLcdO2mR2xLTk,1355
         | 
| 276 | 
            -
            junifer/pipeline/tests/test_workdir_manager.py,sha256= | 
| 276 | 
            +
            junifer/pipeline/tests/test_workdir_manager.py,sha256=N7_5cTnmv0eSQCT9UWOmFFVT-BIrNWq8GFmaqa-BtRI,4050
         | 
| 277 277 | 
             
            junifer/preprocess/__init__.py,sha256=91D43p254il88g-7sSN64M7HsCvwytYoiTS_GLEr37Y,342
         | 
| 278 278 | 
             
            junifer/preprocess/__init__.pyi,sha256=EApXtuEZohQZnIeP6k882Y2H5IRiGmhJbVGdN7VCWFc,254
         | 
| 279 279 | 
             
            junifer/preprocess/base.py,sha256=v6azVA3RwDe3HriYlcaISOX1A6gYgFUKNzQeIDLx92Q,6681
         | 
| @@ -332,13 +332,14 @@ junifer/utils/fs.py,sha256=M3CKBLh4gPS6s9giyopgb1hHMXzLb6k3cung2wHVBjs,492 | |
| 332 332 | 
             
            junifer/utils/helpers.py,sha256=_IqnaPaOcFy1yrEyNmmg7XqQWb1wHOtxfOBnlaRYbiI,2063
         | 
| 333 333 | 
             
            junifer/utils/logging.py,sha256=ardaiJkDfZMYvak5UIL5Etxg5Ii7inmVQSBdFLdgtb8,9781
         | 
| 334 334 | 
             
            junifer/utils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 335 | 
            +
            junifer/utils/singleton.py,sha256=3mEZT4GJ7lMkH8H7ZPgy0DBe6CNTqg9CRVJFDAy3h60,1201
         | 
| 335 336 | 
             
            junifer/utils/tests/test_fs.py,sha256=WQS7cKlKEZ742CIuiOYYpueeAhY9PqlastfDVpVVtvE,923
         | 
| 336 337 | 
             
            junifer/utils/tests/test_helpers.py,sha256=k5qqfxK8dFyuewTJyR1Qn6-nFaYNuVr0ysc18bfPjyU,929
         | 
| 337 338 | 
             
            junifer/utils/tests/test_logging.py,sha256=duO4ou365hxwa_kwihFtKPLaL6LC5XHiyhOijrrngbA,8009
         | 
| 338 | 
            -
            junifer-0.0.6. | 
| 339 | 
            -
            junifer-0.0.6. | 
| 340 | 
            -
            junifer-0.0.6. | 
| 341 | 
            -
            junifer-0.0.6. | 
| 342 | 
            -
            junifer-0.0.6. | 
| 343 | 
            -
            junifer-0.0.6. | 
| 344 | 
            -
            junifer-0.0.6. | 
| 339 | 
            +
            junifer-0.0.6.dev219.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
         | 
| 340 | 
            +
            junifer-0.0.6.dev219.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
         | 
| 341 | 
            +
            junifer-0.0.6.dev219.dist-info/METADATA,sha256=NmVabUMfIEWcEJ8nOtLA7HTzwuZYBhoIZPA1Z44ycdw,8448
         | 
| 342 | 
            +
            junifer-0.0.6.dev219.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
         | 
| 343 | 
            +
            junifer-0.0.6.dev219.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
         | 
| 344 | 
            +
            junifer-0.0.6.dev219.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
         | 
| 345 | 
            +
            junifer-0.0.6.dev219.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |