brkraw 0.5.1__py3-none-any.whl → 0.5.3__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.
brkraw/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = '0.5.1'
3
+ __version__ = '0.5.3'
4
4
  from .apps.loader import BrukerLoader
5
5
 
6
6
 
@@ -163,6 +163,7 @@ class BrukerLoader:
163
163
  scan.convert = MethodType(_convert, scan)
164
164
  scan._converter_hook = None
165
165
  scan._converter_hook_name = None
166
+ scan.converter_func = None
166
167
  if rules:
167
168
  try:
168
169
  hook_name = select_rule_use(
@@ -259,9 +260,8 @@ class BrukerLoader:
259
260
  partial(_get_affine, decimals=self._affine_decimals),
260
261
  scan,
261
262
  )
262
- scan.get_nifti1image = MethodType(_get_nifti1image, scan)
263
- scan.convert = MethodType(_convert, scan)
264
263
  scan._converter_hook = None
264
+ scan.converter_func = None
265
265
 
266
266
  def get_scan(self, scan_id: int) -> "ScanLoader":
267
267
  """Return scan by id.
@@ -349,7 +349,6 @@ class BrukerLoader:
349
349
  override_header: Optional[Nifti1HeaderContents] = None,
350
350
  override_subject_type: Optional[SubjectType] = None,
351
351
  override_subject_pose: Optional[SubjectPose] = None,
352
- flip_x: bool = False,
353
352
  flatten_fg: bool = False,
354
353
  xyz_units: XYZUNIT = 'mm',
355
354
  t_units: TUNIT = 'sec'):
@@ -362,7 +361,6 @@ class BrukerLoader:
362
361
  override_header: Optional header values to apply.
363
362
  override_subject_type: Subject type override for subject view.
364
363
  override_subject_pose: Subject pose override for subject view.
365
- flip_x: If True, set NIfTI header x-flip flag.
366
364
  xyz_units: Spatial units for NIfTI header.
367
365
  t_units: Temporal units for NIfTI header.
368
366
 
@@ -372,12 +370,10 @@ class BrukerLoader:
372
370
  scan = self.get_scan(scan_id)
373
371
  return scan.convert(
374
372
  reco_id,
375
- format="nifti",
376
373
  space=space,
377
374
  override_header=override_header,
378
375
  override_subject_type=override_subject_type,
379
376
  override_subject_pose=override_subject_pose,
380
- flip_x=flip_x,
381
377
  flatten_fg=flatten_fg,
382
378
  xyz_units=xyz_units,
383
379
  t_units=t_units,
@@ -388,27 +384,23 @@ class BrukerLoader:
388
384
  scan_id: int,
389
385
  reco_id: Optional[int] = None,
390
386
  *,
391
- format: Literal["nifti", "nifti1"] = "nifti",
392
387
  space: AffineSpace = 'subject_ras',
393
388
  override_header: Optional[Nifti1HeaderContents] = None,
394
389
  override_subject_type: Optional[SubjectType] = None,
395
390
  override_subject_pose: Optional[SubjectPose] = None,
396
- flip_x: bool = False,
397
391
  flatten_fg: bool = False,
398
392
  xyz_units: XYZUNIT = "mm",
399
393
  t_units: TUNIT = "sec",
400
394
  hook_args_by_name: Optional[Mapping[str, Mapping[str, Any]]] = None,
401
395
  ):
402
- """Convert a scan/reco to the requested output format."""
396
+ """Convert a scan/reco to output object(s) supporting to_filename()."""
403
397
  scan = self.get_scan(scan_id)
404
398
  return scan.convert(
405
399
  reco_id,
406
- format=format,
407
400
  space=space,
408
401
  override_header=override_header,
409
402
  override_subject_type=override_subject_type,
410
403
  override_subject_pose=override_subject_pose,
411
- flip_x=flip_x,
412
404
  flatten_fg=flatten_fg,
413
405
  xyz_units=xyz_units,
414
406
  t_units=t_units,
@@ -21,7 +21,7 @@ from ...core.parameters import Parameters
21
21
  from ...specs.remapper import load_spec, map_parameters, load_context_map, apply_context_map
22
22
  from ...specs.rules import load_rules, select_rule_use
23
23
  from ...dataclasses import Reco, Scan, Study
24
- from .types import ScanLoader
24
+ from .types import ScanLoader, ToFilename, ConvertType, GetDataobjType, GetAffineType
25
25
  from ...specs import hook as converter_core
26
26
  from ...resolver import affine as affine_resolver
27
27
  from ...resolver import image as image_resolver
@@ -472,6 +472,54 @@ def _apply_affine_post_transform(affines: AffineReturn, *, kwargs: Mapping[str,
472
472
 
473
473
 
474
474
  def get_nifti1image(
475
+ self: Union["Scan", "ScanLoader"],
476
+ reco_id: int,
477
+ dataobjs: Tuple[np.ndarray, ...],
478
+ affines: Tuple[np.ndarray, ...],
479
+ *,
480
+ xyz_units: XYZUNIT = "mm",
481
+ t_units: TUNIT = "sec",
482
+ override_header: Optional[Nifti1HeaderContents] = None,
483
+ ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
484
+ """Return NIfTI image(s) for a reco.
485
+
486
+ Args:
487
+ self: Scan or ScanLoader instance.
488
+ reco_id: Reco identifier to read (defaults to the first available).
489
+ xyz_units: Spatial units for NIfTI header.
490
+ t_units: Temporal units for NIfTI header.
491
+ override_header: Optional header values to apply.
492
+
493
+ Returns:
494
+ Output object(s) supporting to_filename(). Returns None when required
495
+ metadata is unavailable.
496
+ """
497
+ self = cast(ScanLoader, self)
498
+
499
+ image_info = self.image_info.get(reco_id)
500
+ if dataobjs is None or affines is None or image_info is None:
501
+ return None
502
+
503
+ niiobjs = []
504
+ for i, dataobj in enumerate(dataobjs):
505
+ affine = affines[i]
506
+ niiobj = Nifti1Image(dataobj, affine)
507
+ nifti1header_contents = nifti_resolver.resolve(
508
+ image_info, xyz_units=xyz_units, t_units=t_units
509
+ )
510
+ if override_header:
511
+ for key, value in override_header.items():
512
+ if value is not None:
513
+ nifti1header_contents[key] = value
514
+ niiobj = nifti_resolver.update(niiobj, nifti1header_contents)
515
+ niiobjs.append(niiobj)
516
+
517
+ if len(niiobjs) == 1:
518
+ return niiobjs[0]
519
+ return tuple(niiobjs)
520
+
521
+
522
+ def convert(
475
523
  self: Union["Scan", "ScanLoader"],
476
524
  reco_id: Optional[int] = None,
477
525
  *,
@@ -479,30 +527,30 @@ def get_nifti1image(
479
527
  override_header: Optional[Nifti1HeaderContents] = None,
480
528
  override_subject_type: Optional[SubjectType] = None,
481
529
  override_subject_pose: Optional[SubjectPose] = None,
482
- flip_x: bool = False,
483
530
  flatten_fg: bool = False,
484
531
  xyz_units: XYZUNIT = "mm",
485
532
  t_units: TUNIT = "sec",
486
533
  hook_args_by_name: Optional[Mapping[str, Mapping[str, Any]]] = None,
487
- ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
488
- """Return NIfTI image(s) for a reco.
489
-
534
+ **kwargs: Any,
535
+ ) -> Optional[Union["ToFilename", Tuple["ToFilename", ...]]]:
536
+ """Convert a reco to output object(s).
537
+
490
538
  Args:
491
- self: Scan or ScanLoader instance.
492
- reco_id: Reco identifier to read (defaults to the first available).
493
539
  space: Output affine space ("raw", "scanner", "subject_ras").
494
540
  override_header: Optional header values to apply.
495
541
  override_subject_type: Subject type override for subject-view wrapping.
496
542
  override_subject_pose: Subject pose override for subject-view wrapping.
497
- flip_x: If True, set NIfTI header x-flip flag.
543
+ flatten_fg: If True, flatten foreground dimensions.
544
+ xyz_units: Spatial units for NIfTI header.
545
+ t_units: Temporal units for NIfTI header.
546
+ hook_args_by_name: Optional hook args mapping (split per helper signature).
547
+ flatten_fg: If True, flatten foreground dimensions.
498
548
  xyz_units: Spatial units for NIfTI header.
499
549
  t_units: Temporal units for NIfTI header.
500
-
501
550
  Returns:
502
551
  Single NIfTI image when one slice pack exists; otherwise a tuple of
503
552
  images. Returns None when required metadata is unavailable.
504
553
  """
505
-
506
554
  if not all(
507
555
  hasattr(self, attr) for attr in ["image_info", "affine_info", "get_dataobj", "get_affine"]
508
556
  ):
@@ -512,14 +560,57 @@ def get_nifti1image(
512
560
  resolved_reco_id = _resolve_reco_id(self, reco_id)
513
561
  if resolved_reco_id is None:
514
562
  return None
563
+
564
+ hook_name = getattr(self, "_converter_hook_name", None)
565
+ if isinstance(hook_name, str) and hook_name:
566
+ logger.debug(
567
+ "Convert starting for scan %s reco %s with hook %s",
568
+ getattr(self, "scan_id", "?"),
569
+ resolved_reco_id,
570
+ hook_name,
571
+ )
572
+ else:
573
+ logger.debug(
574
+ "Convert starting for scan %s reco %s (no hook)",
575
+ getattr(self, "scan_id", "?"),
576
+ resolved_reco_id,
577
+ )
578
+
515
579
  hook_kwargs = _resolve_hook_kwargs(self, hook_args_by_name)
516
580
  data_kwargs = _filter_hook_kwargs(self.get_dataobj, hook_kwargs)
581
+ convert_kwargs = {
582
+ key: value
583
+ for key, value in hook_kwargs.items()
584
+ if key not in data_kwargs
585
+ }
517
586
  if data_kwargs:
587
+ logger.debug(
588
+ "Calling get_dataobj for scan %s reco %s with args %s",
589
+ getattr(self, "scan_id", "?"),
590
+ resolved_reco_id,
591
+ data_kwargs,
592
+ )
518
593
  dataobjs = self.get_dataobj(resolved_reco_id, **data_kwargs)
519
594
  else:
595
+ logger.debug(
596
+ "Calling get_dataobj for scan %s reco %s (no args)",
597
+ getattr(self, "scan_id", "?"),
598
+ resolved_reco_id,
599
+ )
520
600
  dataobjs = self.get_dataobj(resolved_reco_id)
521
601
  affine_kwargs = _filter_hook_kwargs(self.get_affine, hook_kwargs)
602
+ convert_kwargs = {
603
+ key: value
604
+ for key, value in convert_kwargs.items()
605
+ if key not in affine_kwargs
606
+ }
522
607
  if affine_kwargs:
608
+ logger.debug(
609
+ "Calling get_affine for scan %s reco %s with args %s",
610
+ getattr(self, "scan_id", "?"),
611
+ resolved_reco_id,
612
+ affine_kwargs,
613
+ )
523
614
  affines = self.get_affine(
524
615
  resolved_reco_id,
525
616
  space=space,
@@ -528,77 +619,64 @@ def get_nifti1image(
528
619
  **affine_kwargs,
529
620
  )
530
621
  else:
622
+ logger.debug(
623
+ "Calling get_affine for scan %s reco %s (no args)",
624
+ getattr(self, "scan_id", "?"),
625
+ resolved_reco_id,
626
+ )
531
627
  affines = self.get_affine(
532
628
  resolved_reco_id,
533
629
  space=space,
534
630
  override_subject_type=override_subject_type,
535
631
  override_subject_pose=override_subject_pose,
536
632
  )
537
- image_info = self.image_info.get(resolved_reco_id)
538
-
539
- if dataobjs is None or affines is None or image_info is None:
633
+
634
+ if dataobjs is None or affines is None:
540
635
  return None
541
-
542
- if not isinstance(dataobjs, tuple) and not isinstance(affines, tuple):
636
+
637
+ if not isinstance(dataobjs, tuple):
543
638
  dataobjs = (dataobjs,)
639
+ if not isinstance(affines, tuple):
544
640
  affines = (affines,)
545
-
546
- niiobjs = []
641
+
642
+ dataobjs = list(dataobjs)
547
643
  for i, dataobj in enumerate(dataobjs):
548
644
  if flatten_fg and dataobj.ndim > 4:
549
645
  spatial_shape = dataobj.shape[:3]
550
646
  flattened = int(np.prod(dataobj.shape[3:]))
551
- dataobj = dataobj.reshape((*spatial_shape, flattened), order="A")
552
- affine = affines[i]
553
- niiobj = Nifti1Image(dataobj, affine)
554
- nifti1header_contents = nifti_resolver.resolve(
555
- image_info, flip_x=flip_x, xyz_units=xyz_units, t_units=t_units
647
+ dataobjs[i] = dataobj.reshape((*spatial_shape, flattened), order="A")
648
+ dataobjs = tuple(dataobjs)
649
+
650
+ converter_func = getattr(self, "converter_func", None)
651
+ if isinstance(converter_func, ConvertType):
652
+ hook_call_kwargs = _filter_hook_kwargs(converter_func, convert_kwargs)
653
+ logger.debug(
654
+ "Calling converter hook for scan %s reco %s with args %s",
655
+ getattr(self, "scan_id", "?"),
656
+ resolved_reco_id,
657
+ hook_call_kwargs,
658
+ )
659
+ return converter_func(
660
+ dataobj=dataobjs,
661
+ affine=affines,
662
+ **hook_call_kwargs,
556
663
  )
557
- if override_header:
558
- for key, value in override_header.items():
559
- if value is not None:
560
- nifti1header_contents[key] = value
561
- niiobj = nifti_resolver.update(niiobj, nifti1header_contents)
562
- niiobjs.append(niiobj)
563
-
564
- if len(niiobjs) == 1:
565
- return niiobjs[0]
566
- return tuple(niiobjs)
567
-
568
664
 
569
- def convert(
570
- self: Union["Scan", "ScanLoader"],
571
- reco_id: Optional[int] = None,
572
- *,
573
- format: Literal["nifti", "nifti1"] = "nifti",
574
- space: AffineSpace = "subject_ras",
575
- override_header: Optional[Nifti1HeaderContents] = None,
576
- override_subject_type: Optional[SubjectType] = None,
577
- override_subject_pose: Optional[SubjectPose] = None,
578
- flip_x: bool = False,
579
- flatten_fg: bool = False,
580
- xyz_units: XYZUNIT = "mm",
581
- t_units: TUNIT = "sec",
582
- hook_args_by_name: Optional[Mapping[str, Mapping[str, Any]]] = None,
583
- ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
584
- """Convert a reco to a selected output format."""
585
- if format not in {"nifti", "nifti1"}:
586
- raise ValueError(f"Unsupported format: {format}")
665
+ nifti1image_kwargs = {
666
+ "xyz_units": xyz_units,
667
+ "t_units": t_units,
668
+ "override_header": override_header,
669
+ **kwargs,
670
+ }
671
+ nifti1image_kwargs = _filter_hook_kwargs(get_nifti1image, nifti1image_kwargs)
587
672
  return get_nifti1image(
588
673
  self,
589
- reco_id,
590
- space=space,
591
- override_header=override_header,
592
- override_subject_type=override_subject_type,
593
- override_subject_pose=override_subject_pose,
594
- flip_x=flip_x,
595
- flatten_fg=flatten_fg,
596
- xyz_units=xyz_units,
597
- t_units=t_units,
598
- hook_args_by_name=hook_args_by_name,
674
+ reco_id=resolved_reco_id,
675
+ dataobjs=dataobjs,
676
+ affines=affines,
677
+ **nifti1image_kwargs,
599
678
  )
600
679
 
601
-
602
680
  def _resolve_hook_kwargs(
603
681
  scan: Union["Scan", "ScanLoader"],
604
682
  hook_args_by_name: Optional[Mapping[str, Mapping[str, Any]]],
@@ -608,6 +686,12 @@ def _resolve_hook_kwargs(
608
686
  hook_name = getattr(scan, "_converter_hook_name", None)
609
687
  if not isinstance(hook_name, str) or not hook_name:
610
688
  return {}
689
+ logger.debug(
690
+ "Resolving hook args for scan %s hook %s (available: %s)",
691
+ getattr(scan, "scan_id", "?"),
692
+ hook_name,
693
+ sorted(hook_args_by_name.keys()),
694
+ )
611
695
  values = hook_args_by_name.get(hook_name)
612
696
  if values is None:
613
697
  seen: set[str] = set()
@@ -643,7 +727,12 @@ def _resolve_hook_kwargs(
643
727
  )
644
728
  values = candidate_values
645
729
  break
646
- return dict(values) if isinstance(values, Mapping) else {}
730
+ resolved = dict(values) if isinstance(values, Mapping) else {}
731
+ if resolved:
732
+ logger.debug("Resolved hook args for %s: %s", hook_name, resolved)
733
+ else:
734
+ logger.debug("No hook args resolved for %s.", hook_name)
735
+ return resolved
647
736
 
648
737
 
649
738
  def _filter_hook_kwargs(func: Any, hook_kwargs: Mapping[str, Any]) -> Dict[str, Any]:
@@ -785,6 +874,17 @@ def apply_converter_hook(
785
874
  """Override scan conversion helpers using a converter hook."""
786
875
  converter_core.validate_hook(converter_hook)
787
876
  plugin = dict(converter_hook)
877
+ logger.debug(
878
+ "Binding converter hook for scan %s: %s",
879
+ getattr(scan, "scan_id", "?"),
880
+ sorted(plugin.keys()),
881
+ )
882
+ if "get_dataobj" in plugin and not isinstance(plugin["get_dataobj"], GetDataobjType):
883
+ raise TypeError("Converter hook 'get_dataobj' must match GetDataobjType.")
884
+ if "get_affine" in plugin and not isinstance(plugin["get_affine"], GetAffineType):
885
+ raise TypeError("Converter hook 'get_affine' must match GetAffineType.")
886
+ if "convert" in plugin and not isinstance(plugin["convert"], ConvertType):
887
+ raise TypeError("Converter hook 'convert' must match ConvertType.")
788
888
  scan._converter_hook = plugin
789
889
  if "get_dataobj" in plugin:
790
890
  scan.get_dataobj = MethodType(plugin["get_dataobj"], scan)
@@ -794,4 +894,11 @@ def apply_converter_hook(
794
894
  get_affine = partial(get_affine, decimals=affine_decimals)
795
895
  scan.get_affine = MethodType(get_affine, scan)
796
896
  if "convert" in plugin:
797
- scan.convert = MethodType(plugin["convert"], scan)
897
+ scan.converter_func = MethodType(plugin["convert"], scan)
898
+ else:
899
+ scan.converter_func = None
900
+ logger.debug(
901
+ "Converter hook bound for scan %s (hook=%s)",
902
+ getattr(scan, "scan_id", "?"),
903
+ getattr(scan, "_converter_hook_name", None),
904
+ )
@@ -5,7 +5,7 @@ Last updated: 2025-12-30
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- from typing import Any, Union, Tuple, Dict, Optional, Protocol, Literal, Mapping, Callable, List, TYPE_CHECKING
8
+ from typing import Any, Union, Tuple, Dict, Optional, Protocol, Literal, Mapping, Callable, List, TYPE_CHECKING, runtime_checkable
9
9
  if TYPE_CHECKING:
10
10
  from typing_extensions import ParamSpec, TypeAlias
11
11
  else:
@@ -35,6 +35,7 @@ AffineSpace = Literal["raw", "scanner", "subject_ras"]
35
35
  P = ParamSpec("P")
36
36
 
37
37
 
38
+ @runtime_checkable
38
39
  class GetDataobjType(Protocol[P]):
39
40
  """Callable signature for get_dataobj overrides."""
40
41
  def __call__(
@@ -47,6 +48,7 @@ class GetDataobjType(Protocol[P]):
47
48
  ...
48
49
 
49
50
 
51
+ @runtime_checkable
50
52
  class GetAffineType(Protocol):
51
53
  """Callable signature for get_affine overrides."""
52
54
  def __call__(
@@ -63,44 +65,21 @@ class GetAffineType(Protocol):
63
65
  ...
64
66
 
65
67
 
66
- class GetNifti1ImageType(Protocol):
67
- """Callable signature for get_nifti1image overrides."""
68
- def __call__(
69
- self,
70
- scan: "Scan",
71
- reco_id: Optional[int] = None,
72
- *,
73
- override_header: Optional[Union[dict, "Nifti1HeaderContents"]],
74
- space: AffineSpace,
75
- override_subject_type: Optional[SubjectType],
76
- override_subject_pose: Optional[SubjectPose],
77
- flip_x: bool,
78
- flatten_fg: bool,
79
- xyz_units: XYZUNIT,
80
- t_units: TUNIT,
81
- **kwargs: Any,
82
- ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
83
- ...
84
-
85
-
68
+ @runtime_checkable
86
69
  class ConvertType(Protocol):
87
70
  """Callable signature for convert overrides."""
88
71
  def __call__(
89
72
  self,
90
73
  scan: "Scan",
91
- reco_id: Optional[int] = None,
92
- *,
93
- format: Union[Literal["nifti", "nifti1"], str],
94
- override_header: Optional[Union[dict, "Nifti1HeaderContents"]],
95
- space: AffineSpace,
96
- override_subject_type: Optional[SubjectType],
97
- override_subject_pose: Optional[SubjectPose],
98
- flip_x: bool,
99
- flatten_fg: bool,
100
- xyz_units: XYZUNIT,
101
- t_units: TUNIT,
74
+ dataobj: Union[Tuple["np.ndarray", ...], "np.ndarray"],
75
+ affine: Union[Tuple["np.ndarray", ...], "np.ndarray"],
102
76
  **kwargs: Any,
103
- ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
77
+ ) -> Optional[Union["ToFilename", Tuple["ToFilename", ...]]]:
78
+ ...
79
+
80
+ class ToFilename(Protocol):
81
+ """Result object that can be written to disk."""
82
+ def to_filename(self, filename: Union[str, "Path"], *args: Any, **kwargs: Any) -> Any:
104
83
  ...
105
84
 
106
85
 
@@ -126,9 +105,11 @@ class ScanLoader(Scan, BaseLoader):
126
105
 
127
106
  image_info: Dict[int, Optional["ResolvedImage"]]
128
107
  affine_info: Dict[int, Optional["ResolvedAffine"]]
108
+ converter_func: Optional[ConvertType]
129
109
  _converter_hook: Optional[ConverterHook]
130
110
  _converter_hook_name: Optional[str]
131
-
111
+
112
+
132
113
  def get_fid(self,
133
114
  buffer_start: Optional[int],
134
115
  buffer_size: Optional[int],
@@ -155,15 +136,12 @@ class ScanLoader(Scan, BaseLoader):
155
136
  ...
156
137
 
157
138
  def get_nifti1image(
158
- self,
159
- reco_id: Optional[int] = None,
139
+ self,
140
+ reco_id: int,
141
+ dataobjs: Tuple["np.ndarray", ...],
142
+ affines: Tuple["np.ndarray", ...],
160
143
  *,
161
144
  override_header: Optional[Union[dict, "Nifti1HeaderContents"]],
162
- space: AffineSpace = "subject_ras",
163
- override_subject_type: Optional[SubjectType],
164
- override_subject_pose: Optional[SubjectPose],
165
- flip_x: bool,
166
- flatten_fg: bool,
167
145
  xyz_units: XYZUNIT,
168
146
  t_units: TUNIT
169
147
  ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
@@ -173,17 +151,16 @@ class ScanLoader(Scan, BaseLoader):
173
151
  self,
174
152
  reco_id: Optional[int] = None,
175
153
  *,
176
- format: Literal["nifti", "nifti1"],
177
- override_header: Optional[Union[dict, "Nifti1HeaderContents"]],
178
154
  space: AffineSpace = "subject_ras",
155
+ override_header: Optional[Union[dict, "Nifti1HeaderContents"]],
179
156
  override_subject_type: Optional[SubjectType],
180
157
  override_subject_pose: Optional[SubjectPose],
181
- flip_x: bool,
182
158
  flatten_fg: bool,
183
159
  xyz_units: XYZUNIT,
184
160
  t_units: TUNIT,
185
161
  hook_args_by_name: Optional[Mapping[str, Mapping[str, Any]]] = None,
186
- ) -> Optional[Union[Tuple["Nifti1Image", ...], "Nifti1Image"]]:
162
+ **kwargs: Any,
163
+ ) -> Optional[Union["ToFilename", Tuple["ToFilename", ...]]]:
187
164
  ...
188
165
 
189
166
  def get_metadata(
@@ -201,15 +178,15 @@ class RecoLoader(Reco, BaseLoader):
201
178
  ...
202
179
 
203
180
 
204
- ConverterHook: TypeAlias = Mapping[str, Union[GetDataobjType[Any], GetAffineType, GetNifti1ImageType, ConvertType]]
181
+ ConverterHook: TypeAlias = Mapping[str, Union[GetDataobjType[Any], GetAffineType, ConvertType]]
205
182
  """Mapping of converter hook keys to override callables."""
206
183
 
207
184
 
208
185
  __all__ = [
209
186
  'GetDataobjType',
210
187
  'GetAffineType',
211
- 'GetNifti1ImageType',
212
188
  'ConvertType',
189
+ 'ToFilename',
213
190
  'ConverterHook',
214
191
  'StudyLoader',
215
192
  'ScanLoader',
@@ -13,7 +13,7 @@ import os
13
13
  import re
14
14
  import sys
15
15
  from pathlib import Path
16
- from typing import Any, Mapping, Optional, Dict, List, Tuple, Literal, cast, get_args
16
+ from typing import Any, Mapping, Optional, Dict, List, Tuple, cast, get_args
17
17
 
18
18
  import numpy as np
19
19
  from brkraw.cli.utils import load
@@ -84,8 +84,6 @@ def cmd_convert(args: argparse.Namespace) -> int:
84
84
  if args.no_convert and not args.sidecar:
85
85
  logger.error("--no-convert requires --sidecar.")
86
86
  return 2
87
- if not args.flip_x:
88
- args.flip_x = _env_flag("BRKRAW_CONVERT_FLIP_X")
89
87
  if not args.flatten_fg:
90
88
  args.flatten_fg = _env_flag("BRKRAW_CONVERT_FLATTEN_FG")
91
89
  if args.space is None:
@@ -119,7 +117,6 @@ def cmd_convert(args: argparse.Namespace) -> int:
119
117
  if args.space is None:
120
118
  args.space = "subject_ras"
121
119
  for attr, env_key in (
122
- ("format", "BRKRAW_CONVERT_FORMAT"),
123
120
  ("header", "BRKRAW_CONVERT_HEADER"),
124
121
  ("context_map", "BRKRAW_CONVERT_CONTEXT_MAP"),
125
122
  ):
@@ -139,13 +136,6 @@ def cmd_convert(args: argparse.Namespace) -> int:
139
136
  logger.error("Cannot use --prefix when --output is a file path.")
140
137
  return 2
141
138
 
142
- args.format = _coerce_choice(
143
- "BRKRAW_CONVERT_FORMAT",
144
- args.format or "nifti",
145
- ("nifti", "nifti1"),
146
- default="nifti",
147
- )
148
-
149
139
  try:
150
140
  render_layout_supports_counter = "counter" in inspect.signature(layout_core.render_layout).parameters
151
141
  except (TypeError, ValueError):
@@ -265,12 +255,10 @@ def cmd_convert(args: argparse.Namespace) -> int:
265
255
  nii = loader.convert(
266
256
  scan_id,
267
257
  reco_id=reco_id,
268
- format=cast(Literal["nifti", "nifti1"], args.format),
269
258
  space=cast(AffineSpace, args.space),
270
259
  override_header=cast(Nifti1HeaderContents, override_header) if override_header else None,
271
260
  override_subject_type=cast(Optional[SubjectType], args.override_subject_type),
272
261
  override_subject_pose=cast(Optional[SubjectPose], args.override_subject_pose),
273
- flip_x=args.flip_x,
274
262
  flatten_fg=args.flatten_fg,
275
263
  xyz_units=cast(XYZUNIT, args.xyz_units),
276
264
  t_units=cast(TUNIT, args.t_units),
@@ -686,7 +674,10 @@ def _parse_hook_args(values: List[str]) -> Dict[str, Dict[str, Any]]:
686
674
  key = key.strip()
687
675
  if not hook_name or not key:
688
676
  raise ValueError("Hook args must include hook name and key.")
689
- parsed.setdefault(hook_name, {})[key] = _coerce_scalar(value.strip())
677
+ coerced_value = _coerce_scalar(value.strip())
678
+ logger.debug("Parsed hook arg %s:%s=%s", hook_name, key, coerced_value)
679
+ parsed.setdefault(hook_name, {})[key] = coerced_value
680
+ logger.debug("Parsed hook args: %s", parsed)
690
681
  return parsed
691
682
 
692
683
 
@@ -781,11 +772,6 @@ def _add_convert_args(
781
772
  type=int,
782
773
  help="Reco id to convert (defaults to all recos when omitted).",
783
774
  )
784
- parser.add_argument(
785
- "--flip-x",
786
- action="store_true",
787
- help="Flip x-axis in NIfTI header.",
788
- )
789
775
  parser.add_argument(
790
776
  "--xyz-units",
791
777
  choices=list(get_args(XYZUNIT)),
@@ -854,11 +840,6 @@ def _add_convert_args(
854
840
  choices=list(get_args(SubjectPose)),
855
841
  help="Override subject pose for subject-view affines (space=subject_ras).",
856
842
  )
857
- parser.add_argument(
858
- "--format",
859
- choices=["nifti", "nifti1"],
860
- help="Output format (default: nifti).",
861
- )
862
843
  parser.add_argument(
863
844
  "--flatten-fg",
864
845
  action="store_true",
@@ -178,12 +178,10 @@ _PRESET_IGNORE_PARAMS = frozenset(
178
178
  "scan",
179
179
  "scan_id",
180
180
  "reco_id",
181
- "format",
182
181
  "space",
183
182
  "override_header",
184
183
  "override_subject_type",
185
184
  "override_subject_pose",
186
- "flip_x",
187
185
  "xyz_units",
188
186
  "t_units",
189
187
  "decimals",
@@ -98,14 +98,12 @@ def cmd_unset(args: argparse.Namespace) -> int:
98
98
  "BRKRAW_CONVERT_CONTEXT_MAP",
99
99
  "BRKRAW_CONVERT_SPACE",
100
100
  "BRKRAW_CONVERT_COMPRESS",
101
- "BRKRAW_CONVERT_FLIP_X",
102
101
  "BRKRAW_CONVERT_FLATTEN_FG",
103
102
  "BRKRAW_CONVERT_OVERRIDE_SUBJECT_TYPE",
104
103
  "BRKRAW_CONVERT_OVERRIDE_SUBJECT_POSE",
105
104
  "BRKRAW_CONVERT_XYZ_UNITS",
106
105
  "BRKRAW_CONVERT_T_UNITS",
107
106
  "BRKRAW_CONVERT_HEADER",
108
- "BRKRAW_CONVERT_FORMAT",
109
107
  ]
110
108
  targets: List[str] = []
111
109
  if args.path:
@@ -153,14 +151,12 @@ def cmd_env(_: argparse.Namespace) -> int:
153
151
  convert_context_map = os.environ.get("BRKRAW_CONVERT_CONTEXT_MAP")
154
152
  convert_compress = os.environ.get("BRKRAW_CONVERT_COMPRESS")
155
153
  convert_space = os.environ.get("BRKRAW_CONVERT_SPACE")
156
- convert_flip_x = os.environ.get("BRKRAW_CONVERT_FLIP_X")
157
154
  convert_flatten_fg = os.environ.get("BRKRAW_CONVERT_FLATTEN_FG")
158
155
  convert_subject_type = os.environ.get("BRKRAW_CONVERT_OVERRIDE_SUBJECT_TYPE")
159
156
  convert_subject_pose = os.environ.get("BRKRAW_CONVERT_OVERRIDE_SUBJECT_POSE")
160
157
  convert_xyz_units = os.environ.get("BRKRAW_CONVERT_XYZ_UNITS")
161
158
  convert_t_units = os.environ.get("BRKRAW_CONVERT_T_UNITS")
162
159
  convert_header = os.environ.get("BRKRAW_CONVERT_HEADER")
163
- convert_format = os.environ.get("BRKRAW_CONVERT_FORMAT")
164
160
  if (
165
161
  path is None
166
162
  and scan_id is None
@@ -175,14 +171,12 @@ def cmd_env(_: argparse.Namespace) -> int:
175
171
  and convert_context_map is None
176
172
  and convert_compress is None
177
173
  and convert_space is None
178
- and convert_flip_x is None
179
174
  and convert_flatten_fg is None
180
175
  and convert_subject_type is None
181
176
  and convert_subject_pose is None
182
177
  and convert_xyz_units is None
183
178
  and convert_t_units is None
184
179
  and convert_header is None
185
- and convert_format is None
186
180
  ):
187
181
  print("(none)")
188
182
  return 0
@@ -212,8 +206,6 @@ def cmd_env(_: argparse.Namespace) -> int:
212
206
  print(f"BRKRAW_CONVERT_SPACE={convert_space}")
213
207
  if convert_compress is not None:
214
208
  print(f"BRKRAW_CONVERT_COMPRESS={convert_compress}")
215
- if convert_flip_x is not None:
216
- print(f"BRKRAW_CONVERT_FLIP_X={convert_flip_x}")
217
209
  if convert_flatten_fg is not None:
218
210
  print(f"BRKRAW_CONVERT_FLATTEN_FG={convert_flatten_fg}")
219
211
  if convert_subject_type is not None:
@@ -226,8 +218,6 @@ def cmd_env(_: argparse.Namespace) -> int:
226
218
  print(f"BRKRAW_CONVERT_T_UNITS={convert_t_units}")
227
219
  if convert_header is not None:
228
220
  print(f"BRKRAW_CONVERT_HEADER={convert_header}")
229
- if convert_format is not None:
230
- print(f"BRKRAW_CONVERT_FORMAT={convert_format}")
231
221
  return 0
232
222
 
233
223
 
@@ -311,7 +301,7 @@ def register(subparsers: argparse._SubParsersAction) -> None: # type: ignore[na
311
301
  help=(
312
302
  "Set BRKRAW_CONVERT_<OPTION> as KEY=VALUE (repeatable). "
313
303
  "Keys: OUTPUT, PREFIX, SCAN_ID, RECO_ID, SIDECAR, CONTEXT_MAP, "
314
- "COMPRESS, SPACE, FLIP_X, FLATTEN_FG, OVERRIDE_SUBJECT_TYPE, "
304
+ "COMPRESS, SPACE, FLATTEN_FG, OVERRIDE_SUBJECT_TYPE, "
315
305
  "OVERRIDE_SUBJECT_POSE, XYZ_UNITS, T_UNITS, HEADER, FORMAT."
316
306
  ),
317
307
  )
brkraw/resolver/nifti.py CHANGED
@@ -32,7 +32,6 @@ DimInfo = Tuple[Optional[int], Optional[int], Optional[int]]
32
32
  logger = logging.getLogger("brkraw")
33
33
 
34
34
  class Nifti1HeaderContents(TypedDict, total=False):
35
- flip_x: bool
36
35
  slice_code: int
37
36
  slope_inter: Tuple[float, float]
38
37
  time_step: Optional[float]
@@ -57,7 +56,6 @@ class Nifti1HeaderContents(TypedDict, total=False):
57
56
  _XYZ_UNITS = set(get_args(XYZUNIT))
58
57
  _T_UNITS = set(get_args(TUNIT))
59
58
  _HEADER_FIELDS = {
60
- "flip_x",
61
59
  "slice_code",
62
60
  "slope_inter",
63
61
  "time_step",
@@ -159,9 +157,7 @@ def _coerce_header_contents(data: Mapping[str, Any]) -> Nifti1HeaderContents:
159
157
  header[key] = None
160
158
  continue
161
159
  raise ValueError(f"{key} cannot be null.")
162
- if key == "flip_x":
163
- header[key] = _coerce_bool(value, name=key)
164
- elif key in {"slice_code", "qform_code", "sform_code", "slice_start", "slice_end", "intent_code"}:
160
+ if key in {"slice_code", "qform_code", "sform_code", "slice_start", "slice_end", "intent_code"}:
165
161
  header[key] = int(value)
166
162
  elif key in {"time_step", "slice_duration", "cal_min", "cal_max"}:
167
163
  header[key] = float(value)
@@ -247,9 +243,8 @@ def _set_dataobj(niiobj: "Nifti1Image", dataobj: np.ndarray) -> None:
247
243
 
248
244
 
249
245
  def resolve(
250
- image_info: "ResolvedImage",
251
- flip_x: bool = False,
252
- xyz_units: "XYZUNIT" = 'mm',
246
+ image_info: "ResolvedImage",
247
+ xyz_units: "XYZUNIT" = 'mm',
253
248
  t_units: "TUNIT" = 'sec'
254
249
  ) -> Nifti1HeaderContents:
255
250
 
@@ -273,7 +268,6 @@ def resolve(
273
268
  slope = image_info['slope']
274
269
  offset = image_info['offset']
275
270
  result: Nifti1HeaderContents = {
276
- 'flip_x': flip_x,
277
271
  'slice_code': slice_code,
278
272
  'slope_inter': (slope, offset),
279
273
  'time_step': time_step,
@@ -295,9 +289,7 @@ def update(
295
289
  for c, val in nifti1header_contents.items():
296
290
  if val is None or c in ('qform_code', 'sform_code'):
297
291
  continue
298
- if c == 'flip_x':
299
- niiobj.header.default_x_flip = bool(val)
300
- elif c == "slice_code":
292
+ if c == "slice_code":
301
293
  if _coerce_int(val, name="slice_code") != 0:
302
294
  niiobj.header['slice_code'] = _coerce_int(val, name="slice_code")
303
295
  elif c == "slope_inter":
@@ -4,8 +4,6 @@ title: "BrkRaw NIfTI Header Overrides"
4
4
  type: object
5
5
  additionalProperties: false
6
6
  properties:
7
- flip_x:
8
- type: boolean
9
7
  slice_code:
10
8
  type: integer
11
9
  slope_inter:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brkraw
3
- Version: 0.5.1
3
+ Version: 0.5.3
4
4
  Summary: Toolkit for loading Bruker Paravision datasets, mapping metadata, and exporting NIfTI
5
5
  Project-URL: Homepage, https://brkraw.github.io
6
6
  Maintainer-email: SungHo Lee <shlee@unc.edu>
@@ -31,6 +31,7 @@ Requires-Dist: mkdocs; extra == 'dev'
31
31
  Requires-Dist: mkdocs-material; extra == 'dev'
32
32
  Requires-Dist: pymdown-extensions; extra == 'dev'
33
33
  Requires-Dist: pytest; extra == 'dev'
34
+ Requires-Dist: tomli; extra == 'dev'
34
35
  Provides-Extra: docs
35
36
  Requires-Dist: rich; extra == 'docs'
36
37
  Provides-Extra: minimal
@@ -48,7 +49,7 @@ Description-Content-Type: text/markdown
48
49
 
49
50
  A modular toolkit for Bruker MRI raw-data handling.
50
51
 
51
- BrkRaw (v0.5.1) converts raw data into standardized, neuroimaging-ready
52
+ BrkRaw (v0.5.3) converts raw data into standardized, neuroimaging-ready
52
53
  datasets, with extensible rules/specs and plugin hooks.
53
54
 
54
55
  - Documentation: [brkraw.github.io](https://brkraw.github.io/)
@@ -66,16 +67,14 @@ If you use BrkRaw in your research, please cite it.
66
67
 
67
68
  <!-- BEGIN: brkraw-bibtex -->
68
69
  ```biblatex
69
- @software{brkraw_2026,
70
- author = {Lee, Sung-Ho and Devenyi, Gabriel A and Ban, Woomi and Shih, Yen-Yu Ian},
70
+ @software{brkraw,
71
+ author = {Lee, Sung-Ho and Devenyi, Gabriel A. and Ban, Woomi and Shih, Yen-Yu Ian},
71
72
  title = {BrkRaw: A modular toolkit for Bruker MRI raw-data handling},
72
- year = {2026},
73
- version = {0.5.0},
73
+ version = {0.5.2},
74
74
  doi = {10.5281/zenodo.3818614},
75
75
  url = {https://github.com/BrkRaw/brkraw},
76
76
  note = {Documentation: https://brkraw.github.io},
77
- license = {GPL-3.0-only},
78
- date = {2026-01-13}
77
+ license = {GPL-3.0-only}
79
78
  }
80
79
  ```
81
80
  <!-- END: brkraw-bibtex -->
@@ -1,4 +1,4 @@
1
- brkraw/__init__.py,sha256=xRDzaw80M_f5rceXUn0qFpdFc04QizjLqQ4XnZjM1iw,210
1
+ brkraw/__init__.py,sha256=p-zGQeH33UEQNKlOOYjQ9gSsfb2MzdTREjhA-sQbI4g,210
2
2
  brkraw/apps/__init__.py,sha256=sEdA1SrY-Vu0xU1ct5Eab7vX-_IFMDip2j3FdSQVT58,170
3
3
  brkraw/apps/addon/__init__.py,sha256=fUR1QNwiaqSbkMIkPxLjKC7mJifR6HhrM8TO7lTo7Mg,531
4
4
  brkraw/apps/addon/core.py,sha256=xVlTElgOHNnoy3avNoeOudOvQSDzvuVsmGq9IVKNINc,659
@@ -8,10 +8,10 @@ brkraw/apps/addon/io.py,sha256=bjgwl0T1tsL02aAJtScLw3fnh2PfOlmK5aGAQj6WF8Y,413
8
8
  brkraw/apps/hook/__init__.py,sha256=W3xf6VmPZkVtQMwnYIrl626fnlck6bO20St0C45tMNY,398
9
9
  brkraw/apps/hook/core.py,sha256=z6PpwHYYESJD8EO__qVsXZj31YqP5JSSmNHYVHZRCnk,20720
10
10
  brkraw/apps/loader/__init__.py,sha256=ytG3wTI3mRHxkLkZ3GNYA6LJduplYgUinZBMuJJkeMQ,163
11
- brkraw/apps/loader/core.py,sha256=hyc7gk-Bl5g5_bMUdnSY99xjjY9YOt3P0o25QIo0zzE,23268
11
+ brkraw/apps/loader/core.py,sha256=m2BGF4E8QqoW1wuVnPf09RjK4Q_mQNMJ0rUQCXibteE,22941
12
12
  brkraw/apps/loader/formatter.py,sha256=WWVCVKdZl6vdyKPCW6rLRmwKuF1cCTTNMPP0vmyBF6Y,9341
13
- brkraw/apps/loader/helper.py,sha256=Vf8nqgH3KBGIf74f52wcnB1rINEVViUM2O4W8FeGmNs,27879
14
- brkraw/apps/loader/types.py,sha256=F3EXtV5vEYlHvCBRwjlz3iaTaJiSe7CYC6IayP_bbug,6825
13
+ brkraw/apps/loader/helper.py,sha256=n-8RHDB4TNV6V3RWbfe96iK-0ATzQ4yysiRVVZ4VRuw,31569
14
+ brkraw/apps/loader/types.py,sha256=5ijIMSwvAg1ZoQb8zrAajKXygTwLXPb7evOE_fufL0U,6014
15
15
  brkraw/apps/loader/info/__init__.py,sha256=1tWVkBakwf3LZK-FwsMrt10fkkdz9cWw1j-Y4Dk6Lio,164
16
16
  brkraw/apps/loader/info/scan.py,sha256=_oLBG7YlwVUv1vWXBvCZbXQiMvC1ARKCRNTvrAkqO0U,2849
17
17
  brkraw/apps/loader/info/scan.yaml,sha256=tYyGRg4t_rf6jGZAT8F0_dUA9MlQeZ5zeOuTNQ2wQM8,1728
@@ -25,13 +25,13 @@ brkraw/cli/utils.py,sha256=Ii14ZqIVqDx-pIrRAtBrL50yzfEQcQZRtJSRWZ211mE,1348
25
25
  brkraw/cli/commands/__init__.py,sha256=PHh4jqD7i0aL8W8hXThczKcT4xsNZiXanBxOH5IOW5I,36
26
26
  brkraw/cli/commands/addon.py,sha256=yUK30gQ0AGse1WDifW5DLUCg84RlWGemid0uNVOnxzU,11179
27
27
  brkraw/cli/commands/config.py,sha256=bcbLQpb7Vw_imYwQsds4ZbWAOtgj_Dw3ojmFN4UmMBs,6471
28
- brkraw/cli/commands/convert.py,sha256=8mkJYZCFXKahqqOIN_C4W7F_qbcwR0idYy40cdhZILU,30615
29
- brkraw/cli/commands/hook.py,sha256=nPGIVMlWrpIJDCMdJABKGzV4HcuBdC3bLIh8cqJ8He4,11925
28
+ brkraw/cli/commands/convert.py,sha256=FCnAcfQeiaTfckcffNVeUM3nDz1jSDutxYEnArgfxyM,30112
29
+ brkraw/cli/commands/hook.py,sha256=_H0ielOlO_HwcvZTIsN5Gj32UivHUjRpKNgdlqjVrVg,11889
30
30
  brkraw/cli/commands/info.py,sha256=fwojS5GlEf2upY3v5-ueQQQf9CPWTn46-1-tub2gnxQ,2251
31
31
  brkraw/cli/commands/init.py,sha256=FLOimOmZbkrCRjTm0iJ8_w8o027He5dzbl3UT2Zu72U,6957
32
32
  brkraw/cli/commands/params.py,sha256=5z_2O24IrUL-_AEjHIzjZHA_89piDHtXkxHkd7C12D0,3159
33
33
  brkraw/cli/commands/prune.py,sha256=Sl8Zl78PAGtRvDB6HH-CqcDr4NBfXSrf8602ZAKL7nM,8798
34
- brkraw/cli/commands/session.py,sha256=COEjRwy-Z-Y9_-SZVAwUsIpDutXQ0UQ1baMNvjN6jYU,12749
34
+ brkraw/cli/commands/session.py,sha256=t77PyNZpQoXxpszpqiKsOsKfLg9woXBJA_yinVhuEVk,12299
35
35
  brkraw/core/__init__.py,sha256=9UPOF5mtjZdGgjQ6-JJJs-eg8CGl4BuV7flGDWKgCBg,218
36
36
  brkraw/core/config.py,sha256=fohxJOoBruBrdzFIrXmBmZE5AW9EpnTOLAr3am8xDM8,11820
37
37
  brkraw/core/entrypoints.py,sha256=OqEvqBna7fTjR8MofIGJE80EzxL0WUYxeiJEUlQjfR8,880
@@ -57,12 +57,12 @@ brkraw/resolver/datatype.py,sha256=Kp-_-_JDfCh4io19Vw4YiAVTjWgaFAkxkO7ZDDglAKY,2
57
57
  brkraw/resolver/fid.py,sha256=SXglNSD6hFK7pAoHrUvuNbCYPgIAvbRdh6PACp7Oz7g,2847
58
58
  brkraw/resolver/helpers.py,sha256=BpL-zpbtGae6n-XQOmD5qP7KrD5HFnElzAD3bcBq0J4,1029
59
59
  brkraw/resolver/image.py,sha256=01mqBVFfoY2Z0V60k3G0qTKpEH-lqRCaSdkZ7pj7Bb8,6735
60
- brkraw/resolver/nifti.py,sha256=otqjDeRZMpplC6Z_uxWMjKoNtxvQyELvwK-ZbVMTuf8,12870
60
+ brkraw/resolver/nifti.py,sha256=S4Z1NZdJp0LbipyUndEUoJqQzAjGfoizhGQC9byQG38,12617
61
61
  brkraw/resolver/shape.py,sha256=r2sQpgKGMN0nmBPj9_LTt7d3ls-y4R8n1HIMDvpNdfk,8110
62
62
  brkraw/schema/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
63
63
  brkraw/schema/context_map.yaml,sha256=OUtoa7NgQZ7ytUe8zuNiJ5ratt1p0DRrrfDAP5Kthqs,1798
64
64
  brkraw/schema/meta.yaml,sha256=ePnTt7jD00lMKob6MPoziws9eYOWa-BX2MrVrIMSo90,1042
65
- brkraw/schema/niftiheader.yaml,sha256=Hj7eQNyLbyuT__-jznzAB15JIP9ArRhBGvJstZFGNZg,1499
65
+ brkraw/schema/niftiheader.yaml,sha256=DmxhD6MUSdWb-aloXn3p4KNqqgWx_UVMqXsTJCQkYdw,1471
66
66
  brkraw/schema/pruner.yaml,sha256=bTmxvs5naAt_CsPQC-nIUEF5aL2T-iWUWGhg05ug_Ic,1023
67
67
  brkraw/schema/remapper.yaml,sha256=qIGiT6DqrJ2AK8g7gHj7Cc6GmQIT47VPaB2nRvnNc8k,3622
68
68
  brkraw/schema/rules.yaml,sha256=G9iOoy6B4yyzCAOVpinrrHSXa9QMJj0U_fY8C_mCq7I,2901
@@ -81,8 +81,8 @@ brkraw/specs/remapper/validator.py,sha256=R-Pib4MCgUVYAvAAoFR04bF-j7TDaePj-jGaxO
81
81
  brkraw/specs/rules/__init__.py,sha256=oF1ury9vxTYMlTgz9Yo9um8jRAzaJeTMwjAcDLV-KOE,214
82
82
  brkraw/specs/rules/logic.py,sha256=w-NstF6o91EfLU2Ho00i8kbvvd7d8yrinPd83UnAW2c,9175
83
83
  brkraw/specs/rules/validator.py,sha256=AHS-r-E0HGHxwhhU48nCyS6LQvllQCgXLS_NDXBm3-k,3508
84
- brkraw-0.5.1.dist-info/METADATA,sha256=D6mXGLxZbPvEs1uW1GNaqzGi6fmN9DJvpD0eY3KejEY,3075
85
- brkraw-0.5.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
86
- brkraw-0.5.1.dist-info/entry_points.txt,sha256=Qd3qG3g8GmGZUlV0gUP7WVpN_ulVn8Qw3l-O-stWxO0,450
87
- brkraw-0.5.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
88
- brkraw-0.5.1.dist-info/RECORD,,
84
+ brkraw-0.5.3.dist-info/METADATA,sha256=nV_JEoOsA59cI8cx87ACdxzhPmWYLFU6WqWX-5xNoq4,3068
85
+ brkraw-0.5.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
86
+ brkraw-0.5.3.dist-info/entry_points.txt,sha256=Qd3qG3g8GmGZUlV0gUP7WVpN_ulVn8Qw3l-O-stWxO0,450
87
+ brkraw-0.5.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
88
+ brkraw-0.5.3.dist-info/RECORD,,
File without changes