Skip to content

Commit c360528

Browse files
committed
Continue build refactoring: move massive tasks configurations to a separate file, enhance build files structure
1 parent 2af1c4d commit c360528

22 files changed

+894
-771
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ out/
1616
/build/
1717
/build-plugin/**/.idea/
1818
/build-plugin/**/build/
19+
!/build-plugin/**/src/build/
1920
/*jupyter*/*/build/
2021
/api-examples/*/build/
2122
/teamcity-artifacts/

build-plugin/src/build/BuildSettingsExtension.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package build
22

3+
import build.util.defaultVersionCatalog
4+
import build.util.junitApi
5+
import build.util.junitEngine
6+
import build.util.kotlinTest
7+
import build.util.testImplementation
8+
import build.util.testRuntimeOnly
39
import org.gradle.api.Project
410
import org.gradle.api.tasks.compile.JavaCompile
511
import org.gradle.api.tasks.testing.Test
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package build
2+
3+
import build.util.PipInstallReq
4+
import build.util.makeTaskName
5+
import org.gradle.api.Project
6+
import org.gradle.api.tasks.Copy
7+
import org.gradle.kotlin.dsl.register
8+
import java.io.File
9+
10+
class DistributionTasksConfigurator(
11+
private val project: Project,
12+
private val settings: RootSettingsExtension,
13+
) {
14+
private fun removeTypeHintsIfNeeded(files: List<File>) {
15+
if (!settings.removeTypeHints)
16+
return
17+
18+
files.forEach {
19+
val fileName = it.absolutePath
20+
project.exec {
21+
commandLine("python", settings.typeHintsRemover, fileName, fileName)
22+
}
23+
}
24+
}
25+
26+
fun registerTasks() {
27+
project.tasks.register<PipInstallReq>(INSTALL_COMMON_REQUIREMENTS_TASK) {
28+
group = DISTRIBUTION_GROUP
29+
requirementsFile = settings.distribUtilRequirementsFile
30+
}
31+
32+
project.tasks.register<PipInstallReq>(INSTALL_HINT_REMOVER_REQUIREMENTS_TASK) {
33+
group = DISTRIBUTION_GROUP
34+
requirementsFile = settings.distribUtilRequirementsHintsRemoverFile
35+
}
36+
37+
project.tasks.register<Copy>(COPY_DISTRIB_FILES_TASK) {
38+
group = DISTRIBUTION_GROUP
39+
dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, false))
40+
if (settings.removeTypeHints) {
41+
dependsOn(INSTALL_HINT_REMOVER_REQUIREMENTS_TASK)
42+
}
43+
from(settings.distributionDir)
44+
from(settings.readmeFile)
45+
into(settings.distribBuildDir)
46+
exclude(".idea/**", "venv/**")
47+
48+
val pythonFiles = mutableListOf<File>()
49+
eachFile {
50+
val absPath = settings.distribBuildDir.resolve(this.path).absoluteFile
51+
if (this.path.endsWith(".py"))
52+
pythonFiles.add(absPath)
53+
}
54+
55+
doLast {
56+
removeTypeHintsIfNeeded(pythonFiles)
57+
}
58+
}
59+
60+
project.tasks.register(PREPARE_DISTRIBUTION_DIR_TASK) {
61+
group = DISTRIBUTION_GROUP
62+
dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, false), COPY_DISTRIB_FILES_TASK)
63+
doLast {
64+
val versionFilePath = settings.distribBuildDir.resolve(settings.versionFileName)
65+
versionFilePath.writeText(settings.pyPackageVersion)
66+
project.copy {
67+
from(versionFilePath)
68+
into(settings.artifactsDir)
69+
}
70+
71+
settings.distribBuildDir.resolve("REPO_URL").writeText(settings.projectRepoUrl)
72+
}
73+
}
74+
}
75+
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package build
2+
3+
import build.util.makeDirs
4+
import build.util.makeTaskName
5+
import build.util.writeJson
6+
import org.gradle.api.Project
7+
import org.gradle.api.Task
8+
import org.gradle.api.tasks.Copy
9+
import org.gradle.kotlin.dsl.get
10+
import org.gradle.kotlin.dsl.register
11+
import java.io.File
12+
13+
class InstallTasksConfigurator(
14+
private val project: Project,
15+
private val settings: RootSettingsExtension,
16+
) {
17+
fun createLocalInstallTasks() {
18+
project.tasks.register<Copy>(COPY_RUN_KERNEL_PY_TASK) {
19+
group = LOCAL_INSTALL_GROUP
20+
dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, true))
21+
from(settings.runKernelDir.resolve(settings.runKernelPy))
22+
from(settings.distributionDir.resolve(settings.kotlinKernelModule)) {
23+
into(settings.kotlinKernelModule)
24+
}
25+
into(settings.localInstallDir)
26+
}
27+
28+
project.tasks.register<Copy>(COPY_NB_EXTENSION_TASK) {
29+
group = LOCAL_INSTALL_GROUP
30+
from(settings.nbExtensionDir)
31+
into(settings.localInstallDir)
32+
}
33+
34+
createInstallTasks(true, settings.localInstallDir, settings.localInstallDir)
35+
36+
project.task(UNINSTALL_TASK) {
37+
group = LOCAL_INSTALL_GROUP
38+
dependsOn(makeTaskName(settings.cleanInstallDirTaskPrefix, false))
39+
}
40+
}
41+
42+
fun createInstallTasks(local: Boolean, specPath: File, mainInstallPath: File) {
43+
val groupName = if (local) LOCAL_INSTALL_GROUP else DISTRIBUTION_GROUP
44+
val cleanDirTask = project.tasks.getByName(makeTaskName(settings.cleanInstallDirTaskPrefix, local))
45+
val shadowJar = project.tasks.getByName(SHADOW_JAR_TASK)
46+
val updateLibrariesTask = project.tasks.named(UPDATE_LIBRARIES_TASK_NAME)
47+
48+
project.tasks.register<Copy>(makeTaskName(settings.copyLibrariesTaskPrefix, local)) {
49+
dependsOn(cleanDirTask, updateLibrariesTask)
50+
group = groupName
51+
from(settings.librariesDir)
52+
into(mainInstallPath.resolve(settings.librariesDir))
53+
}
54+
55+
project.tasks.register<Copy>(makeTaskName(settings.installLibsTaskPrefix, local)) {
56+
dependsOn(cleanDirTask)
57+
group = groupName
58+
from(project.configurations["deploy"])
59+
into(mainInstallPath.resolve(settings.jarsPath))
60+
}
61+
62+
project.tasks.register<Copy>(makeTaskName(settings.installKernelTaskPrefix, local)) {
63+
dependsOn(cleanDirTask, shadowJar)
64+
group = groupName
65+
from(shadowJar.outputs)
66+
into(mainInstallPath.resolve(settings.jarsPath))
67+
}
68+
69+
listOf(true, false).forEach { debug ->
70+
val specTaskName = createTaskForSpecs(debug, local, groupName, cleanDirTask, shadowJar, specPath, mainInstallPath)
71+
createMainInstallTask(debug, local, groupName, specTaskName)
72+
}
73+
}
74+
75+
private fun createTaskForSpecs(debug: Boolean, local: Boolean, group: String, cleanDir: Task, shadowJar: Task, specPath: File, mainInstallPath: File): String {
76+
val taskName = makeTaskName(if (debug) "createDebugSpecs" else "createSpecs", local)
77+
project.tasks.register(taskName) {
78+
this.group = group
79+
dependsOn(cleanDir, shadowJar)
80+
doLast {
81+
val kernelFile = project.files(shadowJar).singleFile
82+
83+
val libsCp = project.files(project.configurations["deploy"]).files.map { it.name }
84+
85+
makeDirs(mainInstallPath.resolve(settings.jarsPath))
86+
makeDirs(mainInstallPath.resolve(settings.configDir))
87+
makeDirs(specPath)
88+
89+
writeJson(
90+
mapOf(
91+
"mainJar" to kernelFile.name,
92+
"mainClass" to settings.mainClassFQN,
93+
"classPath" to libsCp,
94+
"debuggerConfig" to if (debug) settings.debuggerConfig else ""
95+
),
96+
mainInstallPath.resolve(settings.jarArgsFile)
97+
)
98+
makeKernelSpec(specPath, local)
99+
}
100+
}
101+
return taskName
102+
}
103+
104+
private fun createMainInstallTask(debug: Boolean, local: Boolean, group: String, specsTaskName: String) {
105+
val taskNamePrefix = if (local) "install" else "prepare"
106+
val taskNameMiddle = if (debug) "Debug" else ""
107+
val taskNameSuffix = if (local) "" else "Package"
108+
val taskName = "$taskNamePrefix$taskNameMiddle$taskNameSuffix"
109+
110+
val dependencies = listOf(
111+
makeTaskName(settings.cleanInstallDirTaskPrefix, local),
112+
if (local) project.tasks.getByName(COPY_RUN_KERNEL_PY_TASK) else project.tasks.getByName(PREPARE_DISTRIBUTION_DIR_TASK),
113+
makeTaskName(settings.installKernelTaskPrefix, local),
114+
makeTaskName(settings.installLibsTaskPrefix, local),
115+
specsTaskName,
116+
makeTaskName(settings.copyLibrariesTaskPrefix, local)
117+
)
118+
119+
project.task(taskName) {
120+
this.group = group
121+
dependsOn(dependencies)
122+
}
123+
}
124+
125+
private fun makeKernelSpec(installPath: File, localInstall: Boolean) {
126+
val argv = if (localInstall) {
127+
listOf(
128+
"python",
129+
installPath.resolve(settings.runKernelPy).toString(),
130+
"{connection_file}",
131+
installPath.resolve(settings.jarArgsFile).toString(),
132+
installPath.toString()
133+
)
134+
} else {
135+
listOf("python", "-m", "run_kotlin_kernel", "{connection_file}")
136+
}
137+
138+
writeJson(
139+
mapOf(
140+
"display_name" to "Kotlin",
141+
"language" to "kotlin",
142+
"interrupt_mode" to "message",
143+
"argv" to argv
144+
),
145+
installPath.resolve(settings.kernelFile)
146+
)
147+
148+
project.copy {
149+
from(settings.nbExtensionDir, settings.logosDir)
150+
into(installPath)
151+
}
152+
}
153+
}

0 commit comments

Comments
 (0)