From 5e4b63a35eaf095ee91ec30f6c1cce4c456b0256 Mon Sep 17 00:00:00 2001 From: Mohamed Ashraf Date: Wed, 1 Apr 2026 16:33:17 +0000 Subject: [PATCH] fix: make Java init respect --yes flag for non-interactive mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The --yes CLI flag was defined but never consumed by init_java_project(). Thread non_interactive through main.py → init_codeflash() → init_java_project() so that when --yes is set, auto-detected defaults are used without prompts. Co-Authored-By: Claude Opus 4.6 --- codeflash/cli_cmds/cmd_init.py | 4 +- codeflash/cli_cmds/init_java.py | 24 +++++++---- codeflash/main.py | 2 +- tests/test_init_java.py | 73 +++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 tests/test_init_java.py diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index d4da0ed04..f90297b51 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -43,7 +43,7 @@ from argparse import Namespace -def init_codeflash() -> None: +def init_codeflash(non_interactive: bool = False) -> None: try: welcome_panel = Panel( Text( @@ -62,7 +62,7 @@ def init_codeflash() -> None: project_language = detect_project_language() if project_language == ProjectLanguage.JAVA: - init_java_project() + init_java_project(non_interactive=non_interactive) return if project_language in (ProjectLanguage.JAVASCRIPT, ProjectLanguage.TYPESCRIPT): diff --git a/codeflash/cli_cmds/init_java.py b/codeflash/cli_cmds/init_java.py index eb01002fa..1ae213a49 100644 --- a/codeflash/cli_cmds/init_java.py +++ b/codeflash/cli_cmds/init_java.py @@ -147,7 +147,7 @@ def detect_java_test_framework(project_root: Path) -> str: return "junit5" # Default to JUnit 5 -def init_java_project() -> None: +def init_java_project(non_interactive: bool = False) -> None: """Initialize Codeflash for a Java project.""" from codeflash.cli_cmds.github_workflow import install_github_actions from codeflash.cli_cmds.init_auth import install_github_app, prompt_api_key @@ -164,17 +164,25 @@ def init_java_project() -> None: did_add_new_key = prompt_api_key() - should_modify, _config = should_modify_java_config() - - # Default git remote - git_remote = "origin" - - if should_modify: - setup_info = collect_java_setup_info() + if non_interactive: + # Use auto-detected defaults without any interactive prompts + setup_info = JavaSetupInfo() git_remote = setup_info.git_remote or "origin" configured = configure_java_project(setup_info) if not configured: apologize_and_exit() + else: + should_modify, _config = should_modify_java_config() + + # Default git remote + git_remote = "origin" + + if should_modify: + setup_info = collect_java_setup_info() + git_remote = setup_info.git_remote or "origin" + configured = configure_java_project(setup_info) + if not configured: + apologize_and_exit() install_github_app(git_remote) diff --git a/codeflash/main.py b/codeflash/main.py index da0d83db6..4dd5498e6 100644 --- a/codeflash/main.py +++ b/codeflash/main.py @@ -62,7 +62,7 @@ def main() -> None: elif args.command == "init": from codeflash.cli_cmds.cmd_init import init_codeflash - init_codeflash() + init_codeflash(non_interactive=getattr(args, "yes", False)) elif args.command == "init-actions": from codeflash.cli_cmds.github_workflow import install_github_actions diff --git a/tests/test_init_java.py b/tests/test_init_java.py new file mode 100644 index 000000000..002f53541 --- /dev/null +++ b/tests/test_init_java.py @@ -0,0 +1,73 @@ +"""Tests for Java project initialization.""" + +from __future__ import annotations + +from pathlib import Path +from unittest.mock import MagicMock, patch + + +class TestInitJavaNonInteractive: + """Test that non_interactive=True makes Java init fully non-interactive.""" + + def test_non_interactive_skips_prompts_and_uses_auto_detected(self, tmp_path: Path) -> None: + project_dir = (tmp_path / "java-project").resolve() + project_dir.mkdir() + (project_dir / "pom.xml").write_text("", encoding="utf-8") + (project_dir / "src" / "main" / "java").mkdir(parents=True) + (project_dir / "src" / "test" / "java").mkdir(parents=True) + + with ( + patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir), + patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False), + patch("codeflash.cli_cmds.init_auth.install_github_app"), + patch("codeflash.cli_cmds.github_workflow.install_github_actions"), + patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True) as mock_configure, + patch("codeflash.cli_cmds.init_java.ph"), + patch("codeflash.cli_cmds.init_java.console"), + patch("codeflash.cli_cmds.init_java.sys") as mock_sys, + ): + mock_sys.exit = MagicMock(side_effect=SystemExit(0)) + + from codeflash.cli_cmds.init_java import JavaSetupInfo, init_java_project + + try: + init_java_project(non_interactive=True) + except SystemExit: + pass + + mock_configure.assert_called_once() + setup_info = mock_configure.call_args[0][0] + assert isinstance(setup_info, JavaSetupInfo) + assert setup_info.module_root_override is None + assert setup_info.test_root_override is None + assert setup_info.formatter_override is None + assert setup_info.git_remote == "origin" + + def test_non_interactive_skips_should_modify_check(self, tmp_path: Path) -> None: + project_dir = (tmp_path / "java-project").resolve() + project_dir.mkdir() + (project_dir / "pom.xml").write_text("", encoding="utf-8") + (project_dir / "src" / "main" / "java").mkdir(parents=True) + (project_dir / "src" / "test" / "java").mkdir(parents=True) + + with ( + patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir), + patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False), + patch("codeflash.cli_cmds.init_auth.install_github_app"), + patch("codeflash.cli_cmds.github_workflow.install_github_actions"), + patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True), + patch("codeflash.cli_cmds.init_java.should_modify_java_config") as mock_should_modify, + patch("codeflash.cli_cmds.init_java.ph"), + patch("codeflash.cli_cmds.init_java.console"), + patch("codeflash.cli_cmds.init_java.sys") as mock_sys, + ): + mock_sys.exit = MagicMock(side_effect=SystemExit(0)) + + from codeflash.cli_cmds.init_java import init_java_project + + try: + init_java_project(non_interactive=True) + except SystemExit: + pass + + mock_should_modify.assert_not_called()