Browse Source

script: exit with code 66/EX_NOINPUT in case no matching volume files were found

previously:
> Traceback (most recent call last):
> [...]
> File ".../freesurfer_volume_reader/main.py", line 59, in main
> united_volume_frame = pandas.concat(volume_frames, ignore_index=True, sort=False)
> [...]
> ValueError: No objects to concatenate

https://github.com/fphammerle/freesurfer-volume-reader/issues/10
Fabian Peter Hammerle 5 years ago
parent
commit
c11d56330e
2 changed files with 29 additions and 5 deletions
  1. 6 1
      freesurfer_volume_reader/__main__.py
  2. 23 4
      tests/main_test.py

+ 6 - 1
freesurfer_volume_reader/__main__.py

@@ -6,6 +6,7 @@ and export collected data as CSV.
 import argparse
 import os
 import re
+import sys
 import typing
 
 import pandas
@@ -62,8 +63,12 @@ def main():
                 volume_frame['source_type'] = source_type
                 volume_frame['source_path'] = volume_file.absolute_path
                 volume_frames.append(volume_frame)
+    if not volume_frames:
+        print('Did not find any volume files matching the specified criteria.', file=sys.stderr)
+        return os.EX_NOINPUT
     united_volume_frame = concat_dataframes(volume_frames)
     print(united_volume_frame.to_csv(index=False))
+    return os.EX_OK
 
 if __name__ == '__main__':
-    main()
+    sys.exit(main())

+ 23 - 4
tests/main_test.py

@@ -21,7 +21,7 @@ def assert_main_volume_frame_equals(capsys, argv: list, expected_frame: pandas.D
     elif 'SUBJECTS_DIR' in os.environ:
         del os.environ['SUBJECTS_DIR']
     with unittest.mock.patch('sys.argv', [''] + argv):
-        freesurfer_volume_reader.__main__.main()
+        assert freesurfer_volume_reader.__main__.main() == 0
     out, _ = capsys.readouterr()
     resulted_frame = pandas.read_csv(io.StringIO(out)).drop(columns=['source_path'])
     if 'correction' in resulted_frame:
@@ -205,11 +205,30 @@ def test_main_root_dir_filename_regex_combined(capsys):
 def test_main_no_files_found(capsys):
     with unittest.mock.patch('sys.argv', ['', '--freesurfer-hipposf-filename-regex', r'^21$',
                                           '--', SUBJECTS_DIR]):
-        with pytest.raises(ValueError):
-            freesurfer_volume_reader.__main__.main()
+        assert os.EX_NOINPUT == freesurfer_volume_reader.__main__.main()
     out, err = capsys.readouterr()
     assert not out
-    assert not err
+    assert err == 'Did not find any volume files matching the specified criteria.\n'
+
+
+def test_main_module_script_no_files_found():
+    proc_info = subprocess.run(['python', '-m', 'freesurfer_volume_reader',
+                                '--freesurfer-hipposf-filename-regex', r'^21$',
+                                '--', SUBJECTS_DIR],
+                               check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    assert os.EX_NOINPUT == proc_info.returncode
+    assert not proc_info.stdout
+    assert 'not find any volume files' in proc_info.stderr.rstrip().decode()
+
+
+def test_script_no_files_found():
+    proc_info = subprocess.run(['freesurfer-volume-reader',
+                                '--freesurfer-hipposf-filename-regex', r'^21$',
+                                '--', SUBJECTS_DIR],
+                               check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    assert os.EX_NOINPUT == proc_info.returncode
+    assert not proc_info.stdout
+    assert 'not find any volume files' in proc_info.stderr.rstrip().decode()
 
 
 def test_main_module_script_help():