junifer 0.0.7.dev84__py3-none-any.whl → 0.0.7.dev93__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/datagrabber/__init__.pyi +11 -1
- junifer/datagrabber/pattern_validation_mixin.py +212 -85
- junifer/datagrabber/tests/test_pattern_validation_mixin.py +104 -1
- junifer/typing/_typing.py +1 -1
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/METADATA +1 -1
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/RECORD +12 -12
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/WHEEL +0 -0
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/licenses/AUTHORS.rst +0 -0
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/licenses/LICENSE.md +0 -0
- {junifer-0.0.7.dev84.dist-info → junifer-0.0.7.dev93.dist-info}/top_level.txt +0 -0
junifer/_version.py
CHANGED
@@ -17,5 +17,5 @@ __version__: str
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
18
18
|
version_tuple: VERSION_TUPLE
|
19
19
|
|
20
|
-
__version__ = version = '0.0.7.
|
21
|
-
__version_tuple__ = version_tuple = (0, 0, 7, '
|
20
|
+
__version__ = version = '0.0.7.dev93'
|
21
|
+
__version_tuple__ = version_tuple = (0, 0, 7, 'dev93')
|
junifer/datagrabber/__init__.pyi
CHANGED
@@ -10,7 +10,11 @@ __all__ = [
|
|
10
10
|
"DataladHCP1200",
|
11
11
|
"MultipleDataGrabber",
|
12
12
|
"DMCC13Benchmark",
|
13
|
+
"DataTypeManager",
|
14
|
+
"DataTypeSchema",
|
15
|
+
"OptionalTypeSchema",
|
13
16
|
"PatternValidationMixin",
|
17
|
+
"register_data_type",
|
14
18
|
]
|
15
19
|
|
16
20
|
# These 4 need to be in this order, otherwise it is a circular import
|
@@ -24,4 +28,10 @@ from .hcp1200 import HCP1200, DataladHCP1200
|
|
24
28
|
from .multiple import MultipleDataGrabber
|
25
29
|
from .dmcc13_benchmark import DMCC13Benchmark
|
26
30
|
|
27
|
-
from .pattern_validation_mixin import
|
31
|
+
from .pattern_validation_mixin import (
|
32
|
+
DataTypeManager,
|
33
|
+
DataTypeSchema,
|
34
|
+
OptionalTypeSchema,
|
35
|
+
PatternValidationMixin,
|
36
|
+
register_data_type,
|
37
|
+
)
|
@@ -3,71 +3,199 @@
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
4
4
|
# License: AGPL
|
5
5
|
|
6
|
+
from collections.abc import Iterator, MutableMapping
|
7
|
+
from typing import TypedDict
|
8
|
+
|
6
9
|
from ..typing import DataGrabberPatterns
|
7
10
|
from ..utils import logger, raise_error, warn_with_log
|
8
11
|
|
9
12
|
|
10
|
-
__all__ = [
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
"
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
"
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
13
|
+
__all__ = [
|
14
|
+
"DataTypeManager",
|
15
|
+
"DataTypeSchema",
|
16
|
+
"OptionalTypeSchema",
|
17
|
+
"PatternValidationMixin",
|
18
|
+
"register_data_type",
|
19
|
+
]
|
20
|
+
|
21
|
+
|
22
|
+
class OptionalTypeSchema(TypedDict):
|
23
|
+
"""Optional type schema."""
|
24
|
+
|
25
|
+
mandatory: list[str]
|
26
|
+
optional: list[str]
|
27
|
+
|
28
|
+
|
29
|
+
class DataTypeSchema(TypedDict):
|
30
|
+
"""Data type schema."""
|
31
|
+
|
32
|
+
mandatory: list[str]
|
33
|
+
optional: dict[str, OptionalTypeSchema]
|
34
|
+
|
35
|
+
|
36
|
+
class DataTypeManager(MutableMapping):
|
37
|
+
"""Class for managing data types."""
|
38
|
+
|
39
|
+
_instance = None
|
40
|
+
|
41
|
+
def __new__(cls):
|
42
|
+
"""Overridden to make the class singleton."""
|
43
|
+
# Make class singleton
|
44
|
+
if cls._instance is None:
|
45
|
+
cls._instance = super().__new__(cls)
|
46
|
+
# Set global schema
|
47
|
+
cls._global: dict[str, DataTypeSchema] = {}
|
48
|
+
cls._builtin: dict[str, DataTypeSchema] = {}
|
49
|
+
cls._external: dict[str, DataTypeSchema] = {}
|
50
|
+
cls._builtin.update(
|
51
|
+
{
|
52
|
+
"T1w": {
|
53
|
+
"mandatory": ["pattern", "space"],
|
54
|
+
"optional": {
|
55
|
+
"mask": {
|
56
|
+
"mandatory": ["pattern", "space"],
|
57
|
+
"optional": [],
|
58
|
+
},
|
59
|
+
},
|
60
|
+
},
|
61
|
+
"T2w": {
|
62
|
+
"mandatory": ["pattern", "space"],
|
63
|
+
"optional": {
|
64
|
+
"mask": {
|
65
|
+
"mandatory": ["pattern", "space"],
|
66
|
+
"optional": [],
|
67
|
+
},
|
68
|
+
},
|
69
|
+
},
|
70
|
+
"BOLD": {
|
71
|
+
"mandatory": ["pattern", "space"],
|
72
|
+
"optional": {
|
73
|
+
"mask": {
|
74
|
+
"mandatory": ["pattern", "space"],
|
75
|
+
"optional": [],
|
76
|
+
},
|
77
|
+
"confounds": {
|
78
|
+
"mandatory": ["pattern", "format"],
|
79
|
+
"optional": ["mappings"],
|
80
|
+
},
|
81
|
+
"reference": {
|
82
|
+
"mandatory": ["pattern"],
|
83
|
+
"optional": [],
|
84
|
+
},
|
85
|
+
"prewarp_space": {"mandatory": [], "optional": []},
|
86
|
+
},
|
87
|
+
},
|
88
|
+
"Warp": {
|
89
|
+
"mandatory": ["pattern", "src", "dst", "warper"],
|
90
|
+
"optional": {},
|
91
|
+
},
|
92
|
+
"VBM_GM": {
|
93
|
+
"mandatory": ["pattern", "space"],
|
94
|
+
"optional": {},
|
95
|
+
},
|
96
|
+
"VBM_WM": {
|
97
|
+
"mandatory": ["pattern", "space"],
|
98
|
+
"optional": {},
|
99
|
+
},
|
100
|
+
"VBM_CSF": {
|
101
|
+
"mandatory": ["pattern", "space"],
|
102
|
+
"optional": {},
|
103
|
+
},
|
104
|
+
"DWI": {
|
105
|
+
"mandatory": ["pattern"],
|
106
|
+
"optional": {},
|
107
|
+
},
|
108
|
+
"FreeSurfer": {
|
109
|
+
"mandatory": ["pattern"],
|
110
|
+
"optional": {
|
111
|
+
"aseg": {"mandatory": ["pattern"], "optional": []},
|
112
|
+
"norm": {"mandatory": ["pattern"], "optional": []},
|
113
|
+
"lh_white": {
|
114
|
+
"mandatory": ["pattern"],
|
115
|
+
"optional": [],
|
116
|
+
},
|
117
|
+
"rh_white": {
|
118
|
+
"mandatory": ["pattern"],
|
119
|
+
"optional": [],
|
120
|
+
},
|
121
|
+
"lh_pial": {
|
122
|
+
"mandatory": ["pattern"],
|
123
|
+
"optional": [],
|
124
|
+
},
|
125
|
+
"rh_pial": {
|
126
|
+
"mandatory": ["pattern"],
|
127
|
+
"optional": [],
|
128
|
+
},
|
129
|
+
},
|
130
|
+
},
|
131
|
+
}
|
132
|
+
)
|
133
|
+
cls._global.update(cls._builtin)
|
134
|
+
return cls._instance
|
135
|
+
|
136
|
+
def __getitem__(self, key: str) -> DataTypeSchema:
|
137
|
+
"""Retrieve schema for ``key``."""
|
138
|
+
return self._global[key]
|
139
|
+
|
140
|
+
def __iter__(self) -> Iterator[str]:
|
141
|
+
"""Iterate over data types."""
|
142
|
+
return iter(self._global)
|
143
|
+
|
144
|
+
def __len__(self) -> int:
|
145
|
+
"""Get data type count."""
|
146
|
+
return len(self._global)
|
147
|
+
|
148
|
+
def __delitem__(self, key: str) -> None:
|
149
|
+
"""Remove schema for ``key``."""
|
150
|
+
# Internal check
|
151
|
+
if key in self._builtin:
|
152
|
+
raise_error(f"Cannot delete in-built key: {key}")
|
153
|
+
# Non-existing key
|
154
|
+
if key not in self._external:
|
155
|
+
raise_error(klass=KeyError, msg=key)
|
156
|
+
# Update external
|
157
|
+
_ = self._external.pop(key)
|
158
|
+
# Update global
|
159
|
+
_ = self._global.pop(key)
|
160
|
+
|
161
|
+
def __setitem__(self, key: str, value: DataTypeSchema) -> None:
|
162
|
+
"""Update ``key`` with ``value``."""
|
163
|
+
# Internal check
|
164
|
+
if key in self._builtin:
|
165
|
+
raise_error(f"Cannot set value for in-built key: {key}")
|
166
|
+
# Value type check
|
167
|
+
if not isinstance(value, dict):
|
168
|
+
raise_error(f"Invalid value type: {type(value)}")
|
169
|
+
# Update external
|
170
|
+
self._external[key] = value
|
171
|
+
# Update global
|
172
|
+
self._global[key] = value
|
173
|
+
|
174
|
+
def popitem():
|
175
|
+
"""Not implemented."""
|
176
|
+
pass
|
177
|
+
|
178
|
+
def clear(self):
|
179
|
+
"""Not implemented."""
|
180
|
+
pass
|
181
|
+
|
182
|
+
def setdefault(self, key: str, value=None):
|
183
|
+
"""Not implemented."""
|
184
|
+
pass
|
185
|
+
|
186
|
+
|
187
|
+
def register_data_type(name: str, schema: DataTypeSchema) -> None:
|
188
|
+
"""Register custom data type.
|
189
|
+
|
190
|
+
Parameters
|
191
|
+
----------
|
192
|
+
name : str
|
193
|
+
The data type name.
|
194
|
+
schema : DataTypeSchema
|
195
|
+
The data type schema.
|
196
|
+
|
197
|
+
"""
|
198
|
+
DataTypeManager()[name] = schema
|
71
199
|
|
72
200
|
|
73
201
|
class PatternValidationMixin:
|
@@ -311,12 +439,13 @@ class PatternValidationMixin:
|
|
311
439
|
msg="`patterns` must contain all `types`", klass=ValueError
|
312
440
|
)
|
313
441
|
# Check against schema
|
442
|
+
dtype_mgr = DataTypeManager()
|
314
443
|
for dtype_key, dtype_val in patterns.items():
|
315
444
|
# Check if valid data type is provided
|
316
|
-
if dtype_key not in
|
445
|
+
if dtype_key not in dtype_mgr:
|
317
446
|
raise_error(
|
318
447
|
f"Unknown data type: {dtype_key}, "
|
319
|
-
f"should be one of: {list(
|
448
|
+
f"should be one of: {list(dtype_mgr.keys())}"
|
320
449
|
)
|
321
450
|
# Conditional for list dtype vals like Warp
|
322
451
|
if isinstance(dtype_val, list):
|
@@ -324,14 +453,14 @@ class PatternValidationMixin:
|
|
324
453
|
# Check mandatory keys for data type
|
325
454
|
self._validate_mandatory_keys(
|
326
455
|
keys=list(entry),
|
327
|
-
schema=
|
456
|
+
schema=dtype_mgr[dtype_key]["mandatory"],
|
328
457
|
data_type=f"{dtype_key}.{idx}",
|
329
458
|
partial_pattern_ok=partial_pattern_ok,
|
330
459
|
)
|
331
460
|
# Check optional keys for data type
|
332
|
-
for optional_key, optional_val in
|
333
|
-
|
334
|
-
]
|
461
|
+
for optional_key, optional_val in dtype_mgr[dtype_key][
|
462
|
+
"optional"
|
463
|
+
].items():
|
335
464
|
if optional_key not in entry:
|
336
465
|
logger.debug(
|
337
466
|
f"Optional key: `{optional_key}` missing for "
|
@@ -344,12 +473,12 @@ class PatternValidationMixin:
|
|
344
473
|
)
|
345
474
|
# Set nested type name for easier access
|
346
475
|
nested_dtype = f"{dtype_key}.{idx}.{optional_key}"
|
347
|
-
nested_mandatory_keys_schema =
|
476
|
+
nested_mandatory_keys_schema = dtype_mgr[
|
348
477
|
dtype_key
|
349
478
|
]["optional"][optional_key]["mandatory"]
|
350
|
-
nested_optional_keys_schema =
|
351
|
-
|
352
|
-
][
|
479
|
+
nested_optional_keys_schema = dtype_mgr[dtype_key][
|
480
|
+
"optional"
|
481
|
+
][optional_key]["optional"]
|
353
482
|
# Check mandatory keys for nested type
|
354
483
|
self._validate_mandatory_keys(
|
355
484
|
keys=list(optional_val["mandatory"]),
|
@@ -392,10 +521,8 @@ class PatternValidationMixin:
|
|
392
521
|
self._identify_stray_keys(
|
393
522
|
keys=list(entry.keys()),
|
394
523
|
schema=(
|
395
|
-
|
396
|
-
+ list(
|
397
|
-
PATTERNS_SCHEMA[dtype_key]["optional"].keys()
|
398
|
-
)
|
524
|
+
dtype_mgr[dtype_key]["mandatory"]
|
525
|
+
+ list(dtype_mgr[dtype_key]["optional"].keys())
|
399
526
|
),
|
400
527
|
data_type=dtype_key,
|
401
528
|
)
|
@@ -412,12 +539,12 @@ class PatternValidationMixin:
|
|
412
539
|
# Check mandatory keys for data type
|
413
540
|
self._validate_mandatory_keys(
|
414
541
|
keys=list(dtype_val),
|
415
|
-
schema=
|
542
|
+
schema=dtype_mgr[dtype_key]["mandatory"],
|
416
543
|
data_type=dtype_key,
|
417
544
|
partial_pattern_ok=partial_pattern_ok,
|
418
545
|
)
|
419
546
|
# Check optional keys for data type
|
420
|
-
for optional_key, optional_val in
|
547
|
+
for optional_key, optional_val in dtype_mgr[dtype_key][
|
421
548
|
"optional"
|
422
549
|
].items():
|
423
550
|
if optional_key not in dtype_val:
|
@@ -432,12 +559,12 @@ class PatternValidationMixin:
|
|
432
559
|
)
|
433
560
|
# Set nested type name for easier access
|
434
561
|
nested_dtype = f"{dtype_key}.{optional_key}"
|
435
|
-
nested_mandatory_keys_schema =
|
436
|
-
|
437
|
-
][
|
438
|
-
nested_optional_keys_schema =
|
439
|
-
|
440
|
-
][
|
562
|
+
nested_mandatory_keys_schema = dtype_mgr[dtype_key][
|
563
|
+
"optional"
|
564
|
+
][optional_key]["mandatory"]
|
565
|
+
nested_optional_keys_schema = dtype_mgr[dtype_key][
|
566
|
+
"optional"
|
567
|
+
][optional_key]["optional"]
|
441
568
|
# Check mandatory keys for nested type
|
442
569
|
self._validate_mandatory_keys(
|
443
570
|
keys=list(optional_val["mandatory"]),
|
@@ -476,8 +603,8 @@ class PatternValidationMixin:
|
|
476
603
|
self._identify_stray_keys(
|
477
604
|
keys=list(dtype_val.keys()),
|
478
605
|
schema=(
|
479
|
-
|
480
|
-
+ list(
|
606
|
+
dtype_mgr[dtype_key]["mandatory"]
|
607
|
+
+ list(dtype_mgr[dtype_key]["optional"].keys())
|
481
608
|
),
|
482
609
|
data_type=dtype_key,
|
483
610
|
)
|
@@ -9,7 +9,110 @@ from typing import Union
|
|
9
9
|
|
10
10
|
import pytest
|
11
11
|
|
12
|
-
from junifer.datagrabber.pattern_validation_mixin import
|
12
|
+
from junifer.datagrabber.pattern_validation_mixin import (
|
13
|
+
DataTypeManager,
|
14
|
+
DataTypeSchema,
|
15
|
+
PatternValidationMixin,
|
16
|
+
register_data_type,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
def test_dtype_mgr_addition_errors() -> None:
|
21
|
+
"""Test data type manager addition errors."""
|
22
|
+
with pytest.raises(ValueError, match="Cannot set"):
|
23
|
+
dtype_schema: DataTypeSchema = {
|
24
|
+
"mandatory": ["pattern"],
|
25
|
+
"optional": {},
|
26
|
+
}
|
27
|
+
DataTypeManager()["T1w"] = dtype_schema
|
28
|
+
|
29
|
+
with pytest.raises(ValueError, match="Invalid"):
|
30
|
+
DataTypeManager()["DType"] = ""
|
31
|
+
|
32
|
+
|
33
|
+
def test_dtype_mgr_removal_errors() -> None:
|
34
|
+
"""Test data type manager removal errors."""
|
35
|
+
with pytest.raises(ValueError, match="Cannot delete"):
|
36
|
+
_ = DataTypeManager().pop("T1w")
|
37
|
+
|
38
|
+
with pytest.raises(KeyError, match="DType"):
|
39
|
+
del DataTypeManager()["DType"]
|
40
|
+
|
41
|
+
|
42
|
+
@pytest.mark.parametrize(
|
43
|
+
"dtype",
|
44
|
+
[
|
45
|
+
{
|
46
|
+
"mandatory": ["pattern"],
|
47
|
+
"optional": {},
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"mandatory": ["pattern"],
|
51
|
+
"optional": {
|
52
|
+
"subtype": {
|
53
|
+
"mandatory": [],
|
54
|
+
"optional": [],
|
55
|
+
}
|
56
|
+
},
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"mandatory": ["pattern"],
|
60
|
+
"optional": {
|
61
|
+
"subtype": {
|
62
|
+
"mandatory": ["pattern"],
|
63
|
+
"optional": [],
|
64
|
+
}
|
65
|
+
},
|
66
|
+
},
|
67
|
+
{
|
68
|
+
"mandatory": ["pattern"],
|
69
|
+
"optional": {
|
70
|
+
"subtype": {
|
71
|
+
"mandatory": ["pattern"],
|
72
|
+
"optional": ["pattern"],
|
73
|
+
}
|
74
|
+
},
|
75
|
+
},
|
76
|
+
],
|
77
|
+
)
|
78
|
+
def test_dtype_mgr(dtype: DataTypeSchema) -> None:
|
79
|
+
"""Test data type manager addition and removal.
|
80
|
+
|
81
|
+
Parameters
|
82
|
+
----------
|
83
|
+
dtype : DataTypeSchema
|
84
|
+
The parametrized schema.
|
85
|
+
|
86
|
+
"""
|
87
|
+
|
88
|
+
DataTypeManager().update({"DType": dtype})
|
89
|
+
assert "DType" in DataTypeManager()
|
90
|
+
|
91
|
+
_ = DataTypeManager().pop("DType")
|
92
|
+
assert "DType" not in DataTypeManager()
|
93
|
+
|
94
|
+
|
95
|
+
def test_register_data_type() -> None:
|
96
|
+
"""Test data type registration."""
|
97
|
+
|
98
|
+
dtype_schema: DataTypeSchema = {
|
99
|
+
"mandatory": ["pattern"],
|
100
|
+
"optional": {
|
101
|
+
"mask": {
|
102
|
+
"mandatory": ["pattern"],
|
103
|
+
"optional": [],
|
104
|
+
},
|
105
|
+
},
|
106
|
+
}
|
107
|
+
|
108
|
+
register_data_type(
|
109
|
+
name="dtype",
|
110
|
+
schema=dtype_schema,
|
111
|
+
)
|
112
|
+
|
113
|
+
assert "dtype" in DataTypeManager()
|
114
|
+
_ = DataTypeManager().pop("dtype")
|
115
|
+
assert "dumb" not in DataTypeManager()
|
13
116
|
|
14
117
|
|
15
118
|
@pytest.mark.parametrize(
|
junifer/typing/_typing.py
CHANGED
@@ -64,7 +64,7 @@ ConditionalDependencies = Sequence[
|
|
64
64
|
ExternalDependencies = Sequence[MutableMapping[str, Union[str, Sequence[str]]]]
|
65
65
|
MarkerInOutMappings = MutableMapping[str, MutableMapping[str, str]]
|
66
66
|
DataGrabberPatterns = dict[
|
67
|
-
str, Union[dict[str, str],
|
67
|
+
str, Union[dict[str, str], list[dict[str, str]]]
|
68
68
|
]
|
69
69
|
ConfigVal = Union[bool, int, float, str]
|
70
70
|
Element = Union[str, tuple[str, ...]]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: junifer
|
3
|
-
Version: 0.0.7.
|
3
|
+
Version: 0.0.7.dev93
|
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,6 @@
|
|
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=vFYsjG-TWfjglJG7fH8rtbhQ3pjvXxlnFjXQw4toOfM,526
|
4
4
|
junifer/conftest.py,sha256=PWYkkRDU8ly2lYwv7VBKMHje4et6HX7Yey3Md_I2KbA,613
|
5
5
|
junifer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
6
|
junifer/stats.py,sha256=e9aaagMGtgpRfW3Wdpz9ocpnYld1IWylCDcjFUgX9Mk,6225
|
@@ -100,14 +100,14 @@ junifer/data/tests/test_data_utils.py,sha256=6-UQ7HDZ7_zA7iQalzk29KJBdftQMVyqKsQ
|
|
100
100
|
junifer/data/tests/test_dispatch.py,sha256=bm4R0E8gs_XpJ6B5lfWFXjle7PmDjaX7Wu0L6mEU33w,2315
|
101
101
|
junifer/data/tests/test_template_spaces.py,sha256=ZEicEcLqOJ-NpuBZ5SYh4yZ0xZRkhYHnYXiC_YSxjrY,3219
|
102
102
|
junifer/datagrabber/__init__.py,sha256=EHIK-lbjuvkt0V8ypFvLSt85OAAXSkaxBmVlCbNNz8M,323
|
103
|
-
junifer/datagrabber/__init__.pyi,sha256=
|
103
|
+
junifer/datagrabber/__init__.pyi,sha256=4Eydc8RO4TN8TLRDq68cdbJPQMxGEynQwU2bmmWStLg,1027
|
104
104
|
junifer/datagrabber/base.py,sha256=Llr5bHyHovkySI-bzxoQ1TklEF6WOaNRN9D_srqQvYM,6661
|
105
105
|
junifer/datagrabber/datalad_base.py,sha256=52T2DbqDGOxiKSESBESzElrVJ3WihLWrrGlQewSvYOs,12616
|
106
106
|
junifer/datagrabber/dmcc13_benchmark.py,sha256=VMyiwvkr4qSvzBICSksPPKOI2w_WVo06H89Url-hrNs,12819
|
107
107
|
junifer/datagrabber/multiple.py,sha256=4tCOzojs3hoG7daHJJ7HUsx15atWR5nTmyP0S0__aig,6666
|
108
108
|
junifer/datagrabber/pattern.py,sha256=hZxXc59qFGiH710aZkcVgt-JcvVjuR-EMmQ1_QFAoHM,18724
|
109
109
|
junifer/datagrabber/pattern_datalad.py,sha256=7jY-0Xw0G-mKG0BgXNTQPuS-KPnpFhvqfVOZtD6Yfcc,4567
|
110
|
-
junifer/datagrabber/pattern_validation_mixin.py,sha256=
|
110
|
+
junifer/datagrabber/pattern_validation_mixin.py,sha256=UpeSy9jNtJ_5OL5IqlLIFPOMg0SFTHcOTpW3DlepE9g,23696
|
111
111
|
junifer/datagrabber/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
112
112
|
junifer/datagrabber/aomic/__init__.py,sha256=ATxzXq9NBPmWowTMuL77zqrmIbbnk0Wd1iXtXCP3XDg,266
|
113
113
|
junifer/datagrabber/aomic/__init__.pyi,sha256=Rp6C075fZDdKY8VIq508_g4NhVj8bWzR6zb9yln761Q,189
|
@@ -130,7 +130,7 @@ junifer/datagrabber/tests/test_dmcc13_benchmark.py,sha256=h5zLrcP7BbSCeGLt2VfCsi
|
|
130
130
|
junifer/datagrabber/tests/test_multiple.py,sha256=tZBQhlEiSE1PeQ5E3TtuVgsHENquna9t39p54AJ-O5w,9963
|
131
131
|
junifer/datagrabber/tests/test_pattern.py,sha256=H55jYRPfT3rMsoIQOAnWJgw3nGrkU7m2xFa3-ed6NQE,9527
|
132
132
|
junifer/datagrabber/tests/test_pattern_datalad.py,sha256=HJ3dQ3XSlMZ3UT1w2b2xpdPqvfmNxRWmla9zhRejWYI,6483
|
133
|
-
junifer/datagrabber/tests/test_pattern_validation_mixin.py,sha256=
|
133
|
+
junifer/datagrabber/tests/test_pattern_validation_mixin.py,sha256=yzUBRB4it_2BCNcp8syh5n3WejRRI6YfMg5T-p4_IkM,9982
|
134
134
|
junifer/datareader/__init__.py,sha256=CDWjL4PQthskxWX5d0ASro6YIfTT1Tb7ZmyDllWWZso,318
|
135
135
|
junifer/datareader/__init__.pyi,sha256=VOqhh-C3-eqapHVR7-F9Ulc_6iyHTb35XLoGb2DCRaA,72
|
136
136
|
junifer/datareader/default.py,sha256=q8aXHlBzLtRtgM2z3JWIsB-daSZncr33mliZlV5RzdM,6733
|
@@ -308,7 +308,7 @@ junifer/tests/test_main.py,sha256=GMff7jlisGM9_FsiUwWDte43j-KQJGFRYZpwRRqTkd8,37
|
|
308
308
|
junifer/tests/test_stats.py,sha256=NljoGFu2JOPADbi9W0WeUHwpf8nZSdOkcCgCv-Z1fY4,4149
|
309
309
|
junifer/typing/__init__.py,sha256=e0UbuxozXUIxz8h8pLokMOxZV629Q1lnA7vvgm95WF0,215
|
310
310
|
junifer/typing/__init__.pyi,sha256=5jzVAkras38Eou5abUvdP1AXhbpCSnPAllLx88YuPB8,640
|
311
|
-
junifer/typing/_typing.py,sha256=
|
311
|
+
junifer/typing/_typing.py,sha256=JogiI9wCZWHuqgTaZarjk89aA5pR0yTvFx2JfheLT_Y,1783
|
312
312
|
junifer/utils/__init__.py,sha256=I3tYaePAD_ZEU-36-TJ_OYeqW_aMmi5MZ3jmqie6RfU,260
|
313
313
|
junifer/utils/__init__.pyi,sha256=CMb4rq1VcQ00IRuiBFfAWu07Vb-vA4qtVLAoY0ll-bA,422
|
314
314
|
junifer/utils/_config.py,sha256=cfxyv1bfklID2atQseu6y3J7mZrCXPwnGEfBSImG9CM,3054
|
@@ -322,10 +322,10 @@ junifer/utils/tests/test_config.py,sha256=7ltIXuwb_W4Mv_1dxQWyiyM10XgUAfsWKV6D_i
|
|
322
322
|
junifer/utils/tests/test_fs.py,sha256=WQS7cKlKEZ742CIuiOYYpueeAhY9PqlastfDVpVVtvE,923
|
323
323
|
junifer/utils/tests/test_helpers.py,sha256=k5qqfxK8dFyuewTJyR1Qn6-nFaYNuVr0ysc18bfPjyU,929
|
324
324
|
junifer/utils/tests/test_logging.py,sha256=W4tFKmaf8_CxnWZ-o_-XxM7DQbhGG18RsLZJk8bZelI,8163
|
325
|
-
junifer-0.0.7.
|
326
|
-
junifer-0.0.7.
|
327
|
-
junifer-0.0.7.
|
328
|
-
junifer-0.0.7.
|
329
|
-
junifer-0.0.7.
|
330
|
-
junifer-0.0.7.
|
331
|
-
junifer-0.0.7.
|
325
|
+
junifer-0.0.7.dev93.dist-info/licenses/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
|
326
|
+
junifer-0.0.7.dev93.dist-info/licenses/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
|
327
|
+
junifer-0.0.7.dev93.dist-info/METADATA,sha256=XJDtsS1aolWYxCr-iCbrso20QFIP8bciZm9-BxskKWk,8387
|
328
|
+
junifer-0.0.7.dev93.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
329
|
+
junifer-0.0.7.dev93.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
|
330
|
+
junifer-0.0.7.dev93.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
|
331
|
+
junifer-0.0.7.dev93.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|