diff --git a/batdetect2/cli.py b/batdetect2/cli.py index 66aada8..9706312 100644 --- a/batdetect2/cli.py +++ b/batdetect2/cli.py @@ -1,4 +1,5 @@ """BatDetect2 command line interface.""" + import os import click @@ -129,10 +130,9 @@ def detect( ): results_path = audio_file.replace(audio_dir, ann_dir) save_results_to_file(results, results_path) - except (RuntimeError, ValueError, LookupError) as err: + except (RuntimeError, ValueError, LookupError, EOFError) as err: error_files.append(audio_file) - click.secho(f"Error processing file!: {err}", fg="red") - raise err + click.secho(f"Error processing file {audio_file}: {err}", fg="red") click.echo(f"\nResults saved to: {ann_dir}") diff --git a/tests/test_cli.py b/tests/test_cli.py index b53635f..4bcbe08 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,10 +7,11 @@ from batdetect2.cli import cli +runner = CliRunner() + def test_cli_base_command(): """Test the base command.""" - runner = CliRunner() result = runner.invoke(cli, ["--help"]) assert result.exit_code == 0 assert ( @@ -20,7 +21,6 @@ def test_cli_base_command(): def test_cli_detect_command_help(): """Test the detect command help.""" - runner = CliRunner() result = runner.invoke(cli, ["detect", "--help"]) assert result.exit_code == 0 assert "Detect bat calls in files in AUDIO_DIR" in result.output @@ -34,7 +34,6 @@ def test_cli_detect_command_on_test_audio(tmp_path): if results_dir.exists(): results_dir.rmdir() - runner = CliRunner() result = runner.invoke( cli, [ @@ -58,7 +57,6 @@ def test_cli_detect_command_with_non_trivial_time_expansion(tmp_path): if results_dir.exists(): results_dir.rmdir() - runner = CliRunner() result = runner.invoke( cli, [ @@ -83,7 +81,6 @@ def test_cli_detect_command_with_the_spec_feature_flag(tmp_path: Path): if results_dir.exists(): results_dir.rmdir() - runner = CliRunner() result = runner.invoke( cli, [ @@ -110,3 +107,26 @@ def test_cli_detect_command_with_the_spec_feature_flag(tmp_path: Path): df = pd.read_csv(results_dir / expected_file) assert not (df.duration == -1).any() + + +def test_cli_detect_fails_gracefully_on_empty_file(tmp_path: Path): + results_dir = tmp_path / "results" + target = tmp_path / "audio" + target.mkdir() + + # Create an empty file with the .wav extension + empty_file = target / "empty.wav" + empty_file.touch() + + result = runner.invoke( + cli, + args=[ + "detect", + str(target), + str(results_dir), + "0.3", + "--spec_features", + ], + ) + assert result.exit_code == 0 + assert f"Error processing file {empty_file}" in result.output