Skip to content

Commit 8f1d3a3

Browse files
authored
Support for toolbox 2.6.0.38881 (#20)
- localization support is now mandatory - initial support for gradle toolbox plugin (structure) - migrated state management to SateFlow coroutine API - refactored service dependency injection - better logging
1 parent f0740a8 commit 8f1d3a3

File tree

74 files changed

+954
-715
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+954
-715
lines changed

build.gradle.kts

+106-33
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1+
import com.fasterxml.jackson.databind.SerializationFeature
2+
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
13
import com.github.jk1.license.filter.ExcludeTransitiveDependenciesFilter
24
import com.github.jk1.license.render.JsonReportRenderer
5+
import com.jetbrains.plugin.structure.toolbox.ToolboxMeta
6+
import com.jetbrains.plugin.structure.toolbox.ToolboxPluginDescriptor
37
import org.jetbrains.intellij.pluginRepository.PluginRepositoryFactory
48
import org.jetbrains.kotlin.com.intellij.openapi.util.SystemInfoRt
59
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
610
import java.nio.file.Path
11+
import kotlin.io.path.createDirectories
712
import kotlin.io.path.div
13+
import kotlin.io.path.writeText
814

915
plugins {
1016
alias(libs.plugins.kotlin)
@@ -14,23 +20,31 @@ plugins {
1420
alias(libs.plugins.ksp)
1521
alias(libs.plugins.gradle.wrapper)
1622
alias(libs.plugins.changelog)
23+
alias(libs.plugins.gettext)
1724
}
1825

19-
buildscript {
20-
dependencies {
21-
classpath(libs.marketplace.client)
22-
}
23-
}
2426

2527
repositories {
2628
mavenCentral()
2729
maven("https://packages.jetbrains.team/maven/p/tbx/toolbox-api")
2830
}
2931

32+
buildscript {
33+
repositories {
34+
mavenCentral()
35+
}
36+
37+
dependencies {
38+
classpath(libs.marketplace.client)
39+
classpath(libs.plugin.structure)
40+
}
41+
}
42+
3043
jvmWrapper {
3144
unixJvmInstallDir = "jvm"
3245
winJvmInstallDir = "jvm"
33-
linuxAarch64JvmUrl = "https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-aarch64-b631.28.tar.gz"
46+
linuxAarch64JvmUrl =
47+
"https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-aarch64-b631.28.tar.gz"
3448
linuxX64JvmUrl = "https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-linux-x64-b631.28.tar.gz"
3549
macAarch64JvmUrl = "https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-osx-aarch64-b631.28.tar.gz"
3650
macX64JvmUrl = "https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-21.0.5-osx-x64-b631.28.tar.gz"
@@ -39,24 +53,43 @@ jvmWrapper {
3953

4054
dependencies {
4155
compileOnly(libs.bundles.toolbox.plugin.api)
42-
implementation(libs.slf4j)
43-
implementation(libs.bundles.serialization)
44-
implementation(libs.coroutines.core)
56+
compileOnly(libs.bundles.serialization)
57+
compileOnly(libs.coroutines.core)
4558
implementation(libs.okhttp)
4659
implementation(libs.exec)
4760
implementation(libs.moshi)
4861
ksp(libs.moshi.codegen)
4962
implementation(libs.retrofit)
5063
implementation(libs.retrofit.moshi)
5164
testImplementation(kotlin("test"))
65+
testImplementation(libs.mokk)
66+
testImplementation(libs.bundles.toolbox.plugin.api)
5267
}
5368

54-
val pluginId = properties("group")
55-
val pluginName = properties("name")
56-
val pluginVersion = properties("version")
69+
val extension = ExtensionJson(
70+
id = properties("group"),
71+
72+
version = properties("version"),
73+
meta = ExtensionJsonMeta(
74+
name = "Coder Toolbox",
75+
description = "Connects your JetBrains IDE to Coder workspaces",
76+
vendor = "Coder",
77+
url = "https://github.com/coder/coder-jetbrains-toolbox-plugin",
78+
)
79+
)
80+
81+
val extensionJsonFile = layout.buildDirectory.file("generated/extension.json")
82+
val extensionJson by tasks.registering {
83+
inputs.property("extension", extension.toString())
84+
85+
outputs.file(extensionJsonFile)
86+
doLast {
87+
generateExtensionJson(extension, extensionJsonFile.get().asFile.toPath())
88+
}
89+
}
5790

5891
changelog {
59-
version.set(pluginVersion)
92+
version.set(extension.version)
6093
groups.set(emptyList())
6194
title.set("Coder Toolbox Plugin Changelog")
6295
}
@@ -76,24 +109,30 @@ tasks.test {
76109
useJUnitPlatform()
77110
}
78111

79-
val assemblePlugin by tasks.registering(Jar::class) {
80-
archiveBaseName.set(pluginId)
81-
from(sourceSets.main.get().output)
112+
113+
tasks.jar {
114+
archiveBaseName.set(extension.id)
115+
dependsOn(extensionJson)
116+
from(extensionJson.get().outputs)
82117
}
83118

84119
val copyPlugin by tasks.creating(Sync::class.java) {
85-
dependsOn(assemblePlugin)
86-
fromCompileDependencies()
120+
dependsOn(tasks.jar)
121+
dependsOn(tasks.getByName("generateLicenseReport"))
87122

123+
fromCompileDependencies()
88124
into(getPluginInstallDir())
89125
}
90126

91127
fun CopySpec.fromCompileDependencies() {
92-
from(assemblePlugin.get().outputs.files)
128+
from(tasks.jar)
129+
from(extensionJson.get().outputs.files)
93130
from("src/main/resources") {
94-
include("extension.json")
95131
include("dependencies.json")
132+
}
133+
from("src/main/resources") {
96134
include("icon.svg")
135+
rename("icon.svg", "pluginIcon.svg")
97136
}
98137

99138
// Copy dependencies, excluding those provided by Toolbox.
@@ -106,18 +145,20 @@ fun CopySpec.fromCompileDependencies() {
106145
"core-api",
107146
"ui-api",
108147
"annotations",
148+
"localization-api"
109149
).any { file.name.contains(it) }
110150
}
111151
},
112152
)
113153
}
114154

115155
val pluginZip by tasks.creating(Zip::class) {
116-
dependsOn(assemblePlugin)
156+
archiveBaseName.set(properties("name"))
157+
dependsOn(tasks.jar)
158+
dependsOn(tasks.getByName("generateLicenseReport"))
117159

118160
fromCompileDependencies()
119-
into(pluginId)
120-
archiveBaseName.set(pluginName)
161+
into(extension.id) // folder like com.coder.toolbox
121162
}
122163

123164
tasks.register("cleanAll", Delete::class.java) {
@@ -142,7 +183,7 @@ private fun getPluginInstallDir(): Path {
142183
else -> error("Unknown os")
143184
} / "plugins"
144185

145-
return pluginsDir / pluginId
186+
return pluginsDir / extension.id
146187
}
147188

148189
val publishPlugin by tasks.creating {
@@ -158,17 +199,49 @@ val publishPlugin by tasks.creating {
158199
// instance.uploader.uploadNewPlugin(pluginZip.outputs.files.singleFile, listOf("toolbox", "gateway"), LicenseUrl.APACHE_2_0, ProductFamily.TOOLBOX)
159200

160201
// subsequent updates
161-
instance.uploader.upload(pluginId, pluginZip.outputs.files.singleFile)
202+
instance.uploader.upload(extension.id, pluginZip.outputs.files.singleFile)
162203
}
163204
}
164205

165-
// For use with kotlin-language-server.
166-
tasks.register("classpath") {
167-
doFirst {
168-
File("classpath").writeText(
169-
sourceSets["main"].runtimeClasspath.asPath
206+
fun properties(key: String) = project.findProperty(key).toString()
207+
208+
gettext {
209+
potFile = project.layout.projectDirectory.file("src/main/resources/localization/defaultMessages.pot")
210+
keywords = listOf("ptrc:1c,2", "ptrl")
211+
}
212+
213+
// region will be moved to the gradle plugin late
214+
data class ExtensionJsonMeta(
215+
val name: String,
216+
val description: String,
217+
val vendor: String,
218+
val url: String?,
219+
)
220+
221+
data class ExtensionJson(
222+
val id: String,
223+
val version: String,
224+
val meta: ExtensionJsonMeta,
225+
)
226+
227+
fun generateExtensionJson(extensionJson: ExtensionJson, destinationFile: Path) {
228+
val descriptor = ToolboxPluginDescriptor(
229+
id = extensionJson.id,
230+
version = extensionJson.version,
231+
apiVersion = libs.versions.toolbox.plugin.api.get(),
232+
meta = ToolboxMeta(
233+
name = extensionJson.meta.name,
234+
description = extensionJson.meta.description,
235+
vendor = extensionJson.meta.vendor,
236+
url = extensionJson.meta.url,
170237
)
171-
}
238+
)
239+
destinationFile.parent.createDirectories()
240+
destinationFile.writeText(
241+
jacksonMapperBuilder()
242+
.enable(SerializationFeature.INDENT_OUTPUT)
243+
.build()
244+
.writeValueAsString(descriptor)
245+
)
172246
}
173-
174-
fun properties(key: String) = project.findProperty(key).toString()
247+
// endregion

gradle/libs.versions.toml

+15-12
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
[versions]
2-
toolbox-plugin-api = "0.7.2.6.0.38311"
2+
toolbox-plugin-api = "1.0.38881"
33
kotlin = "2.1.0"
44
coroutines = "1.10.1"
55
serialization = "1.8.0"
66
okhttp = "4.10.0"
7-
slf4j = "2.0.17"
87
dependency-license-report = "2.9"
98
marketplace-client = "2.0.45"
109
gradle-wrapper = "0.14.0"
@@ -13,6 +12,9 @@ moshi = "1.15.2"
1312
ksp = "2.1.0-1.0.29"
1413
retrofit = "2.11.0"
1514
changelog = "2.2.1"
15+
gettext = "0.7.0"
16+
plugin-structure = "3.298"
17+
mockk = "1.13.17"
1618

1719
[libraries]
1820
toolbox-core-api = { module = "com.jetbrains.toolbox:core-api", version.ref = "toolbox-plugin-api" }
@@ -23,23 +25,24 @@ serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cor
2325
serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
2426
serialization-json-okio = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-okio", version.ref = "serialization" }
2527
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
26-
slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
2728
exec = { module = "org.zeroturnaround:zt-exec", version.ref = "exec" }
28-
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi"}
29-
moshi-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi"}
30-
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit"}
31-
retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "retrofit"}
32-
29+
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
30+
moshi-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" }
31+
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
32+
retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "retrofit" }
33+
plugin-structure = { module = "org.jetbrains.intellij.plugins:structure-toolbox", version.ref = "plugin-structure" }
34+
mokk = { module = "io.mockk:mockk", version.ref = "mockk" }
3335
marketplace-client = { module = "org.jetbrains.intellij:plugin-repository-rest-client", version.ref = "marketplace-client" }
3436

3537
[bundles]
36-
serialization = [ "serialization-core", "serialization-json", "serialization-json-okio" ]
37-
toolbox-plugin-api = [ "toolbox-core-api", "toolbox-ui-api", "toolbox-remote-dev-api" ]
38+
serialization = ["serialization-core", "serialization-json", "serialization-json-okio"]
39+
toolbox-plugin-api = ["toolbox-core-api", "toolbox-ui-api", "toolbox-remote-dev-api"]
3840

3941
[plugins]
4042
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
4143
serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
4244
dependency-license-report = { id = "com.github.jk1.dependency-license-report", version.ref = "dependency-license-report" }
43-
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"}
45+
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
4446
gradle-wrapper = { id = "me.filippov.gradle.jvm.wrapper", version.ref = "gradle-wrapper" }
45-
changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" }
47+
changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" }
48+
gettext = { id = "name.kropp.kotlinx-gettext", version.ref = "gettext" }

0 commit comments

Comments
 (0)