From 37eca6486e52a05a82e699629efebf81713416ed Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Thu, 9 Jan 2020 11:57:11 -0800 Subject: [PATCH] Make InteractiveRunner only used in @console_rule --- .../python/rules/python_test_runner.py | 11 ++++----- src/python/pants/engine/interactive_runner.py | 2 +- src/python/pants/rules/core/test.py | 23 +++++++++++-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/python/pants/backend/python/rules/python_test_runner.py b/src/python/pants/backend/python/rules/python_test_runner.py index 9a71b0171c6..2967265d594 100644 --- a/src/python/pants/backend/python/rules/python_test_runner.py +++ b/src/python/pants/backend/python/rules/python_test_runner.py @@ -15,7 +15,7 @@ from pants.build_graph.address import Address from pants.engine.addressable import BuildFileAddresses from pants.engine.fs import Digest, DirectoriesToMerge, FileContent, InputFilesContent -from pants.engine.interactive_runner import InteractiveProcessRequest, InteractiveRunner +from pants.engine.interactive_runner import InteractiveProcessRequest from pants.engine.isolated_process import ExecuteProcessRequest, FallibleExecuteProcessResult from pants.engine.legacy.graph import HydratedTargets, TransitiveHydratedTargets from pants.engine.legacy.structs import PythonTestsAdaptor @@ -23,7 +23,7 @@ from pants.engine.selectors import Get from pants.option.global_options import GlobalOptions from pants.rules.core.strip_source_root import SourceRootStrippedSources -from pants.rules.core.test import TestDebugResult, TestOptions, TestResult, TestTarget +from pants.rules.core.test import TestDebugRequest, TestOptions, TestResult, TestTarget DEFAULT_COVERAGE_CONFIG = dedent(f""" @@ -189,17 +189,14 @@ async def run_python_test( async def debug_python_test( test_target: PythonTestsAdaptor, test_setup: TestTargetSetup, - runner: InteractiveRunner -) -> TestDebugResult: +) -> TestDebugRequest: run_request = InteractiveProcessRequest( argv=(test_setup.requirements_pex.output_filename, *test_setup.args), run_in_workspace=False, input_files=test_setup.input_files_digest ) - - result = runner.run_local_interactive_process(run_request) - return TestDebugResult(result.process_exit_code) + return TestDebugRequest(run_request) def rules(): diff --git a/src/python/pants/engine/interactive_runner.py b/src/python/pants/engine/interactive_runner.py index 803c3cd7955..8de347290ae 100644 --- a/src/python/pants/engine/interactive_runner.py +++ b/src/python/pants/engine/interactive_runner.py @@ -33,7 +33,7 @@ def __post_init__(self): @dataclass(frozen=True) class InteractiveRunner: _scheduler: 'SchedulerSession' - uncacheable = False + uncacheable = True def run_local_interactive_process(self, request: InteractiveProcessRequest) -> InteractiveProcessResult: ExceptionSink.toggle_ignoring_sigint_v2_engine(True) diff --git a/src/python/pants/rules/core/test.py b/src/python/pants/rules/core/test.py index 680acbca907..4a19b3146fc 100644 --- a/src/python/pants/rules/core/test.py +++ b/src/python/pants/rules/core/test.py @@ -13,6 +13,7 @@ from pants.engine.console import Console from pants.engine.fs import Digest from pants.engine.goal import Goal, GoalSubsystem +from pants.engine.interactive_runner import InteractiveProcessRequest, InteractiveRunner from pants.engine.isolated_process import FallibleExecuteProcessResult from pants.engine.legacy.graph import HydratedTarget from pants.engine.objects import union @@ -54,8 +55,8 @@ def from_fallible_execute_process_result( @dataclass(frozen=True) -class TestDebugResult: - exit_code: int +class TestDebugRequest: + ipr: InteractiveProcessRequest @union @@ -119,17 +120,19 @@ def is_testable( @dataclass(frozen=True) -class AddressAndDebugResult: +class AddressAndDebugRequest: address: BuildFileAddress - test_result: TestDebugResult + request: TestDebugRequest @goal_rule -async def run_tests(console: Console, options: TestOptions, addresses: BuildFileAddresses) -> Test: +async def run_tests(console: Console, options: TestOptions, runner: InteractiveRunner, addresses: BuildFileAddresses) -> Test: if options.values.debug: address = await Get[BuildFileAddress](BuildFileAddresses, addresses) - result = await Get[AddressAndDebugResult](Address, address.to_address()) - return Test(result.test_result.exit_code) + addr_debug_request = await Get[AddressAndDebugRequest](Address, address.to_address()) + result = runner.run_local_interactive_process(addr_debug_request.request.ipr) + return Test(result.process_exit_code) + results = await MultiGet(Get[AddressAndTestResult](Address, addr.to_address()) for addr in addresses) did_any_fail = False filtered_results = [(x.address, x.test_result) for x in results if x.test_result is not None] @@ -186,10 +189,10 @@ async def coordinator_of_tests( @rule -async def coordinator_of_debug_tests(target: HydratedTarget) -> AddressAndDebugResult: +async def coordinator_of_debug_tests(target: HydratedTarget) -> AddressAndDebugRequest: logger.info(f"Starting tests in debug mode: {target.address.reference()}") - result = await Get[TestDebugResult](TestTarget, target.adaptor) - return AddressAndDebugResult(target.address, result) + request = await Get[TestDebugRequest](TestTarget, target.adaptor) + return AddressAndDebugRequest(target.address, request) def rules():