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 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.dev84'
21
- __version_tuple__ = version_tuple = (0, 0, 7, 'dev84')
20
+ __version__ = version = '0.0.7.dev93'
21
+ __version_tuple__ = version_tuple = (0, 0, 7, 'dev93')
@@ -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 PatternValidationMixin
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__ = ["PatternValidationMixin"]
11
-
12
-
13
- # Define schema for pattern-based datagrabber's patterns
14
- PATTERNS_SCHEMA = {
15
- "T1w": {
16
- "mandatory": ["pattern", "space"],
17
- "optional": {
18
- "mask": {"mandatory": ["pattern", "space"], "optional": []},
19
- },
20
- },
21
- "T2w": {
22
- "mandatory": ["pattern", "space"],
23
- "optional": {
24
- "mask": {"mandatory": ["pattern", "space"], "optional": []},
25
- },
26
- },
27
- "BOLD": {
28
- "mandatory": ["pattern", "space"],
29
- "optional": {
30
- "mask": {"mandatory": ["pattern", "space"], "optional": []},
31
- "confounds": {
32
- "mandatory": ["pattern", "format"],
33
- "optional": ["mappings"],
34
- },
35
- "reference": {"mandatory": ["pattern"], "optional": []},
36
- "prewarp_space": {"mandatory": [], "optional": []},
37
- },
38
- },
39
- "Warp": {
40
- "mandatory": ["pattern", "src", "dst", "warper"],
41
- "optional": {},
42
- },
43
- "VBM_GM": {
44
- "mandatory": ["pattern", "space"],
45
- "optional": {},
46
- },
47
- "VBM_WM": {
48
- "mandatory": ["pattern", "space"],
49
- "optional": {},
50
- },
51
- "VBM_CSF": {
52
- "mandatory": ["pattern", "space"],
53
- "optional": {},
54
- },
55
- "DWI": {
56
- "mandatory": ["pattern"],
57
- "optional": {},
58
- },
59
- "FreeSurfer": {
60
- "mandatory": ["pattern"],
61
- "optional": {
62
- "aseg": {"mandatory": ["pattern"], "optional": []},
63
- "norm": {"mandatory": ["pattern"], "optional": []},
64
- "lh_white": {"mandatory": ["pattern"], "optional": []},
65
- "rh_white": {"mandatory": ["pattern"], "optional": []},
66
- "lh_pial": {"mandatory": ["pattern"], "optional": []},
67
- "rh_pial": {"mandatory": ["pattern"], "optional": []},
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 PATTERNS_SCHEMA:
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(PATTERNS_SCHEMA.keys())}"
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=PATTERNS_SCHEMA[dtype_key]["mandatory"],
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 PATTERNS_SCHEMA[
333
- dtype_key
334
- ]["optional"].items():
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 = PATTERNS_SCHEMA[
476
+ nested_mandatory_keys_schema = dtype_mgr[
348
477
  dtype_key
349
478
  ]["optional"][optional_key]["mandatory"]
350
- nested_optional_keys_schema = PATTERNS_SCHEMA[
351
- dtype_key
352
- ]["optional"][optional_key]["optional"]
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
- PATTERNS_SCHEMA[dtype_key]["mandatory"]
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=PATTERNS_SCHEMA[dtype_key]["mandatory"],
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 PATTERNS_SCHEMA[dtype_key][
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 = PATTERNS_SCHEMA[
436
- dtype_key
437
- ]["optional"][optional_key]["mandatory"]
438
- nested_optional_keys_schema = PATTERNS_SCHEMA[
439
- dtype_key
440
- ]["optional"][optional_key]["optional"]
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
- PATTERNS_SCHEMA[dtype_key]["mandatory"]
480
- + list(PATTERNS_SCHEMA[dtype_key]["optional"].keys())
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 PatternValidationMixin
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], Sequence[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.dev84
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=iWMjU9D90ZxnUKQO-oz8AsSNuBYLAhkb9NigQNnxQE0,526
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=zOQE4TaCKXBTHnNqgmECtsszWIOHYiQ1CUEeXXFU9F4,832
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=3MwpeUePm8eGgbe-J2kTWs9x5bk1SR3nhojHwN95SXM,19368
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=KU3xha3Mo7IX_5Tp4RL5awvEzZrX43OmrRFjeqMYVgk,7498
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=vPUuES-PO5tNkrxm-3ghq5A3lE2f0IuCgBIgswrR07M,1787
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.dev84.dist-info/licenses/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
326
- junifer-0.0.7.dev84.dist-info/licenses/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
327
- junifer-0.0.7.dev84.dist-info/METADATA,sha256=GpP1-4C59Ci4SZQ9MNzH_l_Qi0JVs0cuk3mjHGMp4SY,8387
328
- junifer-0.0.7.dev84.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
329
- junifer-0.0.7.dev84.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
330
- junifer-0.0.7.dev84.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
331
- junifer-0.0.7.dev84.dist-info/RECORD,,
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,,