airbyte-internal-ops 0.4.1__py3-none-any.whl → 0.4.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {airbyte_internal_ops-0.4.1.dist-info → airbyte_internal_ops-0.4.2.dist-info}/METADATA +1 -1
- {airbyte_internal_ops-0.4.1.dist-info → airbyte_internal_ops-0.4.2.dist-info}/RECORD +7 -7
- airbyte_ops_mcp/cli/cloud.py +15 -3
- airbyte_ops_mcp/mcp/prerelease.py +1 -2
- airbyte_ops_mcp/regression_tests/ci_output.py +143 -67
- {airbyte_internal_ops-0.4.1.dist-info → airbyte_internal_ops-0.4.2.dist-info}/WHEEL +0 -0
- {airbyte_internal_ops-0.4.1.dist-info → airbyte_internal_ops-0.4.2.dist-info}/entry_points.txt +0 -0
|
@@ -353,7 +353,7 @@ airbyte_ops_mcp/cli/__init__.py,sha256=XpL7FyVfgabfBF2JR7u7NwJ2krlYqjd_OwLcWf-Xc
|
|
|
353
353
|
airbyte_ops_mcp/cli/_base.py,sha256=I8tWnyQf0ks4r3J8N8h-5GZxyn37T-55KsbuHnxYlcg,415
|
|
354
354
|
airbyte_ops_mcp/cli/_shared.py,sha256=jg-xMyGzTCGPqKd8VTfE_3kGPIyO_3Kx5sQbG4rPc0Y,1311
|
|
355
355
|
airbyte_ops_mcp/cli/app.py,sha256=SEdBpqFUG2O8zGV5ifwptxrLGFph_dLr66-MX9d69gQ,789
|
|
356
|
-
airbyte_ops_mcp/cli/cloud.py,sha256=
|
|
356
|
+
airbyte_ops_mcp/cli/cloud.py,sha256=7Iy8gpIM-Im5GMy2aShi3gE-BSPZABXPICnOyrZrJAw,44621
|
|
357
357
|
airbyte_ops_mcp/cli/gh.py,sha256=koJPu0MDB6AW7mJq2z4dZV65ofvsZTkqoeitGF8KJR8,5364
|
|
358
358
|
airbyte_ops_mcp/cli/registry.py,sha256=L4nDKhlegr31gSE-GUvDFSq10KgDz5kJuZXgLIxYIyg,9785
|
|
359
359
|
airbyte_ops_mcp/cli/repo.py,sha256=G1hoQpH0XYhUH3FFOsia9xabGB0LP9o3XcwBuqvFVo0,16331
|
|
@@ -379,7 +379,7 @@ airbyte_ops_mcp/mcp/gcp_logs.py,sha256=IPtq4098_LN1Cgeba4jATO1iYFFFpL2-aRO0pGcOd
|
|
|
379
379
|
airbyte_ops_mcp/mcp/github_actions.py,sha256=_mAVTl6UX3F7S_HeV1-M5R4jMNzNQGI3ADs3sBzden8,11760
|
|
380
380
|
airbyte_ops_mcp/mcp/github_repo_ops.py,sha256=PiERpt8abo20Gz4CfXhrDNlVM4o4FOt5sweZJND2a0s,5314
|
|
381
381
|
airbyte_ops_mcp/mcp/metadata.py,sha256=fwGW97WknR5lfKcQnFtK6dU87aA6TmLj1NkKyqDAV9g,270
|
|
382
|
-
airbyte_ops_mcp/mcp/prerelease.py,sha256=
|
|
382
|
+
airbyte_ops_mcp/mcp/prerelease.py,sha256=OoZxwy3-PAiTiKuWhhbfv_DrsHBDs9LVz4Y6EuL0Qkk,10596
|
|
383
383
|
airbyte_ops_mcp/mcp/prod_db_queries.py,sha256=VsiBBnVbOjc8lBb2Xr1lmcH3wu7QHQfjd4lORarEE1s,42700
|
|
384
384
|
airbyte_ops_mcp/mcp/prompts.py,sha256=mJld9mdPECXYZffWXGSvNs4Xevx3rxqUGNlzGKVC2_s,1599
|
|
385
385
|
airbyte_ops_mcp/mcp/registry.py,sha256=PW-VYUj42qx2pQ_apUkVaoUFq7VgB9zEU7-aGrkSCCw,290
|
|
@@ -396,7 +396,7 @@ airbyte_ops_mcp/registry/models.py,sha256=B4L4TKr52wo0xs0CqvCBrpowqjShzVnZ5eTr2-
|
|
|
396
396
|
airbyte_ops_mcp/registry/publish.py,sha256=VoPxsM2_0zJ829orzCRN-kjgcJtuBNyXgW4I9J680ro,12717
|
|
397
397
|
airbyte_ops_mcp/regression_tests/__init__.py,sha256=8pwJIdz1Lb9oFV6UQ3DSjYKd8HCSqU8RpH5SDgEcEBA,1038
|
|
398
398
|
airbyte_ops_mcp/regression_tests/cdk_secrets.py,sha256=iRjqqBS96KZoswfgT7ju-pE_pfbYoDy4PfrK-K8uyYs,3204
|
|
399
|
-
airbyte_ops_mcp/regression_tests/ci_output.py,sha256=
|
|
399
|
+
airbyte_ops_mcp/regression_tests/ci_output.py,sha256=DwBVCaCZAhI4MNf39EpUDIzOsHx5T1BZp268IAdaayg,15180
|
|
400
400
|
airbyte_ops_mcp/regression_tests/config.py,sha256=dwWeY0tatdbwl9BqbhZ7EljoZDCtKmGO5fvOAIxeXmA,5873
|
|
401
401
|
airbyte_ops_mcp/regression_tests/connection_fetcher.py,sha256=5wIiA0VvCFNEc-fr6Po18gZMX3E5fyPOGf2SuVOqv5U,12799
|
|
402
402
|
airbyte_ops_mcp/regression_tests/connection_secret_retriever.py,sha256=FhWNVWq7sON4nwUmVJv8BgXBOqg1YV4b5WuWyCzZ0LU,4695
|
|
@@ -414,7 +414,7 @@ airbyte_ops_mcp/regression_tests/regression/comparators.py,sha256=MJkLZEKHivgrG0
|
|
|
414
414
|
airbyte_ops_mcp/regression_tests/validation/__init__.py,sha256=MBEwGOoNuqT4_oCahtoK62OKWIjUCfWa7vZTxNj_0Ek,1532
|
|
415
415
|
airbyte_ops_mcp/regression_tests/validation/catalog_validators.py,sha256=jqqVAMOk0mtdPgwu4d0hA0ZEjtsNh5gapvGydRv3_qk,12553
|
|
416
416
|
airbyte_ops_mcp/regression_tests/validation/record_validators.py,sha256=RjauAhKWNwxMBTu0eNS2hMFNQVs5CLbQU51kp6FOVDk,7432
|
|
417
|
-
airbyte_internal_ops-0.4.
|
|
418
|
-
airbyte_internal_ops-0.4.
|
|
419
|
-
airbyte_internal_ops-0.4.
|
|
420
|
-
airbyte_internal_ops-0.4.
|
|
417
|
+
airbyte_internal_ops-0.4.2.dist-info/METADATA,sha256=RP-Eu-2phGMnspxD4d5rQBI9Q6jnU-Zr0Fdi8hrzpqY,5679
|
|
418
|
+
airbyte_internal_ops-0.4.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
419
|
+
airbyte_internal_ops-0.4.2.dist-info/entry_points.txt,sha256=WxP0l7bRFss4Cr5uQqVj9mTEKwnRKouNuphXQF0lotA,171
|
|
420
|
+
airbyte_internal_ops-0.4.2.dist-info/RECORD,,
|
airbyte_ops_mcp/cli/cloud.py
CHANGED
|
@@ -53,7 +53,7 @@ from airbyte_ops_mcp.mcp.cloud_connector_versions import (
|
|
|
53
53
|
from airbyte_ops_mcp.regression_tests.cdk_secrets import get_first_config_from_secrets
|
|
54
54
|
from airbyte_ops_mcp.regression_tests.ci_output import (
|
|
55
55
|
generate_regression_report,
|
|
56
|
-
|
|
56
|
+
generate_single_version_report,
|
|
57
57
|
write_github_output,
|
|
58
58
|
write_github_outputs,
|
|
59
59
|
write_github_summary,
|
|
@@ -988,6 +988,18 @@ def regression_test(
|
|
|
988
988
|
},
|
|
989
989
|
)
|
|
990
990
|
|
|
991
|
+
# Generate report.md with detailed metrics
|
|
992
|
+
report_path = generate_single_version_report(
|
|
993
|
+
connector_image=resolved_test_image,
|
|
994
|
+
command=command,
|
|
995
|
+
result=result,
|
|
996
|
+
output_dir=output_path,
|
|
997
|
+
)
|
|
998
|
+
print_success(f"Generated report: {report_path}")
|
|
999
|
+
|
|
1000
|
+
# Write report to GITHUB_STEP_SUMMARY (if env var exists)
|
|
1001
|
+
write_github_summary(report_path.read_text())
|
|
1002
|
+
|
|
991
1003
|
if result["success"]:
|
|
992
1004
|
print_success(
|
|
993
1005
|
f"Single-version regression test passed for {resolved_test_image}"
|
|
@@ -1059,8 +1071,8 @@ def regression_test(
|
|
|
1059
1071
|
)
|
|
1060
1072
|
print_success(f"Generated regression report: {report_path}")
|
|
1061
1073
|
|
|
1062
|
-
|
|
1063
|
-
write_github_summary(
|
|
1074
|
+
# Write report to GITHUB_STEP_SUMMARY (if env var exists)
|
|
1075
|
+
write_github_summary(report_path.read_text())
|
|
1064
1076
|
|
|
1065
1077
|
if regression_detected:
|
|
1066
1078
|
exit_with_error(
|
|
@@ -263,11 +263,10 @@ def publish_connector_to_airbyte_registry(
|
|
|
263
263
|
head_info = get_pr_head_ref(DEFAULT_REPO_OWNER, target_repo_name, pr_number, token)
|
|
264
264
|
|
|
265
265
|
# Prepare workflow inputs
|
|
266
|
-
# The workflow uses refs/pull/{pr}/head directly - no gitref needed
|
|
267
|
-
# Note: The workflow auto-detects modified connectors from the PR
|
|
268
266
|
workflow_inputs = {
|
|
269
267
|
"repo": f"{DEFAULT_REPO_OWNER}/{target_repo_name}",
|
|
270
268
|
"pr": str(pr_number),
|
|
269
|
+
"connector": connector_name,
|
|
271
270
|
}
|
|
272
271
|
|
|
273
272
|
# Trigger the workflow on the default branch
|
|
@@ -171,7 +171,7 @@ def _get_github_artifacts_url() -> str | None:
|
|
|
171
171
|
return f"{run_url}#artifacts"
|
|
172
172
|
|
|
173
173
|
|
|
174
|
-
def
|
|
174
|
+
def generate_action_test_comparison_report(
|
|
175
175
|
target_image: str,
|
|
176
176
|
control_image: str,
|
|
177
177
|
command: str,
|
|
@@ -179,16 +179,17 @@ def generate_regression_report(
|
|
|
179
179
|
control_result: dict[str, Any],
|
|
180
180
|
output_dir: Path,
|
|
181
181
|
) -> Path:
|
|
182
|
-
"""Generate a markdown
|
|
182
|
+
"""Generate a markdown comparison report for a single action (command).
|
|
183
183
|
|
|
184
184
|
This creates a comprehensive report with context, message counts comparison,
|
|
185
|
-
and record counts per stream (for read commands). The
|
|
186
|
-
|
|
185
|
+
and record counts per stream (for read commands). The report starts with an
|
|
186
|
+
L2 header containing the command name, making it easy to consolidate multiple
|
|
187
|
+
command reports into a single document.
|
|
187
188
|
|
|
188
189
|
Args:
|
|
189
190
|
target_image: The target (new version) connector image.
|
|
190
191
|
control_image: The control (baseline version) connector image.
|
|
191
|
-
command: The Airbyte command that was run.
|
|
192
|
+
command: The Airbyte command that was run (e.g., "spec", "check", "discover", "read").
|
|
192
193
|
target_result: Results dict from running target connector.
|
|
193
194
|
control_result: Results dict from running control connector.
|
|
194
195
|
output_dir: Directory to write the report to.
|
|
@@ -204,51 +205,22 @@ def generate_regression_report(
|
|
|
204
205
|
target_record_counts = target_result.get("record_counts_per_stream", {})
|
|
205
206
|
control_record_counts = control_result.get("record_counts_per_stream", {})
|
|
206
207
|
|
|
207
|
-
|
|
208
|
-
artifact_name = (
|
|
209
|
-
f"regression-test-artifacts-{run_id}" if run_id else "regression-test-artifacts"
|
|
210
|
-
)
|
|
211
|
-
|
|
208
|
+
# Extract version tags for the summary table
|
|
212
209
|
target_version = (
|
|
213
210
|
target_image.rsplit(":", 1)[-1] if ":" in target_image else "unknown"
|
|
214
211
|
)
|
|
215
212
|
control_version = (
|
|
216
213
|
control_image.rsplit(":", 1)[-1] if ":" in control_image else "unknown"
|
|
217
214
|
)
|
|
218
|
-
connector_name = (
|
|
219
|
-
target_image.rsplit(":", 1)[0] if ":" in target_image else target_image
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
run_url = _get_github_run_url()
|
|
223
|
-
artifacts_url = _get_github_artifacts_url()
|
|
224
215
|
|
|
216
|
+
# Start with L2 header containing the command name (no L1 header)
|
|
217
|
+
# This allows multiple command reports to be concatenated into a single document
|
|
218
|
+
# Note: Context block (connector, versions, workflow links) is added at the workflow level
|
|
225
219
|
lines: list[str] = [
|
|
226
|
-
"
|
|
227
|
-
"",
|
|
228
|
-
"## Context",
|
|
220
|
+
f"## `{command.upper()}` Test Results",
|
|
229
221
|
"",
|
|
230
|
-
f"- **Test Date:** {datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}",
|
|
231
|
-
f"- **Connector:** `{connector_name}`",
|
|
232
|
-
f"- **Control Version:** `{control_version}`",
|
|
233
|
-
f"- **Target Version:** `{target_version}`",
|
|
234
|
-
f"- **Command:** `{command.upper()}`",
|
|
235
222
|
]
|
|
236
223
|
|
|
237
|
-
if run_url:
|
|
238
|
-
lines.append(f"- **Workflow Run:** [View Execution]({run_url})")
|
|
239
|
-
if artifacts_url:
|
|
240
|
-
lines.append(f"- **Artifacts:** [Download `{artifact_name}`]({artifacts_url})")
|
|
241
|
-
else:
|
|
242
|
-
lines.append(f"- **Artifacts:** `{artifact_name}`")
|
|
243
|
-
|
|
244
|
-
lines.extend(
|
|
245
|
-
[
|
|
246
|
-
"",
|
|
247
|
-
"## Summary",
|
|
248
|
-
"",
|
|
249
|
-
]
|
|
250
|
-
)
|
|
251
|
-
|
|
252
224
|
if regression_detected:
|
|
253
225
|
if target_result["success"] and not control_result["success"]:
|
|
254
226
|
lines.append("**Result:** Target succeeded, control failed (improvement)")
|
|
@@ -261,20 +233,24 @@ def generate_regression_report(
|
|
|
261
233
|
else:
|
|
262
234
|
lines.append("**Result:** Both versions failed")
|
|
263
235
|
|
|
236
|
+
# Use emojis for better scanability
|
|
237
|
+
control_emoji = "✅" if control_result["success"] else "❌"
|
|
238
|
+
target_emoji = "✅" if target_result["success"] else "❌"
|
|
239
|
+
|
|
264
240
|
lines.extend(
|
|
265
241
|
[
|
|
266
242
|
"",
|
|
267
|
-
"| Version | Exit Code |
|
|
268
|
-
"
|
|
269
|
-
f"| Control ({control_version}) | {control_result['exit_code']} | {
|
|
270
|
-
f"| Target ({target_version}) | {target_result['exit_code']} | {
|
|
243
|
+
"| Version | Exit Code | Result |",
|
|
244
|
+
"|---------|-----------|--------|",
|
|
245
|
+
f"| Control (`{control_version}`) | {control_result['exit_code']} | {control_emoji} |",
|
|
246
|
+
f"| Target (`{target_version}`) | {target_result['exit_code']} | {target_emoji} |",
|
|
271
247
|
"",
|
|
272
248
|
]
|
|
273
249
|
)
|
|
274
250
|
|
|
275
251
|
lines.extend(
|
|
276
252
|
[
|
|
277
|
-
"
|
|
253
|
+
"### Command Execution Metrics",
|
|
278
254
|
"",
|
|
279
255
|
]
|
|
280
256
|
)
|
|
@@ -282,7 +258,7 @@ def generate_regression_report(
|
|
|
282
258
|
if target_counts or control_counts:
|
|
283
259
|
lines.extend(
|
|
284
260
|
[
|
|
285
|
-
"
|
|
261
|
+
"#### Message Types",
|
|
286
262
|
"",
|
|
287
263
|
"| Type | Control | Target | Delta |",
|
|
288
264
|
"|------|---------|--------|-------|",
|
|
@@ -294,14 +270,14 @@ def generate_regression_report(
|
|
|
294
270
|
target_count = target_counts.get(msg_type, 0)
|
|
295
271
|
delta = target_count - control_count
|
|
296
272
|
lines.append(
|
|
297
|
-
f"| {msg_type} | {control_count} | {target_count} | {_format_delta(delta)} |"
|
|
273
|
+
f"| `{msg_type}` | {control_count} | {target_count} | {_format_delta(delta)} |"
|
|
298
274
|
)
|
|
299
275
|
lines.append("")
|
|
300
276
|
|
|
301
277
|
if target_record_counts or control_record_counts:
|
|
302
278
|
lines.extend(
|
|
303
279
|
[
|
|
304
|
-
"
|
|
280
|
+
"#### Record Count per Stream",
|
|
305
281
|
"",
|
|
306
282
|
"| Stream | Control | Target | Delta |",
|
|
307
283
|
"|--------|---------|--------|-------|",
|
|
@@ -330,7 +306,7 @@ def generate_regression_report(
|
|
|
330
306
|
if control_http or target_http:
|
|
331
307
|
lines.extend(
|
|
332
308
|
[
|
|
333
|
-
"
|
|
309
|
+
"#### HTTP Metrics",
|
|
334
310
|
"",
|
|
335
311
|
"| Version | Flow Count | Duplicate Flows |",
|
|
336
312
|
"|---------|------------|-----------------|",
|
|
@@ -340,25 +316,130 @@ def generate_regression_report(
|
|
|
340
316
|
]
|
|
341
317
|
)
|
|
342
318
|
|
|
319
|
+
# Note: Execution Details section removed as redundant with Summary table
|
|
320
|
+
|
|
321
|
+
report_content = "\n".join(lines)
|
|
322
|
+
report_path = output_dir / "report.md"
|
|
323
|
+
report_path.write_text(report_content)
|
|
324
|
+
|
|
325
|
+
return report_path
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
# Backwards-compatible alias for the old function name
|
|
329
|
+
generate_regression_report = generate_action_test_comparison_report
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def generate_single_version_report(
|
|
333
|
+
connector_image: str,
|
|
334
|
+
command: str,
|
|
335
|
+
result: dict[str, Any],
|
|
336
|
+
output_dir: Path,
|
|
337
|
+
) -> Path:
|
|
338
|
+
"""Generate a markdown report for a single-version regression test.
|
|
339
|
+
|
|
340
|
+
This creates a report with message counts and record counts per stream for a single
|
|
341
|
+
connector run. The report starts with an L2 header containing the command name,
|
|
342
|
+
making it easy to consolidate multiple command reports.
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
connector_image: The connector image that was tested.
|
|
346
|
+
command: The Airbyte command that was run (e.g., "spec", "check", "discover", "read").
|
|
347
|
+
result: Results dict from running the connector.
|
|
348
|
+
output_dir: Directory to write the report to.
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
Path to the generated report.md file.
|
|
352
|
+
"""
|
|
353
|
+
message_counts = result.get("message_counts", {})
|
|
354
|
+
record_counts = result.get("record_counts_per_stream", {})
|
|
355
|
+
|
|
356
|
+
run_id = os.getenv("GITHUB_RUN_ID", "")
|
|
357
|
+
artifact_name = (
|
|
358
|
+
f"regression-test-artifacts-{command}-{run_id}"
|
|
359
|
+
if run_id
|
|
360
|
+
else f"regression-test-artifacts-{command}"
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
version = (
|
|
364
|
+
connector_image.rsplit(":", 1)[-1] if ":" in connector_image else "unknown"
|
|
365
|
+
)
|
|
366
|
+
connector_name = (
|
|
367
|
+
connector_image.rsplit(":", 1)[0] if ":" in connector_image else connector_image
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
run_url = _get_github_run_url()
|
|
371
|
+
artifacts_url = _get_github_artifacts_url()
|
|
372
|
+
|
|
373
|
+
# Start with L2 header containing the command name (no L1 header)
|
|
374
|
+
lines: list[str] = [
|
|
375
|
+
f"## `{command.upper()}` Test Results",
|
|
376
|
+
"",
|
|
377
|
+
"### Context",
|
|
378
|
+
"",
|
|
379
|
+
f"- **Test Date:** {datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}",
|
|
380
|
+
f"- **Connector:** `{connector_name}`",
|
|
381
|
+
f"- **Version:** `{version}`",
|
|
382
|
+
f"- **Command:** `{command.upper()}`",
|
|
383
|
+
]
|
|
384
|
+
|
|
385
|
+
if run_url:
|
|
386
|
+
lines.append(f"- **Workflow Run:** [View Execution]({run_url})")
|
|
387
|
+
if artifacts_url:
|
|
388
|
+
lines.append(f"- **Artifacts:** [Download `{artifact_name}`]({artifacts_url})")
|
|
389
|
+
else:
|
|
390
|
+
lines.append(f"- **Artifacts:** `{artifact_name}`")
|
|
391
|
+
|
|
343
392
|
lines.extend(
|
|
344
393
|
[
|
|
345
|
-
"## Execution Details",
|
|
346
394
|
"",
|
|
347
|
-
"###
|
|
395
|
+
"### Summary",
|
|
396
|
+
"",
|
|
397
|
+
f"**Result:** {'PASS' if result['success'] else 'FAIL'}",
|
|
348
398
|
"",
|
|
349
|
-
f"- **
|
|
350
|
-
f"- **
|
|
351
|
-
f"- **Success:** {control_result['success']}",
|
|
352
|
-
f"- **Stdout:** `{control_result.get('stdout_file', 'N/A')}`",
|
|
353
|
-
f"- **Stderr:** `{control_result.get('stderr_file', 'N/A')}`",
|
|
399
|
+
f"- **Exit Code:** {result['exit_code']}",
|
|
400
|
+
f"- **Success:** {result['success']}",
|
|
354
401
|
"",
|
|
355
|
-
|
|
402
|
+
]
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
if message_counts:
|
|
406
|
+
lines.extend(
|
|
407
|
+
[
|
|
408
|
+
"### Message Types",
|
|
409
|
+
"",
|
|
410
|
+
"| Type | Count |",
|
|
411
|
+
"|------|-------|",
|
|
412
|
+
]
|
|
413
|
+
)
|
|
414
|
+
for msg_type in sorted(message_counts.keys()):
|
|
415
|
+
count = message_counts[msg_type]
|
|
416
|
+
lines.append(f"| `{msg_type}` | {count} |")
|
|
417
|
+
lines.append("")
|
|
418
|
+
|
|
419
|
+
if record_counts:
|
|
420
|
+
lines.extend(
|
|
421
|
+
[
|
|
422
|
+
"### Record Count per Stream",
|
|
423
|
+
"",
|
|
424
|
+
"| Stream | Count |",
|
|
425
|
+
"|--------|-------|",
|
|
426
|
+
]
|
|
427
|
+
)
|
|
428
|
+
total = 0
|
|
429
|
+
for stream in sorted(record_counts.keys()):
|
|
430
|
+
count = record_counts[stream]
|
|
431
|
+
total += count
|
|
432
|
+
lines.append(f"| {stream} | {count} |")
|
|
433
|
+
lines.append(f"| **Total** | **{total}** |")
|
|
434
|
+
lines.append("")
|
|
435
|
+
|
|
436
|
+
lines.extend(
|
|
437
|
+
[
|
|
438
|
+
"### Execution Details",
|
|
356
439
|
"",
|
|
357
|
-
f"- **Image:** `{
|
|
358
|
-
f"- **
|
|
359
|
-
f"- **
|
|
360
|
-
f"- **Stdout:** `{target_result.get('stdout_file', 'N/A')}`",
|
|
361
|
-
f"- **Stderr:** `{target_result.get('stderr_file', 'N/A')}`",
|
|
440
|
+
f"- **Image:** `{connector_image}`",
|
|
441
|
+
f"- **Stdout:** `{result.get('stdout_file', 'N/A')}`",
|
|
442
|
+
f"- **Stderr:** `{result.get('stderr_file', 'N/A')}`",
|
|
362
443
|
"",
|
|
363
444
|
]
|
|
364
445
|
)
|
|
@@ -373,9 +454,6 @@ def generate_regression_report(
|
|
|
373
454
|
def get_report_summary(report_path: Path) -> str:
|
|
374
455
|
"""Get a brief summary pointing to the full report.
|
|
375
456
|
|
|
376
|
-
Args:
|
|
377
|
-
report_path: Path to the full report.md file.
|
|
378
|
-
|
|
379
457
|
Returns:
|
|
380
458
|
Brief markdown summary for GITHUB_STEP_SUMMARY.
|
|
381
459
|
"""
|
|
@@ -393,7 +471,5 @@ def get_report_summary(report_path: Path) -> str:
|
|
|
393
471
|
|
|
394
472
|
return f"""## Regression Test Report
|
|
395
473
|
|
|
396
|
-
Full report available in
|
|
397
|
-
|
|
398
|
-
See the Checks tab for the complete report with message counts and execution details.
|
|
474
|
+
Full report available in artifact {artifact_link}.
|
|
399
475
|
"""
|
|
File without changes
|
{airbyte_internal_ops-0.4.1.dist-info → airbyte_internal_ops-0.4.2.dist-info}/entry_points.txt
RENAMED
|
File without changes
|