fix: CI #29
6 changed files with 34 additions and 45 deletions
|
|
@ -86,8 +86,7 @@ class PatternDataGrabber(BaseDataGrabber):
|
||||||
glob_pattern = pattern
|
glob_pattern = pattern
|
||||||
for t_r in self.replacements:
|
for t_r in self.replacements:
|
||||||
# Replace the first of each with a named group definition
|
# Replace the first of each with a named group definition
|
||||||
re_pattern = re_pattern.replace(
|
re_pattern = re_pattern.replace(f"{{{t_r}}}", f"(?P<{t_r}>.*)", 1)
|
||||||
f"{{{t_r}}}", f"(?P<{t_r}>.*)", 1)
|
|
||||||
|
|
||||||
for t_r in self.replacements:
|
for t_r in self.replacements:
|
||||||
# Replace the second appearance of each with the named group
|
# Replace the second appearance of each with the named group
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
||||||
# License: AGPL
|
# License: AGPL
|
||||||
|
|
||||||
from junifer.datagrabber import PatternDataladDataGrabber, MultipleDataGrabber
|
from junifer.datagrabber import MultipleDataGrabber, PatternDataladDataGrabber
|
||||||
|
|
||||||
|
|
||||||
_testing_dataset = {
|
_testing_dataset = {
|
||||||
"example_bids": {
|
"example_bids": {
|
||||||
|
|
@ -34,14 +35,16 @@ def test_multiple() -> None:
|
||||||
uri=repo_uri,
|
uri=repo_uri,
|
||||||
types=["T1w"],
|
types=["T1w"],
|
||||||
patterns=pattern1,
|
patterns=pattern1,
|
||||||
replacements=replacements)
|
replacements=replacements,
|
||||||
|
)
|
||||||
|
|
||||||
dg2 = PatternDataladDataGrabber(
|
dg2 = PatternDataladDataGrabber(
|
||||||
rootdir=rootdir,
|
rootdir=rootdir,
|
||||||
uri=repo_uri,
|
uri=repo_uri,
|
||||||
types=["bold"],
|
types=["bold"],
|
||||||
patterns=pattern2,
|
patterns=pattern2,
|
||||||
replacements=replacements)
|
replacements=replacements,
|
||||||
|
)
|
||||||
|
|
||||||
dg = MultipleDataGrabber([dg1, dg2])
|
dg = MultipleDataGrabber([dg1, dg2])
|
||||||
expected_subs = [
|
expected_subs = [
|
||||||
|
|
@ -73,14 +76,16 @@ def test_multiple_no_intersection() -> None:
|
||||||
uri=repo_uri1,
|
uri=repo_uri1,
|
||||||
types=["T1w"],
|
types=["T1w"],
|
||||||
patterns=pattern1,
|
patterns=pattern1,
|
||||||
replacements=replacements)
|
replacements=replacements,
|
||||||
|
)
|
||||||
|
|
||||||
dg2 = PatternDataladDataGrabber(
|
dg2 = PatternDataladDataGrabber(
|
||||||
rootdir=rootdir,
|
rootdir=rootdir,
|
||||||
uri=repo_uri2,
|
uri=repo_uri2,
|
||||||
types=["bold"],
|
types=["bold"],
|
||||||
patterns=pattern2,
|
patterns=pattern2,
|
||||||
replacements=replacements)
|
replacements=replacements,
|
||||||
|
)
|
||||||
|
|
||||||
dg = MultipleDataGrabber([dg1, dg2])
|
dg = MultipleDataGrabber([dg1, dg2])
|
||||||
expected_subs = set()
|
expected_subs = set()
|
||||||
|
|
|
||||||
|
|
@ -391,7 +391,7 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage):
|
||||||
# Process metadata
|
# Process metadata
|
||||||
meta_md5, t_meta_row = process_meta(t_meta)
|
meta_md5, t_meta_row = process_meta(t_meta)
|
||||||
# Get sqlalchemy engine
|
# Get sqlalchemy engine
|
||||||
engine = self.get_engine(t_meta)
|
engine = self.get_engine(meta=t_meta)
|
||||||
if meta_md5 not in inspect(engine).get_table_names():
|
if meta_md5 not in inspect(engine).get_table_names():
|
||||||
# Convert metadata to dataframe
|
# Convert metadata to dataframe
|
||||||
meta_df = self._meta_row(meta=t_meta_row, meta_md5=meta_md5)
|
meta_df = self._meta_row(meta=t_meta_row, meta_md5=meta_md5)
|
||||||
|
|
@ -553,7 +553,7 @@ class SQLiteFeatureStorage(PandasBaseFeatureStorage):
|
||||||
table_name = f"meta_{meta_md5}"
|
table_name = f"meta_{meta_md5}"
|
||||||
t_df = in_storage.read_df(feature_md5=meta_md5)
|
t_df = in_storage.read_df(feature_md5=meta_md5)
|
||||||
# Save data
|
# Save data
|
||||||
out_storage._save_upsert(t_df, table_name, if_exist="nocheck")
|
out_storage._save_upsert(t_df, table_name, if_exists="nocheck")
|
||||||
|
|
||||||
|
|
||||||
# TODO: refactor
|
# TODO: refactor
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ def test_upsert_replace(tmp_path: Path) -> None:
|
||||||
# Metadata to store
|
# Metadata to store
|
||||||
meta = {"element": "test", "version": "0.0.1"}
|
meta = {"element": "test", "version": "0.0.1"}
|
||||||
# Save to database
|
# Save to database
|
||||||
storage.store_df(df1, meta)
|
storage.store_df(df=df1, meta=meta)
|
||||||
# Store metadata
|
# Store metadata
|
||||||
table_name = storage.store_metadata(meta)
|
table_name = storage.store_metadata(meta)
|
||||||
# Read stored table
|
# Read stored table
|
||||||
|
|
@ -162,7 +162,7 @@ def test_upsert_replace(tmp_path: Path) -> None:
|
||||||
# Check if dataframes are equal
|
# Check if dataframes are equal
|
||||||
assert_frame_equal(df1, c_df1)
|
assert_frame_equal(df1, c_df1)
|
||||||
# Upsert using replace
|
# Upsert using replace
|
||||||
storage._save_upsert(df2, table_name, if_exist="replace")
|
storage._save_upsert(df=df2, name=table_name, if_exists="replace")
|
||||||
# Read stored table
|
# Read stored table
|
||||||
c_df2 = _read_sql(
|
c_df2 = _read_sql(
|
||||||
table_name=table_name, uri=uri, index_col=["element", "pk2"]
|
table_name=table_name, uri=uri, index_col=["element", "pk2"]
|
||||||
|
|
@ -188,9 +188,9 @@ def test_upsert_ignore(tmp_path: Path) -> None:
|
||||||
# Metadata to store
|
# Metadata to store
|
||||||
meta = {"element": "test", "version": "0.0.1"}
|
meta = {"element": "test", "version": "0.0.1"}
|
||||||
# Save to database
|
# Save to database
|
||||||
storage.store_df(df1, meta)
|
storage.store_df(df=df1, meta=meta)
|
||||||
# Store metadata
|
# Store metadata
|
||||||
table_name = storage.store_metadata(meta)
|
table_name = storage.store_metadata(meta=meta)
|
||||||
# Read stored table
|
# Read stored table
|
||||||
c_df1 = _read_sql(
|
c_df1 = _read_sql(
|
||||||
table_name=table_name, uri=uri, index_col=["element", "pk2"]
|
table_name=table_name, uri=uri, index_col=["element", "pk2"]
|
||||||
|
|
@ -206,7 +206,7 @@ def test_upsert_ignore(tmp_path: Path) -> None:
|
||||||
assert_frame_equal(c_dfignore, df_ignore)
|
assert_frame_equal(c_dfignore, df_ignore)
|
||||||
# Check for error
|
# Check for error
|
||||||
with pytest.raises(ValueError, match=r"already exists"):
|
with pytest.raises(ValueError, match=r"already exists"):
|
||||||
storage._save_upsert(df2, table_name, if_exist="fail")
|
storage._save_upsert(df2, table_name, if_exists="fail")
|
||||||
|
|
||||||
|
|
||||||
def test_upsert_update(tmp_path: Path) -> None:
|
def test_upsert_update(tmp_path: Path) -> None:
|
||||||
|
|
@ -375,39 +375,23 @@ def test_store_table(tmp_path: Path) -> None:
|
||||||
# Check if dataframes are equal
|
# Check if dataframes are equal
|
||||||
assert_frame_equal(df, c_df)
|
assert_frame_equal(df, c_df)
|
||||||
|
|
||||||
|
# New data to store
|
||||||
def test_store_table_check_warning(tmp_path: Path) -> None:
|
data_new = [[1, 10], [2, 20], [3, 300], [4, 40], [5, 50], [6, 600]]
|
||||||
"""Test table store and check warning.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
tmp_path : pathlib.Path
|
|
||||||
The path to the test directory.
|
|
||||||
|
|
||||||
"""
|
|
||||||
uri = tmp_path / "test_store_table_check_warning.db"
|
|
||||||
storage = SQLiteFeatureStorage(uri=uri, single_output=True)
|
|
||||||
# Metadata to store
|
|
||||||
meta = {"element": "test", "version": "0.0.1", "marker": {"name": "fc"}}
|
|
||||||
# Data to store
|
|
||||||
data = [[1, 10], [2, 20], [3, 300], [4, 40], [5, 50], [6, 600]]
|
|
||||||
# Convert element to index
|
# Convert element to index
|
||||||
idx = element_to_index(meta, n_rows=6, rows_col_name="scan")
|
idx_new = element_to_index(meta, n_rows=6, rows_col_name="scan")
|
||||||
# Create dataframe
|
# Create dataframe
|
||||||
df = pd.DataFrame(data, columns=["f1", "f2"], index=idx)
|
df_new = pd.DataFrame(data_new, columns=["f1", "f2"], index=idx_new)
|
||||||
# Check warning
|
# Check warning
|
||||||
with pytest.warns(RuntimeWarning, match=r"Some rows"):
|
with pytest.warns(RuntimeWarning, match=r"Some rows"):
|
||||||
storage.store_table(
|
storage.store_table(
|
||||||
data, meta, columns=["f1", "f2"], rows_col_name="scan"
|
data_new, meta, columns=["f1", "f2"], rows_col_name="scan"
|
||||||
)
|
)
|
||||||
# Store metadata
|
|
||||||
table_name = storage.store_metadata(meta)
|
|
||||||
# Read stored table
|
# Read stored table
|
||||||
c_df = _read_sql(
|
c_df_new = _read_sql(
|
||||||
table_name=table_name, uri=uri, index_col=["element", "scan"]
|
table_name=table_name, uri=uri, index_col=["element", "scan"]
|
||||||
)
|
)
|
||||||
# Check if dataframes are equal
|
# Check if dataframes are equal
|
||||||
assert_frame_equal(df, c_df)
|
assert_frame_equal(df_new, c_df_new)
|
||||||
|
|
||||||
|
|
||||||
# TODO: can the test be parametrized?
|
# TODO: can the test be parametrized?
|
||||||
|
|
|
||||||
|
|
@ -63,21 +63,23 @@ def process_meta(meta: Dict) -> Tuple[str, Dict]:
|
||||||
"""
|
"""
|
||||||
if meta is None:
|
if meta is None:
|
||||||
raise_error(msg="`meta` must be a dict (currently is None)")
|
raise_error(msg="`meta` must be a dict (currently is None)")
|
||||||
|
# Copy the metadata
|
||||||
|
t_meta = meta.copy()
|
||||||
# Remove key "element"
|
# Remove key "element"
|
||||||
element = meta.pop("element", None)
|
element = t_meta.pop("element", None)
|
||||||
if element is None:
|
if element is None:
|
||||||
if "_element_keys" not in meta:
|
if "_element_keys" not in t_meta:
|
||||||
raise_error(
|
raise_error(
|
||||||
msg="`meta` must contain the key 'element' or '_element_keys'"
|
msg="`meta` must contain the key 'element' or '_element_keys'"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
if isinstance(element, dict):
|
if isinstance(element, dict):
|
||||||
meta["_element_keys"] = list(element.keys())
|
t_meta["_element_keys"] = list(element.keys())
|
||||||
else:
|
else:
|
||||||
meta["_element_keys"] = ["element"]
|
t_meta["_element_keys"] = ["element"]
|
||||||
# MD5 hash of the metadata
|
# MD5 hash of the metadata
|
||||||
md5_hash = _meta_hash(meta)
|
md5_hash = _meta_hash(t_meta)
|
||||||
return md5_hash, meta
|
return md5_hash, t_meta
|
||||||
|
|
||||||
|
|
||||||
def element_to_prefix(element: Union[Tuple, Dict, str, int]) -> str:
|
def element_to_prefix(element: Union[Tuple, Dict, str, int]) -> str:
|
||||||
|
|
|
||||||
|
|
@ -39,8 +39,7 @@ class OasisVBMTestingDatagrabber(BaseDataGrabber):
|
||||||
"""
|
"""
|
||||||
out = super().__getitem__(element)
|
out = super().__getitem__(element)
|
||||||
i_sub = int(element.split("-")[1]) - 1
|
i_sub = int(element.split("-")[1]) - 1
|
||||||
out["VBM_GM"] = {
|
out["VBM_GM"] = {"path": self._dataset.gray_matter_maps[i_sub]}
|
||||||
"path": self._dataset.gray_matter_maps[i_sub]}
|
|
||||||
# Set the element accordingly
|
# Set the element accordingly
|
||||||
out["meta"]["element"] = {"subject": element}
|
out["meta"]["element"] = {"subject": element}
|
||||||
return out
|
return out
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue