Skip to content

Commit b20b169

Browse files
refactor: remove returncode/stderr properties from EntrypointOutput
- Remove completed_process parameter from constructor as requested - Add @classmethod from_completed_process() factory method - Remove returncode and stderr properties as they are not needed - Update callers to use EntrypointOutput.errors for failure detection - Addresses GitHub PR feedback from @aaronsteers Co-Authored-By: AJ Steers <[email protected]>
1 parent 23ac759 commit b20b169

File tree

3 files changed

+24
-29
lines changed

3 files changed

+24
-29
lines changed

airbyte_cdk/test/entrypoint_wrapper.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ def __init__(
6969
uncaught_exception: Optional[BaseException] = None,
7070
*,
7171
message_file: Path | None = None,
72-
completed_process: Optional[subprocess.CompletedProcess[str]] = None,
7372
) -> None:
7473
if messages is None and message_file is None:
7574
raise ValueError("Either messages or message_file must be provided")
@@ -78,7 +77,7 @@ def __init__(
7877

7978
self._messages: list[AirbyteMessage] | None = None
8079
self._message_file: Path | None = message_file
81-
self._completed_process: Optional[subprocess.CompletedProcess[str]] = completed_process
80+
self._completed_process: Optional[subprocess.CompletedProcess[str]] = None
8281
if messages:
8382
try:
8483
self._messages = [self._parse_message(message) for message in messages]
@@ -294,15 +293,17 @@ def is_not_in_logs(self, pattern: str) -> bool:
294293
"""Check if no log message matches the case-insensitive pattern."""
295294
return not self.is_in_logs(pattern)
296295

297-
@property
298-
def returncode(self) -> int | None:
299-
"""Return the exit code of the process, if available."""
300-
return self._completed_process.returncode if self._completed_process else None
301-
302-
@property
303-
def stderr(self) -> str | None:
304-
"""Return the stderr output of the process, if available."""
305-
return self._completed_process.stderr if self._completed_process else None
296+
@classmethod
297+
def from_completed_process(
298+
cls,
299+
completed_process: subprocess.CompletedProcess[str],
300+
*,
301+
message_file: Path | None = None,
302+
) -> "EntrypointOutput":
303+
"""Create EntrypointOutput from a completed subprocess with optional message file."""
304+
instance = cls(message_file=message_file)
305+
instance._completed_process = completed_process
306+
return instance
306307

307308

308309
def _run_command(

airbyte_cdk/test/standard_tests/docker_base.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -374,22 +374,18 @@ def test_docker_image_build_and_read(
374374
capture_stderr=True,
375375
capture_stdout=True,
376376
)
377-
if read_result.returncode != 0:
378-
error_messages = (
379-
[
380-
f"Error message: {error.trace.error.message}"
381-
for error in read_result.errors
382-
if error.trace and error.trace.error
383-
]
384-
if read_result.errors
385-
else ["No error messages found"]
386-
)
377+
if read_result.errors:
378+
error_messages = [
379+
f"Error message: {error.trace.error.message}"
380+
for error in read_result.errors
381+
if error.trace and error.trace.error
382+
]
383+
if not error_messages:
384+
error_messages = ["No structured error messages found"]
385+
387386
raise AssertionError(
388387
f"Failed to run `read` command in docker image {connector_image!r}. "
389388
"\n-----------------"
390-
f"EXIT CODE: {read_result.returncode}\n"
391-
"STDERR:\n"
392-
f"{read_result.stderr}\n"
393389
"ERROR MESSAGES:\n"
394390
f"{chr(10).join(error_messages)}\n"
395391
"\n-----------------"

airbyte_cdk/utils/docker.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,9 @@ def run_docker_command(
436436

437437
stdout_temp_file.close()
438438

439-
return EntrypointOutput(
439+
return EntrypointOutput.from_completed_process(
440+
completed_process,
440441
message_file=stdout_path,
441-
completed_process=completed_process,
442442
)
443443

444444

@@ -485,9 +485,7 @@ def verify_connector_image(
485485
logger.error("No spec messages found in output.")
486486
return False
487487
except subprocess.CalledProcessError as e:
488-
logger.error(
489-
f"Image verification failed: {result.stderr if 'result' in locals() else e.stderr}"
490-
)
488+
logger.error(f"Image verification failed: {e.stderr}")
491489
return False
492490

493491
return True

0 commit comments

Comments
 (0)