Skip to content

Commit dede7ce

Browse files
committed
Fix #255
1 parent 4e0d30a commit dede7ce

File tree

8 files changed

+204
-84
lines changed

8 files changed

+204
-84
lines changed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ shadowJarVersion=7.0.0
1010
kotlinxSerializationVersion=1.1.0
1111
ktlintGradleVersion=10.0.0
1212
ktlintVersion=0.40.0
13-
publishPluginVersion=0.0.27-dev
13+
publishPluginVersion=0.0.29-dev
1414
junitVersion=5.7.1
1515
slf4jVersion=1.7.30
1616
logbackVersion=1.2.3
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

jupyter-lib/kotlin-jupyter-api-gradle-plugin/build.gradle.kts

+20-7
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,21 @@ val saveVersion by tasks.registering {
4848
}
4949
}
5050

51-
tasks.processResources {
52-
dependsOn(saveVersion)
53-
}
51+
tasks {
52+
processResources {
53+
dependsOn(saveVersion)
54+
}
55+
56+
test {
57+
useJUnitPlatform()
58+
testLogging {
59+
events("passed", "skipped", "failed")
60+
}
61+
}
5462

55-
tasks.test {
56-
useJUnitPlatform()
57-
testLogging {
58-
events("passed", "skipped", "failed")
63+
register<Jar>("sourceJar") {
64+
archiveClassifier.set("sources")
65+
from(sourceSets.named("main").get().allSource)
5966
}
6067
}
6168

@@ -90,6 +97,12 @@ pluginBundle {
9097
}
9198

9299
publishing {
100+
publications {
101+
withType<MavenPublication> {
102+
artifact(tasks["sourceJar"])
103+
}
104+
}
105+
93106
repositories {
94107
(rootProject.findProperty("localPublicationsRepo") as? java.nio.file.Path)?.let {
95108
maven {

jupyter-lib/kotlin-jupyter-api-gradle-plugin/src/main/kotlin/org/jetbrains/kotlinx/jupyter/api/plugin/ApiGradlePlugin.kt

+36-20
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@ package org.jetbrains.kotlinx.jupyter.api.plugin
22

33
import org.gradle.api.Plugin
44
import org.gradle.api.Project
5+
import org.gradle.api.tasks.Copy
56
import org.gradle.kotlin.dsl.findByType
67
import org.gradle.kotlin.dsl.invoke
8+
import org.gradle.kotlin.dsl.named
79
import org.gradle.kotlin.dsl.register
810
import org.gradle.kotlin.dsl.repositories
911
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
1012
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin
1113
import org.jetbrains.kotlin.gradle.plugin.KaptExtension
1214
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
1315
import org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask
16+
import org.jetbrains.kotlinx.jupyter.api.plugin.tasks.whenAdded
1417

1518
class ApiGradlePlugin : Plugin<Project> {
1619
override fun apply(target: Project): Unit = with(target) {
@@ -41,37 +44,50 @@ class ApiGradlePlugin : Plugin<Project> {
4144
}
4245

4346
val resourcesTaskName = "processJupyterApiResources"
44-
fun registerResourceTask() {
45-
register<JupyterApiResourcesTask>(resourcesTaskName) {
46-
val kaptKotlinTask = findByName("kaptKotlin")
47-
if (kaptKotlinTask != null) {
48-
dependsOn(kaptKotlinTask)
49-
kaptKotlinTask.dependsOn(cleanJupyterTask)
50-
kaptKotlinTask.outputs.dir(jupyterBuildPath)
51-
}
47+
fun registerResourceTask(): JupyterApiResourcesTask {
48+
findByName(resourcesTaskName) ?: register<JupyterApiResourcesTask>(resourcesTaskName)
49+
return named<JupyterApiResourcesTask>(resourcesTaskName).get()
50+
}
51+
52+
fun dependOnProcessingTask(processTaskName: String) {
53+
val jupyterTask = registerResourceTask()
54+
tasks.named<Copy>(processTaskName) {
55+
dependsOn(resourcesTaskName)
56+
from(jupyterTask.outputDir)
5257
}
5358
}
5459

60+
fun dependOnKapt(kaptTaskName: String) {
61+
registerResourceTask()
62+
tasks.whenAdded(
63+
{ it.name == kaptTaskName },
64+
{
65+
tasks.named(resourcesTaskName) {
66+
dependsOn(it)
67+
it.dependsOn(cleanJupyterTask)
68+
it.outputs.dir(jupyterBuildPath)
69+
}
70+
}
71+
)
72+
}
73+
5574
// apply configuration to JVM-only project
5675
plugins.withId("org.jetbrains.kotlin.jvm") {
57-
// Task should be registered after plugin is applied
58-
registerResourceTask()
59-
named("processResources") {
60-
dependsOn(resourcesTaskName)
61-
}
76+
dependOnProcessingTask("processResources")
77+
dependOnKapt("kaptKotlin")
6278
}
6379

6480
// apply only to multiplatform plugin
6581
plugins.withId("org.jetbrains.kotlin.multiplatform") {
66-
// Task should be registered after plugin is applied
67-
registerResourceTask()
6882
extensions.findByType<KotlinMultiplatformExtension>()?.apply {
69-
val jvmTargetName = targets.filterIsInstance<KotlinJvmTarget>().firstOrNull()?.name
70-
?: error("Single JVM target not found in a multiplatform project")
71-
named(jvmTargetName + "ProcessResources") {
72-
dependsOn(resourcesTaskName)
73-
}
83+
targets.whenAdded(
84+
{ (it is KotlinJvmTarget) },
85+
{
86+
dependOnProcessingTask(it.name + "ProcessResources")
87+
}
88+
)
7489
}
90+
dependOnKapt("kaptKotlinJvm")
7591
}
7692
}
7793
}

jupyter-lib/kotlin-jupyter-api-gradle-plugin/src/main/kotlin/org/jetbrains/kotlinx/jupyter/api/plugin/KotlinJupyterPluginExtension.kt

+19-13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.gradle.kotlin.dsl.dependencies
55
import org.gradle.kotlin.dsl.findByType
66
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
77
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
8+
import org.jetbrains.kotlinx.jupyter.api.plugin.tasks.whenAdded
89
import java.util.Locale
910

1011
private fun Project.configureDependency(scope: String, dependencyNotation: Any) {
@@ -19,13 +20,17 @@ private fun Project.configureDependency(scope: String, dependencyNotation: Any)
1920
// apply only to multiplatform plugin
2021
plugins.withId("org.jetbrains.kotlin.multiplatform") {
2122
extensions.findByType<KotlinMultiplatformExtension>()?.apply {
22-
val jvmTargetName = targets.filterIsInstance<KotlinJvmTarget>().firstOrNull()?.name
23-
?: error("Single JVM target not found in a multiplatform project")
24-
val configuration = project.configurations.findByName(jvmTargetName + scope.capitalize(Locale.ROOT))
25-
?: error("$scope configuration is not resolved for a multiplatform project")
26-
dependencies {
27-
configuration.invoke(dependencyNotation)
28-
}
23+
targets.whenAdded(
24+
{ it is KotlinJvmTarget },
25+
{
26+
val jvmTargetName = it.name
27+
val configuration = project.configurations.findByName(jvmTargetName + scope.capitalize(Locale.ROOT))
28+
?: error("$scope configuration is not resolved for a multiplatform project")
29+
dependencies {
30+
configuration.invoke(dependencyNotation)
31+
}
32+
}
33+
)
2934
}
3035
}
3136
}
@@ -39,13 +44,14 @@ class KotlinJupyterPluginExtension(
3944
}
4045

4146
fun addScannerDependency(version: String? = null) = with(project) {
42-
val kaptConf = configurations.findByName("kapt") ?: return
43-
val apiVersion = version ?: apiVersion()
44-
val mavenCoordinates = "$GROUP_ID:kotlin-jupyter-api-annotations:$apiVersion"
45-
dependencies {
46-
kaptConf(mavenCoordinates)
47+
configurations.whenAdded({ it.name == "kapt" }) { kaptConf ->
48+
val apiVersion = version ?: apiVersion()
49+
val mavenCoordinates = "$GROUP_ID:kotlin-jupyter-api-annotations:$apiVersion"
50+
dependencies {
51+
kaptConf(mavenCoordinates)
52+
}
53+
configureDependency("implementation", mavenCoordinates)
4754
}
48-
configureDependency("implementation", mavenCoordinates)
4955
}
5056

5157
internal fun addDependenciesIfNeeded() {

jupyter-lib/kotlin-jupyter-api-gradle-plugin/src/main/kotlin/org/jetbrains/kotlinx/jupyter/api/plugin/tasks/JupyterApiResourcesTask.kt

+4-30
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@ import com.google.gson.Gson
44
import org.gradle.api.DefaultTask
55
import org.gradle.api.tasks.Input
66
import org.gradle.api.tasks.OutputDirectory
7-
import org.gradle.api.tasks.SourceSet
8-
import org.gradle.api.tasks.SourceSetContainer
97
import org.gradle.api.tasks.TaskAction
10-
import org.gradle.kotlin.dsl.findByType
11-
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
12-
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
138
import org.jetbrains.kotlinx.jupyter.api.plugin.ApiGradlePlugin
149
import java.io.File
1510

@@ -31,30 +26,7 @@ open class JupyterApiResourcesTask : DefaultTask() {
3126
var libraryDefinitions: List<String> = emptyList()
3227

3328
@OutputDirectory
34-
val outputDir: File
35-
36-
init {
37-
val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer
38-
when {
39-
project.plugins.findPlugin("org.jetbrains.kotlin.jvm") != null -> {
40-
val mainSourceSet: SourceSet = sourceSets.named("main").get()
41-
outputDir = mainSourceSet.output.resourcesDir?.resolve("META-INF/kotlin-jupyter-libraries")
42-
?: throw IllegalStateException("No resources dir for main source set")
43-
}
44-
project.plugins.findPlugin("org.jetbrains.kotlin.multiplatform") != null -> {
45-
val mppExtension = project.extensions.findByType<KotlinMultiplatformExtension>()
46-
?: error("Kotlin MPP extension not found")
47-
val jvmTargetName = mppExtension.targets.filterIsInstance<KotlinJvmTarget>().firstOrNull()?.name
48-
?: error("Single JVM target not found in a multiplatform project")
49-
// TODO properly resolve resource directory
50-
outputDir = project.buildDir.resolve("processedResources/$jvmTargetName/main")
51-
.resolve("META-INF/kotlin-jupyter-libraries")
52-
}
53-
else -> {
54-
error("Kotlin plugin not found in the project")
55-
}
56-
}
57-
}
29+
val outputDir: File = project.buildDir.resolve("jupyterProcessedResources")
5830

5931
@TaskAction
6032
fun createDescriptions() {
@@ -64,7 +36,9 @@ open class JupyterApiResourcesTask : DefaultTask() {
6436
) + getScanResultFromAnnotations()
6537
val json = Gson().toJson(resultObject)
6638

67-
val libFile = outputDir.resolve("libraries.json")
39+
val jupyterDir = outputDir.resolve("META-INF/kotlin-jupyter-libraries")
40+
val libFile = jupyterDir.resolve("libraries.json")
41+
libFile.parentFile.mkdirs()
6842
libFile.writeText(json)
6943
}
7044

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.jetbrains.kotlinx.jupyter.api.plugin.tasks
2+
3+
import org.gradle.api.NamedDomainObjectCollection
4+
5+
fun <T> NamedDomainObjectCollection<T>.whenAdded(condition: (T) -> Boolean, action: (T) -> Unit) {
6+
val element = find(condition)
7+
if (element != null) {
8+
action(element)
9+
return
10+
}
11+
whenObjectAdded {
12+
val addedElement = this
13+
if (condition(addedElement)) action(addedElement)
14+
}
15+
}

0 commit comments

Comments
 (0)