From efbf36f637376e9abbf3a8a6658fa52c97498732 Mon Sep 17 00:00:00 2001 From: GalaxyGamingFR <153150716+GalaxyGamingFR@users.noreply.github.com> Date: Sun, 11 Oct 2026 02:35:59 -0700 Subject: [PATCH] fix(tools): make stubgen debt links resolve from docs/dev stubgen emitted TechnicalDebt links as repo-relative paths, but TechnicalDebt.md lives in docs/dev and the conventions checker resolves links relative to it, so pasted lines failed CI. The derived default path now carries a ../../ prefix; an explicit --td-path is used as given. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01V9UU71SP1UKGR51Sowbgmq --- CMakeLists.txt | 2 ++ tools/stubgen.py | 4 ++-- tools/tests/test_stubgen.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 tools/tests/test_stubgen.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 55fc3887e..5cb4fb85c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,8 @@ if(BUILD_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_test_registration.py) add_test(NAME check_skips COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_check_skips.py) + add_test(NAME stubgen COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/tools/tests/test_stubgen.py) add_test(NAME hardware_oracle COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/hw-oracle/test_hw_oracle.py) add_test(NAME pr_overlap_exports COMMAND ${Python3_EXECUTABLE} diff --git a/tools/stubgen.py b/tools/stubgen.py index 2dca532f4..5a3f47480 100644 --- a/tools/stubgen.py +++ b/tools/stubgen.py @@ -104,7 +104,7 @@ def _default_td_path(module): def td_target(module, td_path, td_lib): if td_path is None: - td_path = _default_td_path(module) + td_path = "../../" + _default_td_path(module) if td_lib is None: td_lib = module return (td_path, td_lib) @@ -173,7 +173,7 @@ def main(argv=None): ap.add_argument("--nids", required=True, help="path to missing-NIDs file, one 11-char NID per line") ap.add_argument("--db", required=False, default=None, help="path to NID name CSV, NID name per line like aerolib.csv") ap.add_argument("--out", required=False, default=None, help="output file for code, default stdout") - ap.add_argument("--td-path", required=False, default=None, help="override file path used inside TechnicalDebt lines, default derived from module") + ap.add_argument("--td-path", required=False, default=None, help="override file path used inside TechnicalDebt lines, default derived from module, relative to docs/dev") ap.add_argument("--td-lib", required=False, default=None, help="override lib label used inside TechnicalDebt lines, default derived from module") ap.add_argument("--td-out", required=False, default=None, help="output file for TechnicalDebt lines, default stdout") ap.add_argument("--td-only", action="store_true", help="print only TechnicalDebt lines, no code") diff --git a/tools/tests/test_stubgen.py b/tools/tests/test_stubgen.py new file mode 100644 index 000000000..1ee9c7a47 --- /dev/null +++ b/tools/tests/test_stubgen.py @@ -0,0 +1,29 @@ +from pathlib import Path +import sys +import unittest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +import check_conventions +import stubgen + + +class StubgenTests(unittest.TestCase): + def test_default_debt_link_resolves_from_docs_dev(self): + _, td = stubgen.generate("libkernel", ["AC1FtjqMCL0"], {}) + found = check_conventions.links("docs/dev/TechnicalDebt.md", td.strip()) + self.assertTrue(found) + for item in found: + self.assertEqual(item[1], "core/libs/prx/libkernel/Unimplemented.cpp") + + def test_explicit_td_path_is_verbatim(self): + _, td = stubgen.generate("libkernel", ["AC1FtjqMCL0"], {}, td_path="x/y.cpp") + self.assertIn("(x/y.cpp)", td) + + def test_code_still_generated(self): + code, _ = stubgen.generate("libkernel", ["AC1FtjqMCL0"], {}) + self.assertIn("APS5_VABI", code) + self.assertIn("NotImplemented_nid_no_patch", code) + + +if __name__ == "__main__": + unittest.main()