Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions tests/test_crawler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 <java.version> 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).
Expand All @@ -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,
Expand Down Expand Up @@ -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
<java.version>17</java.version> inside <properties>. The original regex
only matched maven.compiler.source/target/release, so all Spring Boot
repos using the <java.version> 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: <java.version>17</java.version> was silently ignored.
with tempfile.TemporaryDirectory() as td:
repo = Path(td)
self._write_pom(repo,
"<project><properties>"
"<java.version>17</java.version>"
"</properties></project>")
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,
"<project><properties>"
"<maven.compiler.source>17</maven.compiler.source>"
"</properties></project>")
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,
"<project><build><plugins><plugin><configuration>"
"<release>21</release>"
"</configuration></plugin></plugins></build></project>")
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,
"<project><properties>"
"<maven.compiler.source>1.8</maven.compiler.source>"
"</properties></project>")
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,
"<project><properties>"
"<java.version>1.8</java.version>"
"</properties></project>")
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, "<project><groupId>com.example</groupId></project>")
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()
2 changes: 1 addition & 1 deletion tools/skill_generator/crawler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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*</",
r"<(?:java\.version|(?:maven\.compiler\.)?(?:source|target|release))>\s*([\d.]+)\s*</",
raw,
)
if m:
Expand Down