junifer 0.0.4.dev15__py3-none-any.whl → 0.0.4.dev25__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
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
- __version__ = version = '0.0.4.dev15'
4
- __version_tuple__ = version_tuple = (0, 0, 4, 'dev15')
3
+ __version__ = version = '0.0.4.dev25'
4
+ __version_tuple__ = version_tuple = (0, 0, 4, 'dev25')
junifer/api/cli.py CHANGED
@@ -8,7 +8,7 @@ import pathlib
8
8
  import subprocess
9
9
  import sys
10
10
  from pathlib import Path
11
- from typing import Dict, List, Union
11
+ from typing import Dict, List, Tuple, Union
12
12
 
13
13
  import click
14
14
 
@@ -32,27 +32,48 @@ from .utils import (
32
32
  )
33
33
 
34
34
 
35
- def _parse_elements(element: str, config: Dict) -> Union[List, None]:
35
+ def _parse_elements(element: Tuple[str], config: Dict) -> Union[List, None]:
36
36
  """Parse elements from cli.
37
37
 
38
38
  Parameters
39
39
  ----------
40
- element : str
41
- The element to operate on.
40
+ element : tuple of str
41
+ The element(s) to operate on.
42
42
  config : dict
43
43
  The configuration to operate using.
44
44
 
45
45
  Returns
46
46
  -------
47
- list
48
- The element(s) as list.
47
+ list or None
48
+ The element(s) as list or None.
49
+
50
+ Raises
51
+ ------
52
+ ValueError
53
+ If no element is found either in the command-line options or
54
+ the configuration file.
55
+
56
+ Warns
57
+ -----
58
+ RuntimeWarning
59
+ If elements are specified both via the command-line options and
60
+ the configuration file.
49
61
 
50
62
  """
51
63
  logger.debug(f"Parsing elements: {element}")
64
+ # Early return None to continue with all elements
52
65
  if len(element) == 0:
53
66
  return None
54
- # TODO: If len == 1, check if its a file, then parse elements from file
55
- elements = [tuple(x.split(",")) if "," in x else x for x in element]
67
+ # Check if the element is a file for single element;
68
+ # if yes, then parse elements from it
69
+ if len(element) == 1 and Path(element[0]).resolve().is_file():
70
+ fetched_element = _parse_elements_file(Path(element[0]).resolve())
71
+ else:
72
+ fetched_element = element
73
+ # Process multi-keyed elements
74
+ elements = [
75
+ tuple(x.split(",")) if "," in x else x for x in fetched_element
76
+ ]
56
77
  logger.debug(f"Parsed elements: {elements}")
57
78
  if elements is not None and "elements" in config:
58
79
  warn_with_log(
@@ -61,19 +82,41 @@ def _parse_elements(element: str, config: Dict) -> Union[List, None]:
61
82
  "over the configuration file. That is, the elements specified "
62
83
  "in the command line will be used. The elements specified in "
63
84
  "the configuration file will be ignored. To remove this warning, "
64
- 'please remove the "elements" item from the configuration file.'
85
+ "please remove the `elements` item from the configuration file."
65
86
  )
66
87
  elif elements is None:
88
+ # Check in config
67
89
  elements = config.get("elements", None)
68
90
  if elements is None:
69
91
  raise_error(
70
- "The 'elements' key is set in the configuration, but its value"
71
- " is 'None'. It is likely that there is an empty 'elements' "
92
+ "The `elements` key is set in the configuration, but its value"
93
+ " is `None`. It is likely that there is an empty `elements` "
72
94
  "section in the yaml configuration file."
73
95
  )
74
96
  return elements
75
97
 
76
98
 
99
+ def _parse_elements_file(filepath: Path) -> List[str]:
100
+ """Parse elements from file.
101
+
102
+ Parameters
103
+ ----------
104
+ filepath : pathlib.Path
105
+ The path to the element file.
106
+
107
+ Returns
108
+ -------
109
+ list of str
110
+ The element(s) as list.
111
+
112
+ """
113
+ # Read file
114
+ with open(filepath) as file:
115
+ raw_elements = file.readlines()
116
+ # Strip whitespace and return
117
+ return [element.strip() for element in raw_elements]
118
+
119
+
77
120
  def _validate_verbose(
78
121
  ctx: click.Context, param: str, value: str
79
122
  ) -> Union[str, int]:
@@ -133,7 +176,9 @@ def cli() -> None: # pragma: no cover
133
176
  callback=_validate_verbose,
134
177
  default="info",
135
178
  )
136
- def run(filepath: click.Path, element: str, verbose: Union[str, int]) -> None:
179
+ def run(
180
+ filepath: click.Path, element: Tuple[str], verbose: Union[str, int]
181
+ ) -> None:
137
182
  """Run command for CLI.
138
183
 
139
184
  \f
@@ -142,8 +187,8 @@ def run(filepath: click.Path, element: str, verbose: Union[str, int]) -> None:
142
187
  ----------
143
188
  filepath : click.Path
144
189
  The filepath to the configuration file.
145
- element : str
146
- The element to operate using.
190
+ element : tuple of str
191
+ The element to operate on.
147
192
  verbose : click.Choice
148
193
  The verbosity level: warning, info or debug (default "info").
149
194
 
junifer/api/functions.py CHANGED
@@ -163,7 +163,9 @@ def run(
163
163
  # Fit elements
164
164
  with datagrabber_object:
165
165
  if elements is not None:
166
- for t_element in elements:
166
+ for t_element in datagrabber_object.filter(
167
+ elements # type: ignore
168
+ ):
167
169
  mc.fit(datagrabber_object[t_element])
168
170
  else:
169
171
  for t_element in datagrabber_object:
@@ -35,7 +35,16 @@ runner = CliRunner()
35
35
  def test_run_and_collect_commands(
36
36
  tmp_path: Path, elements: Tuple[str, ...]
37
37
  ) -> None:
38
- """Test run and collect commands."""
38
+ """Test run and collect commands.
39
+
40
+ Parameters
41
+ ----------
42
+ tmp_path : pathlib.Path
43
+ The path to the test directory.
44
+ elements : tuple of str
45
+ The elements to operate on.
46
+
47
+ """
39
48
  # Get test config
40
49
  infile = Path(__file__).parent / "data" / "gmd_mean.yaml"
41
50
  # Read test config
@@ -74,6 +83,57 @@ def test_run_and_collect_commands(
74
83
  assert collect_result.exit_code == 0
75
84
 
76
85
 
86
+ @pytest.mark.parametrize(
87
+ "elements",
88
+ [
89
+ "sub-01",
90
+ "sub-01\nsub-02",
91
+ ],
92
+ )
93
+ def test_run_using_element_file(tmp_path: Path, elements: str) -> None:
94
+ """Test run command using element file.
95
+
96
+ Parameters
97
+ ----------
98
+ tmp_path : pathlib.Path
99
+ The path to the test directory.
100
+ elements : str
101
+ The elements to write to the element file.
102
+
103
+ """
104
+ # Create test file
105
+ test_file_path = tmp_path / "elements.txt"
106
+ with open(test_file_path, "w") as f:
107
+ f.write(elements)
108
+
109
+ # Get test config
110
+ infile = Path(__file__).parent / "data" / "gmd_mean.yaml"
111
+ # Read test config
112
+ contents = yaml.load(infile)
113
+ # Working directory
114
+ workdir = tmp_path / "workdir"
115
+ contents["workdir"] = str(workdir.resolve())
116
+ # Output directory
117
+ outdir = tmp_path / "outdir"
118
+ # Storage
119
+ contents["storage"]["uri"] = str(outdir.resolve())
120
+ # Write new test config
121
+ outfile = tmp_path / "in.yaml"
122
+ yaml.dump(contents, stream=outfile)
123
+ # Run command arguments
124
+ run_args = [
125
+ str(outfile.absolute()),
126
+ "--verbose",
127
+ "debug",
128
+ "--element",
129
+ str(test_file_path.resolve()),
130
+ ]
131
+ # Invoke run command
132
+ run_result = runner.invoke(run, run_args)
133
+ # Check
134
+ assert run_result.exit_code == 0
135
+
136
+
77
137
  def test_wtf_short() -> None:
78
138
  """Test short version of wtf command."""
79
139
  # Invoke wtf command
@@ -58,12 +58,12 @@ class BaseDataGrabber(ABC, UpdateMetaMixin):
58
58
  """
59
59
  yield from self.get_elements()
60
60
 
61
- def __getitem__(self, element: Union[str, Tuple]) -> Dict[str, Dict]:
61
+ def __getitem__(self, element: Union[str, Tuple[str]]) -> Dict[str, Dict]:
62
62
  """Enable indexing support.
63
63
 
64
64
  Parameters
65
65
  ----------
66
- element : str or tuple
66
+ element : str or tuple of str
67
67
  The element to be indexed.
68
68
 
69
69
  Returns
@@ -117,6 +117,51 @@ class BaseDataGrabber(ABC, UpdateMetaMixin):
117
117
  """
118
118
  return self._datadir
119
119
 
120
+ def filter(self, selection: List[Union[str, Tuple[str]]]) -> Iterator:
121
+ """Filter elements to be grabbed.
122
+
123
+ Parameters
124
+ ----------
125
+ selection : list of str or tuple
126
+ The list of partial element key values to filter using.
127
+
128
+ Yields
129
+ ------
130
+ object
131
+ An element that can be indexed by the DataGrabber.
132
+
133
+ """
134
+
135
+ def filter_func(element: Union[str, Tuple[str]]) -> bool:
136
+ """Filter element based on selection.
137
+
138
+ Parameters
139
+ ----------
140
+ element : str or tuple of str
141
+ The element to be filtered.
142
+
143
+ Returns
144
+ -------
145
+ bool
146
+ If the element passes the filter or not.
147
+
148
+ """
149
+ # Convert element to tuple
150
+ if not isinstance(element, tuple):
151
+ element = (element,)
152
+ # Filter based on selection kind
153
+ if isinstance(selection[0], str):
154
+ for opt in selection:
155
+ if opt in element:
156
+ return True
157
+ elif isinstance(selection[0], tuple):
158
+ for opt in selection:
159
+ if set(opt).issubset(element):
160
+ return True
161
+ return False
162
+
163
+ yield from filter(filter_func, self.get_elements())
164
+
120
165
  @abstractmethod
121
166
  def get_element_keys(self) -> List[str]:
122
167
  """Get element keys.
@@ -136,7 +181,7 @@ class BaseDataGrabber(ABC, UpdateMetaMixin):
136
181
  )
137
182
 
138
183
  @abstractmethod
139
- def get_elements(self) -> List:
184
+ def get_elements(self) -> List[Union[str, Tuple[str]]]:
140
185
  """Get elements.
141
186
 
142
187
  Returns
@@ -67,3 +67,60 @@ def test_BaseDataGrabber() -> None:
67
67
 
68
68
  with pytest.raises(NotImplementedError):
69
69
  dg.get_item(subject=1) # type: ignore
70
+
71
+
72
+ def test_BaseDataGrabber_filter_single() -> None:
73
+ """Test single-keyed element filter for BaseDataGrabber."""
74
+
75
+ # Create concrete class
76
+ class FilterDataGrabber(BaseDataGrabber):
77
+ def get_item(self, subject):
78
+ return {"BOLD": {}}
79
+
80
+ def get_elements(self):
81
+ return ["sub01", "sub02", "sub03"]
82
+
83
+ def get_element_keys(self):
84
+ return ["subject"]
85
+
86
+ dg = FilterDataGrabber(datadir="/tmp", types=["BOLD"])
87
+ with dg:
88
+ assert "sub01" in list(dg.filter(["sub01"]))
89
+ assert "sub02" not in list(dg.filter(["sub01"]))
90
+
91
+
92
+ def test_BaseDataGrabber_filter_multi() -> None:
93
+ """Test multi-keyed element filter for BaseDataGrabber."""
94
+
95
+ # Create concrete class
96
+ class FilterDataGrabber(BaseDataGrabber):
97
+ def get_item(self, subject):
98
+ return {"BOLD": {}}
99
+
100
+ def get_elements(self):
101
+ return [
102
+ ("sub01", "rest"),
103
+ ("sub01", "movie"),
104
+ ("sub02", "rest"),
105
+ ("sub02", "movie"),
106
+ ("sub03", "rest"),
107
+ ("sub03", "movie"),
108
+ ]
109
+
110
+ def get_element_keys(self):
111
+ return ["subject", "task"]
112
+
113
+ dg = FilterDataGrabber(datadir="/tmp", types=["BOLD"])
114
+ with dg:
115
+ assert ("sub01", "rest") in list(
116
+ dg.filter([("sub01", "rest")]) # type: ignore
117
+ )
118
+ assert ("sub01", "movie") not in list(
119
+ dg.filter([("sub01", "rest")]) # type: ignore
120
+ )
121
+ assert ("sub02", "rest") not in list(
122
+ dg.filter([("sub01", "rest")]) # type: ignore
123
+ )
124
+ assert ("sub02", "movie") not in list(
125
+ dg.filter([("sub01", "rest")]) # type: ignore
126
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: junifer
3
- Version: 0.0.4.dev15
3
+ Version: 0.0.4.dev25
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>
@@ -26,31 +26,31 @@ Requires-Python: >=3.8
26
26
  Description-Content-Type: text/markdown
27
27
  License-File: LICENSE.md
28
28
  License-File: AUTHORS.rst
29
- Requires-Dist: click (<8.2,>=8.1.3)
30
- Requires-Dist: numpy (<1.26,>=1.24)
31
- Requires-Dist: datalad (<0.19,>=0.15.4)
32
- Requires-Dist: pandas (<1.6,>=1.4.0)
33
- Requires-Dist: nibabel (<4.1,>=3.2.0)
34
- Requires-Dist: nilearn (<=0.10.0,>=0.9.0)
35
- Requires-Dist: sqlalchemy (<=1.5.0,>=1.4.27)
36
- Requires-Dist: ruamel.yaml (<0.18,>=0.17)
37
- Requires-Dist: h5py (<3.9,>=3.8.0)
29
+ Requires-Dist: click <8.2,>=8.1.3
30
+ Requires-Dist: numpy <1.26,>=1.24
31
+ Requires-Dist: datalad <0.19,>=0.15.4
32
+ Requires-Dist: pandas <1.6,>=1.4.0
33
+ Requires-Dist: nibabel <4.1,>=3.2.0
34
+ Requires-Dist: nilearn <=0.10.0,>=0.9.0
35
+ Requires-Dist: sqlalchemy <=1.5.0,>=1.4.27
36
+ Requires-Dist: ruamel.yaml <0.18,>=0.17
37
+ Requires-Dist: h5py <3.9,>=3.8.0
38
38
  Requires-Dist: importlib-metadata ; python_version < "3.10"
39
39
  Provides-Extra: dev
40
40
  Requires-Dist: tox ; extra == 'dev'
41
41
  Requires-Dist: pre-commit ; extra == 'dev'
42
42
  Provides-Extra: docs
43
- Requires-Dist: seaborn (<0.12,>=0.11.2) ; extra == 'docs'
44
- Requires-Dist: Sphinx (<5.4,>=5.3.0) ; extra == 'docs'
45
- Requires-Dist: sphinx-gallery (<0.12,>=0.11.0) ; extra == 'docs'
46
- Requires-Dist: furo (<2023.0.0,>=2022.9.29) ; extra == 'docs'
47
- Requires-Dist: numpydoc (<1.6,>=1.5.0) ; extra == 'docs'
48
- Requires-Dist: julearn (==0.3.0) ; extra == 'docs'
49
- Requires-Dist: sphinx-copybutton (==0.5.1) ; extra == 'docs'
50
- Requires-Dist: towncrier (==22.12.0) ; extra == 'docs'
51
- Requires-Dist: sphinxcontrib-mermaid (==0.8.1) ; extra == 'docs'
43
+ Requires-Dist: seaborn <0.12,>=0.11.2 ; extra == 'docs'
44
+ Requires-Dist: Sphinx <5.4,>=5.3.0 ; extra == 'docs'
45
+ Requires-Dist: sphinx-gallery <0.12,>=0.11.0 ; extra == 'docs'
46
+ Requires-Dist: furo <2023.0.0,>=2022.9.29 ; extra == 'docs'
47
+ Requires-Dist: numpydoc <1.6,>=1.5.0 ; extra == 'docs'
48
+ Requires-Dist: julearn ==0.3.0 ; extra == 'docs'
49
+ Requires-Dist: sphinx-copybutton ==0.5.1 ; extra == 'docs'
50
+ Requires-Dist: towncrier ==22.12.0 ; extra == 'docs'
51
+ Requires-Dist: sphinxcontrib-mermaid ==0.8.1 ; extra == 'docs'
52
52
  Provides-Extra: onthefly
53
- Requires-Dist: bctpy (==0.6.0) ; extra == 'onthefly'
53
+ Requires-Dist: bctpy ==0.6.0 ; extra == 'onthefly'
54
54
 
55
55
  ![Junifer logo](docs/images/junifer_logo.png "junifer logo")
56
56
 
@@ -1,10 +1,10 @@
1
1
  junifer/__init__.py,sha256=x1UR2jUcrUdm2HNl-3Qvyi4UUrU6ms5qm2qcmNY7zZk,391
2
- junifer/_version.py,sha256=ZwqhGZ18UivOp5VizAjwA0R1I9txaG9DFoVQGhBFIWc,175
2
+ junifer/_version.py,sha256=NZ3ofU9gZvPmI7ejRJvqwug4iqb9OXFI2rNJgc-g_zw,175
3
3
  junifer/stats.py,sha256=KUX4jJcLWnlE34coet8EkdFypFd-td4Vtpx5LvlomVs,5879
4
4
  junifer/api/__init__.py,sha256=YILu9M7SC0Ri4CVd90fELH2OnK_gvCYAXCoqBNCFE8E,257
5
- junifer/api/cli.py,sha256=epPGiMU9szF0Dbv-_ty3hxxWPUd8KM-gqQI10TJEl2Y,9843
5
+ junifer/api/cli.py,sha256=3yNNZkqarBHmjEOcDzb1ZBqj3jAxdFzbbb1azE2_BYQ,10982
6
6
  junifer/api/decorators.py,sha256=8bnwHPAe7VgzKxl--M_e0umdAlTVSzaJQHEJZ5kof5k,2580
7
- junifer/api/functions.py,sha256=5wKGRNsdzWgah24Xc2InaxpmkH2Cy9Y1Y1FSQn6yqzk,22536
7
+ junifer/api/functions.py,sha256=ifnHQ5w6_1WZSi4CoJ6ab8SF-8s0NDDnHwJBJG_myjo,22609
8
8
  junifer/api/parser.py,sha256=SZr3k5tAkma3oHWj88MlCntEolhoGIbiYekFf8i797Y,3308
9
9
  junifer/api/utils.py,sha256=dyjTdPMwX9qeCrn8SQT2Pjshfnu-y1FEyujV7lCzvm0,3333
10
10
  junifer/api/res/run_conda.sh,sha256=GerhBGReDw-_fp6RPnaorMHT9IHrp3LRgHJY4mgK4_Y,501
@@ -14,7 +14,7 @@ junifer/api/res/afni/3dReHo,sha256=Jb5B97iPPPQ14zAz7tK5BVG4jPZyOe9c6kgM6ixKaY8,4
14
14
  junifer/api/res/afni/afni,sha256=idLvNWHwd6P4jWXfk6hMXQckdpcTJYbvnLC3uNP6sBg,42
15
15
  junifer/api/res/afni/run_afni_docker.sh,sha256=Qw_yLv7GijmjPmmuiDA0qRmB2Kxuvsoerm5R7mjtzZo,1106
16
16
  junifer/api/tests/test_api_utils.py,sha256=_ykEECJN0qTEBcJ2YSvOAQrRN-xmEilRLPyirC5cO_o,2285
17
- junifer/api/tests/test_cli.py,sha256=-V-oyKiEqnIOUOiO_5KHMKuAa71Azmd48Ghy5FcP5H0,2797
17
+ junifer/api/tests/test_cli.py,sha256=91KUxeKXaorB7hZ4SX0TJ9ClpqmfVLHKD_zKQqZFd6M,4279
18
18
  junifer/api/tests/test_functions.py,sha256=yIo4MQ64lTdpEMGUR7THYGYHQQyV0zC73-pQw_Sq0Xw,24632
19
19
  junifer/api/tests/test_parser.py,sha256=3GZYamYbpW8bGnx95_RQ1uT783or_H-yqzZ138wQYmE,6107
20
20
  junifer/api/tests/data/gmd_mean.yaml,sha256=Ohb_C5cfQMK-59U9O1ZhejXyBtzLc5Y4cv8QyYq2azg,330
@@ -62,7 +62,7 @@ junifer/data/tests/test_data_utils.py,sha256=Vy7x8zaHws5hmn92PKSv3H38hU2kamOpyaH
62
62
  junifer/data/tests/test_masks.py,sha256=uhY3dm0CGbKTMs8hAMJxQx0KMcl9qmfaee3guBrdYas,13269
63
63
  junifer/data/tests/test_parcellations.py,sha256=3JCTuaT4Ugs3t_EX5XWbr52bSaMSnoROF81Nthmn9Nc,31361
64
64
  junifer/datagrabber/__init__.py,sha256=xKMQMjqoWul13YluGTLLMBgKahUg5jJKi4phPih3XJU,634
65
- junifer/datagrabber/base.py,sha256=6JoIDBCWXCIQdjSg6OIbdrqbQKzV6_zBTk0Zs1Wj6_Y,4622
65
+ junifer/datagrabber/base.py,sha256=r4SQrse9XWmMqYaCl861bhzEs1uQGBTUeOgH9d39mEE,6016
66
66
  junifer/datagrabber/datalad_base.py,sha256=dDaBiIePPP6-G4ycgBMxTcXxs4vkg-yDS3OBURK4VGs,10731
67
67
  junifer/datagrabber/multiple.py,sha256=eXQIsvSNvD8GuEITjMaMoi1GwoeyWXXbQMRi-f2qgc4,4923
68
68
  junifer/datagrabber/pattern.py,sha256=LRI9eUSwvbuz3Go_MIrlo-Rk5bncpLdw8N0A2qi3eJE,10519
@@ -79,7 +79,7 @@ junifer/datagrabber/hcp1200/__init__.py,sha256=zy4Qq1_m3vECEhioG-UDteco2b5cni_8x
79
79
  junifer/datagrabber/hcp1200/datalad_hcp1200.py,sha256=5MlQnUgQl9CzXhGhrN0sjpZ8bG4d7lD4g-dfqBsEQyE,2321
80
80
  junifer/datagrabber/hcp1200/hcp1200.py,sha256=joICsu26ZuvQuEVznjYDsgM43_-tgpDuKkS6sOKQXfk,5575
81
81
  junifer/datagrabber/hcp1200/tests/test_hcp1200.py,sha256=KJ-Jq01l0a6TaboG898qjBdPTHG1E3PZtHCjJ7n-1X0,10765
82
- junifer/datagrabber/tests/test_base.py,sha256=4dss506m2dryhOx-TM-V9Ts5T3yLyFQRjM6Qp9VMCwA,2001
82
+ junifer/datagrabber/tests/test_base.py,sha256=TBv14m7JZCvF6OPKG2MesMI7MPm-BkCAzOHb1GmMrG8,3738
83
83
  junifer/datagrabber/tests/test_datagrabber_utils.py,sha256=08fdnXRehAhrWoNdMP_2Ecgam7a1uMbt1i0wIpderEg,2795
84
84
  junifer/datagrabber/tests/test_datalad_base.py,sha256=GORMEzpIIK1StqJLv7jE8dZeLjXMZTPL_d_KDafDATc,16496
85
85
  junifer/datagrabber/tests/test_multiple.py,sha256=Buu-ajH6AC8jVZz7RdEXm8kBIHwvFZvoSPH1DETxoFA,4955
@@ -190,10 +190,10 @@ junifer/utils/fs.py,sha256=Jd9AoV2fIF7pT7KhXsn8T1O1fJ1_SFZgaFuOBAM7DG8,460
190
190
  junifer/utils/logging.py,sha256=phBwOFaK6ejqbSjkCSAkZhhdo4sr01GdVZmJIL8t-Lw,8994
191
191
  junifer/utils/tests/test_fs.py,sha256=WQS7cKlKEZ742CIuiOYYpueeAhY9PqlastfDVpVVtvE,923
192
192
  junifer/utils/tests/test_logging.py,sha256=l8oo-AiBV7H6_IzlsNcj__cLeZBUvgIGoaMszD9VaJg,7754
193
- junifer-0.0.4.dev15.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
194
- junifer-0.0.4.dev15.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
195
- junifer-0.0.4.dev15.dist-info/METADATA,sha256=6sr_iKHAMdS1rBLwlyGO7fciJEpqkJb5JzZ74qZlGc8,6833
196
- junifer-0.0.4.dev15.dist-info/WHEEL,sha256=AtBG6SXL3KF_v0NxLf0ehyVOh0cold-JbJYXNGorC6Q,92
197
- junifer-0.0.4.dev15.dist-info/entry_points.txt,sha256=DxFvKq0pOqRunAK0FxwJcoDfV1-dZvsFDpD5HRqSDhw,48
198
- junifer-0.0.4.dev15.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
199
- junifer-0.0.4.dev15.dist-info/RECORD,,
193
+ junifer-0.0.4.dev25.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
194
+ junifer-0.0.4.dev25.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
195
+ junifer-0.0.4.dev25.dist-info/METADATA,sha256=reZCG9RgC2mw-1ZQt4o33iEGJJTZda_93KxYuGVjJ18,6795
196
+ junifer-0.0.4.dev25.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
197
+ junifer-0.0.4.dev25.dist-info/entry_points.txt,sha256=DxFvKq0pOqRunAK0FxwJcoDfV1-dZvsFDpD5HRqSDhw,48
198
+ junifer-0.0.4.dev25.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
199
+ junifer-0.0.4.dev25.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.0)
2
+ Generator: bdist_wheel (0.41.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5