Skip to content

Commit d4d1331

Browse files
tomasstupkasdelamo
andauthored
added support for graalpy gradle plugin (#2708)
* added support for graalpy gradle plugin * supply Kotlin Dsl to rocker template --------- Co-authored-by: Sergio del Amo <[email protected]>
1 parent 8be3f31 commit d4d1331

File tree

4 files changed

+55
-36
lines changed

4 files changed

+55
-36
lines changed

gradle/templates.versions.toml

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ spring-boot-starter-parent="3.3.5"
7171
graaljs = "24.0.2" # Once this is bumped past 24.1, you should be able to remove the disabling of Loom in the config properties in the React feature.
7272
frontend-maven-plugin = "1.15.0"
7373
liquibase-slf4j = "5.0.0"
74+
graalpy = "24.2.0"
7475

7576
[libraries]
7677
spring-boot-starter-parent = { module = "org.springframework.boot:spring-boot-starter-parent", version.ref = "spring-boot-starter-parent" }
@@ -146,6 +147,7 @@ buildless-gradle-plugin = { module = "build.less:buildless-plugin-gradle", versi
146147
graaljs-community = { module = "org.graalvm.polyglot:js-community", version.ref = "graaljs" }
147148
frontend-maven-plugin = { module = "com.github.eirslett:frontend-maven-plugin", version.ref = "frontend-maven-plugin" }
148149
liquibase-slf4j = { module = "com.mattbertolini:liquibase-slf4j", version.ref = "liquibase-slf4j" }
150+
graalpy-gradle-plugin = { module = "org.graalvm.python:org.graalvm.python.gradle.plugin", version.ref = "graalpy" }
149151

150152
[plugins]
151153
# This is an exception to the rule!

starter-core/src/main/java/io/micronaut/starter/feature/graallanguages/Graalpy.java

+21-9
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,18 @@
1919
import io.micronaut.core.util.StringUtils;
2020
import io.micronaut.starter.application.ApplicationType;
2121
import io.micronaut.starter.application.generator.GeneratorContext;
22-
import io.micronaut.starter.build.BuildProperties;
2322
import io.micronaut.starter.build.dependencies.CoordinateResolver;
2423
import io.micronaut.starter.build.dependencies.Dependency;
2524
import io.micronaut.starter.build.dependencies.MicronautDependencyUtils;
25+
import io.micronaut.starter.build.gradle.GradleDsl;
26+
import io.micronaut.starter.build.gradle.GradlePlugin;
27+
import io.micronaut.starter.build.gradle.GradlePluginPortal;
2628
import io.micronaut.starter.build.maven.MavenPlugin;
2729
import io.micronaut.starter.feature.Category;
28-
import io.micronaut.starter.feature.MavenSpecificFeature;
30+
import io.micronaut.starter.feature.Feature;
2931
import io.micronaut.starter.feature.MinJdkFeature;
3032
import io.micronaut.starter.feature.graallanguages.templates.graalPyMavenPlugin;
33+
import io.micronaut.starter.feature.graallanguages.templates.graalPyGradlePlugin;
3134
import io.micronaut.starter.options.BuildTool;
3235
import io.micronaut.starter.options.JdkVersion;
3336
import io.micronaut.starter.template.RockerWritable;
@@ -38,7 +41,7 @@
3841

3942
@Requires(property = "micronaut.starter.feature.graalpy.enabled", value = StringUtils.TRUE, defaultValue = StringUtils.TRUE)
4043
@Singleton
41-
public class Graalpy implements MinJdkFeature, MavenSpecificFeature {
44+
public class Graalpy implements MinJdkFeature, Feature {
4245
public static final String NAME = "graalpy";
4346

4447
private static final String GROUP_ID_GRAALVM_PYTHON = "org.graalvm.python";
@@ -85,20 +88,29 @@ public void apply(GeneratorContext generatorContext) {
8588
addDependencies(generatorContext);
8689
if (generatorContext.getBuildTool() == BuildTool.MAVEN) {
8790
addGraalPyMavenPlugin(generatorContext);
91+
} else if (generatorContext.getBuildTool().isGradle()) {
92+
addGraalPyGradlePlugin(generatorContext);
8893
}
8994
}
9095

9196
private void addGraalPyMavenPlugin(GeneratorContext generatorContext) {
92-
BuildProperties buildProperties = generatorContext.getBuildProperties();
93-
generatorContext.addBuildPlugin(graalpyMavenPlugin());
94-
}
95-
96-
protected MavenPlugin graalpyMavenPlugin() {
97-
return MavenPlugin.builder()
97+
MavenPlugin plugin = MavenPlugin.builder()
9898
.groupId(GROUP_ID_GRAALVM_PYTHON)
9999
.artifactId(ARTIFACT_ID_GRAALPY_MAVEN_PLUGIN)
100100
.extension(new RockerWritable(graalPyMavenPlugin.template(pythonPackages())))
101101
.build();
102+
generatorContext.addBuildPlugin(plugin);
103+
}
104+
105+
private void addGraalPyGradlePlugin(GeneratorContext generatorContext) {
106+
GradleDsl dsl = generatorContext.getBuildTool().getGradleDsl().orElse(GradleDsl.KOTLIN);
107+
GradlePlugin plugin = GradlePlugin.builder()
108+
.id("org.graalvm.python")
109+
.lookupArtifactId("org.graalvm.python.gradle.plugin")
110+
.extension(new RockerWritable(graalPyGradlePlugin.template(pythonPackages(), dsl)))
111+
.pluginsManagementRepository(new GradlePluginPortal())
112+
.build();
113+
generatorContext.addBuildPlugin(plugin);
102114
}
103115

104116
protected List<String> pythonPackages() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
@import java.util.List
2+
@import io.micronaut.starter.build.gradle.GradleDsl
3+
@args (List<String> packages, GradleDsl dsl)
4+
//tag::graalpy-gradle-plugin[]
5+
@if(!packages.isEmpty()) {
6+
graalPy {
7+
@if(dsl == GradleDsl.KOTLIN) {
8+
@for (String pkg : packages) {
9+
packages.add(@(pkg))
10+
}
11+
} else {
12+
packages = @("[\"" + String.join("\",\"",packages) + "\"]")
13+
}
14+
}
15+
}
16+
//end::graalpy-gradle-plugin[]

starter-core/src/test/groovy/io/micronaut/starter/feature/graallaguages/GraalpySpec.groovy

+16-27
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,18 @@ class GraalpySpec extends ApplicationContextSpec implements CommandOutputFixture
2323
@Subject
2424
Graalpy micronautGraalPyFeature = beanContext.getBean(Graalpy)
2525

26-
void 'readme.md with feature micronaut-graalpy contains links to docs'() {
26+
void "readme.md with feature micronaut-graalpy contains links to docs for language=#language buildTool=#buildTool "(BuildTool buildTool, Language language) {
2727
when:
28-
Map<String, String> output = generate(ApplicationType.DEFAULT, new Options(Language.JAVA, TestFramework.JUNIT, BuildTool.MAVEN, JdkVersion.JDK_21), [Graalpy.NAME])
28+
Map<String, String> output = generate(ApplicationType.DEFAULT, new Options(language, TestFramework.JUNIT, buildTool, JdkVersion.JDK_21), [Graalpy.NAME])
2929
String readme = output["README.md"]
3030

3131
then:
3232
readme
3333
readme.contains("https://micronaut-projects.github.io/micronaut-graal-languages/latest/guide");
3434
readme.contains("https://graalvm.org/python");
35+
36+
where:
37+
[buildTool, language] << [BuildTool.values(), Language.JAVA].combinations()
3538
}
3639

3740
void "micronaut-graalpy belongs to LANGUAGES category"() {
@@ -47,29 +50,25 @@ class GraalpySpec extends ApplicationContextSpec implements CommandOutputFixture
4750
applicationType << ApplicationType.values()
4851
}
4952

50-
void "micronaut-graalpy feature adds micronaut-graalpy dependency for Java and Maven "() {
53+
void "micronaut-graalpy feature adds micronaut-graalpy dependency for language=#language buildTool=#buildTool "(BuildTool buildTool, Language language) {
5154
when:
52-
String template = new BuildBuilder(beanContext, BuildTool.MAVEN)
55+
String template = new BuildBuilder(beanContext, buildTool)
5356
.features([Graalpy.NAME])
54-
.language(Language.JAVA)
57+
.language(language)
5558
.render()
56-
BuildTestVerifier verifier = BuildTestUtil.verifier(BuildTool.MAVEN, Language.JAVA, template)
59+
BuildTestVerifier verifier = BuildTestUtil.verifier(buildTool, language, template)
5760

5861
then:
5962
template
6063
verifier.hasDependency("io.micronaut.graal-languages", "micronaut-graalpy", Scope.COMPILE)
61-
}
62-
63-
void "micronaut-graalpy feature adds maven-graalvm-plugin for language=java buildTool=maven "() {
64-
when:
65-
String template = new BuildBuilder(beanContext, BuildTool.MAVEN)
66-
.features([Graalpy.NAME])
67-
.language(Language.JAVA)
68-
.render()
64+
if (buildTool == BuildTool.MAVEN) {
65+
assert template.contains("<artifactId>graalpy-maven-plugin</artifactId>")
66+
} else if (buildTool.isGradle()) {
67+
assert verifier.hasBuildPlugin("org.graalvm.python")
68+
}
6969

70-
then:
71-
template
72-
template.contains("<artifactId>graalpy-maven-plugin</artifactId>")
70+
where:
71+
[buildTool, language] << [BuildTool.values(), Language.JAVA].combinations()
7372
}
7473

7574
void "micronaut-graalpy feature requires java 21"() {
@@ -84,14 +83,4 @@ class GraalpySpec extends ApplicationContextSpec implements CommandOutputFixture
8483
ex.message == "The selected feature graalpy requires at latest Java 21"
8584
}
8685

87-
void 'test feature graalpy is only supported for Maven'() {
88-
given:
89-
String featureName = 'graalpy'
90-
when:
91-
getFeatures([featureName], new Options(Language.JAVA, TestFramework.JUNIT, BuildTool.GRADLE, JdkVersion.JDK_21))
92-
93-
then:
94-
IllegalArgumentException ex = thrown()
95-
ex.message.contains("Feature only supported by Maven")
96-
}
9786
}

0 commit comments

Comments
 (0)