diff --git a/.generator/cli.py b/.generator/cli.py index 20d3daab3ee9..0fd97d11c6fe 100644 --- a/.generator/cli.py +++ b/.generator/cli.py @@ -59,7 +59,7 @@ def _determine_bazel_rule(api_path): str: The discovered Bazel rule. Raises: - Exception: If the subprocess call fails or returns an empty result. + ValueError: If the subprocess call fails or returns an empty result. """ logger.info(f"Determining Bazel rule for api_path: '{api_path}'") try: @@ -82,6 +82,30 @@ def _determine_bazel_rule(api_path): raise ValueError(f"Bazelisk query `{query}` failed") from e +def _build_bazel_target(bazel_rule): + """Executes `bazelisk build` on a given Bazel rule. + + Args: + bazel_rule (str): The Bazel rule to build. + + Raises: + ValueError: If the subprocess call fails. + """ + logger.info(f"Executing build for rule: {bazel_rule}") + try: + command = ["bazelisk", "build", bazel_rule] + subprocess.run( + command, + cwd=f"{SOURCE_DIR}/googleapis", + capture_output=True, + text=True, + check=True, + ) + logger.info(f"Bazel build for {bazel_rule} rule completed successfully.") + except Exception as e: + raise ValueError(f"Bazel build for {bazel_rule} rule failed.") from e + + def handle_generate(): """The main coordinator for the code generation process. @@ -104,6 +128,7 @@ def handle_generate(): api_path = api.get("path") if api_path: bazel_rule = _determine_bazel_rule(api_path) + _build_bazel_target(bazel_rule) logger.info(json.dumps(request_data, indent=2)) except Exception as e: diff --git a/.generator/test_cli.py b/.generator/test_cli.py index 096ce8e67f87..a5cd14604c04 100644 --- a/.generator/test_cli.py +++ b/.generator/test_cli.py @@ -23,6 +23,7 @@ from cli import ( _read_json_file, _determine_bazel_rule, + _build_bazel_target, handle_generate, handle_build, handle_configure, @@ -78,6 +79,29 @@ def test_determine_bazel_rule_success(mocker, caplog): assert "Found Bazel rule" in caplog.text +def test_build_bazel_target_success(mocker, caplog): + """ + Tests that the build helper logs success when the command runs correctly. + """ + caplog.set_level(logging.INFO) + mocker.patch("cli.subprocess.run", return_value=MagicMock(returncode=0)) + _build_bazel_target("mock/bazel:rule") + assert "Bazel build for mock/bazel:rule rule completed successfully" in caplog.text + + +def test_build_bazel_target_fails(mocker, caplog): + """ + Tests that ValueError is raised if the subprocess command fails. + """ + caplog.set_level(logging.ERROR) + mocker.patch( + "cli.subprocess.run", + side_effect=subprocess.CalledProcessError(1, "cmd", stderr="Build failed"), + ) + with pytest.raises(ValueError): + _build_bazel_target("mock/bazel:rule") + + def test_determine_bazel_rule_command_fails(mocker, caplog): """ Tests that an exception is raised if the subprocess command fails. @@ -103,6 +127,7 @@ def test_handle_generate_success(caplog, mock_generate_request_file, mocker): mock_determine_rule = mocker.patch( "cli._determine_bazel_rule", return_value="mock-rule" ) + mock_build_target = mocker.patch("cli._build_bazel_target") handle_generate()