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

Lines changed: 106 additions & 33 deletions
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

Lines changed: 15 additions & 12 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy