junifer 0.0.6.dev258__py3-none-any.whl → 0.0.6.dev277__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/api/decorators.py +1 -1
- junifer/api/functions.py +1 -1
- junifer/cli/cli.py +8 -8
- junifer/cli/parser.py +1 -1
- junifer/data/_dispatch.py +1 -1
- junifer/data/masks/_masks.py +1 -1
- junifer/data/template_spaces.py +1 -1
- junifer/datagrabber/multiple.py +6 -2
- junifer/datagrabber/pattern.py +58 -52
- junifer/datagrabber/pattern_validation_mixin.py +3 -3
- junifer/datagrabber/tests/test_datalad_base.py +2 -2
- junifer/datagrabber/tests/test_multiple.py +48 -2
- junifer/datagrabber/tests/test_pattern_datalad.py +1 -1
- junifer/stats.py +1 -1
- junifer/storage/utils.py +2 -2
- junifer/testing/datagrabbers.py +1 -1
- junifer/typing/__init__.pyi +4 -0
- junifer/typing/_typing.py +11 -5
- junifer/utils/__init__.pyi +3 -0
- junifer/utils/_config.py +110 -0
- junifer/utils/helpers.py +1 -1
- junifer/utils/logging.py +1 -1
- junifer/utils/singleton.py +1 -1
- junifer/utils/tests/test_config.py +59 -0
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/METADATA +38 -38
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/RECORD +32 -30
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/WHEEL +1 -1
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/AUTHORS.rst +0 -0
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/LICENSE.md +0 -0
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.6.dev258.dist-info → junifer-0.0.6.dev277.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.dev277'
|
16
|
+
__version_tuple__ = version_tuple = (0, 0, 6, 'dev277')
|
junifer/api/decorators.py
CHANGED
junifer/api/functions.py
CHANGED
@@ -24,7 +24,7 @@ from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike
|
|
24
24
|
from ..utils import logger, raise_error, yaml
|
25
25
|
|
26
26
|
|
27
|
-
__all__ = ["
|
27
|
+
__all__ = ["collect", "list_elements", "queue", "reset", "run"]
|
28
28
|
|
29
29
|
|
30
30
|
def _get_datagrabber(datagrabber_config: dict) -> DataGrabberLike:
|
junifer/cli/cli.py
CHANGED
@@ -29,19 +29,19 @@ from .utils import (
|
|
29
29
|
|
30
30
|
|
31
31
|
__all__ = [
|
32
|
+
"afni_docker",
|
33
|
+
"ants_docker",
|
32
34
|
"cli",
|
33
|
-
"run",
|
34
35
|
"collect",
|
36
|
+
"freesurfer_docker",
|
37
|
+
"fsl_docker",
|
38
|
+
"list_elements",
|
35
39
|
"queue",
|
36
|
-
"wtf",
|
37
|
-
"selftest",
|
38
40
|
"reset",
|
39
|
-
"
|
41
|
+
"run",
|
42
|
+
"selftest",
|
40
43
|
"setup",
|
41
|
-
"
|
42
|
-
"fsl_docker",
|
43
|
-
"ants_docker",
|
44
|
-
"freesurfer_docker",
|
44
|
+
"wtf",
|
45
45
|
]
|
46
46
|
|
47
47
|
|
junifer/cli/parser.py
CHANGED
junifer/data/_dispatch.py
CHANGED
junifer/data/masks/_masks.py
CHANGED
junifer/data/template_spaces.py
CHANGED
junifer/datagrabber/multiple.py
CHANGED
@@ -111,8 +111,12 @@ class MultipleDataGrabber(BaseDataGrabber):
|
|
111
111
|
|
112
112
|
# Update all the metas again
|
113
113
|
for kind in out:
|
114
|
-
|
115
|
-
|
114
|
+
to_update = out[kind]
|
115
|
+
if not isinstance(to_update, list):
|
116
|
+
to_update = [to_update]
|
117
|
+
for t_kind in to_update:
|
118
|
+
self.update_meta(t_kind, "datagrabber")
|
119
|
+
t_kind["meta"]["datagrabber"]["datagrabbers"] = metas
|
116
120
|
return out
|
117
121
|
|
118
122
|
def __enter__(self) -> "MultipleDataGrabber":
|
junifer/datagrabber/pattern.py
CHANGED
@@ -13,6 +13,7 @@ from typing import Optional, Union
|
|
13
13
|
import numpy as np
|
14
14
|
|
15
15
|
from ..api.decorators import register_datagrabber
|
16
|
+
from ..typing import DataGrabberPatterns
|
16
17
|
from ..utils import logger, raise_error
|
17
18
|
from .base import BaseDataGrabber
|
18
19
|
from .pattern_validation_mixin import PatternValidationMixin
|
@@ -171,7 +172,7 @@ class PatternDataGrabber(BaseDataGrabber, PatternValidationMixin):
|
|
171
172
|
def __init__(
|
172
173
|
self,
|
173
174
|
types: list[str],
|
174
|
-
patterns:
|
175
|
+
patterns: DataGrabberPatterns,
|
175
176
|
replacements: Union[list[str], str],
|
176
177
|
datadir: Union[str, Path],
|
177
178
|
confounds_format: Optional[str] = None,
|
@@ -478,58 +479,63 @@ class PatternDataGrabber(BaseDataGrabber, PatternValidationMixin):
|
|
478
479
|
t_type = self.types[t_idx]
|
479
480
|
types_element = set()
|
480
481
|
|
481
|
-
#
|
482
|
-
|
483
|
-
# Conditional
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
for
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
#
|
517
|
-
if
|
518
|
-
elements
|
482
|
+
# Data type dictionary
|
483
|
+
patterns = self.patterns[t_type]
|
484
|
+
# Conditional for list dtype vals like Warp
|
485
|
+
if not isinstance(patterns, list):
|
486
|
+
patterns = [patterns]
|
487
|
+
for t_pattern in patterns:
|
488
|
+
# Conditional fetch of base pattern for getting elements
|
489
|
+
pattern = None
|
490
|
+
# Try for data type pattern
|
491
|
+
pattern = t_pattern.get("pattern")
|
492
|
+
# Try for nested data type pattern
|
493
|
+
if pattern is None and self.partial_pattern_ok:
|
494
|
+
for v in t_pattern.values():
|
495
|
+
if isinstance(v, dict) and "pattern" in v:
|
496
|
+
pattern = v["pattern"]
|
497
|
+
break
|
498
|
+
|
499
|
+
# Replace the pattern
|
500
|
+
(
|
501
|
+
re_pattern,
|
502
|
+
glob_pattern,
|
503
|
+
t_replacements,
|
504
|
+
) = self._replace_patterns_regex(pattern)
|
505
|
+
for fname in self.datadir.glob(glob_pattern):
|
506
|
+
suffix = fname.relative_to(self.datadir).as_posix()
|
507
|
+
m = re.match(re_pattern, suffix)
|
508
|
+
if m is not None:
|
509
|
+
# Find the groups of replacements present in the
|
510
|
+
# pattern. If one replacement is not present, set it
|
511
|
+
# to None. We will take care of this in the
|
512
|
+
# intersection.
|
513
|
+
t_element = tuple([m.group(k) for k in t_replacements])
|
514
|
+
if len(self.replacements) == 1:
|
515
|
+
t_element = t_element[0]
|
516
|
+
types_element.add(t_element)
|
517
|
+
# TODO: does this make sense as elements is always None
|
518
|
+
if elements is None:
|
519
|
+
elements = types_element
|
519
520
|
else:
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
)
|
531
|
-
|
532
|
-
|
521
|
+
# Do the intersection by filtering out elements in which
|
522
|
+
# the replacements are not None
|
523
|
+
if t_replacements == self.replacements:
|
524
|
+
elements.intersection(types_element)
|
525
|
+
else:
|
526
|
+
t_repl_idx = [
|
527
|
+
i
|
528
|
+
for i, v in enumerate(self.replacements)
|
529
|
+
if v in t_replacements
|
530
|
+
]
|
531
|
+
new_elements = set()
|
532
|
+
for t_element in elements:
|
533
|
+
if (
|
534
|
+
tuple(np.array(t_element)[t_repl_idx])
|
535
|
+
in types_element
|
536
|
+
):
|
537
|
+
new_elements.add(t_element)
|
538
|
+
elements = new_elements
|
533
539
|
if elements is None:
|
534
540
|
elements = set()
|
535
541
|
return list(elements)
|
@@ -3,8 +3,8 @@
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
4
4
|
# License: AGPL
|
5
5
|
|
6
|
-
from typing import Union
|
7
6
|
|
7
|
+
from ..typing import DataGrabberPatterns
|
8
8
|
from ..utils import logger, raise_error, warn_with_log
|
9
9
|
|
10
10
|
|
@@ -96,7 +96,7 @@ class PatternValidationMixin:
|
|
96
96
|
def _validate_replacements(
|
97
97
|
self,
|
98
98
|
replacements: list[str],
|
99
|
-
patterns:
|
99
|
+
patterns: DataGrabberPatterns,
|
100
100
|
partial_pattern_ok: bool,
|
101
101
|
) -> None:
|
102
102
|
"""Validate the replacements.
|
@@ -263,7 +263,7 @@ class PatternValidationMixin:
|
|
263
263
|
self,
|
264
264
|
types: list[str],
|
265
265
|
replacements: list[str],
|
266
|
-
patterns:
|
266
|
+
patterns: DataGrabberPatterns,
|
267
267
|
partial_pattern_ok: bool = False,
|
268
268
|
) -> None:
|
269
269
|
"""Validate the patterns.
|
@@ -14,8 +14,8 @@ from junifer.datagrabber import DataladDataGrabber
|
|
14
14
|
_testing_dataset = {
|
15
15
|
"example_bids": {
|
16
16
|
"uri": "https://gin.g-node.org/juaml/datalad-example-bids",
|
17
|
-
"commit": "
|
18
|
-
"id": "
|
17
|
+
"commit": "3f288c8725207ae0c9b3616e093e78cda192b570",
|
18
|
+
"id": "582b9696-f13f-42e4-9587-b4e62aa2a8e7",
|
19
19
|
},
|
20
20
|
"example_bids_ses": {
|
21
21
|
"uri": "https://gin.g-node.org/juaml/datalad-example-bids-ses",
|
@@ -29,7 +29,7 @@ def test_MultipleDataGrabber() -> None:
|
|
29
29
|
dg1 = PatternDataladDataGrabber(
|
30
30
|
rootdir=rootdir,
|
31
31
|
uri=repo_uri,
|
32
|
-
types=["T1w"],
|
32
|
+
types=["T1w", "Warp"],
|
33
33
|
patterns={
|
34
34
|
"T1w": {
|
35
35
|
"pattern": (
|
@@ -44,6 +44,28 @@ def test_MultipleDataGrabber() -> None:
|
|
44
44
|
"space": "native",
|
45
45
|
},
|
46
46
|
},
|
47
|
+
"Warp": [
|
48
|
+
{
|
49
|
+
"pattern": (
|
50
|
+
"{subject}/{session}/anat/"
|
51
|
+
"{subject}_{session}_from-MNI152NLin2009cAsym_to-T1w_"
|
52
|
+
"xfm.h5"
|
53
|
+
),
|
54
|
+
"src": "MNI152NLin2009cAsym",
|
55
|
+
"dst": "native",
|
56
|
+
"warper": "ants",
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"pattern": (
|
60
|
+
"{subject}/{session}/anat/"
|
61
|
+
"{subject}_{session}_from-T1w_to-MNI152NLin2009cAsym_"
|
62
|
+
"xfm.h5"
|
63
|
+
),
|
64
|
+
"src": "native",
|
65
|
+
"dst": "MNI152NLin2009cAsym",
|
66
|
+
"warper": "ants",
|
67
|
+
},
|
68
|
+
],
|
47
69
|
},
|
48
70
|
replacements=replacements,
|
49
71
|
)
|
@@ -75,6 +97,7 @@ def test_MultipleDataGrabber() -> None:
|
|
75
97
|
|
76
98
|
types = dg.get_types()
|
77
99
|
assert "T1w" in types
|
100
|
+
assert "Warp" in types
|
78
101
|
assert "BOLD" in types
|
79
102
|
|
80
103
|
expected_subs = [
|
@@ -90,6 +113,7 @@ def test_MultipleDataGrabber() -> None:
|
|
90
113
|
elem = dg[("sub-01", "ses-01")]
|
91
114
|
# Check data types
|
92
115
|
assert "T1w" in elem
|
116
|
+
assert "Warp" in elem
|
93
117
|
assert "BOLD" in elem
|
94
118
|
# Check meta
|
95
119
|
assert "meta" in elem["BOLD"]
|
@@ -111,7 +135,7 @@ def test_MultipleDataGrabber_no_intersection() -> None:
|
|
111
135
|
dg1 = PatternDataladDataGrabber(
|
112
136
|
rootdir=rootdir,
|
113
137
|
uri=_testing_dataset["example_bids"]["uri"],
|
114
|
-
types=["T1w"],
|
138
|
+
types=["T1w", "Warp"],
|
115
139
|
patterns={
|
116
140
|
"T1w": {
|
117
141
|
"pattern": (
|
@@ -119,6 +143,28 @@ def test_MultipleDataGrabber_no_intersection() -> None:
|
|
119
143
|
),
|
120
144
|
"space": "native",
|
121
145
|
},
|
146
|
+
"Warp": [
|
147
|
+
{
|
148
|
+
"pattern": (
|
149
|
+
"{subject}/{session}/anat/"
|
150
|
+
"{subject}_{session}_from-MNI152NLin2009cAsym_to-T1w_"
|
151
|
+
"xfm.h5"
|
152
|
+
),
|
153
|
+
"src": "MNI152NLin2009cAsym",
|
154
|
+
"dst": "native",
|
155
|
+
"warper": "ants",
|
156
|
+
},
|
157
|
+
{
|
158
|
+
"pattern": (
|
159
|
+
"{subject}/{session}/anat/"
|
160
|
+
"{subject}_{session}_from-T1w_to-MNI152NLin2009cAsym_"
|
161
|
+
"xfm.h5"
|
162
|
+
),
|
163
|
+
"src": "native",
|
164
|
+
"dst": "MNI152NLin2009cAsym",
|
165
|
+
"warper": "ants",
|
166
|
+
},
|
167
|
+
],
|
122
168
|
},
|
123
169
|
replacements=replacements,
|
124
170
|
)
|
@@ -15,7 +15,7 @@ from junifer.datagrabber import PatternDataladDataGrabber
|
|
15
15
|
_testing_dataset = {
|
16
16
|
"example_bids": {
|
17
17
|
"uri": "https://gin.g-node.org/juaml/datalad-example-bids",
|
18
|
-
"commit": "
|
18
|
+
"commit": "3f288c8725207ae0c9b3616e093e78cda192b570",
|
19
19
|
"id": "8fddff30-6993-420a-9d1e-b5b028c59468",
|
20
20
|
},
|
21
21
|
"example_bids_ses": {
|
junifer/stats.py
CHANGED
@@ -13,7 +13,7 @@ from scipy.stats.mstats import winsorize
|
|
13
13
|
from .utils import logger, raise_error
|
14
14
|
|
15
15
|
|
16
|
-
__all__ = ["
|
16
|
+
__all__ = ["count", "get_aggfunc_by_name", "select", "winsorized_mean"]
|
17
17
|
|
18
18
|
|
19
19
|
def get_aggfunc_by_name(
|
junifer/storage/utils.py
CHANGED
@@ -15,11 +15,11 @@ from ..utils.logging import logger, raise_error
|
|
15
15
|
|
16
16
|
|
17
17
|
__all__ = [
|
18
|
+
"element_to_prefix",
|
18
19
|
"get_dependency_version",
|
20
|
+
"matrix_to_vector",
|
19
21
|
"process_meta",
|
20
|
-
"element_to_prefix",
|
21
22
|
"store_matrix_checks",
|
22
|
-
"matrix_to_vector",
|
23
23
|
]
|
24
24
|
|
25
25
|
|
junifer/testing/datagrabbers.py
CHANGED
junifer/typing/__init__.pyi
CHANGED
@@ -8,6 +8,8 @@ __all__ = [
|
|
8
8
|
"ConditionalDependencies",
|
9
9
|
"ExternalDependencies",
|
10
10
|
"MarkerInOutMappings",
|
11
|
+
"DataGrabberPatterns",
|
12
|
+
"ConfigVal",
|
11
13
|
]
|
12
14
|
|
13
15
|
from ._typing import (
|
@@ -20,4 +22,6 @@ from ._typing import (
|
|
20
22
|
ConditionalDependencies,
|
21
23
|
ExternalDependencies,
|
22
24
|
MarkerInOutMappings,
|
25
|
+
DataGrabberPatterns,
|
26
|
+
ConfigVal,
|
23
27
|
)
|
junifer/typing/_typing.py
CHANGED
@@ -19,15 +19,17 @@ if TYPE_CHECKING:
|
|
19
19
|
|
20
20
|
|
21
21
|
__all__ = [
|
22
|
+
"ConditionalDependencies",
|
23
|
+
"ConfigVal",
|
22
24
|
"DataGrabberLike",
|
23
|
-
"
|
24
|
-
"MarkerLike",
|
25
|
-
"StorageLike",
|
26
|
-
"PipelineComponent",
|
25
|
+
"DataGrabberPatterns",
|
27
26
|
"Dependencies",
|
28
|
-
"ConditionalDependencies",
|
29
27
|
"ExternalDependencies",
|
30
28
|
"MarkerInOutMappings",
|
29
|
+
"MarkerLike",
|
30
|
+
"PipelineComponent",
|
31
|
+
"PreprocessorLike",
|
32
|
+
"StorageLike",
|
31
33
|
]
|
32
34
|
|
33
35
|
|
@@ -56,3 +58,7 @@ ConditionalDependencies = Sequence[
|
|
56
58
|
]
|
57
59
|
ExternalDependencies = Sequence[MutableMapping[str, Union[str, Sequence[str]]]]
|
58
60
|
MarkerInOutMappings = MutableMapping[str, MutableMapping[str, str]]
|
61
|
+
DataGrabberPatterns = dict[
|
62
|
+
str, Union[dict[str, str], Sequence[dict[str, str]]]
|
63
|
+
]
|
64
|
+
ConfigVal = Union[bool, int, float]
|
junifer/utils/__init__.pyi
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
__all__ = [
|
2
2
|
"make_executable",
|
3
3
|
"configure_logging",
|
4
|
+
"config",
|
4
5
|
"logger",
|
5
6
|
"raise_error",
|
6
7
|
"warn_with_log",
|
7
8
|
"run_ext_cmd",
|
8
9
|
"deep_update",
|
9
10
|
"yaml",
|
11
|
+
"ConfigManager",
|
10
12
|
]
|
11
13
|
|
12
14
|
from .fs import make_executable
|
13
15
|
from .logging import configure_logging, logger, raise_error, warn_with_log
|
16
|
+
from ._config import config, ConfigManager
|
14
17
|
from .helpers import run_ext_cmd, deep_update
|
15
18
|
from ._yaml import yaml
|
junifer/utils/_config.py
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
"""Provide junifer global configuration."""
|
2
|
+
|
3
|
+
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
4
|
+
# Synchon Mandal <s.mandal@fz-juelich.de>
|
5
|
+
# License: AGPL
|
6
|
+
|
7
|
+
import os
|
8
|
+
from typing import Optional
|
9
|
+
|
10
|
+
from ..typing import ConfigVal
|
11
|
+
from .logging import logger
|
12
|
+
from .singleton import Singleton
|
13
|
+
|
14
|
+
|
15
|
+
__all__ = ["ConfigManager", "config"]
|
16
|
+
|
17
|
+
|
18
|
+
class ConfigManager(metaclass=Singleton):
|
19
|
+
"""Manage configuration parameters.
|
20
|
+
|
21
|
+
Attributes
|
22
|
+
----------
|
23
|
+
_config : dict
|
24
|
+
Configuration parameters.
|
25
|
+
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self) -> None:
|
29
|
+
"""Initialize the class."""
|
30
|
+
self._config = {}
|
31
|
+
# Initial setup from process env
|
32
|
+
self._reload()
|
33
|
+
|
34
|
+
def _reload(self) -> None:
|
35
|
+
"""Reload env vars."""
|
36
|
+
for t_var in os.environ:
|
37
|
+
if t_var.startswith("JUNIFER_"):
|
38
|
+
# Set correct type
|
39
|
+
var_value = os.environ[t_var]
|
40
|
+
# bool
|
41
|
+
if var_value.lower() == "true":
|
42
|
+
var_value = True
|
43
|
+
elif var_value.lower() == "false":
|
44
|
+
var_value = False
|
45
|
+
# numeric
|
46
|
+
else:
|
47
|
+
try:
|
48
|
+
var_value = int(var_value)
|
49
|
+
except ValueError:
|
50
|
+
try:
|
51
|
+
var_value = float(var_value)
|
52
|
+
except ValueError:
|
53
|
+
pass
|
54
|
+
# Set value
|
55
|
+
var_name = (
|
56
|
+
t_var.replace("JUNIFER_", "").lower().replace("_", ".")
|
57
|
+
)
|
58
|
+
logger.debug(
|
59
|
+
f"Setting `{var_name}` from environment to "
|
60
|
+
f"`{var_value}` (type: {type(var_value)})"
|
61
|
+
)
|
62
|
+
self._config[var_name] = var_value
|
63
|
+
|
64
|
+
def get(self, key: str, default: Optional[ConfigVal] = None) -> ConfigVal:
|
65
|
+
"""Get configuration parameter.
|
66
|
+
|
67
|
+
Parameters
|
68
|
+
----------
|
69
|
+
key : str
|
70
|
+
The configuration key to get.
|
71
|
+
default : bool or int or float or None, optional
|
72
|
+
The default value to return if the key is not found (default None).
|
73
|
+
|
74
|
+
Returns
|
75
|
+
-------
|
76
|
+
bool or int or float
|
77
|
+
The configuration value.
|
78
|
+
|
79
|
+
"""
|
80
|
+
return self._config.get(key, default)
|
81
|
+
|
82
|
+
def set(self, key: str, val: ConfigVal) -> None:
|
83
|
+
"""Set configuration parameter.
|
84
|
+
|
85
|
+
Parameters
|
86
|
+
----------
|
87
|
+
key : str
|
88
|
+
The configuration key to set.
|
89
|
+
val : bool or int or float
|
90
|
+
The value to set ``key`` to.
|
91
|
+
|
92
|
+
"""
|
93
|
+
logger.debug(f"Setting `{key}` to `{val}` (type: {type(val)})")
|
94
|
+
self._config[key] = val
|
95
|
+
|
96
|
+
def delete(self, key: str) -> None:
|
97
|
+
"""Delete configuration parameter.
|
98
|
+
|
99
|
+
Parameters
|
100
|
+
----------
|
101
|
+
key : str
|
102
|
+
The configuration key to delete.
|
103
|
+
|
104
|
+
"""
|
105
|
+
logger.debug(f"Deleting `{key}` from config")
|
106
|
+
_ = self._config.pop(key)
|
107
|
+
|
108
|
+
|
109
|
+
# Initialize here to access from anywhere
|
110
|
+
config = ConfigManager()
|
junifer/utils/helpers.py
CHANGED
junifer/utils/logging.py
CHANGED
junifer/utils/singleton.py
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
"""Provide tests for ConfigManager."""
|
2
|
+
|
3
|
+
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
4
|
+
# Synchon Mandal <s.mandal@fz-juelich.de>
|
5
|
+
# License: AGPL
|
6
|
+
|
7
|
+
import os
|
8
|
+
|
9
|
+
import pytest
|
10
|
+
|
11
|
+
from junifer.typing import ConfigVal
|
12
|
+
from junifer.utils import config
|
13
|
+
from junifer.utils._config import ConfigManager
|
14
|
+
|
15
|
+
|
16
|
+
def test_config_manager_singleton() -> None:
|
17
|
+
"""Test that ConfigManager is a singleton."""
|
18
|
+
config_mgr_1 = ConfigManager()
|
19
|
+
config_mgr_2 = ConfigManager()
|
20
|
+
assert id(config_mgr_1) == id(config_mgr_2)
|
21
|
+
|
22
|
+
|
23
|
+
def test_config_manager() -> None:
|
24
|
+
"""Test config operations for ConfigManager."""
|
25
|
+
# Get non-existing with default
|
26
|
+
assert config.get(key="scooby") is None
|
27
|
+
# Set
|
28
|
+
config.set(key="scooby", val=True)
|
29
|
+
# Get existing
|
30
|
+
assert config.get("scooby")
|
31
|
+
# Delete
|
32
|
+
config.delete("scooby")
|
33
|
+
# Get non-existing with default
|
34
|
+
assert config.get(key="scooby") is None
|
35
|
+
|
36
|
+
|
37
|
+
@pytest.mark.parametrize(
|
38
|
+
"val, expected_val",
|
39
|
+
[("TRUE", True), ("FALSE", False), ("1", 1), ("0.0", 0.0)],
|
40
|
+
)
|
41
|
+
def test_config_manager_env_reload(val: str, expected_val: ConfigVal) -> None:
|
42
|
+
"""Test config parsing from env reload.
|
43
|
+
|
44
|
+
Parameters
|
45
|
+
----------
|
46
|
+
val : str
|
47
|
+
The parametrized values.
|
48
|
+
expected_val : bool or int or float
|
49
|
+
The parametrized expected value.
|
50
|
+
|
51
|
+
"""
|
52
|
+
# Set env var
|
53
|
+
os.environ["JUNIFER_TESTME"] = val
|
54
|
+
# Check
|
55
|
+
config._reload()
|
56
|
+
assert config.get("testme") == expected_val
|
57
|
+
# Cleanup
|
58
|
+
del os.environ["JUNIFER_TESTME"]
|
59
|
+
config.delete("testme")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: junifer
|
3
|
-
Version: 0.0.6.
|
3
|
+
Version: 0.0.6.dev277
|
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>
|
@@ -28,47 +28,47 @@ Requires-Python: >=3.9
|
|
28
28
|
Description-Content-Type: text/markdown
|
29
29
|
License-File: LICENSE.md
|
30
30
|
License-File: AUTHORS.rst
|
31
|
-
Requires-Dist: click
|
32
|
-
Requires-Dist: numpy
|
33
|
-
Requires-Dist: scipy
|
34
|
-
Requires-Dist: datalad
|
35
|
-
Requires-Dist: pandas
|
36
|
-
Requires-Dist: nibabel
|
37
|
-
Requires-Dist: nilearn
|
38
|
-
Requires-Dist: sqlalchemy
|
39
|
-
Requires-Dist: ruamel.yaml
|
40
|
-
Requires-Dist: h5py
|
41
|
-
Requires-Dist: httpx[http2]
|
42
|
-
Requires-Dist: tqdm
|
43
|
-
Requires-Dist: templateflow
|
44
|
-
Requires-Dist: lapy
|
45
|
-
Requires-Dist:
|
46
|
-
Requires-Dist:
|
47
|
-
Requires-Dist: looseversion
|
31
|
+
Requires-Dist: click<8.2,>=8.1.3
|
32
|
+
Requires-Dist: numpy<2.0.0,>=1.26.0
|
33
|
+
Requires-Dist: scipy<=1.15.0,>=1.10.0
|
34
|
+
Requires-Dist: datalad<1.2.0,>=1.0.0
|
35
|
+
Requires-Dist: pandas<2.3.0,>=2.0.0
|
36
|
+
Requires-Dist: nibabel<5.4.0,>=5.2.0
|
37
|
+
Requires-Dist: nilearn<=0.10.4,>=0.10.3
|
38
|
+
Requires-Dist: sqlalchemy<=2.1.0,>=2.0.25
|
39
|
+
Requires-Dist: ruamel.yaml<0.19,>=0.17
|
40
|
+
Requires-Dist: h5py>=3.10
|
41
|
+
Requires-Dist: httpx[http2]<0.28.0,>=0.26.0
|
42
|
+
Requires-Dist: tqdm<4.67.0,>=4.66.1
|
43
|
+
Requires-Dist: templateflow>=23.0.0
|
44
|
+
Requires-Dist: lapy<2.0.0,>=1.0.0
|
45
|
+
Requires-Dist: lazy_loader==0.4
|
46
|
+
Requires-Dist: importlib_metadata; python_version < "3.9"
|
47
|
+
Requires-Dist: looseversion==1.3.0; python_version >= "3.12"
|
48
48
|
Provides-Extra: all
|
49
|
-
Requires-Dist: bctpy
|
50
|
-
Requires-Dist: neurokit2
|
49
|
+
Requires-Dist: bctpy==0.6.0; extra == "all"
|
50
|
+
Requires-Dist: neurokit2>=0.1.7; extra == "all"
|
51
51
|
Provides-Extra: bct
|
52
|
-
Requires-Dist: bctpy
|
52
|
+
Requires-Dist: bctpy==0.6.0; extra == "bct"
|
53
|
+
Provides-Extra: onthefly
|
54
|
+
Requires-Dist: bctpy==0.6.0; extra == "onthefly"
|
55
|
+
Provides-Extra: neurokit2
|
56
|
+
Requires-Dist: neurokit2>=0.1.7; extra == "neurokit2"
|
53
57
|
Provides-Extra: dev
|
54
|
-
Requires-Dist: tox
|
55
|
-
Requires-Dist: pre-commit
|
58
|
+
Requires-Dist: tox; extra == "dev"
|
59
|
+
Requires-Dist: pre-commit; extra == "dev"
|
56
60
|
Provides-Extra: docs
|
57
|
-
Requires-Dist: seaborn
|
58
|
-
Requires-Dist: sphinx
|
59
|
-
Requires-Dist: sphinx-gallery
|
60
|
-
Requires-Dist: furo
|
61
|
-
Requires-Dist: numpydoc
|
62
|
-
Requires-Dist: julearn
|
63
|
-
Requires-Dist: sphinx-copybutton
|
64
|
-
Requires-Dist: towncrier
|
65
|
-
Requires-Dist: sphinxcontrib-mermaid
|
66
|
-
Requires-Dist: sphinxcontrib-towncrier
|
67
|
-
Requires-Dist: setuptools-scm
|
68
|
-
Provides-Extra: neurokit2
|
69
|
-
Requires-Dist: neurokit2 >=0.1.7 ; extra == 'neurokit2'
|
70
|
-
Provides-Extra: onthefly
|
71
|
-
Requires-Dist: bctpy ==0.6.0 ; extra == 'onthefly'
|
61
|
+
Requires-Dist: seaborn<0.14.0,>=0.13.0; extra == "docs"
|
62
|
+
Requires-Dist: sphinx<8.1.0,>=7.3.0; extra == "docs"
|
63
|
+
Requires-Dist: sphinx-gallery<0.18.0,>=0.17.0; extra == "docs"
|
64
|
+
Requires-Dist: furo<2024.9.0,>=2024.4.27; extra == "docs"
|
65
|
+
Requires-Dist: numpydoc<1.9.0,>=1.6.0; extra == "docs"
|
66
|
+
Requires-Dist: julearn==0.3.3; extra == "docs"
|
67
|
+
Requires-Dist: sphinx-copybutton<0.5.3,>=0.5.1; extra == "docs"
|
68
|
+
Requires-Dist: towncrier<24.7.0,>=23.10.0; extra == "docs"
|
69
|
+
Requires-Dist: sphinxcontrib-mermaid<0.10,>=0.8.1; extra == "docs"
|
70
|
+
Requires-Dist: sphinxcontrib-towncrier==0.4.0a0; extra == "docs"
|
71
|
+
Requires-Dist: setuptools-scm>=8; extra == "docs"
|
72
72
|
|
73
73
|

|
74
74
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
junifer/__init__.py,sha256=2McgH1yNue6Z1V26-uN_mfMjbTcx4CLhym-DMBl5xA4,266
|
2
2
|
junifer/__init__.pyi,sha256=SsTvgq2Dod6UqJN96GH1lCphH6hJQQurEJHGNhHjGUI,508
|
3
|
-
junifer/_version.py,sha256
|
3
|
+
junifer/_version.py,sha256=oxdSo7e4dHuWGJ6fcFCd_o22QGOenmAuWxLqOvENYXw,428
|
4
4
|
junifer/conftest.py,sha256=PWYkkRDU8ly2lYwv7VBKMHje4et6HX7Yey3Md_I2KbA,613
|
5
5
|
junifer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
junifer/stats.py,sha256=
|
6
|
+
junifer/stats.py,sha256=e9aaagMGtgpRfW3Wdpz9ocpnYld1IWylCDcjFUgX9Mk,6225
|
7
7
|
junifer/api/__init__.py,sha256=aAXW_KAEGQ8aAP5Eni2G1R4MWBF7UgjKOgM6akLuJco,252
|
8
8
|
junifer/api/__init__.pyi,sha256=UJu55ApMFd43N0xlQyNKrYpCdzqhAxA3Jjaj0ETwCXU,169
|
9
|
-
junifer/api/decorators.py,sha256=
|
10
|
-
junifer/api/functions.py,sha256=
|
9
|
+
junifer/api/decorators.py,sha256=xphy55NJHnMZnJ-aNA70UzHUJ3SIgh5Xc8ekcozvj3U,2854
|
10
|
+
junifer/api/functions.py,sha256=ebKz9WVdDcVWX32p2MHiYEEN-FEcsGcRWEN6u4pFnro,12826
|
11
11
|
junifer/api/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
junifer/api/queue_context/__init__.py,sha256=glr8x4aMm4EvVrHywDIlugdNlwD1RzqV2FTDNPqYQZ4,204
|
13
13
|
junifer/api/queue_context/__init__.pyi,sha256=LoDQFGZ9wCDmgx5a1_nhKo4zOSvqViXZ8V882DksF7U,246
|
@@ -43,8 +43,8 @@ junifer/api/res/fsl/std2imgcoord,sha256=-X5wRH6XMl0yqnTACJX6MFhO8DFOEWg42MHRxGvi
|
|
43
43
|
junifer/api/tests/test_functions.py,sha256=aBAZ2EveiBHbAM5w6j2QxMHBze-XiVD3Td1kAE946ps,17786
|
44
44
|
junifer/cli/__init__.py,sha256=DS3kZKHeVDxt6d1MLBerZ2fcAwrEBHee5JOBhOLajUI,197
|
45
45
|
junifer/cli/__init__.pyi,sha256=PiV4znUnzSeuSSJGz-RT8N21PiMqoSMwYcypi7nt2Js,40
|
46
|
-
junifer/cli/cli.py,sha256=
|
47
|
-
junifer/cli/parser.py,sha256=
|
46
|
+
junifer/cli/cli.py,sha256=kzSM-5nZWgQ4iaGbcjDkU2JgdYcUF-zsYskuq9_ewM0,13195
|
47
|
+
junifer/cli/parser.py,sha256=Ok_ADyoDfjlAxl9NP36dtzFHp9QTL87V_cRxCa44UKs,8336
|
48
48
|
junifer/cli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
49
|
junifer/cli/utils.py,sha256=AbPQC0Kl-tHMNKiPxp_01gLAGD3IGoLbsq3rXyPMM-c,3116
|
50
50
|
junifer/cli/tests/test_cli.py,sha256=AYL4my12GmFRCbI3JV7-rju32heYxAqbXNwnV8PwqVY,10982
|
@@ -72,10 +72,10 @@ junifer/configs/juseless/datagrabbers/tests/test_ucla.py,sha256=l-1y_m6NJo7JExhy
|
|
72
72
|
junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py,sha256=b9hjc1mgO--PSRC3id2EzzfE2yWNsuZ2UI47a6sfGZU,1025
|
73
73
|
junifer/data/__init__.py,sha256=xJDI2QKtdjcNzpd1oVFM3guh1SFHM6jKstl7pFmzOuk,267
|
74
74
|
junifer/data/__init__.pyi,sha256=qYszjUYcbFi_2zO23MnbA2HhTW-Ad2oh1pqPQYd6yt0,542
|
75
|
-
junifer/data/_dispatch.py,sha256=
|
75
|
+
junifer/data/_dispatch.py,sha256=O524U1R4MtbGhGJsL0HSh9EqisapBFJWK7uupXrJuMg,6158
|
76
76
|
junifer/data/pipeline_data_registry_base.py,sha256=G8bE3WTj4D_rKC4ZKZe6E48Sd96CGea1PS3SxmTgGK4,2010
|
77
77
|
junifer/data/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
78
|
-
junifer/data/template_spaces.py,sha256=
|
78
|
+
junifer/data/template_spaces.py,sha256=AVNuXuCqY0w7dSrVOZURjCPFIkg0wzQsAV2ggtQFpJU,6504
|
79
79
|
junifer/data/utils.py,sha256=5r-0QGQCNZvDM1tVcl9xyrIdgAO85mww0plpM1RUaGA,3247
|
80
80
|
junifer/data/coordinates/__init__.py,sha256=ffM8rwcHLgHAWixJbKrATrbUKzX940V1UF6RAxZdUMg,186
|
81
81
|
junifer/data/coordinates/__init__.pyi,sha256=Z-Ti5XD3HigkZ8uYN6oYsLqw40-F1GvTVQ5QAy08Wng,88
|
@@ -106,7 +106,7 @@ junifer/data/masks/__init__.py,sha256=eEEhHglyVEx1LrqwXjq3cOmjf4sTsgBstRx5-k7zIQ
|
|
106
106
|
junifer/data/masks/__init__.pyi,sha256=lcgr8gmWDPibC4RxnWBXb8DDpIkO73Aax09u6VXiJJI,114
|
107
107
|
junifer/data/masks/_ants_mask_warper.py,sha256=yGjC-b6Ui-MpPG3FpRnI8pEAxjMUfSSuUGVIeazjN7I,5078
|
108
108
|
junifer/data/masks/_fsl_mask_warper.py,sha256=_7UkX3-wFXQs4KwxopO-QjMyB6aeq1GAkiGSGpG-OzM,2412
|
109
|
-
junifer/data/masks/_masks.py,sha256=
|
109
|
+
junifer/data/masks/_masks.py,sha256=96NKsSSosD6r03Jb2N1xQoyOc2Vl5miokcQdSeuM6SY,20729
|
110
110
|
junifer/data/masks/tests/test_masks.py,sha256=1Zm09ZSdUlR278DTCZeVuxuQntryefsnYYPP02MttVE,16120
|
111
111
|
junifer/data/masks/ukb/UKB_15K_GM_template.nii.gz,sha256=jcX1pDOrDsoph8cPMNFVKH5gZYio5G4rJNpOFXm9wJI,946636
|
112
112
|
junifer/data/masks/vickery-patil/CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean.nii.gz,sha256=j6EY8EtRnUuRxeKgD65Q6B0GPEPIALKDJEIje1TfnAU,88270
|
@@ -125,10 +125,10 @@ junifer/datagrabber/__init__.pyi,sha256=zOQE4TaCKXBTHnNqgmECtsszWIOHYiQ1CUEeXXFU
|
|
125
125
|
junifer/datagrabber/base.py,sha256=a3_fUZIN5Bqhq2f4ldpwk_eWeSVRDpDmx2QGIKzCtkg,6761
|
126
126
|
junifer/datagrabber/datalad_base.py,sha256=2g-e_pLG0Legx4BvisrnGWYi1NCTyOkCi09QxbKX18M,11415
|
127
127
|
junifer/datagrabber/dmcc13_benchmark.py,sha256=VMyiwvkr4qSvzBICSksPPKOI2w_WVo06H89Url-hrNs,12819
|
128
|
-
junifer/datagrabber/multiple.py,sha256=
|
129
|
-
junifer/datagrabber/pattern.py,sha256=
|
128
|
+
junifer/datagrabber/multiple.py,sha256=4tCOzojs3hoG7daHJJ7HUsx15atWR5nTmyP0S0__aig,6666
|
129
|
+
junifer/datagrabber/pattern.py,sha256=UwJQ0MObBIS6eHH9FfoM_sBYuNM9n5NAX7DA0HdtL1A,18709
|
130
130
|
junifer/datagrabber/pattern_datalad.py,sha256=QPWXIToYHDU4mvm9lz_hy8BjdqqoCXiGiJKCcATrT-w,4568
|
131
|
-
junifer/datagrabber/pattern_validation_mixin.py,sha256=
|
131
|
+
junifer/datagrabber/pattern_validation_mixin.py,sha256=MlcQIDyPHtqPcq1eHkwvrp-m5MhZaxTG1l2j3JM6FOc,19236
|
132
132
|
junifer/datagrabber/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
133
133
|
junifer/datagrabber/aomic/__init__.py,sha256=ATxzXq9NBPmWowTMuL77zqrmIbbnk0Wd1iXtXCP3XDg,266
|
134
134
|
junifer/datagrabber/aomic/__init__.pyi,sha256=Rp6C075fZDdKY8VIq508_g4NhVj8bWzR6zb9yln761Q,189
|
@@ -146,11 +146,11 @@ junifer/datagrabber/hcp1200/hcp1200.py,sha256=L_JTY0RYQ_Wst2La5EaGVDbya7IfSkTVkK
|
|
146
146
|
junifer/datagrabber/hcp1200/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
147
147
|
junifer/datagrabber/hcp1200/tests/test_hcp1200.py,sha256=HeXlD6wjvDq0EyqlB_nPqfXSIhAzALYAYjSCAjNOGGg,10972
|
148
148
|
junifer/datagrabber/tests/test_base.py,sha256=fZdVhNhvfht9lpTHrAUf5E6mAfNNUP7OTQ5KLaBQ1gI,3506
|
149
|
-
junifer/datagrabber/tests/test_datalad_base.py,sha256=
|
149
|
+
junifer/datagrabber/tests/test_datalad_base.py,sha256=5QSgsloHROVjp0g1UxXlk-Zmk-vHsLHGn05DJmmNkTI,16261
|
150
150
|
junifer/datagrabber/tests/test_dmcc13_benchmark.py,sha256=QSdYAAwAj1DoE1oLhoraIc4lAgUgIaJyrtcOs_witzM,9914
|
151
|
-
junifer/datagrabber/tests/test_multiple.py,sha256=
|
151
|
+
junifer/datagrabber/tests/test_multiple.py,sha256=tZBQhlEiSE1PeQ5E3TtuVgsHENquna9t39p54AJ-O5w,9963
|
152
152
|
junifer/datagrabber/tests/test_pattern.py,sha256=H55jYRPfT3rMsoIQOAnWJgw3nGrkU7m2xFa3-ed6NQE,9527
|
153
|
-
junifer/datagrabber/tests/test_pattern_datalad.py,sha256=
|
153
|
+
junifer/datagrabber/tests/test_pattern_datalad.py,sha256=HJ3dQ3XSlMZ3UT1w2b2xpdPqvfmNxRWmla9zhRejWYI,6483
|
154
154
|
junifer/datagrabber/tests/test_pattern_validation_mixin.py,sha256=KU3xha3Mo7IX_5Tp4RL5awvEzZrX43OmrRFjeqMYVgk,7498
|
155
155
|
junifer/datareader/__init__.py,sha256=CDWjL4PQthskxWX5d0ASro6YIfTT1Tb7ZmyDllWWZso,318
|
156
156
|
junifer/datareader/__init__.pyi,sha256=VOqhh-C3-eqapHVR7-F9Ulc_6iyHTb35XLoGb2DCRaA,72
|
@@ -306,7 +306,7 @@ junifer/storage/hdf5.py,sha256=1nK4su0S1ND-cMMP0jhf66yf0I0JwHp1gicDjZhXw9s,38001
|
|
306
306
|
junifer/storage/pandas_base.py,sha256=v3iRuoXJzBChZYkjR4OHJp99NM0BPTpYkw1TAX52Nto,7529
|
307
307
|
junifer/storage/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
308
308
|
junifer/storage/sqlite.py,sha256=QzkKB1pD4qNjrMe0bB7ATHnPgNjteTrP3ULCE_XuwD0,21269
|
309
|
-
junifer/storage/utils.py,sha256=
|
309
|
+
junifer/storage/utils.py,sha256=3wpiHeyGJ74neICgKmSrlpSZcyl5Hm1y3_49-Sj9tWg,7390
|
310
310
|
junifer/storage/tests/test_hdf5.py,sha256=vHMludIWJJ-4_i1kMYqLfdCrHJkYe7Dd9ZXLTjt-MOQ,31481
|
311
311
|
junifer/storage/tests/test_pandas_base.py,sha256=y_TfUGpuXkj_39yVon3rMDxMeBrZXs58ZW6OSty5LNw,4058
|
312
312
|
junifer/storage/tests/test_sqlite.py,sha256=0TQIcqHPgk67ALsR-98CA73ulDPsR2t9wGXYaem983w,28312
|
@@ -314,7 +314,7 @@ junifer/storage/tests/test_storage_base.py,sha256=YzgfspuggzXejyPIoRCPST3ZzH9Pi7
|
|
314
314
|
junifer/storage/tests/test_utils.py,sha256=k2HxD9cC-NczasEWjPZUiIy6mpbelR8KIUXWtkp_uws,11862
|
315
315
|
junifer/testing/__init__.py,sha256=gqfrX2c7I31VYBmH9hCUERO-61NwubT1cvy1bKM0NqU,249
|
316
316
|
junifer/testing/__init__.pyi,sha256=OFqGc5GCjoD4hPVOYNWvnvvP_RVF-oO-UQR8n9HDVtM,133
|
317
|
-
junifer/testing/datagrabbers.py,sha256=
|
317
|
+
junifer/testing/datagrabbers.py,sha256=ui2VwArMjx4KUD2Cf8PRJOExvDHfPntuuuhEEwWwTZ4,6571
|
318
318
|
junifer/testing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
319
319
|
junifer/testing/registry.py,sha256=MVO-xlzSH3pAv9ySTqO1R3sNqdnfD1Qh7oA775ZxlXs,688
|
320
320
|
junifer/testing/utils.py,sha256=TEIwdV7etWglXOFQX1O5ZR18GzfYZ0LcRqXuK-JPo8U,591
|
@@ -326,23 +326,25 @@ junifer/testing/tests/test_testing_registry.py,sha256=MK4a_q4MHieCvYhnhuPm_dH76l
|
|
326
326
|
junifer/tests/test_main.py,sha256=GMff7jlisGM9_FsiUwWDte43j-KQJGFRYZpwRRqTkd8,373
|
327
327
|
junifer/tests/test_stats.py,sha256=NljoGFu2JOPADbi9W0WeUHwpf8nZSdOkcCgCv-Z1fY4,4149
|
328
328
|
junifer/typing/__init__.py,sha256=e0UbuxozXUIxz8h8pLokMOxZV629Q1lnA7vvgm95WF0,215
|
329
|
-
junifer/typing/__init__.pyi,sha256=
|
330
|
-
junifer/typing/_typing.py,sha256=
|
329
|
+
junifer/typing/__init__.pyi,sha256=0SBTyWv6jYV2x7UiZO2vJirFeJePTMyVq9lZcHZus44,536
|
330
|
+
junifer/typing/_typing.py,sha256=TQrKnVqECgLDP1EiI0z-5pkeT9zHPmoha1gG8a2tqs0,1560
|
331
331
|
junifer/utils/__init__.py,sha256=I3tYaePAD_ZEU-36-TJ_OYeqW_aMmi5MZ3jmqie6RfU,260
|
332
|
-
junifer/utils/__init__.pyi,sha256=
|
332
|
+
junifer/utils/__init__.pyi,sha256=CMb4rq1VcQ00IRuiBFfAWu07Vb-vA4qtVLAoY0ll-bA,422
|
333
|
+
junifer/utils/_config.py,sha256=cfxyv1bfklID2atQseu6y3J7mZrCXPwnGEfBSImG9CM,3054
|
333
334
|
junifer/utils/_yaml.py,sha256=jpTroTI2rajECj0RXGCXaOwLpad858WzI7Jg-eXJ_jU,336
|
334
335
|
junifer/utils/fs.py,sha256=M3CKBLh4gPS6s9giyopgb1hHMXzLb6k3cung2wHVBjs,492
|
335
|
-
junifer/utils/helpers.py,sha256=
|
336
|
-
junifer/utils/logging.py,sha256=
|
336
|
+
junifer/utils/helpers.py,sha256=QcfdHPhrYKTf6o5eSOIvDxqmIAxlp9SqmCEdR10jbIY,2033
|
337
|
+
junifer/utils/logging.py,sha256=DRWcKwez56Mfh5PyLQSaKgL0Cc_Om8qfO8zGHTHB5Vo,9769
|
337
338
|
junifer/utils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
338
|
-
junifer/utils/singleton.py,sha256=
|
339
|
+
junifer/utils/singleton.py,sha256=iATJMdzsSVE9akTI4DDycubhAl98t0EdO17gwgOjAYA,1189
|
340
|
+
junifer/utils/tests/test_config.py,sha256=7ltIXuwb_W4Mv_1dxQWyiyM10XgUAfsWKV6D_iE-XU0,1540
|
339
341
|
junifer/utils/tests/test_fs.py,sha256=WQS7cKlKEZ742CIuiOYYpueeAhY9PqlastfDVpVVtvE,923
|
340
342
|
junifer/utils/tests/test_helpers.py,sha256=k5qqfxK8dFyuewTJyR1Qn6-nFaYNuVr0ysc18bfPjyU,929
|
341
343
|
junifer/utils/tests/test_logging.py,sha256=duO4ou365hxwa_kwihFtKPLaL6LC5XHiyhOijrrngbA,8009
|
342
|
-
junifer-0.0.6.
|
343
|
-
junifer-0.0.6.
|
344
|
-
junifer-0.0.6.
|
345
|
-
junifer-0.0.6.
|
346
|
-
junifer-0.0.6.
|
347
|
-
junifer-0.0.6.
|
348
|
-
junifer-0.0.6.
|
344
|
+
junifer-0.0.6.dev277.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
|
345
|
+
junifer-0.0.6.dev277.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
|
346
|
+
junifer-0.0.6.dev277.dist-info/METADATA,sha256=_f6DUBkVFhbhg_l8PQXSibG-3q9WIM6EP9PBvayajuA,8429
|
347
|
+
junifer-0.0.6.dev277.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
348
|
+
junifer-0.0.6.dev277.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
|
349
|
+
junifer-0.0.6.dev277.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
|
350
|
+
junifer-0.0.6.dev277.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|