From 912db3c39a5861245e82227c7015083ecb9cb80e Mon Sep 17 00:00:00 2001 From: Javanaut Date: Fri, 19 Jun 2026 08:22:52 +0200 Subject: [PATCH] fix M --- src/ffx/cli.py | 35 ++++++++++++++++--- tests/unit/test_cli_unmux_output_directory.py | 18 ++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/ffx/cli.py b/src/ffx/cli.py index 8317403..5482c4c 100755 --- a/src/ffx/cli.py +++ b/src/ffx/cli.py @@ -301,6 +301,35 @@ def resolveUnmuxOutputDirectory(context, outputDirectory, subtitlesOnly, label): return os.path.join(configuredSubtitlesBaseDirectory, resolvedLabel), True +def confirmUnmuxOutputDirectoryCreation(outputDirectory): + message = ( + "Create unmux output directory and missing parents: " + + str(outputDirectory) + ) + + if not sys.stdin.isatty(): + return click.confirm(message, default=True) + + click.echo(f"{message} [Y/n]: ", nl=False) + while True: + char = click.getchar() + if char in ('\r', '\n'): + click.echo() + return True + + normalizedChar = char.lower() + if normalizedChar == 'y': + click.echo(char) + return True + if normalizedChar == 'n': + click.echo(char) + return False + if char in ('\x03', '\x04'): + raise click.Abort() + + click.echo("\nPlease respond with 'y' or 'n': ", nl=False) + + def ensureUnmuxOutputDirectory(context, outputDirectory): resolvedOutputDirectory = os.path.expanduser(str(outputDirectory).strip()) if not resolvedOutputDirectory: @@ -318,11 +347,7 @@ def ensureUnmuxOutputDirectory(context, outputDirectory): if context.get('dry_run', False): return False - if not click.confirm( - "Create unmux output directory and missing parents: " - + resolvedOutputDirectory, - default=True, - ): + if not confirmUnmuxOutputDirectoryCreation(resolvedOutputDirectory): raise click.ClickException("Unmux output directory creation aborted by user.") os.makedirs(resolvedOutputDirectory, exist_ok=True) diff --git a/tests/unit/test_cli_unmux_output_directory.py b/tests/unit/test_cli_unmux_output_directory.py index 525714f..9b97853 100644 --- a/tests/unit/test_cli_unmux_output_directory.py +++ b/tests/unit/test_cli_unmux_output_directory.py @@ -104,6 +104,24 @@ class UnmuxOutputDirectoryTests(unittest.TestCase): self.assertTrue(output_directory.is_dir()) mocked_confirm.assert_called_once() + def test_tty_carriage_return_accepts_default_directory_creation(self): + with tempfile.TemporaryDirectory() as tempdir: + output_directory = Path(tempdir) / "missing" / "manual" + + with patch("ffx.cli.sys.stdin.isatty", return_value=True), patch( + "ffx.cli.click.getchar", + return_value="\r", + ) as mocked_getchar, patch("ffx.cli.click.confirm") as mocked_confirm: + created = cli.ensureUnmuxOutputDirectory( + {"dry_run": False}, + str(output_directory), + ) + + self.assertTrue(created) + self.assertTrue(output_directory.is_dir()) + mocked_getchar.assert_called_once() + mocked_confirm.assert_not_called() + def test_missing_output_directory_can_be_rejected(self): with tempfile.TemporaryDirectory() as tempdir: output_directory = Path(tempdir) / "missing" / "manual"