diff --git a/tests/test_crawler.py b/tests/test_crawler.py index fbed8fc..fc85340 100644 --- a/tests/test_crawler.py +++ b/tests/test_crawler.py @@ -8,6 +8,8 @@ - The _iter_files exclude logic — specifically the bug where absolute path components (e.g. the parent dir being named "build") would cause all files to be silently skipped. + - _detect_java_version — regression for the missing Spring Boot + property: previously only maven.compiler.source/target/release were matched. - crawl() end-to-end on a minimal temp repo. All tests use stdlib only (tempfile, pathlib, unittest). @@ -17,6 +19,7 @@ from pathlib import Path from tools.skill_generator.crawler import ( + _detect_java_version, _extract_properties_prefixes, _extract_yaml_prefixes, _import_tail_tokens, @@ -348,5 +351,88 @@ def test_no_api_calls(self): "crawl() must not import network modules") +class TestDetectJavaVersion(unittest.TestCase): + """Regression tests for _detect_java_version. + + Spring Boot projects standardly declare Java version as + 17 inside . The original regex + only matched maven.compiler.source/target/release, so all Spring Boot + repos using the convention reported "Unknown". + """ + + def _write_pom(self, repo: Path, content: str) -> None: + (repo / "pom.xml").write_text(content, encoding="utf-8") + + def test_spring_boot_java_version_property(self): + # Regression: 17 was silently ignored. + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, + "" + "17" + "") + self.assertEqual(_detect_java_version(repo), "17") + + def test_maven_compiler_source(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, + "" + "17" + "") + self.assertEqual(_detect_java_version(repo), "17") + + def test_maven_compiler_release(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, + "" + "21" + "") + self.assertEqual(_detect_java_version(repo), "21") + + def test_old_java_1_8_normalized(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, + "" + "1.8" + "") + self.assertEqual(_detect_java_version(repo), "8") + + def test_spring_boot_java_version_1_8_normalized(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, + "" + "1.8" + "") + self.assertEqual(_detect_java_version(repo), "8") + + def test_no_pom_returns_unknown(self): + with tempfile.TemporaryDirectory() as td: + self.assertEqual(_detect_java_version(Path(td)), "Unknown") + + def test_pom_with_no_version_info_returns_unknown(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + self._write_pom(repo, "com.example") + self.assertEqual(_detect_java_version(repo), "Unknown") + + def test_gradle_jvm_target(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + (repo / "build.gradle").write_text('jvmTarget = "11"\n', encoding="utf-8") + self.assertEqual(_detect_java_version(repo), "11") + + def test_gradle_source_compatibility(self): + with tempfile.TemporaryDirectory() as td: + repo = Path(td) + (repo / "build.gradle").write_text( + "sourceCompatibility = JavaVersion.VERSION_17\n", encoding="utf-8" + ) + self.assertEqual(_detect_java_version(repo), "17") + + if __name__ == "__main__": unittest.main() diff --git a/tools/skill_generator/crawler.py b/tools/skill_generator/crawler.py index be79a44..fbda8fb 100644 --- a/tools/skill_generator/crawler.py +++ b/tools/skill_generator/crawler.py @@ -837,7 +837,7 @@ def _detect_java_version(repo_root: Path) -> str: except OSError: raw = "" m = re.search( - r"<(?:maven\.compiler\.)?(?:source|target|release)>\s*([\d.]+)\s*\s*([\d.]+)\s*