Skip to content

Commit

Permalink
🐛 dedup deps (#693)
Browse files Browse the repository at this point in the history
Signed-off-by: Pranav Gaikwad <pgaikwad@redhat.com>
  • Loading branch information
pranavgaikwad authored Feb 26, 2025
1 parent 983f7da commit 351ad91
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 0 deletions.
12 changes: 12 additions & 0 deletions kai/reactive_codeplanner/agent/dependency_agent/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ def to_xml_element(self) -> ET._Element:
parent.append(version)
return parent

def match_dep(self, dep: ET._Element, match_version: bool = False) -> bool:
found = []
to_match = [self.group_id, self.artifact_id]
if match_version:
to_match.append(self.version)
for child in dep:
if child.text in to_match:
found.append(True)
if len(found) == len(to_match):
return True
return False


@dataclass
class FindInPomResponse:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ def execute_task(self, rcm: RepoContextManager, task: Task) -> TaskResult:
if deps is None or not isinstance(deps, ET._Element):
return TaskResult(modified_files=[], encountered_errors=[], summary="")

# deduplicate deps
for dep in deps:
if maven_dep_response.fqdn_response.match_dep(dep=dep):
logger.debug("removing existing duplicate dep %s", dep)
deps.remove(dep)

## We always need to add the new dep
deps.append(maven_dep_response.fqdn_response.to_xml_element())

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.redhat.coolstore</groupId>
<artifactId>monolith</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>coolstore-monolith</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>yyyyMMdd'T'HHmmss</maven.build.timestamp.format>
<project.encoding>UTF-8</project.encoding>
<maven.test.skip>true</maven.test.skip>
</properties>
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.rmi</groupId>
<artifactId>jboss-rmi-api_1.0_spec</artifactId>
<version>1.0.2.Final</version>
</dependency>
<dependency>
<artifactId>jakarta.inject-api</artifactId>
<groupId>jakarta.inject</groupId>
<version>2.0.1.MR</version>
</dependency>
<dependency><artifactId>smallrye-reactive-messaging</artifactId><groupId>io.smallrye.reactive</groupId><version>4.29.0</version></dependency></dependencies>
</project>
41 changes: 41 additions & 0 deletions tests/test_data/test_dependency_task_runner/deduplication/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.redhat.coolstore</groupId>
<artifactId>monolith</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>coolstore-monolith</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.build.timestamp.format>yyyyMMdd'T'HHmmss</maven.build.timestamp.format>
<project.encoding>UTF-8</project.encoding>
<maven.test.skip>true</maven.test.skip>
</properties>
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.rmi</groupId>
<artifactId>jboss-rmi-api_1.0_spec</artifactId>
<version>1.0.2.Final</version>
</dependency>
<dependency>
<artifactId>smallrye-reactive-messaging</artifactId>
<groupId>io.smallrye.reactive</groupId>
<version>4.27.0</version>
</dependency>
<dependency>
<artifactId>smallrye-reactive-messaging</artifactId>
<groupId>io.smallrye.reactive</groupId>
<version>3.29.0</version>
</dependency>
<dependency>
<artifactId>jakarta.inject-api</artifactId>
<groupId>jakarta.inject</groupId>
<version>2.0.1.MR</version>
</dependency>
</dependencies>
</project>
40 changes: 40 additions & 0 deletions tests/test_dependency_task_runner.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import os
import unittest
from pathlib import Path
from unittest.mock import MagicMock

from kai.kai_config import KaiConfigModels
from kai.llm_interfacing.model_provider import ModelProvider
from kai.reactive_codeplanner.agent.dependency_agent.api import FQDNResponse
from kai.reactive_codeplanner.agent.dependency_agent.dependency_agent import (
MavenDependencyAgent,
MavenDependencyResult,
)
from kai.reactive_codeplanner.task_runner.compiler.maven_validator import (
PackageDoesNotExistError,
Expand Down Expand Up @@ -139,3 +142,40 @@ def test_package_does_not_exist_error_bug_616(self) -> None:
self.assertEqual(actual_pom_contents, expected_pom_contents)

rcm.reset(snapshot)

def test_deduplicate_deps(self) -> None:
mock_agent = MagicMock()
mock_agent.execute.return_value = MavenDependencyResult(
encountered_errors=[],
file_to_modify=Path("pom.xml"),
final_answer="Found the answer",
find_in_pom=None,
fqdn_response=FQDNResponse(
artifact_id="smallrye-reactive-messaging",
group_id="io.smallrye.reactive",
version="4.29.0",
),
)
rcm = RepoContextManager(project_root=self.project_base / "deduplication")
task_runner = DependencyTaskRunner(
agent=mock_agent,
)
pom_file = self.project_base / "deduplication" / "pom.xml"
result = task_runner.execute_task(
rcm=rcm,
task=PackageDoesNotExistError(
priority=1,
parse_lines="'[ERROR] ./test_data/test_dependency_agent/Order.java:[8,27] package jakarta.persistence does not exist'",
missing_package="jakarta.persistence",
message="Maven compiler error: package org.eclipse.microprofile.reactive.messaging does not exist",
file=str(self.project_base / "Order.java"),
line=8,
max_retries=3,
column=27,
),
)
self.assertEqual(result.encountered_errors, [])
self.assertEqual(result.modified_files, [pom_file])
expected_file = self.project_base / "deduplication" / "expected.xml"
self.assertEqual(pom_file.read_text(), expected_file.read_text())
rcm.reset(rcm.first_snapshot)

0 comments on commit 351ad91

Please sign in to comment.