Skip to content

Commit

Permalink
Bug fixes (#20)
Browse files Browse the repository at this point in the history
* fix #19

* fix #18

* fix test
  • Loading branch information
Remi-Gau authored Sep 11, 2023
1 parent f415b20 commit 32acb4d
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 67 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ tests/data/**/*.json
**/*.edf
**/*.EDF
eye2bids/_version.py
events.json
eyetrack.json

# General
.DS_Store
Expand Down
9 changes: 4 additions & 5 deletions eye2bids/_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,13 @@ def cli(argv: Sequence[str] = sys.argv) -> None:

args, _ = parser.parse_known_args(argv[1:])

input_file = args.input_file
input_file = Path(input_file).resolve()
input_file = Path(args.input_file).resolve()

metadata_file = args.metadata_file
if metadata_file is not None:
metadata_file = metadata_file[0]
if metadata_file not in [None, ""]:
metadata_file = Path(metadata_file).resolve()

output_dir = args.output_dir
output_dir = Path(args.output_dir).resolve()

set_verbosity(args.verbosity)

Expand Down
2 changes: 1 addition & 1 deletion eye2bids/_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,6 @@ def global_parser() -> ArgumentParser:
choices=[0, 1, 2, 3],
default=2,
type=int,
nargs=1,
nargs=2,
)
return parser
59 changes: 40 additions & 19 deletions eye2bids/edf2bids.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,43 +23,64 @@ def _check_inputs(
output_dir: str | Path | None = None,
interactive: bool = False,
) -> tuple[Path, Path | None, Path]:
"""Check if inputs are valid."""
if input_file is None:
if interactive:
input_file = Prompt.ask("Enter the edf file path")
else:
raise FileNotFoundError("No input file specified")

if isinstance(input_file, str):
input_file = Path(input_file)
if input_file.exists():
e2b_log.info(f"file found: {input_file}")
cheked_input_file = Path(input_file)
elif isinstance(input_file, Path):
cheked_input_file = input_file

if cheked_input_file.exists():
e2b_log.info(f"input file found: {cheked_input_file}")
else:
raise FileNotFoundError(f"No such file: {input_file}")
raise FileNotFoundError(f"No such input file: {cheked_input_file}")

if metadata_file is None and interactive:
if metadata_file in [None, ""] and interactive:
e2b_log.info(
"""Load the metadata.yml file with the additional metadata.\n
This file must contain at least the additional REQUIRED metadata
in the format specified in the BIDS specification.\n"""
)
metadata_file = Prompt.ask("Enter the file path to the metadata.yml file")
if isinstance(metadata_file, str):
metadata_file = Path(metadata_file)
if isinstance(metadata_file, str):
metadata_file = Path(metadata_file)
if isinstance(metadata_file, Path):
if metadata_file.exists():
e2b_log.info(f"file found: {metadata_file}")
else:
raise FileNotFoundError(f"No such file: {metadata_file}")

if metadata_file in ["", None]:
checked_metadata_file = None
elif isinstance(metadata_file, str):
checked_metadata_file = Path(metadata_file)
elif isinstance(metadata_file, Path):
checked_metadata_file = metadata_file

if isinstance(checked_metadata_file, Path):
if not checked_metadata_file.exists():
raise FileNotFoundError(f"No such metadata file: {checked_metadata_file}")
if checked_metadata_file.is_file():
e2b_log.info(f"metadata file found: {checked_metadata_file}")
elif checked_metadata_file.is_dir():
raise IsADirectoryError(
f"metadata file is a directory: {checked_metadata_file}"
)

return cheked_input_file, checked_metadata_file, _check_output_dir(output_dir)


def _check_output_dir(output_dir: str | Path | None = None) -> Path:
"""Check if output directory is valid."""
if output_dir is None:
output_dir = input("Enter the output directory: ")
if isinstance(output_dir, str):
output_dir = Path(output_dir)
if not output_dir.exists():
output_dir.mkdir(parents=True, exist_ok=True)
checked_output_dir = Path(output_dir)
elif isinstance(output_dir, Path):
checked_output_dir = output_dir

return input_file, metadata_file, output_dir
if not checked_output_dir.exists():
checked_output_dir.mkdir(parents=True, exist_ok=True)

return checked_output_dir


def _check_edf2asc_present() -> bool:
Expand Down Expand Up @@ -159,7 +180,7 @@ def _extract_MaximalCalibrationError(df: pd.DataFrame) -> list[float]:


def _extract_AverageCalibrationError(df: pd.DataFrame) -> list[float]:
if _has_validation(df):
if not _has_validation(df):
return []
return np.array(_validations(df)[[9]]).astype(float).tolist()

Expand Down
25 changes: 25 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from __future__ import annotations

from pathlib import Path

import pytest


def data_dir() -> Path:
return Path(__file__).parent / "data"


def asc_test_files(input_dir: Path = data_dir()) -> list[Path]:
return list(input_dir.glob("**/*.asc"))


def edf_test_files(input_dir: Path = data_dir()) -> list[Path]:
files = list(input_dir.glob("**/*.edf"))
EDF_files = list(input_dir.glob("**/*.EDF"))
files.extend(EDF_files)
return files


@pytest.fixture
def eyelink_test_data_dir() -> Path:
return data_dir() / "osf" / "eyelink"
44 changes: 44 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from __future__ import annotations

from pathlib import Path

import pytest

from eye2bids._cli import cli
from eye2bids.edf2bids import _check_edf2asc_present

from .conftest import data_dir, edf_test_files


def root_dir() -> Path:
"""Return the root directory of the project."""
return Path(__file__).parent.parent


@pytest.mark.parametrize("metadata_file", [data_dir() / "metadata.yml", None])
@pytest.mark.parametrize("output_dir", [data_dir() / "output", None])
@pytest.mark.parametrize("use_relative_path", [False, True])
def test_edf_cli(use_relative_path, metadata_file, output_dir, eyelink_test_data_dir):
if not _check_edf2asc_present():
pytest.skip("edf2asc missing")

input_dir = eyelink_test_data_dir / "decisions"
input_file = edf_test_files(input_dir=input_dir)[0]

if use_relative_path:
input_file = input_file.relative_to(root_dir())

command = ["eye2bids", "--input_file", str(input_file)]
if metadata_file is not None:
if use_relative_path:
metadata_file = metadata_file.relative_to(root_dir())
metadata_file = str(metadata_file)
command.extend(["--metadata_file", metadata_file])

if output_dir is not None:
if use_relative_path:
output_dir = output_dir.relative_to(root_dir())
output_dir = str(output_dir)
command.extend(["--output_dir", output_dir])

cli(command)
71 changes: 29 additions & 42 deletions tests/test_edf2bids.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,7 @@
edf2bids,
)


def data_dir() -> Path:
return Path(__file__).parent / "data"


def asc_test_files(input_dir: Path = data_dir()) -> list[Path]:
return list(input_dir.glob("**/*.asc"))


def edf_test_files(input_dir: Path = data_dir()) -> list[Path]:
files = list(input_dir.glob("**/*.edf"))
EDF_files = list(input_dir.glob("**/*.EDF"))
files.extend(EDF_files)
return files
from .conftest import asc_test_files, data_dir, edf_test_files


@pytest.mark.parametrize("input_file", edf_test_files())
Expand All @@ -51,11 +38,11 @@ def test_convert_edf_to_asc(input_file):


@pytest.mark.parametrize("metadata_file", [data_dir() / "metadata.yml", None])
def test_edf_end_to_end(metadata_file):
def test_edf_end_to_end(metadata_file, eyelink_test_data_dir):
if not _check_edf2asc_present():
pytest.skip("edf2asc missing")

input_dir = data_dir() / "osf" / "eyelink" / "decisions"
input_dir = eyelink_test_data_dir / "decisions"
input_file = edf_test_files(input_dir=input_dir)[0]

output_dir = data_dir() / "output"
Expand Down Expand Up @@ -91,8 +78,8 @@ def test_edf_end_to_end(metadata_file):
("vergence", "HV9"),
],
)
def test_extract_CalibrationType(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_CalibrationType(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_CalibrationType(df_ms_reduced) == expected
Expand All @@ -110,8 +97,8 @@ def test_extract_CalibrationType(folder, expected):
("vergence", [1919, 1079]),
],
)
def test_extract_ScreenResolution(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_ScreenResolution(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_ScreenResolution(df_ms_reduced) == expected
Expand All @@ -129,8 +116,8 @@ def test_extract_ScreenResolution(folder, expected):
("vergence", ""),
],
)
def test_extract_CalibrationUnit(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_CalibrationUnit(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_CalibrationUnit(df_ms_reduced) == expected
Expand Down Expand Up @@ -193,8 +180,8 @@ def test_extract_CalibrationUnit(folder, expected):
("vergence", []),
],
)
def test_extract_CalibrationPosition(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_CalibrationPosition(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_CalibrationPosition(df_ms_reduced) == expected
Expand All @@ -212,8 +199,8 @@ def test_extract_CalibrationPosition(folder, expected):
("vergence", "P-CR"),
],
)
def test_extract_EyeTrackingMethod(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_EyeTrackingMethod(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
events = _load_asc_file(asc_file)
assert _extract_EyeTrackingMethod(events) == expected
Expand All @@ -231,8 +218,8 @@ def test_extract_EyeTrackingMethod(folder, expected):
("vergence", 1000),
],
)
def test_extract_SamplingFrequency(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_SamplingFrequency(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_SamplingFrequency(df_ms_reduced) == expected
Expand All @@ -250,8 +237,8 @@ def test_extract_SamplingFrequency(folder, expected):
("vergence", "CENTROID"),
],
)
def test_extract_PupilFitMethod(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_PupilFitMethod(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_PupilFitMethod(df_ms_reduced) == expected
Expand All @@ -269,8 +256,8 @@ def test_extract_PupilFitMethod(folder, expected):
("vergence", "CL1-72N02"),
],
)
def test_extract_DeviceSerialNumber(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_DeviceSerialNumber(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
events = _load_asc_file(asc_file)
assert _extract_DeviceSerialNumber(events) == expected
Expand All @@ -288,8 +275,8 @@ def test_extract_DeviceSerialNumber(folder, expected):
("vergence", "Both"),
],
)
def test_extract_RecordedEye(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_RecordedEye(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms_reduced = _load_asc_file_as_reduced_df(asc_file)
assert _extract_RecordedEye(df_ms_reduced) == expected
Expand All @@ -307,8 +294,8 @@ def test_extract_RecordedEye(folder, expected):
("vergence", "EYELINK II CL v4.56 Aug 18 2010"),
],
)
def test_extract_ManufacturersModelName(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_ManufacturersModelName(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
events = _load_asc_file(asc_file)
assert _extract_ManufacturersModelName(events) == expected
Expand All @@ -326,8 +313,8 @@ def test_extract_ManufacturersModelName(folder, expected):
("vergence", []),
],
)
def test_extract_MaximalCalibrationError(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_MaximalCalibrationError(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms = _load_asc_file_as_df(asc_file)
assert _extract_MaximalCalibrationError(df_ms) == expected
Expand All @@ -338,15 +325,15 @@ def test_extract_MaximalCalibrationError(folder, expected):
[
("decisions", []),
("emg", []),
("lt", []),
("lt", [[0.16], [0.18]]),
("pitracker", []),
("rest", []),
("rest", [[0.65]]),
("satf", []),
("vergence", []),
],
)
def test_extract_AverageCalibrationError(folder, expected):
input_dir = data_dir() / "osf" / "eyelink" / folder
def test_extract_AverageCalibrationError(folder, expected, eyelink_test_data_dir):
input_dir = eyelink_test_data_dir / folder
asc_file = asc_test_files(input_dir=input_dir)[0]
df_ms = _load_asc_file_as_df(asc_file)
assert _extract_AverageCalibrationError(df_ms) == expected

0 comments on commit 32acb4d

Please sign in to comment.