Skip to content

Commit a0fbdfd

Browse files
authored
Merge pull request #25056 from abpframework/fix/update-dependency-changes-script
improve: preserve doc preamble and normalize `-preview` version in `update_dependency_changes` script
2 parents 80bd4dc + fb23d80 commit a0fbdfd

File tree

2 files changed

+103
-5
lines changed

2 files changed

+103
-5
lines changed

.github/scripts/test_update_dependency_changes.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import os
1515
sys.path.insert(0, os.path.dirname(__file__))
1616

17-
from update_dependency_changes import merge_changes, render_section
17+
from update_dependency_changes import merge_changes, render_section, normalize_version, extract_preamble
1818

1919

2020
def test_update_then_revert():
@@ -367,12 +367,83 @@ def test_document_format():
367367
print("-" * 60 + "\n")
368368

369369

370+
def test_extract_preamble_with_seo_block():
371+
"""Test: content with a JSON SEO block before the heading."""
372+
print("Test 17: extract_preamble - preamble before heading")
373+
content = (
374+
"```json\n"
375+
"//[doc-seo]\n"
376+
"{\n"
377+
' "Description": "Some description."\n'
378+
"}\n"
379+
"```\n"
380+
"\n"
381+
"# Package Version Changes\n"
382+
"\n"
383+
"## 10.1.0-rc.1\n"
384+
)
385+
result = extract_preamble(content)
386+
assert result == "```json\n//[doc-seo]\n{\n \"Description\": \"Some description.\"\n}\n```\n\n", \
387+
f"Unexpected preamble: {repr(result)}"
388+
print("✓ Passed: preamble correctly extracted\n")
389+
390+
391+
def test_extract_preamble_no_preamble():
392+
"""Test: heading at the very start — preamble should be empty string."""
393+
print("Test 18: extract_preamble - no preamble before heading")
394+
content = "# Package Version Changes\n\n## 10.1.0-rc.1\n"
395+
result = extract_preamble(content)
396+
assert result == "", f"Expected empty string, got: {repr(result)}"
397+
print("✓ Passed: empty preamble returned when heading is at start\n")
398+
399+
400+
def test_extract_preamble_no_heading():
401+
"""Test: no matching heading — returns empty string."""
402+
print("Test 19: extract_preamble - no matching heading")
403+
content = "Some random content without the expected heading.\n"
404+
result = extract_preamble(content)
405+
assert result == "", f"Expected empty string, got: {repr(result)}"
406+
print("✓ Passed: empty string returned when heading is absent\n")
407+
408+
409+
def test_normalize_version_preview():
410+
"""Test: preview suffix is normalized to rc.1."""
411+
print("Test 20: normalize_version - preview -> rc.1")
412+
assert normalize_version("10.1.0-preview") == "10.1.0-rc.1", \
413+
f"Expected '10.1.0-rc.1', got: {normalize_version('10.1.0-preview')}"
414+
assert normalize_version("10.2.0-preview") == "10.2.0-rc.1", \
415+
f"Expected '10.2.0-rc.1', got: {normalize_version('10.2.0-preview')}"
416+
print("✓ Passed: preview correctly normalized to rc.1\n")
417+
418+
419+
def test_normalize_version_rc():
420+
"""Test: rc.N versions are unchanged."""
421+
print("Test 21: normalize_version - rc.N unchanged")
422+
assert normalize_version("10.1.0-rc.1") == "10.1.0-rc.1", \
423+
f"Expected '10.1.0-rc.1', got: {normalize_version('10.1.0-rc.1')}"
424+
assert normalize_version("10.2.0-rc.1") == "10.2.0-rc.1", \
425+
f"Expected '10.2.0-rc.1', got: {normalize_version('10.2.0-rc.1')}"
426+
assert normalize_version("10.2.0-rc.2") == "10.2.0-rc.2", \
427+
f"Expected '10.2.0-rc.2', got: {normalize_version('10.2.0-rc.2')}"
428+
print("✓ Passed: rc.N versions unchanged\n")
429+
430+
431+
def test_normalize_version_stable():
432+
"""Test: stable versions are unchanged."""
433+
print("Test 22: normalize_version - stable unchanged")
434+
assert normalize_version("10.1.0") == "10.1.0", \
435+
f"Expected '10.1.0', got: {normalize_version('10.1.0')}"
436+
assert normalize_version("10.2.0") == "10.2.0", \
437+
f"Expected '10.2.0', got: {normalize_version('10.2.0')}"
438+
print("✓ Passed: stable versions unchanged\n")
439+
440+
370441
def run_all_tests():
371442
"""Run all test cases."""
372443
print("=" * 70)
373444
print("Testing update_dependency_changes.py")
374445
print("=" * 70 + "\n")
375-
446+
376447
test_update_then_revert()
377448
test_add_then_remove_same_version()
378449
test_remove_then_add_same_version()
@@ -389,16 +460,24 @@ def run_all_tests():
389460
test_add_add()
390461
test_complex_chain_ending_in_original()
391462
test_document_format()
392-
463+
test_extract_preamble_with_seo_block()
464+
test_extract_preamble_no_preamble()
465+
test_extract_preamble_no_heading()
466+
test_normalize_version_preview()
467+
test_normalize_version_rc()
468+
test_normalize_version_stable()
469+
393470
print("=" * 70)
394-
print("All 16 tests passed! ✓")
471+
print("All 22 tests passed! ✓")
395472
print("=" * 70)
396473
print("\nTest coverage summary:")
397474
print(" ✓ Basic scenarios (update, add, remove)")
398475
print(" ✓ Version revert handling")
399476
print(" ✓ Complex multi-step sequences")
400477
print(" ✓ Edge cases and duplicates")
401478
print(" ✓ Document format validation")
479+
print(" ✓ Preamble extraction (SEO block, no preamble, no heading)")
480+
print(" ✓ Version normalization (preview -> rc.1)")
402481
print("=" * 70)
403482

404483

.github/scripts/update_dependency_changes.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99
DOC_PATH = os.environ.get("DOC_PATH", "docs/en/package-version-changes.md")
1010

1111

12+
def extract_preamble(content):
13+
"""Extract content before the '# Package Version Changes' heading."""
14+
header_pattern = re.compile(r"^# Package Version Changes\s*$", re.MULTILINE)
15+
match = header_pattern.search(content)
16+
if match:
17+
return content[: match.start()]
18+
return ""
19+
20+
21+
def normalize_version(version):
22+
"""Normalize version string: replace -preview suffix with -rc.1."""
23+
if version and version.endswith("-preview"):
24+
return version[: -len("-preview")] + "-rc.1"
25+
return version
26+
27+
1228
def get_version():
1329
"""Read the current version from common.props."""
1430
try:
@@ -275,7 +291,7 @@ def main():
275291

276292
pr_number = f"#{pr_arg}"
277293

278-
version = get_version()
294+
version = normalize_version(get_version())
279295
if not version:
280296
print("Could not read version from common.props.")
281297
sys.exit(1)
@@ -297,6 +313,7 @@ def main():
297313

298314
# Load existing document from the base branch
299315
existing_content = get_existing_doc_from_base(base_ref)
316+
preamble = extract_preamble(existing_content) if existing_content else ""
300317
sections = parse_document(existing_content) if existing_content else []
301318

302319
# Find existing section for this version
@@ -320,6 +337,8 @@ def main():
320337
if doc_dir:
321338
os.makedirs(doc_dir, exist_ok=True)
322339
with open(DOC_PATH, "w") as f:
340+
if preamble:
341+
f.write(preamble)
323342
f.write(HEADER + "\n")
324343
for _, text in sections:
325344
f.write(text.rstrip("\n") + "\n\n")

0 commit comments

Comments
 (0)