diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e738c1ac..f01cb0da 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,4 +23,4 @@ jobs: dependency-repositories: local,central,portal,google,snapshot snapshot-url: https://s01.oss.sonatype.org/content/repositories/snapshots - name: Build with Gradle - run: gradle build + run: gradle build --no-daemon diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 800c4d03..d3404242 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -40,7 +40,7 @@ jobs: gradle-portal-secret: ${{ secrets.GRADLE_PUBLISH_SECRET }} gpg-key-name: ${{ secrets.GPG_KEY_NAME }} - name: Publish with Gradle - run: gradle publish + run: gradle publish --no-daemon - name: Publish plugins to Gradle Portal if: ${{ github.event_name == 'release' }} - run: gradle publishPlugins + run: gradle publishPlugins --no-daemon diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index a366ac36..f81d8c20 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -1,6 +1,6 @@ plugins { `java-platform` - id("nebula.maven-publish") + id("com.netflix.nebula.maven-publish") sisyphus } diff --git a/build.gradle.kts b/build.gradle.kts index 10bf9b0a..3909c0b2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("nebula.contacts") + id("com.netflix.nebula.contacts") } contacts { @@ -8,19 +8,4 @@ contacts { github = "devkanro" roles.add("owner") }) - addPerson("wzlylv@163.com", delegateClosureOf { - moniker = "wangzheng" - github = "GuoDuanLZ" - roles.add("maintainer") - }) - addPerson("zhaoy_xin@163.com", delegateClosureOf { - moniker = "future" - github = "yuxin-zhao" - roles.add("maintainer") - }) - addPerson("jane.zhangjin@outlook.com", delegateClosureOf { - moniker = "ZhangJin" - github = "ZhangJin233" - roles.add("tester") - }) } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index fd465340..adb6534b 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -11,18 +11,14 @@ repositories { } dependencies { - implementation(platform("com.bybutter.sisyphus:sisyphus-dependencies:1.5.31")) - implementation("com.bybutter.sisyphus.tools:sisyphus-protobuf-gradle-plugin") - implementation("com.bybutter.sisyphus.tools:sisyphus-project-gradle-plugin") - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin") - implementation("org.jetbrains.kotlin:kotlin-allopen") - implementation("org.springframework.boot:spring-boot-gradle-plugin") - implementation("org.jlleitschuh.gradle:ktlint-gradle") - implementation("com.github.ben-manes:gradle-versions-plugin") - implementation("com.netflix.nebula:nebula-publishing-plugin") - implementation("com.netflix.nebula:gradle-contacts-plugin") - implementation("com.netflix.nebula:gradle-info-plugin") - implementation("org.gradle.kotlin:plugins") - implementation("com.gradle.publish:plugin-publish-plugin") - implementation("org.eclipse.jgit:org.eclipse.jgit") + implementation(libs.nebula.contacts) + implementation(libs.nebula.info) + implementation(libs.nebula.publishing) + implementation(libs.gradle.sisyphus) + implementation(libs.gradle.sisyphus.protobuf) + implementation(libs.gradle.ktlint) + implementation(libs.gradle.spring) + implementation(libs.gradle.kotlin) + implementation(libs.gradle.kotlin.allopen) + implementation(libs.gradle.plugin.publish) } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 00000000..fa8bc749 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,7 @@ +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/dependencies.kt b/buildSrc/src/main/kotlin/dependencies.kt deleted file mode 100644 index 2d1df96d..00000000 --- a/buildSrc/src/main/kotlin/dependencies.kt +++ /dev/null @@ -1,150 +0,0 @@ -import org.gradle.api.Project -import org.gradle.kotlin.dsl.dependencies - -object Dependencies { - object Kotlin { - private const val group = "org.jetbrains.kotlin" - const val stdlib = "$group:kotlin-stdlib-jdk8" - const val reflect = "$group:kotlin-reflect" - const val poet = "com.squareup:kotlinpoet" - const val plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin" - - object Coroutines { - private const val group = "org.jetbrains.kotlinx" - const val core = "$group:kotlinx-coroutines-core" - const val jdk = "$group:kotlinx-coroutines-jdk8" - const val reactive = "$group:kotlinx-coroutines-reactive" - } - } - - object Jackson { - private const val group = "com.fasterxml.jackson.core" - const val core = "$group:jackson-core" - - object Module { - private const val group = "com.fasterxml.jackson.module" - const val kotlin = "$group:jackson-module-kotlin" - } - - object Dataformat { - private const val group = "com.fasterxml.jackson.dataformat" - const val yaml = "$group:jackson-dataformat-yaml" - const val properties = "$group:jackson-dataformat-properties" - const val cbor = "$group:jackson-dataformat-cbor" - const val smile = "$group:jackson-dataformat-smile" - } - } - - object Spring { - object Framework { - private const val group = "org.springframework" - - const val webflux = "$group:spring-webflux" - - const val amqp = "$group.amqp:spring-rabbit" - - } - - object Boot { - private const val group = "org.springframework.boot" - - const val boot = "$group:spring-boot-starter" - - const val webflux = "$group:spring-boot-starter-webflux" - - const val jooq = "$group:spring-boot-starter-jooq" - - const val jdbc = "$group:spring-boot-starter-jdbc" - - const val test = "$group:spring-boot-starter-test" - - const val redis = "$group:spring-boot-starter-data-redis" - - const val amqp = "$group:spring-boot-starter-amqp" - - const val jackson = "$group:spring-boot-starter-json" - - const val actuator = "$group:spring-boot-starter-actuator" - } - } - - object Proto { - private const val group = "com.google.protobuf" - - const val base = "$group:protobuf-java" - const val apiCompiler = "com.google.api:api-compiler" - const val grpcProto = "com.google.api.grpc:proto-google-common-protos" - } - - object Grpc { - private const val group = "io.grpc" - - const val api = "$group:grpc-api" - - const val core = "$group:grpc-core" - - const val stub = "$group:grpc-stub" - - const val netty = "$group:grpc-netty" - - const val kotlin = "$group:grpc-kotlin-stub" - } - - object Maven { - private const val group = "org.apache.maven" - - const val resolver = "$group:maven-resolver-provider" - - const val resolverConnector = "$group.resolver:maven-resolver-connector-basic" - - const val resolverWagon = "$group.resolver:maven-resolver-transport-wagon" - - const val wagonFile = "$group.wagon:wagon-file" - - const val wagonHttp = "$group.wagon:wagon-http" - } - - const val elastic = "org.elasticsearch.client:elasticsearch-rest-client" - - const val mysql = "mysql:mysql-connector-java" - - const val postgresql = "org.postgresql:postgresql" - - const val junit = "org.junit.jupiter:junit-jupiter" - - const val hbase = "com.aliyun.hbase:alihbase-client" - - const val reflections = "org.reflections:reflections" - - const val jooq = "org.jooq:jooq" - - const val hikari = "com.zaxxer:HikariCP" - - const val h2 = "com.h2database:h2" - - const val kubeJavaClient = "io.kubernetes:client-java" - - const val retrofit = "com.squareup.retrofit2:retrofit" - - const val okhttp = "com.squareup.okhttp3:okhttp" - - const val resilience4j = "io.github.resilience4j:resilience4j-retrofit" - - const val antlr4 = "org.antlr:antlr4" - - const val swagger = "io.swagger.core.v3:swagger-core" - - const val rocketMq = "org.apache.rocketmq:rocketmq-client" - - const val rocketMqAcl = "org.apache.rocketmq:rocketmq-acl" - - const val mongo = "org.mongodb:mongodb-driver-reactivestreams" -} - -val Project.managedDependencies: Project - get() { - dependencies { - add("implementation", platform(project(":sisyphus-dependencies"))) - } - return this - } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/kotlin.kt b/buildSrc/src/main/kotlin/kotlin.kt deleted file mode 100644 index d05dc0c7..00000000 --- a/buildSrc/src/main/kotlin/kotlin.kt +++ /dev/null @@ -1,26 +0,0 @@ -import org.gradle.api.Project -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -val Project.kotlin: Project - get() { - apply { - plugin("kotlin") - plugin("kotlin-spring") - plugin("org.jlleitschuh.gradle.ktlint") - } - - dependencies { - add("api", Dependencies.Kotlin.stdlib) - add("api", Dependencies.Kotlin.reflect) - add("api", Dependencies.Kotlin.Coroutines.core) - } - - tasks.withType { - kotlinOptions.jvmTarget = "1.8" - kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" - } - - return this - } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/project.kt b/buildSrc/src/main/kotlin/project.kt index 8431047d..2c4bef0f 100644 --- a/buildSrc/src/main/kotlin/project.kt +++ b/buildSrc/src/main/kotlin/project.kt @@ -1,5 +1,4 @@ import com.bybutter.sisyphus.project.gradle.SisyphusProjectPlugin -import com.github.benmanes.gradle.versions.VersionsPlugin import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.JavaLibraryPlugin @@ -8,14 +7,13 @@ import org.gradle.api.tasks.testing.Test import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.withType import org.gradle.plugins.ide.idea.IdeaPlugin +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val Project.java: Project get() { pluginManager.apply(JavaLibraryPlugin::class.java) pluginManager.apply(SisyphusProjectPlugin::class.java) - managedDependencies - tasks.withType { sourceCompatibility = JavaVersion.VERSION_1_8.majorVersion targetCompatibility = JavaVersion.VERSION_1_8.majorVersion @@ -23,21 +21,37 @@ val Project.java: Project return this } +val Project.kotlin: Project + get() { + apply { + plugin("kotlin") + plugin("kotlin-spring") + plugin("org.jlleitschuh.gradle.ktlint") + } + + dependencies { + add("api", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") + add("implementation", "org.jetbrains.kotlin:kotlin-reflect") + } + + tasks.withType { + kotlinOptions.jvmTarget = "1.8" + kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" + } + + return this + } + val Project.next: Project get() { pluginManager.apply(IdeaPlugin::class.java) - pluginManager.apply(VersionsPlugin::class.java) - java.kotlin.managedDependencies + java.kotlin tasks.withType { useJUnitPlatform() } - tasks.withType { - sourceCompatibility = JavaVersion.VERSION_1_8.majorVersion - targetCompatibility = JavaVersion.VERSION_1_8.majorVersion - } return this } @@ -46,10 +60,6 @@ val Project.middleware: Project next group = "com.bybutter.sisyphus.middleware" - - dependencies { - "api"(Dependencies.Spring.Boot.boot) - } return this } @@ -61,28 +71,11 @@ val Project.lib: Project return this } -val Project.proto: Project - get() { - java - - group = "com.bybutter.sisyphus.proto" - - pluginManager.apply(JavaLibraryPlugin::class.java) - pluginManager.apply(SisyphusProjectPlugin::class.java) - - return this - } - val Project.starter: Project get() { next group = "com.bybutter.sisyphus.starter" - - dependencies { - "api"(Dependencies.Spring.Boot.boot) - "testImplementation"(Dependencies.Spring.Boot.test) - } return this } diff --git a/dependencies/build.gradle.kts b/dependencies/build.gradle.kts deleted file mode 100644 index 239ff030..00000000 --- a/dependencies/build.gradle.kts +++ /dev/null @@ -1,61 +0,0 @@ -plugins { - `java-platform` - id("nebula.maven-publish") - sisyphus -} - -group = "com.bybutter.sisyphus" -description = "Dependencies of Sisyphus Project (Bill of Materials)" - -javaPlatform { - allowDependencies() -} - -dependencies { - api(platform(project(":sisyphus-bom"))) - api(platform("com.google.protobuf:protobuf-bom:3.21.5")) - api(platform("io.grpc:grpc-bom:1.48.1")) - api(platform("io.micrometer:micrometer-bom:1.9.3")) - api(platform("org.apache.maven:maven:3.8.6")) - api(platform("org.apache.rocketmq:rocketmq-all:4.7.1")) - api(platform("org.jetbrains.kotlin:kotlin-bom:1.7.10")) - api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4")) - api(platform("org.junit:junit-bom:5.9.0")) - api(platform("org.springframework.boot:spring-boot-dependencies:2.7.2")) - api(platform("com.fasterxml.jackson:jackson-bom:2.13.3")) - - constraints { - api("com.aliyun.hbase:alihbase-client:2.8.7") - api("com.android.tools.build:gradle:4.1.2") - api("com.github.ben-manes:gradle-versions-plugin:0.28.0") - api("com.google.api.grpc:proto-google-common-protos:2.9.2") - api("com.google.api:api-common:2.2.1") - api("com.google.api:api-compiler:0.0.8") - api("com.gradle.publish:plugin-publish-plugin:0.21.0") - api("com.netflix.nebula:gradle-contacts-plugin:6.0.0") - api("com.netflix.nebula:gradle-info-plugin:11.3.3") - api("com.netflix.nebula:nebula-publishing-plugin:18.4.0") - api("com.bmuschko:gradle-docker-plugin:8.1.0") - api("com.salesforce.servicelibs:rxgrpc-stub:1.2.3") - api("com.squareup.okhttp3:okhttp:4.10.0") - api("com.squareup.retrofit2:retrofit:2.9.0") - api("com.squareup:kotlinpoet:1.11.0") - api("io.github.resilience4j:resilience4j-retrofit:1.7.1") - api("io.github.resilience4j:resilience4j-circuitbreaker:1.7.1") - api("io.grpc:grpc-kotlin-stub:1.3.0") - api("io.kubernetes:client-java:15.0.1") - api("io.swagger.core.v3:swagger-core:2.2.1") - api("org.antlr:antlr4:4.10.1") - api("org.antlr:antlr4-runtime:4.10.1") - api("org.apache.maven.wagon:wagon-http:3.5.1") - api("org.eclipse.jgit:org.eclipse.jgit:6.2.0.202206071550-r") - api("org.gradle.kotlin:plugins:1.3.6") - api("org.jetbrains.kotlin:kotlin-allopen:1.7.10") - api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10") - api("org.jlleitschuh.gradle:ktlint-gradle:10.3.0") - api("org.jooq:jooq:3.17.2") - api("org.mongodb:mongodb-driver-reactivestreams:4.6.1") - api("org.reflections:reflections:0.10.2") - api("org.springframework.boot:spring-boot-gradle-plugin:2.7.2") - } -} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..ac26a436 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,150 @@ +[versions] +protobuf = "3.22.0" +grpc = "1.53.0" +grpc-kotlin = "1.3.0" +grpc-rxjava = "1.2.3" +kotlin = "1.8.10" +kotlinx-coroutines = "1.6.4" +junit-platform = "1.9.2" +junit-jupiter = "5.9.0" +spring-boot = "2.7.9" +spring-framework = "5.3.13" +spring-rabbit = "2.4.10" +jackson = "2.13.3" +mysql = "8.0.32" +logback = "1.2.6" +postgresql = "42.5.4" +nebula-contacts = "7.0.0" +nebula-info = "12.0.1" +nebula-publishing = "20.1.0" +gradle-docker = "8.1.0" +okhttp = "4.10.0" +retrofit = "2.9.0" +kotlinpoet = "1.12.0" +resilience4j = "1.7.1" +antlr4 = "4.10.1" +maven = "3.9.0" +maven-resolver = "1.9.4" +maven-wagon = "3.5.3" +jgit = "6.4.0.202211300538-r" +jooq = "3.17.8" +mongodb = "4.9.0" +reflections = "0.10.2" +ktlint = "11.3.1" +sisyphus-project-plugin = "1.7.0" +sisyphus-protobuf-plugin = "1.7.0" +plugin-publishing = "1.1.0" +google-commonProtos = "2.14.2" +google-apiCommon = "2.6.2" +rxjava = "2.2.21" +gson = "2.9.1" +elastic = "7.15.2" +kubernetes = "15.0.1" +hbase = "2.8.7" +hikari = "5.0.1" +h2 = "2.1.214" +rocketmq = "4.7.1" +swagger = "2.2.8" + +[libraries] +protobuf-bom = { module = "com.google.protobuf:protobuf-bom", version.ref = "protobuf" } +protobuf-java = { module = "com.google.protobuf:protobuf-java", version.ref = "protobuf" } + +grpc-bom = { module = "io.grpc:grpc-bom", version.ref = "grpc" } +grpc-netty = { module = "io.grpc:grpc-netty", version.ref = "grpc" } +grpc-api = { module = "io.grpc:grpc-api", version.ref = "grpc" } +grpc-core = { module = "io.grpc:grpc-core", version.ref = "grpc" } +grpc-stub = { module = "io.grpc:grpc-stub", version.ref = "grpc" } +grpc-kotlin = { module = "io.grpc:grpc-kotlin-stub", version.ref = "grpc-kotlin" } +grpc-rxjava = { module = "com.salesforce.servicelibs:rxgrpc-stub", version.ref = "grpc-rxjava" } + +mysql-connector = { module = "com.mysql:mysql-connector-j", version.ref = "mysql" } +postgresql-connector = { module = "org.postgresql:postgresql", version.ref = "postgresql" } + +nebula-info = { module = "com.netflix.nebula:gradle-info-plugin", version.ref = "nebula-info" } +nebula-publishing = { module = "com.netflix.nebula:nebula-publishing-plugin", version.ref = "nebula-publishing" } +nebula-contacts = { module = "com.netflix.nebula:gradle-contacts-plugin", version.ref = "nebula-contacts" } + +gradle-docker = { module = "com.bmuschko:gradle-docker-plugin", version.ref = "gradle-docker" } +gradle-sisyphus = { module = "com.bybutter.sisyphus.tools:sisyphus-project-gradle-plugin", version.ref = "sisyphus-project-plugin" } +gradle-sisyphus-protobuf = { module = "com.bybutter.sisyphus.tools:sisyphus-protobuf-gradle-plugin", version.ref = "sisyphus-protobuf-plugin" } +gradle-spring = { module = "org.springframework.boot:spring-boot-gradle-plugin", version.ref = "spring-boot" } +gradle-ktlint = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlint" } +gradle-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +gradle-kotlin-allopen = { module = "org.jetbrains.kotlin:kotlin-allopen", version.ref = "kotlin" } +gradle-plugin-publish = { module = "com.gradle.publish:plugin-publish-plugin", version.ref = "plugin-publishing" } + +spring-boot = { module = "org.springframework.boot:spring-boot-starter", version.ref = "spring-boot" } +spring-boot-test = { module = "org.springframework.boot:spring-boot-starter-test", version.ref = "spring-boot" } +spring-boot-redis = { module = "org.springframework.boot:spring-boot-starter-data-redis", version.ref = "spring-boot" } +spring-boot-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator", version.ref = "spring-boot" } +spring-boot-json = { module = "org.springframework.boot:spring-boot-starter-json", version.ref = "spring-boot" } +spring-boot-webflux = { module = "org.springframework.boot:spring-boot-starter-webflux", version.ref = "spring-boot" } +spring-framework-amqp = { module = "org.springframework.amqp:spring-rabbit", version.ref = "spring-rabbit" } + +antlr4-runtime = { module = "org.antlr:antlr4-runtime", version.ref = "antlr4" } +antlr4 = { module = "org.antlr:antlr4", version.ref = "antlr4" } + +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } +kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } +kotlin-coroutines-jdk = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8", version.ref = "kotlinx-coroutines" } +kotlin-coroutines-reactive = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactive", version.ref = "kotlinx-coroutines" } + +junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" } +junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit-jupiter" } +junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit-jupiter" } +junit-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-platform" } + +google-commonProtos = { module = "com.google.api.grpc:proto-google-common-protos", version.ref = "google-commonProtos" } +google-apiCommon = { module = "com.google.api:api-common", version.ref = "google-apiCommon" } + +rxjava = { module = "io.reactivex.rxjava2:rxjava", version.ref = "rxjava" } + +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } + +jackson = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson" } +jackson-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } +jackson-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" } +jackson-properties = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-properties", version.ref = "jackson" } +jackson-smile = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", version.ref = "jackson" } +jackson-cbor = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", version.ref = "jackson" } + +reflections = { module = "org.reflections:reflections", version.ref = "reflections" } + +maven-resolver = { module = "org.apache.maven:maven-resolver-provider", version.ref = "maven" } +maven-resolver-connector = { module = "org.apache.maven.resolver:maven-resolver-connector-basic", version.ref = "maven-resolver" } +maven-resolver-wagon = { module = "org.apache.maven.resolver:maven-resolver-transport-wagon", version.ref = "maven-resolver" } +maven-wagon-file = { module = "org.apache.maven.wagon:wagon-file", version.ref = "maven-wagon" } +maven-wagon-http = { module = "org.apache.maven.wagon:wagon-http", version.ref = "maven-wagon" } + +elastic-rest = { module = "org.elasticsearch.client:elasticsearch-rest-client", version.ref = "elastic" } + +kubernetes = { module = "io.kubernetes:client-java", version.ref = "kubernetes" } + +hbase = { module = "com.aliyun.hbase:alihbase-client", version.ref = "hbase" } + +hikari = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } + +h2 = { module = "com.h2database:h2", version.ref = "h2" } + +mongodb = { module = "org.mongodb:mongodb-driver-reactivestreams", version.ref = "mongodb" } + +jooq = { module = "org.jooq:jooq", version.ref = "jooq" } + +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } + +okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } + +resilience4j-retrofit = { module = "io.github.resilience4j:resilience4j-retrofit", version.ref = "resilience4j" } +resilience4j-circuitbreaker = { module = "io.github.resilience4j:resilience4j-circuitbreaker", version.ref = "resilience4j" } + +rocketmq = { module = "org.apache.rocketmq:rocketmq-client", version.ref = "rocketmq" } +rocketmq-acl = { module = "org.apache.rocketmq:rocketmq-acl", version.ref = "rocketmq" } + +swagger = { module = "io.swagger.core.v3:swagger-core", version.ref = "swagger" } + +kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" } + +[plugins] +nebula-maven = { id = "com.netflix.nebula.maven-publish", version.ref = "nebula-publishing" } +nebula-contacts = { id = "com.netflix.nebula.contacts", version.ref = "nebula-contacts" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8fad3f5a..3796d3cd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/lib/sisyphus-common/build.gradle.kts b/lib/sisyphus-common/build.gradle.kts index c3ac5243..98195712 100644 --- a/lib/sisyphus-common/build.gradle.kts +++ b/lib/sisyphus-common/build.gradle.kts @@ -7,5 +7,6 @@ plugins { description = "Common lib of Sisyphus Project" dependencies { - compileOnly(Dependencies.Spring.Boot.boot) + compileOnly(libs.spring.boot) + compileOnly(libs.kotlin.coroutines) } diff --git a/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/data/ByteArrays.kt b/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/data/ByteArrays.kt index e2f68d0d..63621346 100644 --- a/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/data/ByteArrays.kt +++ b/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/data/ByteArrays.kt @@ -111,15 +111,17 @@ inline fun ByteArray.trim(predicate: (Byte) -> Boolean): ByteArray { val match = predicate(this[index]) if (!startFound) { - if (!match) + if (!match) { startFound = true - else + } else { startIndex += 1 + } } else { - if (!match) + if (!match) { break - else + } else { endIndex -= 1 + } } } @@ -128,16 +130,18 @@ inline fun ByteArray.trim(predicate: (Byte) -> Boolean): ByteArray { inline fun ByteArray.trimStart(predicate: (Byte) -> Boolean): ByteArray { for (index in this.indices) - if (!predicate(this[index])) + if (!predicate(this[index])) { return copyOfRange(index, size) + } return byteArrayOf() } inline fun ByteArray.trimEnd(predicate: (Byte) -> Boolean): ByteArray { for (index in this.indices.reversed()) - if (!predicate(this[index])) + if (!predicate(this[index])) { return copyOfRange(0, index + 1) + } return byteArrayOf() } diff --git a/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/string/PathMatcher.kt b/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/string/PathMatcher.kt index 5fe16413..da9394d0 100644 --- a/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/string/PathMatcher.kt +++ b/lib/sisyphus-common/src/main/kotlin/com/bybutter/sisyphus/string/PathMatcher.kt @@ -82,7 +82,9 @@ object PathMatcher { // string: a/bc/ return if (pc == sc) { normalMatch(pat, p + 1, str, si + 1, pathDelimiters) - } else false + } else { + false + } // Not matched string in current path part. // ↓ ↓ // pattern: a/* a/*d diff --git a/lib/sisyphus-dsl/build.gradle.kts b/lib/sisyphus-dsl/build.gradle.kts index a8664029..a78a7e3b 100644 --- a/lib/sisyphus-dsl/build.gradle.kts +++ b/lib/sisyphus-dsl/build.gradle.kts @@ -9,15 +9,13 @@ plugins { description = "Utils and toolkit for building gRPC service easier" dependencies { - api(project(":lib:sisyphus-grpc")) + api(libs.antlr4.runtime) + api(projects.lib.sisyphusGrpc) + implementation(projects.lib.sisyphusCommon) - implementation(project(":lib:sisyphus-common")) - api("org.antlr:antlr4-runtime") + antlr(libs.antlr4) - antlr(platform(project(":sisyphus-dependencies"))) - antlr("org.antlr:antlr4") - - testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation(libs.junit.jupiter) } configurations { diff --git a/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelContext.kt b/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelContext.kt index 38b846e4..1625f9f8 100644 --- a/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelContext.kt +++ b/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelContext.kt @@ -148,7 +148,9 @@ class CelContext internal constructor(private val engine: CelEngine, global: Map is CelParser.SelectOrCallContext -> { if (member.open != null) { engine.runtime.invokeMarco( - this, visit(member.member()), member.IDENTIFIER().text, + this, + visit(member.member()), + member.IDENTIFIER().text, member.args?.e ?: listOf() ) { return it } @@ -189,12 +191,15 @@ class CelContext internal constructor(private val engine: CelEngine, global: Map is CelParser.IdentOrGlobalCallContext -> { if (primary.op != null) { engine.runtime.invokeMarco( - this, null, primary.IDENTIFIER().text, + this, + null, + primary.IDENTIFIER().text, primary.args?.e ?: listOf() ) { return it } engine.runtime.invoke( - null, primary.IDENTIFIER().text, + null, + primary.IDENTIFIER().text, primary.args?.e?.map { visit(it) } ?: listOf() ) diff --git a/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelRuntime.kt b/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelRuntime.kt index c7d9b018..f3d8dc4e 100644 --- a/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelRuntime.kt +++ b/lib/sisyphus-dsl/src/main/kotlin/com/bybutter/sisyphus/dsl/cel/CelRuntime.kt @@ -82,10 +82,12 @@ open class CelRuntime(val macro: CelMacro = CelMacro(), val std: CelStandardLibr private fun KFunction<*>.compatibleWith(th: Any?, arguments: List): Boolean { val thType = this.extensionReceiverParameter?.type?.classifier as? KClass<*> - if (th == null && thType == null) return compatibleWith( - listOfNotNull(this.extensionReceiverParameter) + this.valueParameters, - arguments - ) + if (th == null && thType == null) { + return compatibleWith( + listOfNotNull(this.extensionReceiverParameter) + this.valueParameters, + arguments + ) + } if (th == null || thType == null) return false if (!thType.isInstance(th)) return false return compatibleWith(valueParameters, arguments) diff --git a/lib/sisyphus-dsl/src/test/kotlin/com/bybutter/sisyphus/dsl/cel/test/CelEngineTest.kt b/lib/sisyphus-dsl/src/test/kotlin/com/bybutter/sisyphus/dsl/cel/test/CelEngineTest.kt index 0017e836..5c2a2feb 100644 --- a/lib/sisyphus-dsl/src/test/kotlin/com/bybutter/sisyphus/dsl/cel/test/CelEngineTest.kt +++ b/lib/sisyphus-dsl/src/test/kotlin/com/bybutter/sisyphus/dsl/cel/test/CelEngineTest.kt @@ -134,7 +134,8 @@ class CelEngineTest { val result = engine.eval( """ .sisyphus.api.cel.test.ConditionalTest { | condition: true - |} """.trimMargin() + |} + """.trimMargin() ) result } diff --git a/lib/sisyphus-dto/build.gradle.kts b/lib/sisyphus-dto/build.gradle.kts index 62257c1f..9bb5fb34 100644 --- a/lib/sisyphus-dto/build.gradle.kts +++ b/lib/sisyphus-dto/build.gradle.kts @@ -7,10 +7,10 @@ plugins { description = "Easy to create struct in Sisyphus" dependencies { - compileOnly(project(":lib:sisyphus-jackson")) - implementation(project(":lib:sisyphus-common")) + compileOnly(projects.lib.sisyphusJackson) - implementation(Dependencies.Kotlin.reflect) + implementation(projects.lib.sisyphusCommon) + implementation(libs.kotlin.reflect) - testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation(libs.junit.jupiter) } diff --git a/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/ModelProxy.kt b/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/ModelProxy.kt index cfe70ae3..cea1ddb2 100644 --- a/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/ModelProxy.kt +++ b/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/ModelProxy.kt @@ -81,7 +81,9 @@ open class ModelProxy constructor( override fun equals(other: Any?): Boolean { return if (other is DtoModel) { super.equals(Proxy.getInvocationHandler(other)) - } else super.equals(other) + } else { + super.equals(other) + } } override fun hashCode(): Int { diff --git a/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/jackson/ModelSerializer.kt b/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/jackson/ModelSerializer.kt index b19391fc..79c33a7d 100644 --- a/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/jackson/ModelSerializer.kt +++ b/lib/sisyphus-dto/src/main/kotlin/com/bybutter/sisyphus/dto/jackson/ModelSerializer.kt @@ -27,7 +27,8 @@ internal class ModelSerializer : BeanSerializerBase { filteredProperties: Array? ) : super( source, - properties, filteredProperties + properties, + filteredProperties ) constructor(source: ModelSerializer, toIgnore: MutableSet?, toInclude: MutableSet?) : super( diff --git a/lib/sisyphus-grpc-coroutine/build.gradle.kts b/lib/sisyphus-grpc-coroutine/build.gradle.kts index a3e117a8..c8295145 100644 --- a/lib/sisyphus-grpc-coroutine/build.gradle.kts +++ b/lib/sisyphus-grpc-coroutine/build.gradle.kts @@ -8,15 +8,16 @@ plugins { description = "Sisyphus customized gRPC runtime for Kotlin coroutine(full support)" dependencies { - api(project(":lib:sisyphus-grpc")) - api(Dependencies.Grpc.stub) - api(Dependencies.Grpc.kotlin) { + api(projects.lib.sisyphusGrpc) + api(libs.kotlin.coroutines) + api(libs.grpc.stub) + api(libs.grpc.kotlin) { exclude("io.grpc", "grpc-protobuf") } - implementation(project(":lib:sisyphus-jackson")) + implementation(projects.lib.sisyphusJackson) - proto(project(":lib:sisyphus-grpc")) + proto(libs.google.commonProtos) } protobuf { diff --git a/lib/sisyphus-grpc-rxjava/build.gradle.kts b/lib/sisyphus-grpc-rxjava/build.gradle.kts index 116f0d95..54d63d14 100644 --- a/lib/sisyphus-grpc-rxjava/build.gradle.kts +++ b/lib/sisyphus-grpc-rxjava/build.gradle.kts @@ -8,13 +8,12 @@ plugins { description = "Sisyphus customized gRPC runtime for RxJava2(client only)" dependencies { - api(project(":lib:sisyphus-grpc")) - api("com.salesforce.servicelibs:rxgrpc-stub") - api("io.reactivex.rxjava2:rxjava") - api("io.grpc:grpc-stub") + api(projects.lib.sisyphusGrpc) + api(libs.grpc.stub) + api(libs.grpc.rxjava) + api(libs.rxjava) - proto(platform(project(":sisyphus-dependencies"))) - proto(Dependencies.Proto.grpcProto) + proto(libs.google.commonProtos) } protobuf { diff --git a/lib/sisyphus-grpc-rxjava/src/main/kotlin/com/bybutter/sisyphus/rpc/AbstractReactiveStub.kt b/lib/sisyphus-grpc-rxjava/src/main/kotlin/com/bybutter/sisyphus/rpc/AbstractReactiveStub.kt index 74da9d19..f8d324cc 100644 --- a/lib/sisyphus-grpc-rxjava/src/main/kotlin/com/bybutter/sisyphus/rpc/AbstractReactiveStub.kt +++ b/lib/sisyphus-grpc-rxjava/src/main/kotlin/com/bybutter/sisyphus/rpc/AbstractReactiveStub.kt @@ -52,7 +52,8 @@ abstract class AbstractReactiveStub>( { req, res -> io.grpc.stub.ClientCalls.asyncUnaryCall( channel.newCall(method, options), - req, res + req, + res ) }, options @@ -69,7 +70,8 @@ abstract class AbstractReactiveStub>( { req, res -> io.grpc.stub.ClientCalls.asyncServerStreamingCall( channel.newCall(method, options), - req, res + req, + res ) }, options diff --git a/lib/sisyphus-grpc/build.gradle.kts b/lib/sisyphus-grpc/build.gradle.kts index e2d64e6e..287ff332 100644 --- a/lib/sisyphus-grpc/build.gradle.kts +++ b/lib/sisyphus-grpc/build.gradle.kts @@ -8,12 +8,11 @@ plugins { description = "Sisyphus customized gRPC runtime" dependencies { - api(project(":lib:sisyphus-protobuf")) - api(Dependencies.Grpc.api) - api("com.google.api:api-common") + api(projects.lib.sisyphusProtobuf) + api(libs.grpc.api) + api(libs.google.apiCommon) - proto(platform(project(":sisyphus-dependencies"))) - proto(Dependencies.Proto.grpcProto) + proto(libs.google.commonProtos) } protobuf { diff --git a/lib/sisyphus-grpc/src/main/kotlin/com/bybutter/sisyphus/rpc/Extensions.kt b/lib/sisyphus-grpc/src/main/kotlin/com/bybutter/sisyphus/rpc/Extensions.kt index b25771ee..efa26116 100644 --- a/lib/sisyphus-grpc/src/main/kotlin/com/bybutter/sisyphus/rpc/Extensions.kt +++ b/lib/sisyphus-grpc/src/main/kotlin/com/bybutter/sisyphus/rpc/Extensions.kt @@ -112,7 +112,7 @@ operator fun ResourceInfo.Companion.invoke( resourceType: String, resourceName: String, description: String, - owner: String = "", + owner: String = "" ): ResourceInfo { return ResourceInfo { this.resourceType = resourceType diff --git a/lib/sisyphus-gson-protobuf/build.gradle.kts b/lib/sisyphus-gson-protobuf/build.gradle.kts index 4bbf5b74..63b6d0b3 100644 --- a/lib/sisyphus-gson-protobuf/build.gradle.kts +++ b/lib/sisyphus-gson-protobuf/build.gradle.kts @@ -7,6 +7,6 @@ plugins { description = "Gson support for Sisyphus protobuf runtime customized message" dependencies { - api("com.google.code.gson:gson:2.9.1") - api(project(":lib:sisyphus-protobuf")) + api(projects.lib.sisyphusProtobuf) + api(libs.gson) } diff --git a/lib/sisyphus-jackson-protobuf/build.gradle.kts b/lib/sisyphus-jackson-protobuf/build.gradle.kts index 9add481c..783196cc 100644 --- a/lib/sisyphus-jackson-protobuf/build.gradle.kts +++ b/lib/sisyphus-jackson-protobuf/build.gradle.kts @@ -7,6 +7,6 @@ plugins { description = "Jackson support for Sisyphus protobuf runtime customized message" dependencies { - api(project(":lib:sisyphus-jackson")) - api(project(":lib:sisyphus-protobuf")) + api(projects.lib.sisyphusJackson) + api(projects.lib.sisyphusProtobuf) } diff --git a/lib/sisyphus-jackson/build.gradle.kts b/lib/sisyphus-jackson/build.gradle.kts index 08ab4aab..b516c900 100644 --- a/lib/sisyphus-jackson/build.gradle.kts +++ b/lib/sisyphus-jackson/build.gradle.kts @@ -7,12 +7,13 @@ plugins { description = "Jackson utils for Sisyphus" dependencies { - api(project(":lib:sisyphus-common")) - api(Dependencies.Jackson.Module.kotlin) - api(Dependencies.Jackson.Dataformat.yaml) - compileOnly(Dependencies.Jackson.Dataformat.cbor) - compileOnly(Dependencies.Jackson.Dataformat.smile) - compileOnly(Dependencies.Jackson.Dataformat.properties) + api(projects.lib.sisyphusCommon) + api(libs.jackson.kotlin) + api(libs.jackson.yaml) - implementation(Dependencies.Kotlin.reflect) + implementation(libs.kotlin.reflect) + + compileOnly(libs.jackson.cbor) + compileOnly(libs.jackson.smile) + compileOnly(libs.jackson.properties) } diff --git a/lib/sisyphus-protobuf/build.gradle.kts b/lib/sisyphus-protobuf/build.gradle.kts index 5b2d794b..a4c6f515 100644 --- a/lib/sisyphus-protobuf/build.gradle.kts +++ b/lib/sisyphus-protobuf/build.gradle.kts @@ -8,15 +8,14 @@ plugins { description = "Sisyphus customized Protobuf runtime for Kotlin" dependencies { - api(project(":lib:sisyphus-common")) + api(projects.lib.sisyphusCommon) - proto(platform(project(":sisyphus-dependencies"))) - proto(Dependencies.Proto.base) + proto(libs.protobuf.java) - testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation(project(":lib:sisyphus-grpc")) - testImplementation(project(":lib:sisyphus-gson-protobuf")) - testImplementation(project(":lib:sisyphus-jackson-protobuf")) + testImplementation(libs.junit.jupiter) + testImplementation(projects.lib.sisyphusGrpc) + testImplementation(projects.lib.sisyphusGsonProtobuf) + testImplementation(projects.lib.sisyphusJacksonProtobuf) } protobuf { diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/MeasureWriter.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/MeasureWriter.kt index 5494c46e..de4a7e7e 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/MeasureWriter.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/MeasureWriter.kt @@ -37,57 +37,46 @@ class MeasureWriter : Writer { } override fun uint32(value: UInt): MeasureWriter { - return append(value.toInt().varintSize) } override fun sint32(value: Int): MeasureWriter { - return append(value.encodeZigZag().varintSize) } override fun fixed32(value: UInt): MeasureWriter { - return append(4) } override fun sfixed32(value: Int): MeasureWriter { - return append(4) } override fun int64(value: Long): MeasureWriter { - return append(value.varintSize) } override fun uint64(value: ULong): MeasureWriter { - return append(value.toLong().varintSize) } override fun sint64(value: Long): MeasureWriter { - return append(value.encodeZigZag().varintSize) } override fun fixed64(value: ULong): MeasureWriter { - return append(8) } override fun sfixed64(value: Long): MeasureWriter { - return append(8) } override fun float(value: Float): MeasureWriter { - return append(4) } override fun double(value: Double): MeasureWriter { - return append(8) } @@ -138,7 +127,7 @@ class MeasureWriter : Writer { class LdMark private constructor( private val parent: LdMark? = null, - private val list: MutableList = parent?.list ?: mutableListOf(), + private val list: MutableList = parent?.list ?: mutableListOf() ) { constructor() : this(null) diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/Reader.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/Reader.kt index a60ccc54..2866ad7c 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/Reader.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/Reader.kt @@ -81,7 +81,7 @@ class Reader(private val inputStream: InputStream) { when (wireType) { WireType.VARINT.ordinal, WireType.FIXED32.ordinal, - WireType.FIXED64.ordinal, + WireType.FIXED64.ordinal -> block(this) WireType.LENGTH_DELIMITED.ordinal -> nested(block) diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/StreamWriter.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/StreamWriter.kt index 6d505aa3..afb967ff 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/StreamWriter.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/coded/StreamWriter.kt @@ -48,7 +48,7 @@ class StreamWriter(private val stream: OutputStream, mark: MeasureWriter.LdMark) (value and 0xFF).toByte(), ((value ushr 8) and 0xFF).toByte(), ((value ushr 16) and 0xFF).toByte(), - ((value ushr 24) and 0xFF).toByte(), + ((value ushr 24) and 0xFF).toByte() ) ) return this @@ -87,7 +87,7 @@ class StreamWriter(private val stream: OutputStream, mark: MeasureWriter.LdMark) ((value ushr 32) and 0xFF).toByte(), ((value ushr 40) and 0xFF).toByte(), ((value ushr 48) and 0xFF).toByte(), - ((value ushr 56) and 0xFF).toByte(), + ((value ushr 56) and 0xFF).toByte() ) ) return this diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractDynamicField.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractDynamicField.kt index 3ac8290c..ab606d8a 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractDynamicField.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractDynamicField.kt @@ -3,7 +3,7 @@ package com.bybutter.sisyphus.protobuf.dynamic import com.bybutter.sisyphus.protobuf.primitives.FieldDescriptorProto abstract class AbstractDynamicField( - private val descriptor: FieldDescriptorProto, + private val descriptor: FieldDescriptorProto ) : DynamicField { protected abstract var value: T protected var hasValue = false diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractPackableDynamicField.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractPackableDynamicField.kt index 81c3244c..2a4525c6 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractPackableDynamicField.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractPackableDynamicField.kt @@ -4,7 +4,7 @@ import com.bybutter.sisyphus.protobuf.coded.Reader import com.bybutter.sisyphus.protobuf.primitives.FieldDescriptorProto abstract class AbstractPackableDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractDynamicField(descriptor) { abstract fun read0(reader: Reader, field: Int, wire: Int) diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractRepeatedPackableDynamicField.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractRepeatedPackableDynamicField.kt index 75ff6be6..78fe2735 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractRepeatedPackableDynamicField.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/AbstractRepeatedPackableDynamicField.kt @@ -6,7 +6,7 @@ import com.bybutter.sisyphus.protobuf.coded.Writer import com.bybutter.sisyphus.protobuf.primitives.FieldDescriptorProto abstract class AbstractRepeatedPackableDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractRepeatedDynamicField(descriptor) { abstract fun read0(reader: Reader, field: Int, wire: Int) diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/DynamicField.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/DynamicField.kt index 530f4ce7..7fa21df0 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/DynamicField.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/DynamicField.kt @@ -548,7 +548,7 @@ class RepeatedSInt32DynamicField(descriptor: FieldDescriptorProto) : } class EnumDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractPackableDynamicField>(descriptor) { private val support = ProtoReflection.findEnumSupport(descriptor().typeName) @@ -570,7 +570,7 @@ class EnumDynamicField( } class RepeatedEnumDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractRepeatedPackableDynamicField>(descriptor) { private val support = ProtoReflection.findEnumSupport(descriptor().typeName) @@ -584,7 +584,7 @@ class RepeatedEnumDynamicField( } class MessageDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractDynamicField?>(descriptor) { private val support = ProtoReflection.findMessageSupport(descriptor().typeName) @@ -610,7 +610,7 @@ class MessageDynamicField( } class RepeatedMessageDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractRepeatedDynamicField>(descriptor) { private val support = ProtoReflection.findMessageSupport(descriptor().typeName) @@ -630,7 +630,7 @@ class RepeatedMessageDynamicField( } class AnyDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractDynamicField?>(descriptor) { override var value: Message<*, *>? = defaultValue() @@ -657,7 +657,7 @@ class AnyDynamicField( } class RepeatedAnyDynamicField( - descriptor: FieldDescriptorProto, + descriptor: FieldDescriptorProto ) : AbstractRepeatedDynamicField>(descriptor) { override fun writeTo(writer: Writer) { diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/MapDynamicField.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/MapDynamicField.kt index ae412dea..581cb46f 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/MapDynamicField.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/dynamic/MapDynamicField.kt @@ -9,7 +9,7 @@ import com.bybutter.sisyphus.protobuf.findMapEntryDescriptor import com.bybutter.sisyphus.protobuf.primitives.FieldDescriptorProto class MapDynamicField( - private val descriptor: FieldDescriptorProto, + private val descriptor: FieldDescriptorProto ) : DynamicField> { private val map = mutableMapOf() diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Reader.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Reader.kt index 97cbd2e1..dbd25e92 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Reader.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Reader.kt @@ -158,20 +158,20 @@ internal fun JsonReader.readRepeated(field: FieldDescriptorProto): Any { val key = when (keyField.type) { FieldDescriptorProto.Type.SINT64, FieldDescriptorProto.Type.SFIXED64, - FieldDescriptorProto.Type.INT64, + FieldDescriptorProto.Type.INT64 -> keyName.toLong() FieldDescriptorProto.Type.FIXED64, - FieldDescriptorProto.Type.UINT64, + FieldDescriptorProto.Type.UINT64 -> keyName.toULong() FieldDescriptorProto.Type.SINT32, FieldDescriptorProto.Type.SFIXED32, - FieldDescriptorProto.Type.INT32, + FieldDescriptorProto.Type.INT32 -> keyName.toInt() FieldDescriptorProto.Type.UINT32, - FieldDescriptorProto.Type.FIXED32, + FieldDescriptorProto.Type.FIXED32 -> keyName.toUInt() FieldDescriptorProto.Type.BOOL -> keyName == "true" @@ -203,20 +203,20 @@ internal fun JsonReader.readField(field: FieldDescriptorProto): Any? { FieldDescriptorProto.Type.FLOAT -> float() FieldDescriptorProto.Type.SFIXED64, FieldDescriptorProto.Type.SINT64, - FieldDescriptorProto.Type.INT64, + FieldDescriptorProto.Type.INT64 -> long() FieldDescriptorProto.Type.FIXED64, - FieldDescriptorProto.Type.UINT64, + FieldDescriptorProto.Type.UINT64 -> ulong() FieldDescriptorProto.Type.SFIXED32, FieldDescriptorProto.Type.SINT32, - FieldDescriptorProto.Type.INT32, + FieldDescriptorProto.Type.INT32 -> int() FieldDescriptorProto.Type.UINT32, - FieldDescriptorProto.Type.FIXED32, + FieldDescriptorProto.Type.FIXED32 -> uint() FieldDescriptorProto.Type.BOOL -> bool() @@ -293,7 +293,7 @@ fun JsonReader.readAny(): Message<*, *>? { Timestamp.name, UInt32Value.name, UInt64Value.name, - Value.name, + Value.name -> { while (next() != JsonToken.END_OBJECT) { if (nameAndNext() == "value") { diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Writer.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Writer.kt index eec00ffa..d39f6a1c 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Writer.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/json/Writer.kt @@ -74,20 +74,20 @@ internal fun JsonWriter.field(value: Any?, field: FieldDescriptorProto) { FieldDescriptorProto.Type.FLOAT -> value(value as Float) FieldDescriptorProto.Type.SFIXED64, FieldDescriptorProto.Type.SINT64, - FieldDescriptorProto.Type.INT64, + FieldDescriptorProto.Type.INT64 -> safeLong(value as Long) FieldDescriptorProto.Type.FIXED64, - FieldDescriptorProto.Type.UINT64, + FieldDescriptorProto.Type.UINT64 -> safeULong(value as ULong) FieldDescriptorProto.Type.SFIXED32, FieldDescriptorProto.Type.SINT32, - FieldDescriptorProto.Type.INT32, + FieldDescriptorProto.Type.INT32 -> value(value as Int) FieldDescriptorProto.Type.UINT32, - FieldDescriptorProto.Type.FIXED32, + FieldDescriptorProto.Type.FIXED32 -> value(value as UInt) FieldDescriptorProto.Type.BOOL -> value(value as Boolean) diff --git a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/primitives/TimestampJvm8Extension.kt b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/primitives/TimestampJvm8Extension.kt index 316388ee..2fa12453 100644 --- a/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/primitives/TimestampJvm8Extension.kt +++ b/lib/sisyphus-protobuf/src/main/kotlin/com/bybutter/sisyphus/protobuf/primitives/TimestampJvm8Extension.kt @@ -59,7 +59,7 @@ operator fun Timestamp.Companion.invoke( minute: Int = 0, second: Int = 0, nano: Int = 0, - zoneId: ZoneId = ZoneId.systemDefault(), + zoneId: ZoneId = ZoneId.systemDefault() ): Timestamp { val instant = ZonedDateTime.of(year, month.value, day, hour, minute, second, nano, zoneId).toInstant() return Timestamp { @@ -76,7 +76,7 @@ operator fun Timestamp.Companion.invoke( minute: Int = 0, second: Int = 0, nano: Int = 0, - zoneId: ZoneId = ZoneId.systemDefault(), + zoneId: ZoneId = ZoneId.systemDefault() ): Timestamp { val instant = ZonedDateTime.of(year, month, day, hour, minute, second, nano, zoneId).toInstant() return Timestamp { diff --git a/lib/sisyphus-test/build.gradle.kts b/lib/sisyphus-test/build.gradle.kts index 986892e1..c5613fde 100644 --- a/lib/sisyphus-test/build.gradle.kts +++ b/lib/sisyphus-test/build.gradle.kts @@ -8,15 +8,15 @@ plugins { description = " Test framework for testing gRPC apis in Sisyphus Framework" dependencies { - api("org.junit.platform:junit-platform-engine") + api(libs.junit.jupiter.engine) - implementation(project(":lib:sisyphus-dsl")) - implementation(project(":lib:sisyphus-grpc")) - implementation(project(":lib:sisyphus-jackson-protobuf")) - implementation("org.junit.platform:junit-platform-launcher") - implementation("org.reflections:reflections") - implementation("io.grpc:grpc-stub") + implementation(projects.lib.sisyphusDsl) + implementation(projects.lib.sisyphusGrpc) + implementation(projects.lib.sisyphusJacksonProtobuf) + implementation(libs.junit.launcher) + implementation(libs.grpc.stub) + implementation(libs.reflections) - testImplementation(project(":starter:sisyphus-grpc-server-starter")) - testImplementation(project(":starter:sisyphus-spring-boot-test-starter")) + testImplementation(projects.starter.sisyphusGrpcServerStarter) + testImplementation(projects.starter.sisyphusSpringBootTestStarter) } diff --git a/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestCaseDescriptor.kt b/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestCaseDescriptor.kt index 71b3a312..6fcd4b40 100644 --- a/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestCaseDescriptor.kt +++ b/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestCaseDescriptor.kt @@ -37,7 +37,8 @@ class SisyphusTestCaseDescriptor(id: UniqueId, val case: TestCase) : if (result != true) { throw AssertionFailedError( "Assertion '$assert' failed in test '$displayName'.", - true, result + true, + result ) } } diff --git a/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestStepDescriptor.kt b/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestStepDescriptor.kt index e658e739..ee9e919e 100644 --- a/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestStepDescriptor.kt +++ b/lib/sisyphus-test/src/main/kotlin/com/bybutter/sisyphus/test/descriptor/SisyphusTestStepDescriptor.kt @@ -167,7 +167,8 @@ class SisyphusTestStepDescriptor(id: UniqueId, val step: TestStep) : if (result != true) { throw AssertionFailedError( "Assertion '$assert' failed in test '${parent.get().displayName}.$displayName'.", - true, result + true, + result ) } } diff --git a/middleware/sisyphus-amqp/build.gradle.kts b/middleware/sisyphus-amqp/build.gradle.kts index 984926c7..d00b1d53 100644 --- a/middleware/sisyphus-amqp/build.gradle.kts +++ b/middleware/sisyphus-amqp/build.gradle.kts @@ -7,8 +7,9 @@ plugins { description = "Middleware for using AMQP in Sisyphus Project" dependencies { - implementation(project(":lib:sisyphus-dto")) - implementation(project(":lib:sisyphus-jackson")) + implementation(projects.lib.sisyphusDto) + implementation(projects.lib.sisyphusJackson) - api(Dependencies.Spring.Framework.amqp) + api(libs.spring.boot) + api(libs.spring.framework.amqp) } diff --git a/middleware/sisyphus-configuration-artifact/build.gradle.kts b/middleware/sisyphus-configuration-artifact/build.gradle.kts index ea6af686..5efde690 100644 --- a/middleware/sisyphus-configuration-artifact/build.gradle.kts +++ b/middleware/sisyphus-configuration-artifact/build.gradle.kts @@ -7,10 +7,11 @@ plugins { description = "Middleware for manage configuration of Sisyphus Project" dependencies { - implementation(project(":lib:sisyphus-common")) - implementation(Dependencies.Maven.resolver) - implementation(Dependencies.Maven.resolverConnector) - implementation(Dependencies.Maven.resolverWagon) - implementation(Dependencies.Maven.wagonFile) - implementation(Dependencies.Maven.wagonHttp) + api(libs.spring.boot) + implementation(libs.maven.resolver) + implementation(libs.maven.resolver.connector) + implementation(libs.maven.resolver.wagon) + implementation(libs.maven.wagon.file) + implementation(libs.maven.wagon.http) + implementation(projects.lib.sisyphusCommon) } diff --git a/middleware/sisyphus-configuration-artifact/src/main/kotlin/com/bybutter/sisyphus/middleware/configuration/maven/Aether.kt b/middleware/sisyphus-configuration-artifact/src/main/kotlin/com/bybutter/sisyphus/middleware/configuration/maven/Aether.kt index d7d6ab91..907fd0f2 100644 --- a/middleware/sisyphus-configuration-artifact/src/main/kotlin/com/bybutter/sisyphus/middleware/configuration/maven/Aether.kt +++ b/middleware/sisyphus-configuration-artifact/src/main/kotlin/com/bybutter/sisyphus/middleware/configuration/maven/Aether.kt @@ -22,6 +22,7 @@ import org.eclipse.aether.transport.wagon.WagonProvider import org.eclipse.aether.transport.wagon.WagonTransporterFactory import org.eclipse.aether.util.repository.AuthenticationBuilder import org.eclipse.aether.util.version.GenericVersionScheme +import org.eclipse.aether.version.VersionScheme import java.io.File class Aether { @@ -69,7 +70,9 @@ class Aether { fun registerRepository(url: String, user: String? = null, password: String? = null): RemoteRepository { val authentication = if (user != null && password != null) { AuthenticationBuilder().addUsername(user).addPassword(password).build() - } else null + } else { + null + } val result = RemoteRepository.Builder("", "default", url).apply { if (authentication != null) { @@ -135,6 +138,6 @@ class Aether { } companion object { - private val versionScheme = GenericVersionScheme() + private val versionScheme: VersionScheme = GenericVersionScheme() } } diff --git a/middleware/sisyphus-elastic/build.gradle.kts b/middleware/sisyphus-elastic/build.gradle.kts index 9b89e6f1..1b06eb38 100644 --- a/middleware/sisyphus-elastic/build.gradle.kts +++ b/middleware/sisyphus-elastic/build.gradle.kts @@ -7,5 +7,6 @@ plugins { description = "Middleware for using ElasticSearch in Sisyphus Project" dependencies { - api(Dependencies.elastic) + api(libs.spring.boot) + api(libs.elastic.rest) } diff --git a/middleware/sisyphus-grpc-client-kubernetes/build.gradle.kts b/middleware/sisyphus-grpc-client-kubernetes/build.gradle.kts index 0b9b15b8..554f1d41 100644 --- a/middleware/sisyphus-grpc-client-kubernetes/build.gradle.kts +++ b/middleware/sisyphus-grpc-client-kubernetes/build.gradle.kts @@ -7,7 +7,8 @@ plugins { description = "Middleware for grpc service discovery of kubernetes in Sisyphus Project" dependencies { - api(project(":middleware:sisyphus-grpc-client")) - api(project(":lib:sisyphus-jackson")) - implementation(Dependencies.kubeJavaClient) + api(projects.middleware.sisyphusGrpcClient) + api(projects.lib.sisyphusJackson) + api(libs.spring.boot) + implementation(libs.kubernetes) } diff --git a/middleware/sisyphus-grpc-client/build.gradle.kts b/middleware/sisyphus-grpc-client/build.gradle.kts index e0a5cdbe..d2cae90e 100644 --- a/middleware/sisyphus-grpc-client/build.gradle.kts +++ b/middleware/sisyphus-grpc-client/build.gradle.kts @@ -7,6 +7,7 @@ plugins { description = "Middleware for using gRPC client in Sisyphus Project" dependencies { - api(project(":lib:sisyphus-grpc-coroutine")) - runtimeOnly("io.grpc:grpc-netty") + api(projects.lib.sisyphusGrpcCoroutine) + api(libs.spring.boot) + runtimeOnly(libs.grpc.netty) } diff --git a/middleware/sisyphus-hbase/build.gradle.kts b/middleware/sisyphus-hbase/build.gradle.kts index 56d6e347..cf292e16 100644 --- a/middleware/sisyphus-hbase/build.gradle.kts +++ b/middleware/sisyphus-hbase/build.gradle.kts @@ -7,10 +7,11 @@ plugins { description = "Middleware for using HBase in Sisyphus Project" dependencies { - api(project(":lib:sisyphus-dto")) - api(project(":lib:sisyphus-jackson")) - api(Dependencies.hbase) { + api(projects.lib.sisyphusDto) + api(projects.lib.sisyphusJackson) + api(libs.spring.boot) + api(libs.hbase) { exclude("org.slf4j", "slf4j-log4j12") } - implementation(project(":lib:sisyphus-common")) + implementation(projects.lib.sisyphusCommon) } diff --git a/middleware/sisyphus-jdbc/build.gradle.kts b/middleware/sisyphus-jdbc/build.gradle.kts index 99dc9b42..e277e5ce 100644 --- a/middleware/sisyphus-jdbc/build.gradle.kts +++ b/middleware/sisyphus-jdbc/build.gradle.kts @@ -7,15 +7,17 @@ plugins { description = "Middleware for using JDBC in Sisyphus Project" dependencies { - api(Dependencies.jooq) - implementation(Dependencies.hikari) + api(libs.spring.boot) + api(libs.jooq) + api(libs.kotlin.coroutines) + implementation(libs.hikari) - runtimeOnly(Dependencies.mysql) - runtimeOnly(Dependencies.postgresql) + runtimeOnly(libs.mysql.connector) + runtimeOnly(libs.postgresql.connector) - compileOnly(project(":lib:sisyphus-dsl")) + compileOnly(projects.lib.sisyphusDsl) - testImplementation(Dependencies.h2) - testImplementation(project(":lib:sisyphus-dsl")) - testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation(projects.lib.sisyphusDsl) + testImplementation(libs.h2) + testImplementation(libs.spring.boot.test) } diff --git a/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/support/proto/filter/FilterRuntime.kt b/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/support/proto/filter/FilterRuntime.kt index 8897d96f..576f8d04 100644 --- a/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/support/proto/filter/FilterRuntime.kt +++ b/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/support/proto/filter/FilterRuntime.kt @@ -47,7 +47,8 @@ open class FilterRuntime(private val std: FilterStandardLibrary = FilterStandard private fun KFunction<*>.compatibleWith(arguments: List): Boolean { return compatibleWith( - listOfNotNull(this.extensionReceiverParameter) + this.valueParameters, arguments + listOfNotNull(this.extensionReceiverParameter) + this.valueParameters, + arguments ) } diff --git a/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/transaction/DelegatingDataSource.kt b/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/transaction/DelegatingDataSource.kt index 17d850b8..280e3934 100644 --- a/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/transaction/DelegatingDataSource.kt +++ b/middleware/sisyphus-jdbc/src/main/kotlin/com/bybutter/sisyphus/middleware/jdbc/transaction/DelegatingDataSource.kt @@ -10,6 +10,8 @@ open class DelegatingDataSource(protected val delegate: DataSource) : DataSource override fun unwrap(iface: Class): T { return if (iface.isInstance(this)) { this as T - } else delegate.unwrap(iface) + } else { + delegate.unwrap(iface) + } } } diff --git a/middleware/sisyphus-mongo/build.gradle.kts b/middleware/sisyphus-mongo/build.gradle.kts index 89446455..5b2d212d 100644 --- a/middleware/sisyphus-mongo/build.gradle.kts +++ b/middleware/sisyphus-mongo/build.gradle.kts @@ -7,6 +7,6 @@ plugins { description = "Middleware for using MongoDB in Sisyphus Project" dependencies { - api(Dependencies.mongo) - api(Dependencies.Kotlin.Coroutines.reactive) + api(libs.spring.boot) + api(libs.mongodb) } diff --git a/middleware/sisyphus-redis/build.gradle.kts b/middleware/sisyphus-redis/build.gradle.kts index 0a7df9ef..d2925a5d 100644 --- a/middleware/sisyphus-redis/build.gradle.kts +++ b/middleware/sisyphus-redis/build.gradle.kts @@ -7,8 +7,9 @@ plugins { description = "Middleware for using Redis cache in Sisyphus Project" dependencies { - api(project(":lib:sisyphus-common")) - api(Dependencies.Spring.Boot.redis) - api(Dependencies.Kotlin.Coroutines.jdk) - api(Dependencies.Kotlin.Coroutines.reactive) + api(projects.lib.sisyphusCommon) + api(libs.spring.boot) + api(libs.spring.boot.redis) + api(libs.kotlin.coroutines.jdk) + api(libs.kotlin.coroutines.reactive) } diff --git a/middleware/sisyphus-redis/src/main/kotlin/com/bybutter/sisyphus/middleware/redis/DistributedLock.kt b/middleware/sisyphus-redis/src/main/kotlin/com/bybutter/sisyphus/middleware/redis/DistributedLock.kt index fe11a1be..6cc3b920 100644 --- a/middleware/sisyphus-redis/src/main/kotlin/com/bybutter/sisyphus/middleware/redis/DistributedLock.kt +++ b/middleware/sisyphus-redis/src/main/kotlin/com/bybutter/sisyphus/middleware/redis/DistributedLock.kt @@ -90,8 +90,9 @@ private class DistributedLock(private var key: String, private val redis: Statef suspend fun lock(waitTime: Long, leaseTime: Long, timeUnit: TimeUnit): Boolean { val endTime = System.currentTimeMillis() + timeUnit.toMillis(waitTime) while (System.currentTimeMillis() < endTime) { - if (lock(leaseTime, timeUnit)) + if (lock(leaseTime, timeUnit)) { return true + } delay(100) } return false diff --git a/middleware/sisyphus-retrofit/build.gradle.kts b/middleware/sisyphus-retrofit/build.gradle.kts index ed832112..11e24574 100644 --- a/middleware/sisyphus-retrofit/build.gradle.kts +++ b/middleware/sisyphus-retrofit/build.gradle.kts @@ -7,13 +7,14 @@ plugins { description = "Middleware for using Retrofit in Sisyphus Project" dependencies { - api(Dependencies.Kotlin.Coroutines.jdk) - api(Dependencies.retrofit) - api(Dependencies.okhttp) - api(Dependencies.reflections) - api(Dependencies.resilience4j) - api("io.github.resilience4j:resilience4j-circuitbreaker") - api(project(":lib:sisyphus-common")) - api(project(":lib:sisyphus-dto")) - api(project(":lib:sisyphus-jackson")) + api(libs.spring.boot) + api(libs.kotlin.coroutines.jdk) + api(libs.retrofit) + api(libs.okhttp) + api(libs.reflections) + api(libs.resilience4j.retrofit) + api(libs.resilience4j.circuitbreaker) + api(projects.lib.sisyphusCommon) + api(projects.lib.sisyphusDto) + api(projects.lib.sisyphusJackson) } diff --git a/middleware/sisyphus-rocketmq/build.gradle.kts b/middleware/sisyphus-rocketmq/build.gradle.kts index bb2eac48..6ab21cda 100644 --- a/middleware/sisyphus-rocketmq/build.gradle.kts +++ b/middleware/sisyphus-rocketmq/build.gradle.kts @@ -7,9 +7,12 @@ plugins { description = "Middleware for using RocketMQ in Sisyphus Project" dependencies { - implementation(project(":lib:sisyphus-common")) + api(libs.spring.boot) + api(libs.rocketmq) - api(Dependencies.rocketMq) - implementation(Dependencies.rocketMqAcl) - compileOnly("org.springframework.boot:spring-boot-starter-actuator") + implementation(libs.rocketmq.acl) + implementation(libs.kotlin.coroutines) + implementation(projects.lib.sisyphusCommon) + + compileOnly(libs.spring.boot.actuator) } diff --git a/middleware/sisyphus-rocketmq/src/main/kotlin/com/bybutter/sisyphus/middleware/rocketmq/DefaultRocketMqResourceFactory.kt b/middleware/sisyphus-rocketmq/src/main/kotlin/com/bybutter/sisyphus/middleware/rocketmq/DefaultRocketMqResourceFactory.kt index 68357e7a..74dc4237 100644 --- a/middleware/sisyphus-rocketmq/src/main/kotlin/com/bybutter/sisyphus/middleware/rocketmq/DefaultRocketMqResourceFactory.kt +++ b/middleware/sisyphus-rocketmq/src/main/kotlin/com/bybutter/sisyphus/middleware/rocketmq/DefaultRocketMqResourceFactory.kt @@ -61,7 +61,8 @@ open class DefaultRocketMqResourceFactory : RocketMqResourceFactory { ?: MixAll.DEFAULT_CONSUMER_GROUP, hook, AllocateMessageQueueAveragely(), - true, consumerProperty.traceTopic + true, + consumerProperty.traceTopic ) } else { DefaultMQPushConsumer( @@ -77,9 +78,13 @@ open class DefaultRocketMqResourceFactory : RocketMqResourceFactory { } this.subscribe( metadata.topic, - if (metadata.filterType == ExpressionType.TAG) MessageSelector.byTag(metadata.filter) else MessageSelector.bySql( - metadata.filter - ) + if (metadata.filterType == ExpressionType.TAG) { + MessageSelector.byTag(metadata.filter) + } else { + MessageSelector.bySql( + metadata.filter + ) + } ) val converter = metadata.converter.instance() when (metadata.type) { diff --git a/settings.gradle.kts b/settings.gradle.kts index c3030774..c667cee8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ rootProject.name = "sisyphus" +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") include("lib:sisyphus-common") include("lib:sisyphus-dsl") @@ -13,10 +14,7 @@ include("lib:sisyphus-grpc-rxjava") include("lib:sisyphus-test") include("tools:sisyphus-protoc") -include("tools:sisyphus-project-gradle-plugin") -include("tools:sisyphus-protobuf-gradle-plugin") include("tools:sisyphus-k8s-gradle-plugin") -include("tools:sisyphus-api-linter-runner") include("tools:sisyphus-protoc-runner") include("middleware:sisyphus-configuration-artifact") @@ -38,7 +36,5 @@ include("starter:sisyphus-grpc-transcoding-starter") include("starter:sisyphus-protobuf-type-server-starter") include("starter:sisyphus-spring-boot-test-starter") -include("dependencies") -project(":dependencies").name = "sisyphus-dependencies" include("bom") project(":bom").name = "sisyphus-bom" \ No newline at end of file diff --git a/starter/sisyphus-grpc-server-starter/build.gradle.kts b/starter/sisyphus-grpc-server-starter/build.gradle.kts index 201bba9f..40af9ba2 100644 --- a/starter/sisyphus-grpc-server-starter/build.gradle.kts +++ b/starter/sisyphus-grpc-server-starter/build.gradle.kts @@ -8,17 +8,20 @@ plugins { description = "Starter for building gRPC server in Sisyphus Framework" dependencies { - api(project(":middleware:sisyphus-grpc-client")) - api(project(":middleware:sisyphus-configuration-artifact")) - implementation("io.grpc:grpc-core") - compileOnly(Dependencies.Spring.Boot.actuator) - runtimeOnly(Dependencies.Grpc.netty) + api(projects.middleware.sisyphusGrpcClient) + api(projects.middleware.sisyphusConfigurationArtifact) + implementation(libs.grpc.core) + + compileOnly(libs.spring.boot.actuator) + runtimeOnly(libs.grpc.netty) + + testImplementation(libs.spring.boot.test) } protobuf { packageMapping( "io.grpc.reflection.v1" to "com.bybutter.sisyphus.starter.grpc.support.reflection.v1", "io.grpc.reflection.v1alpha" to "com.bybutter.sisyphus.starter.grpc.support.reflection.v1alpha", - "io.grpc.health.v1" to "com.bybutter.sisyphus.starter.grpc.support.health.v1", + "io.grpc.health.v1" to "com.bybutter.sisyphus.starter.grpc.support.health.v1" ) } diff --git a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/SisyphusGrpcServerInterceptor.kt b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/SisyphusGrpcServerInterceptor.kt index 7b8b6957..8c7fc83d 100644 --- a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/SisyphusGrpcServerInterceptor.kt +++ b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/SisyphusGrpcServerInterceptor.kt @@ -49,7 +49,7 @@ class SisyphusGrpcServerInterceptor : ServerInterceptor { override fun interceptCall( call: ServerCall, headers: Metadata, - next: ServerCallHandler, + next: ServerCallHandler ): ServerCall.Listener { val context = Context.current().withValue(RequestLogger.REQUEST_CONTEXT_KEY, RequestInfo(headers)) @@ -71,7 +71,7 @@ class SisyphusGrpcServerInterceptor : ServerInterceptor { private class SisyphusGrpcServerCall( call: ServerCall, private val loggers: List, - private val statusRenderers: List, + private val statusRenderers: List ) : ForwardingServerCall.SimpleForwardingServerCall(call) { private val requestNanoTime = System.nanoTime() diff --git a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/health/v1/HealthService.kt b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/health/v1/HealthService.kt index 39228894..af9403a0 100644 --- a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/health/v1/HealthService.kt +++ b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/health/v1/HealthService.kt @@ -10,8 +10,9 @@ class HealthService : Health() { private var server: Server? = null fun initServer(server: Server) { - if (this.server != null && this.server != server) + if (this.server != null && this.server != server) { throw IllegalArgumentException("Server is already set") + } this.server = server } diff --git a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/metrics/MicrometerRequestLogger.kt b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/metrics/MicrometerRequestLogger.kt index 858038a7..8a1c92eb 100644 --- a/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/metrics/MicrometerRequestLogger.kt +++ b/starter/sisyphus-grpc-server-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/support/metrics/MicrometerRequestLogger.kt @@ -33,8 +33,10 @@ class MicrometerRequestLogger(private val registry: MeterRegistry) : RequestLogg override fun log(call: ServerCall<*, *>, inputHeader: Metadata) { registry.counter( "sisyphus_incoming_grpc_requests", - "service", call.methodDescriptor.serviceName, - "method", call.methodDescriptor.fullMethodName, + "service", + call.methodDescriptor.serviceName, + "method", + call.methodDescriptor.fullMethodName ) } diff --git a/starter/sisyphus-grpc-transcoding-starter/build.gradle.kts b/starter/sisyphus-grpc-transcoding-starter/build.gradle.kts index feac412f..66ec8ead 100644 --- a/starter/sisyphus-grpc-transcoding-starter/build.gradle.kts +++ b/starter/sisyphus-grpc-transcoding-starter/build.gradle.kts @@ -7,11 +7,11 @@ plugins { description = "Starter for building gRPC server which with HTTP and gRPC Transcoding in Sisyphus Framework" dependencies { - api(project(":lib:sisyphus-jackson-protobuf")) - api(project(":lib:sisyphus-grpc-coroutine")) - api(project(":middleware:sisyphus-configuration-artifact")) - api(project(":starter:sisyphus-grpc-server-starter")) - api(project(":starter:sisyphus-webflux-starter")) - implementation(Dependencies.swagger) - compileOnly(Dependencies.Spring.Boot.actuator) + api(projects.lib.sisyphusJacksonProtobuf) + api(projects.lib.sisyphusGrpcCoroutine) + api(projects.middleware.sisyphusConfigurationArtifact) + api(projects.starter.sisyphusGrpcServerStarter) + api(projects.starter.sisyphusWebfluxStarter) + implementation(libs.swagger) + compileOnly(libs.spring.boot.actuator) } diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/GrpcTranscodingConfig.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/GrpcTranscodingConfig.kt index 1e14ee1f..ab844530 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/GrpcTranscodingConfig.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/GrpcTranscodingConfig.kt @@ -79,7 +79,8 @@ class GrpcTranscodingConfig : ImportBeanDefinitionRegistrar, EnvironmentAware { val rules = exportTranscodingRules( BeanUtils.getSortedBeans(registry, TranscodingRouterRuleExporter::class.java).values, - server, enableServices + server, + enableServices ) TranscodingRouterFunction(rules, channel) @@ -129,14 +130,15 @@ class GrpcTranscodingConfig : ImportBeanDefinitionRegistrar, EnvironmentAware { val rules = exportTranscodingRules( BeanUtils.getSortedBeans(registry, TranscodingRouterRuleExporter::class.java).values, - server, enableServices + server, + enableServices ) // Create CORS config source for transcoding. TranscodingCorsConfigurationSource( rules, // Try to get the default transcoding cors configuration factory form spring application context - BeanUtils.getSortedBeans(registry, TranscodingCorsConfigurationInterceptor::class.java).values, + BeanUtils.getSortedBeans(registry, TranscodingCorsConfigurationInterceptor::class.java).values ) } registry.registerBeanDefinition( diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingCallListener.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingCallListener.kt index f2002070..ff504640 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingCallListener.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingCallListener.kt @@ -1,121 +1,10 @@ package com.bybutter.sisyphus.starter.grpc.transcoding import com.bybutter.sisyphus.protobuf.Message -import com.bybutter.sisyphus.protobuf.primitives.Empty -import com.bybutter.sisyphus.rpc.Code -import com.bybutter.sisyphus.rpc.STATUS_META_KEY -import com.bybutter.sisyphus.security.base64 -import com.bybutter.sisyphus.security.base64UrlSafe -import com.bybutter.sisyphus.starter.grpc.transcoding.util.toHttpStatus -import com.bybutter.sisyphus.starter.webflux.DetectBodyInserter import io.grpc.ClientCall -import io.grpc.Metadata -import io.grpc.Status -import org.springframework.http.HttpHeaders -import org.springframework.http.HttpStatus import org.springframework.web.reactive.function.server.ServerResponse import reactor.core.publisher.Mono -import reactor.core.publisher.Sinks -/** - * Listener for gRPC calling, it convert gRPC call to [ServerResponse] asynchronously. - * @property body String the response body field name of gRPC response message. - * @constructor - * @see https://aip.bybutter.com/127#http-method-and-path - */ -class TranscodingCallListener(private val body: String) : ClientCall.Listener>() { - private val response = Sinks.one>() - - private var headers: Metadata? = null - private var message: Message<*, *>? = null - - override fun onClose(status: Status, trailers: Metadata) { - try { - val builder = ServerResponse.status(status.code.toHttpStatus()) - - // Set response header from gRPC headers and trailers. - builder.setHeaderFromMetadata(headers) - builder.setHeaderFromMetadata(trailers) - - trailers[STATUS_META_KEY]?.let { - if (it.code != Code.OK.number) { - // The trailers contains status meta and code is not [Code.OK], return the status directly. - this.response.tryEmitValue(builder.body(DetectBodyInserter(it))) - return - } else { - // The trailers contains status meta but code is [Code.OK], return the status in response header. - builder.header(STATUS_META_KEY.name(), it.toProto().base64UrlSafe()) - } - } - - val message = message - val response = when { - // Empty message. - message is Empty -> builder.build() - // Return the body. - message != null -> when (body) { - "", "*" -> { - builder.body(DetectBodyInserter(message)) - } - else -> { - builder.body(DetectBodyInserter(message[body])) - } - } - // No message returned by gRPC, maybe some unknown error happened. - else -> builder.body( - DetectBodyInserter( - com.bybutter.sisyphus.rpc.Status { - this.code = status.code.value() - this.message = status.description ?: status.cause?.message ?: "Unknown" - } - ) - ) - } - this.response.tryEmitValue(response) - } catch (e: Exception) { - this.response.tryEmitValue( - ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body( - DetectBodyInserter( - com.bybutter.sisyphus.rpc.Status { - this.code = Status.Code.INTERNAL.value() - this.message = e.message ?: "Unknown" - } - ) - ) - ) - } - } - - override fun onHeaders(headers: Metadata) { - this.headers = headers - } - - override fun onMessage(message: Message<*, *>) { - this.message = message - } - - private fun ServerResponse.BodyBuilder.setHeaderFromMetadata(metadata: Metadata?): ServerResponse.BodyBuilder { - metadata ?: return this - - for (key in metadata.keys()) { - // Skip ignore headers. - if (IGNORE_GRPC_HEADER.contains(key)) continue - // Skip bin headers. - if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) { - header(key, metadata[Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER)]?.base64()) - } else { - header(key, metadata[Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)]) - } - } - return this - } - - fun response(): Mono { - return response.asMono().flatMap { it } - } - - companion object { - val IGNORE_GRPC_HEADER = setOf(HttpHeaders.CONTENT_TYPE.lowercase(), STATUS_META_KEY.name()) - } +abstract class TranscodingCallListener : ClientCall.Listener>() { + abstract fun response(): Mono } diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingHttpRouterFunction.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingHttpRouterFunction.kt index eb67c652..1dbb3af4 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingHttpRouterFunction.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingHttpRouterFunction.kt @@ -38,16 +38,14 @@ class TranscodingHttpRouterFunction constructor( when (field.type) { FieldDescriptorProto.Type.DOUBLE -> Double::class.java FieldDescriptorProto.Type.FLOAT -> Float::class.java - FieldDescriptorProto.Type.SINT64, - FieldDescriptorProto.Type.SFIXED64, - FieldDescriptorProto.Type.INT64 -> Long::class.java + FieldDescriptorProto.Type.SINT64, FieldDescriptorProto.Type.SFIXED64, FieldDescriptorProto.Type.INT64 -> Long::class.java + FieldDescriptorProto.Type.UINT64 -> ULong::class.java - FieldDescriptorProto.Type.SINT32, - FieldDescriptorProto.Type.SFIXED32, - FieldDescriptorProto.Type.INT32 -> Int::class.java + FieldDescriptorProto.Type.SINT32, FieldDescriptorProto.Type.SFIXED32, FieldDescriptorProto.Type.INT32 -> Int::class.java + FieldDescriptorProto.Type.FIXED64 -> ULong::class.java - FieldDescriptorProto.Type.UINT32, - FieldDescriptorProto.Type.FIXED32 -> UInt::class.java + FieldDescriptorProto.Type.UINT32, FieldDescriptorProto.Type.FIXED32 -> UInt::class.java + FieldDescriptorProto.Type.BOOL -> Boolean::class.java FieldDescriptorProto.Type.STRING -> String::class.java FieldDescriptorProto.Type.BYTES -> ByteArray::class.java @@ -81,13 +79,24 @@ class TranscodingHttpRouterFunction constructor( val call = channel.newCall(rule.method.methodDescriptor, CallOptions.DEFAULT) .uncheckedCast, Message<*, *>>>() val header = prepareHeader(request) - val listener = TranscodingCallListener(rule.http.responseBody) + + val isServerStreaming = !rule.method.methodDescriptor.type.serverSendsOneMessage() + val listener = if (isServerStreaming) { + TranscodingStreamingCallListener(call) + } else { + TranscodingUnaryCallListener(rule.http.responseBody) + } call.start(listener, header) - // gRPC transcoding only support the unary calls, so we request 2 message for response. - // Server will try to return 2 messages, but just 1 message returned, so server will return - // once and told client there is no more messages, call will be closed. - call.request(2) + + if (isServerStreaming) { + call.request(1) + } else { + // We request 2 message for unary calls. + // Server will try to return 2 messages, but just 1 message returned, so server will return + // once and told client there is no more messages, call will be closed. + call.request(2) + } return request.bodyToMono(bodyClass).map { when (rule.http.body) { diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterFunction.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterFunction.kt index 864756ed..b232e661 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterFunction.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterFunction.kt @@ -40,7 +40,7 @@ class TranscodingRouterFunction constructor( companion object { operator fun invoke( rules: Collection, - transcodingChannel: Channel, + transcodingChannel: Channel ): RouterFunction { // Return empty router if no service routers created. if (rules.isEmpty()) return EmptyRouterFunction diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterRuleExporter.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterRuleExporter.kt index 65814ea7..e556cd95 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterRuleExporter.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingRouterRuleExporter.kt @@ -6,7 +6,6 @@ import com.bybutter.sisyphus.protobuf.ProtoTypes import com.bybutter.sisyphus.protobuf.findServiceSupport import com.bybutter.sisyphus.protobuf.primitives.MethodDescriptorProto import com.bybutter.sisyphus.protobuf.primitives.ServiceDescriptorProto -import io.grpc.MethodDescriptor import io.grpc.Server import io.grpc.ServerMethodDefinition import io.grpc.ServerServiceDefinition @@ -40,8 +39,8 @@ class HttpTranscodingRouterRuleExporter : TranscodingRouterRuleExporter { private fun exportServices(service: ServerServiceDefinition, rules: MutableList) { val serviceProto = ProtoTypes.findServiceSupport(".${service.serviceDescriptor.name}").descriptor for (method in service.methods) { - // Just support transcoding for unary gRPC calls. - if (method.methodDescriptor.type != MethodDescriptor.MethodType.UNARY) continue + // Just support non-client-streaming method. + if (!method.methodDescriptor.type.clientSendsOneMessage()) continue // Ensure method proto registered. val methodProto = serviceProto.method.firstOrNull { it.name == method.methodDescriptor.fullMethodName.substringAfter('/') diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingStreamingCallListener.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingStreamingCallListener.kt new file mode 100644 index 00000000..5f849bc5 --- /dev/null +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingStreamingCallListener.kt @@ -0,0 +1,97 @@ +package com.bybutter.sisyphus.starter.grpc.transcoding + +import com.bybutter.sisyphus.protobuf.Message +import com.bybutter.sisyphus.rpc.STATUS_META_KEY +import com.bybutter.sisyphus.security.base64 +import io.grpc.ClientCall +import io.grpc.Metadata +import io.grpc.Status +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.http.codec.ServerSentEvent +import org.springframework.web.reactive.function.BodyInserters +import org.springframework.web.reactive.function.server.ServerResponse +import reactor.core.publisher.Mono +import reactor.core.publisher.Sinks + +class TranscodingStreamingCallListener(private val clientCall: ClientCall<*, *>) : TranscodingCallListener() { + private val eventSink = Sinks.many().unicast().onBackpressureBuffer>() + private val response = Sinks.one>() + + override fun onClose(status: Status, trailers: Metadata) { + try { + val statusMessage = trailers[STATUS_META_KEY] ?: com.bybutter.sisyphus.rpc.Status { + this.code = status.code.value() + status.description?.let { + this.message = it + } + } + eventSink.tryEmitNext( + ServerSentEvent.builder().event("status").data(statusMessage).build() + ) + eventSink.tryEmitNext( + ServerSentEvent.builder().event("trailers").data(trailers.toMap()).build() + ) + eventSink.tryEmitComplete() + } catch (e: Exception) { + eventSink.tryEmitError(e) + } + } + + override fun onHeaders(headers: Metadata) { + response.tryEmitValue( + ServerResponse.status(HttpStatus.OK).setHeaderFromMetadata(headers) + .body(BodyInserters.fromServerSentEvents(eventSink.asFlux())) + ) + } + + override fun onMessage(message: Message<*, *>) { + eventSink.tryEmitNext( + ServerSentEvent.builder().event("message").data(message).build() + ) + clientCall.request(1) + } + + private fun ServerResponse.BodyBuilder.setHeaderFromMetadata(metadata: Metadata?): ServerResponse.BodyBuilder { + metadata ?: return this + + for (key in metadata.keys()) { + // Skip ignore headers. + if (IGNORE_GRPC_HEADER.contains(key)) continue + // Skip bin headers. + if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) { + header(key, metadata[Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER)]?.base64()) + } else { + header(key, metadata[Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)]) + } + } + return this + } + + private fun Metadata.toMap(): Map { + val result = mutableMapOf() + for (key in keys()) { + // Skip ignore headers. + if (IGNORE_GRPC_HEADER.contains(key)) continue + // Skip bin headers. + if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) { + this[Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER)]?.base64()?.let { + result[key] = it + } + } else { + this[Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)]?.let { + result[key] = it + } + } + } + return result + } + + override fun response(): Mono { + return response.asMono().flatMap { it } + } + + companion object { + val IGNORE_GRPC_HEADER = setOf(HttpHeaders.CONTENT_TYPE.lowercase(), STATUS_META_KEY.name()) + } +} diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingUnaryCallListener.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingUnaryCallListener.kt new file mode 100644 index 00000000..c39996e6 --- /dev/null +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/TranscodingUnaryCallListener.kt @@ -0,0 +1,120 @@ +package com.bybutter.sisyphus.starter.grpc.transcoding + +import com.bybutter.sisyphus.protobuf.Message +import com.bybutter.sisyphus.protobuf.primitives.Empty +import com.bybutter.sisyphus.rpc.Code +import com.bybutter.sisyphus.rpc.STATUS_META_KEY +import com.bybutter.sisyphus.security.base64 +import com.bybutter.sisyphus.security.base64UrlSafe +import com.bybutter.sisyphus.starter.grpc.transcoding.util.toHttpStatus +import com.bybutter.sisyphus.starter.webflux.DetectBodyInserter +import io.grpc.Metadata +import io.grpc.Status +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.web.reactive.function.server.ServerResponse +import reactor.core.publisher.Mono +import reactor.core.publisher.Sinks + +/** + * Listener for gRPC calling, it convert gRPC call to [ServerResponse] asynchronously. + * @property body String the response body field name of gRPC response message. + * @constructor + * @see https://aip.bybutter.com/127#http-method-and-path + */ +class TranscodingUnaryCallListener(private val body: String) : TranscodingCallListener() { + private val response = Sinks.one>() + + private var headers: Metadata? = null + private var message: Message<*, *>? = null + + override fun onClose(status: Status, trailers: Metadata) { + try { + val builder = ServerResponse.status(status.code.toHttpStatus()) + + // Set response header from gRPC headers and trailers. + builder.setHeaderFromMetadata(headers) + builder.setHeaderFromMetadata(trailers) + + trailers[STATUS_META_KEY]?.let { + if (it.code != Code.OK.number) { + // The trailers contains status meta and code is not [Code.OK], return the status directly. + this.response.tryEmitValue(builder.body(DetectBodyInserter(it))) + return + } else { + // The trailers contains status meta but code is [Code.OK], return the status in response header. + builder.header(STATUS_META_KEY.name(), it.toProto().base64UrlSafe()) + } + } + + val message = message + val response = when { + // Empty message. + message is Empty -> builder.build() + // Return the body. + message != null -> when (body) { + "", "*" -> { + builder.body(DetectBodyInserter(message)) + } + else -> { + builder.body(DetectBodyInserter(message[body])) + } + } + // No message returned by gRPC, maybe some unknown error happened. + else -> builder.body( + DetectBodyInserter( + com.bybutter.sisyphus.rpc.Status { + this.code = status.code.value() + this.message = status.description ?: status.cause?.message ?: "Unknown" + } + ) + ) + } + this.response.tryEmitValue(response) + } catch (e: Exception) { + this.response.tryEmitValue( + ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + DetectBodyInserter( + com.bybutter.sisyphus.rpc.Status { + this.code = Status.Code.INTERNAL.value() + this.message = e.message ?: "Unknown" + } + ) + ) + ) + } + } + + override fun onHeaders(headers: Metadata) { + this.headers = headers + } + + override fun onMessage(message: Message<*, *>) { + this.message = message + } + + private fun ServerResponse.BodyBuilder.setHeaderFromMetadata(metadata: Metadata?): ServerResponse.BodyBuilder { + metadata ?: return this + + for (key in metadata.keys()) { + // Skip ignore headers. + if (IGNORE_GRPC_HEADER.contains(key)) continue + // Skip bin headers. + if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) { + header(key, metadata[Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER)]?.base64()) + } else { + header(key, metadata[Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)]) + } + } + return this + } + + override fun response(): Mono { + return response.asMono().flatMap { it } + } + + companion object { + val IGNORE_GRPC_HEADER = setOf(HttpHeaders.CONTENT_TYPE.lowercase(), STATUS_META_KEY.name()) + } +} diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/metrics/GrpcTranscodingWebFluxTagsContributor.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/metrics/GrpcTranscodingWebFluxTagsContributor.kt index a31c66a9..f4e6d863 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/metrics/GrpcTranscodingWebFluxTagsContributor.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/metrics/GrpcTranscodingWebFluxTagsContributor.kt @@ -16,15 +16,20 @@ class GrpcTranscodingWebFluxTagsContributor : WebFluxTagsContributor { if (rule == null || pathTemplate == null) { return Tags.of( - "grpc_method", "None", - "grpc_service", "None" + "grpc_method", + "None", + "grpc_service", + "None" ) } return Tags.of( - "grpc_method", rule.method.methodDescriptor.fullMethodName, - "grpc_service", rule.service.serviceDescriptor.name, - "uri", pathTemplate.toString() + "grpc_method", + rule.method.methodDescriptor.fullMethodName, + "grpc_service", + rule.service.serviceDescriptor.name, + "uri", + pathTemplate.toString() ) } } diff --git a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/swagger/SwaggerRouterFunction.kt b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/swagger/SwaggerRouterFunction.kt index d6e587ef..f2e17348 100644 --- a/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/swagger/SwaggerRouterFunction.kt +++ b/starter/sisyphus-grpc-transcoding-starter/src/main/kotlin/com/bybutter/sisyphus/starter/grpc/transcoding/support/swagger/SwaggerRouterFunction.kt @@ -241,8 +241,10 @@ class SwaggerRouterFunction private constructor( ) + SwaggerServers.fetchServers(property.servers) components = Components().apply { this.schemas = schemas - if (property.securitySchemes != null) securitySchemes = - SwaggerSecuritySchemes.fetchSecuritySchemes(property.securitySchemes) + if (property.securitySchemes != null) { + securitySchemes = + SwaggerSecuritySchemes.fetchSecuritySchemes(property.securitySchemes) + } } } return ServerResponse.ok().bodyValue(Json.mapper().writeValueAsString(openApi)) diff --git a/starter/sisyphus-jackson-starter/build.gradle.kts b/starter/sisyphus-jackson-starter/build.gradle.kts index c52d2934..e7870faf 100644 --- a/starter/sisyphus-jackson-starter/build.gradle.kts +++ b/starter/sisyphus-jackson-starter/build.gradle.kts @@ -7,8 +7,8 @@ plugins { description = "Starter for configuring HttpMessageEncoder with Jackson in Sisyphus Framework" dependencies { - api(project(":lib:sisyphus-jackson")) - api(Dependencies.Spring.Boot.jackson) - compileOnly(Dependencies.Jackson.Dataformat.cbor) - compileOnly(Dependencies.Jackson.Dataformat.smile) + api(projects.lib.sisyphusJackson) + api(libs.spring.boot.json) + compileOnly(libs.jackson.cbor) + compileOnly(libs.jackson.smile) } diff --git a/starter/sisyphus-protobuf-type-server-starter/build.gradle.kts b/starter/sisyphus-protobuf-type-server-starter/build.gradle.kts index 8aad234c..fe1396a0 100644 --- a/starter/sisyphus-protobuf-type-server-starter/build.gradle.kts +++ b/starter/sisyphus-protobuf-type-server-starter/build.gradle.kts @@ -7,9 +7,9 @@ plugins { description = "Starter for build application with Protobuf type server in Sisyphus Framework" dependencies { - api(project(":lib:sisyphus-protobuf")) - api(project(":lib:sisyphus-grpc-coroutine")) - api(project(":lib:sisyphus-common")) - api(project(":starter:sisyphus-webflux-starter")) - implementation(Dependencies.Grpc.stub) + api(projects.lib.sisyphusProtobuf) + api(projects.lib.sisyphusGrpcCoroutine) + api(projects.lib.sisyphusCommon) + api(projects.starter.sisyphusWebfluxStarter) + implementation(libs.grpc.stub) } diff --git a/starter/sisyphus-spring-boot-test-starter/build.gradle.kts b/starter/sisyphus-spring-boot-test-starter/build.gradle.kts index 921ea021..2a9c4d65 100644 --- a/starter/sisyphus-spring-boot-test-starter/build.gradle.kts +++ b/starter/sisyphus-spring-boot-test-starter/build.gradle.kts @@ -7,5 +7,6 @@ plugins { description = "Starter for configure spring boot environment in Sisyphus Test Framework" dependencies { - api(project(":lib:sisyphus-test")) + api(libs.spring.boot) + api(projects.lib.sisyphusTest) } diff --git a/starter/sisyphus-webflux-starter/build.gradle.kts b/starter/sisyphus-webflux-starter/build.gradle.kts index 0c469c83..95f5c64f 100644 --- a/starter/sisyphus-webflux-starter/build.gradle.kts +++ b/starter/sisyphus-webflux-starter/build.gradle.kts @@ -7,6 +7,6 @@ plugins { description = "Starter for build application with String Webflux in Sisyphus Framework" dependencies { - api(project(":starter:sisyphus-jackson-starter")) - api(Dependencies.Spring.Boot.webflux) + api(projects.starter.sisyphusJacksonStarter) + api(libs.spring.boot.webflux) } diff --git a/tools/sisyphus-api-linter-runner/build.gradle.kts b/tools/sisyphus-api-linter-runner/build.gradle.kts deleted file mode 100644 index c4f3c183..00000000 --- a/tools/sisyphus-api-linter-runner/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -tools - -plugins { - `java-library` -} - -description = "Runner and executable manager for Google API Linter on java" diff --git a/tools/sisyphus-api-linter-runner/src/main/kotlin/com/bybutter/sisyphus/apilinter/ApiLinterRunner.kt b/tools/sisyphus-api-linter-runner/src/main/kotlin/com/bybutter/sisyphus/apilinter/ApiLinterRunner.kt deleted file mode 100644 index 1b1d1b41..00000000 --- a/tools/sisyphus-api-linter-runner/src/main/kotlin/com/bybutter/sisyphus/apilinter/ApiLinterRunner.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.bybutter.sisyphus.apilinter - -import java.io.BufferedReader -import java.io.File -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import java.nio.file.attribute.PosixFilePermission - -class ApiLinterRunner { - - fun runApiLinter(args: List, version: String): String? { - val apiLinterTemp = extractApiLinter(version) - return executeCmd(apiLinterTemp.toString(), args) - } - - private fun executeCmd(cmd: String, args: List): String { - val apiLinterCmd = mutableListOf(cmd) - for (arg in args) { - apiLinterCmd.add(arg) - } - println("api-linter executing: $apiLinterCmd") - val process = ProcessBuilder(apiLinterCmd).redirectErrorStream(true).start() - val result = process.text() - val exitCode = process.waitFor() - if (exitCode != 0) { - println("api-linter: $result") - throw IllegalStateException("Api linter return with non-zero value '$exitCode'.") - } - return result - } - - private fun extractApiLinter(version: String): Path { - val osName = System.getProperties().getProperty("os.name").normalize() - val platform = detectPlatform(osName) - val srcFilePath = Paths.get(version, "api-linter-$version-$platform.exe").toString() - val srcFile = this.javaClass.classLoader.getResource(srcFilePath.replace(File.separatorChar, '/')) - ?: throw UnsupportedOperationException("Unsupported api linter version $version for platform $osName.") - val executable = createTempBinDir().resolve("apilinter.exe") - srcFile.openStream().use { - Files.copy(it, executable) - } - when (platform) { - "darwin", "linux" -> { - Files.setPosixFilePermissions(executable, setOf(PosixFilePermission.OWNER_EXECUTE)) - } - } - return executable.also { - it.toFile().deleteOnExit() - } - } - - private fun detectPlatform(osName: String): String { - return when { - (osName.startsWith("macosx") || osName.startsWith("osx")) -> "darwin" - osName.startsWith("linux") -> "linux" - osName.startsWith("windows") -> "windows" - else -> "unknown" - } - } - - private fun String.normalize(): String { - return this.lowercase().replace("[^a-z0-9]+".toRegex(), "") - } - - private fun createTempBinDir(): Path { - return Files.createTempDirectory("apilinterrun").also { - it.toFile().deleteOnExit() - } - } - - private fun Process.text(): String { - return this.inputStream.bufferedReader().use(BufferedReader::readText) - } - - companion object { - const val API_LINTER_DEFAULT_VERSION = "1.9.0" - } -} diff --git a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-darwin.exe b/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-darwin.exe deleted file mode 100644 index 4d61aeff..00000000 Binary files a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-darwin.exe and /dev/null differ diff --git a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-linux.exe b/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-linux.exe deleted file mode 100644 index f41a6a64..00000000 Binary files a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-linux.exe and /dev/null differ diff --git a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-windows.exe b/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-windows.exe deleted file mode 100644 index e59eea7e..00000000 Binary files a/tools/sisyphus-api-linter-runner/src/main/resources/1.9.0/api-linter-1.9.0-windows.exe and /dev/null differ diff --git a/tools/sisyphus-k8s-gradle-plugin/build.gradle.kts b/tools/sisyphus-k8s-gradle-plugin/build.gradle.kts index b094fae3..d6797883 100644 --- a/tools/sisyphus-k8s-gradle-plugin/build.gradle.kts +++ b/tools/sisyphus-k8s-gradle-plugin/build.gradle.kts @@ -9,30 +9,22 @@ plugins { description = "Plugin for easy deploying and debugging docker image on Kubernetes cluster" dependencies { - implementation(Dependencies.Kotlin.reflect) - implementation(Dependencies.Kotlin.plugin) - implementation(Dependencies.kubeJavaClient) + implementation(libs.kotlin.reflect) + implementation(libs.gradle.kotlin) + implementation(libs.kubernetes) } gradlePlugin { + website.set("https://sisyphus.bybutter.com") + vcsUrl.set("https://github.com/ButterCam/sisyphus") + plugins { create("sisyphus-k8s") { id = "com.bybutter.sisyphus.k8s" displayName = "Sisyphus k8s Plugin" description = "Deploy and debug docker image on Kubernetes cluster." implementationClass = "com.bybutter.sisyphus.k8s.gradle.SisyphusK8sPlugin" - } - } -} - -pluginBundle { - website = "https://github.com/ButterCam/sisyphus" - vcsUrl = "https://github.com/ButterCam/sisyphus" - description = "Easy configure develop environment for project based on sisyphus framework." - - (plugins) { - "sisyphus-k8s" { - tags = listOf("sisyphus", "deploy", "k8s", "kubernetes") + tags.set(listOf("sisyphus", "deploy", "k8s", "kubernetes")) } } } diff --git a/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/KubernetesResourceSupport.kt b/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/KubernetesResourceSupport.kt index 66969d35..d97dc1df 100644 --- a/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/KubernetesResourceSupport.kt +++ b/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/KubernetesResourceSupport.kt @@ -24,7 +24,8 @@ interface KubernetesResourceSupport { val patch = V1Patch(resource.cluster.api.json.serialize(k8sResource)) patchResourceCall(resource, patch) }, - V1Patch.PATCH_FORMAT_STRATEGIC_MERGE_PATCH, resource.cluster.api + V1Patch.PATCH_FORMAT_STRATEGIC_MERGE_PATCH, + resource.cluster.api ) } diff --git a/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/Utils.kt b/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/Utils.kt index f113c909..c651f388 100644 --- a/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/Utils.kt +++ b/tools/sisyphus-k8s-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/k8s/gradle/resource/Utils.kt @@ -5,6 +5,7 @@ import java.time.LocalDateTime internal fun patchRestartMetadata(metadata: V1ObjectMeta?) { metadata?.putAnnotationsItem( - "kubectl.kubernetes.io/restartedAt", LocalDateTime.now().toString() + "kubectl.kubernetes.io/restartedAt", + LocalDateTime.now().toString() ) } diff --git a/tools/sisyphus-project-gradle-plugin/build.gradle.kts b/tools/sisyphus-project-gradle-plugin/build.gradle.kts deleted file mode 100644 index 80d3f8a5..00000000 --- a/tools/sisyphus-project-gradle-plugin/build.gradle.kts +++ /dev/null @@ -1,45 +0,0 @@ -tools - -plugins { - `java-library` - `java-gradle-plugin` - id("com.gradle.plugin-publish") -} - -description = "Plugin for easy configuring Gradle and plugins in Sisyphus Framework" - -dependencies { - implementation(Dependencies.Kotlin.reflect) - implementation(Dependencies.Kotlin.plugin) - implementation(Dependencies.kubeJavaClient) - - compileOnly("com.netflix.nebula:nebula-publishing-plugin") - compileOnly("com.netflix.nebula:gradle-info-plugin") - compileOnly("com.netflix.nebula:gradle-contacts-plugin") - compileOnly("org.jlleitschuh.gradle:ktlint-gradle") - compileOnly("com.bmuschko:gradle-docker-plugin") - compileOnly("org.springframework.boot:spring-boot-gradle-plugin") -} - -gradlePlugin { - plugins { - create("sisyphus") { - id = "com.bybutter.sisyphus.project" - displayName = "Sisyphus Project Plugin" - description = "Easy configure develop environment for project based on sisyphus framework." - implementationClass = "com.bybutter.sisyphus.project.gradle.SisyphusProjectPlugin" - } - } -} - -pluginBundle { - website = "https://github.com/ButterCam/sisyphus" - vcsUrl = "https://github.com/ButterCam/sisyphus" - description = "Easy configure develop environment for project based on sisyphus framework." - - (plugins) { - "sisyphus" { - tags = listOf("sisyphus", "project") - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Repository.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Repository.kt deleted file mode 100644 index 25cdc0d6..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Repository.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.bybutter.sisyphus.project.gradle - -data class Repository(val url: String, val username: String? = null, val password: String? = null) diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusExtension.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusExtension.kt deleted file mode 100644 index 3c807ed3..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusExtension.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.bybutter.sisyphus.project.gradle - -import org.gradle.api.Project -import org.gradle.api.internal.artifacts.dsl.ParsedModuleStringNotation -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.MapProperty -import org.gradle.api.provider.Property -import org.gradle.kotlin.dsl.SisyphusDevelopmentLayer - -open class SisyphusExtension(val project: Project) { - val developer: Property = project.objects.property(String::class.java) - - val layer: Property = - project.objects.property(SisyphusDevelopmentLayer::class.java).value(SisyphusDevelopmentLayer.IMPLEMENTATION) - - val repositories: MapProperty = - project.objects.mapProperty(String::class.java, Repository::class.java).empty() - - val dependencyRepositories: ListProperty = - project.objects.listProperty(String::class.java).value(listOf("local", "central", "portal", "google")) - - val releaseRepositories: ListProperty = - project.objects.listProperty(String::class.java).value(listOf("release")) - - val snapshotRepositories: ListProperty = - project.objects.listProperty(String::class.java).value(listOf("snapshot")) - - val dockerPublishRegistries: ListProperty = project.objects.listProperty(String::class.java).empty() - - val managedDependencies: MapProperty = - project.objects.mapProperty(String::class.java, ParsedModuleStringNotation::class.java).empty() - - init { - developer.set(project.findProperty("sisyphus.developer") as? String) - for (key in project.properties.keys) { - val result = repositoryUrlRegex.matchEntire(key) ?: continue - val repositoryName = result.groupValues[1] - - val url = project.findProperty("sisyphus.repositories.$repositoryName.url") as? String ?: continue - val username = project.findProperty("sisyphus.repositories.$repositoryName.username") as? String - val password = project.findProperty("sisyphus.repositories.$repositoryName.password") as? String - - repositories.put(repositoryName, Repository(url, username, password)) - } - - (project.findProperty("sisyphus.dependency.repositories") as? String)?.split(',')?.let { - dependencyRepositories.set(it) - } - (project.findProperty("sisyphus.release.repositories") as? String)?.split(',')?.let { - releaseRepositories.set(it) - } - (project.findProperty("sisyphus.snapshot.repositories") as? String)?.split(',')?.let { - snapshotRepositories.set(it) - } - (project.findProperty("sisyphus.docker.repositories") as? String)?.split(',')?.let { - dockerPublishRegistries.set(it) - } - (project.findProperty("sisyphus.dependency.overriding") as? String)?.split(',')?.associate { - val moduleStringNotation = ParsedModuleStringNotation(it, "") - "${moduleStringNotation.group}:${moduleStringNotation.name}" to moduleStringNotation - }?.let { - managedDependencies.set(it) - } - (project.findProperty("sisyphus.layer") as? String)?.let { SisyphusDevelopmentLayer.valueOf(it) }?.let { - layer.set(it) - } - } - - fun recommendVersion(): String? { - val branchName: String? = System.getenv("BRANCH_NAME") - val githubRef: String? = System.getenv("GITHUB_REF") - val tagName: String? = System.getenv("TAG_NAME") - val buildVersion: String? = System.getenv("BUILD_VERSION") - - return when { - !developer.orNull.isNullOrEmpty() -> "${developer.get()}-SNAPSHOT" - buildVersion != null -> "$buildVersion" - tagName != null -> "$tagName" - branchName != null -> "$branchName-SNAPSHOT" - githubRef != null && pullRequestRefRegex.matches(githubRef) -> - "PR-${ - pullRequestRefRegex.matchEntire( - githubRef - )?.groupValues?.get(1) - }-SNAPSHOT" - - else -> null - } - } - - companion object { - private val repositoryUrlRegex = """sisyphus\.repositories\.([A-Za-z][A-Za-z0-9-_]+)\.url""".toRegex() - private val pullRequestRefRegex = """refs/pull/([0-9]+)/merge""".toRegex() - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusProjectPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusProjectPlugin.kt deleted file mode 100644 index 1d269f05..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/SisyphusProjectPlugin.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.bybutter.sisyphus.project.gradle - -import com.bybutter.sisyphus.project.gradle.java.JavaBaseProjectPlugin -import com.bybutter.sisyphus.project.gradle.java.JavaLibraryProjectPlugin -import com.bybutter.sisyphus.project.gradle.java.JavaPlatformProjectPlugin -import com.bybutter.sisyphus.project.gradle.publishing.ProjectContactsPlugin -import com.bybutter.sisyphus.project.gradle.publishing.ProjectLicensePlugin -import com.bybutter.sisyphus.project.gradle.publishing.ProjectPublishingPlugin -import com.bybutter.sisyphus.project.gradle.publishing.ProjectSigningPlugin -import com.bybutter.sisyphus.project.gradle.threepart.SisyphusAntlrKotlinPlugin -import com.bybutter.sisyphus.project.gradle.threepart.SisyphusDockerPlugin -import com.bybutter.sisyphus.project.gradle.threepart.SisyphusKtlintPlugin -import org.gradle.api.Plugin -import org.gradle.api.Project - -class SisyphusProjectPlugin : Plugin { - override fun apply(target: Project) { - applyBase(target) - - target.pluginManager.apply(JavaBaseProjectPlugin::class.java) - target.pluginManager.apply(JavaLibraryProjectPlugin::class.java) - target.pluginManager.apply(JavaPlatformProjectPlugin::class.java) - target.pluginManager.apply(ProjectPublishingPlugin::class.java) - target.pluginManager.apply(ProjectContactsPlugin::class.java) - target.pluginManager.apply(ProjectLicensePlugin::class.java) - target.pluginManager.apply(ProjectSigningPlugin::class.java) - target.pluginManager.apply(SisyphusAntlrKotlinPlugin::class.java) - if (isClassExist("com.bmuschko.gradle.docker.DockerRemoteApiPlugin")) { - target.pluginManager.apply(SisyphusDockerPlugin::class.java) - } - if (isClassExist("org.jlleitschuh.gradle.ktlint.KtlintExtension")) { - target.pluginManager.apply(SisyphusKtlintPlugin::class.java) - } - } - - private fun applyBase(target: Project) { - val extension = target.extensions.create("sisyphus", SisyphusExtension::class.java, target) - if (target.version.toString() == Project.DEFAULT_VERSION) { - extension.recommendVersion()?.let { - target.version = it - } - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Utils.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Utils.kt deleted file mode 100644 index 821b9150..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/Utils.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.bybutter.sisyphus.project.gradle - -import org.gradle.api.Project -import org.gradle.api.artifacts.dsl.RepositoryHandler -import java.net.URI - -internal fun Project.isSnapshot(): Boolean { - return version.toString().endsWith("-SNAPSHOT") -} - -internal fun Project.isRelease(): Boolean { - return !isSnapshot() -} - -internal fun Project.ensurePlugin(vararg ids: String, block: (Project) -> Unit): Boolean { - for (id in ids) { - if (!pluginManager.hasPlugin(id)) { - pluginManager.withPlugin(id) { - block(this) - } - return false - } - } - - return true -} - -internal inline fun Project.ensurePlugin(id: String, noinline block: (Project) -> Unit, returnBlock: () -> Unit) { - if (!pluginManager.hasPlugin(id)) { - pluginManager.withPlugin(id) { - block(this) - } - returnBlock() - } -} - -internal fun Project.tryApplyPluginClass(className: String, action: () -> Unit = {}): Boolean { - return try { - val plugin = Class.forName(className) - action() - this.pluginManager.apply(plugin) - true - } catch (ex: ClassNotFoundException) { - false - } -} - -internal fun RepositoryHandler.applyFromRepositoryKeys( - repositories: Map, - repositoryKeys: Collection -) { - for (repositoryKey in repositoryKeys) { - val repository = when (repositoryKey) { - "local" -> repositories[repositoryKey] ?: run { - this.mavenLocal() - null - } - - "central" -> repositories[repositoryKey] ?: run { - this.mavenCentral() - null - } - - "portal" -> repositories[repositoryKey] ?: run { - this.gradlePluginPortal() - null - } - - "google" -> repositories[repositoryKey] ?: run { - this.google() - null - } - - else -> repositories[repositoryKey] - } - - repository ?: continue - - this.maven { - it.name = repositoryKey - it.url = URI.create(repository.url) - if (repository.username != null) { - it.credentials.username = repository.username - } - if (repository.password != null) { - it.credentials.password = repository.password - } - } - } -} - -internal fun isClassExist(className: String): Boolean { - return try { - Class.forName(className) - true - } catch (ex: ClassNotFoundException) { - false - } -} - -fun getJavaMajorVersion(): Int? { - val javaVersion = System.getProperty("java.version") - return if (javaVersion.startsWith("1.")) { - javaVersion.substring(2, 3) - } else { - javaVersion.substringBefore('.') - }.toIntOrNull() -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaBaseProjectPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaBaseProjectPlugin.kt deleted file mode 100644 index fe13e0a4..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaBaseProjectPlugin.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.java - -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import com.bybutter.sisyphus.project.gradle.applyFromRepositoryKeys -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import org.gradle.api.Plugin -import org.gradle.api.Project - -class JavaBaseProjectPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("java-base") { - apply(it) - }.also { - if (!it) return - } - - val extension = target.extensions.getByType(SisyphusExtension::class.java) - target.repositories.applyFromRepositoryKeys(extension.repositories.get(), extension.dependencyRepositories.get()) - target.pluginManager.apply(JavaDependenciesReplacePlugin::class.java) - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaDependenciesReplacePlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaDependenciesReplacePlugin.kt deleted file mode 100644 index d7cb3d91..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaDependenciesReplacePlugin.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.java - -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import org.gradle.api.Plugin -import org.gradle.api.Project - -class JavaDependenciesReplacePlugin : Plugin { - override fun apply(target: Project) { - val extension = target.extensions.getByType(SisyphusExtension::class.java) - - target.configurations.all { - it.resolutionStrategy.eachDependency { detail -> - extension.managedDependencies.getting("${detail.requested.group}:${detail.requested.name}")?.orNull?.let { moduleStringNotation -> - detail.useVersion(moduleStringNotation.version) - detail.because("The version of current dependency managed by Sisyphus Property") - } - } - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaLibraryProjectPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaLibraryProjectPlugin.kt deleted file mode 100644 index c3727f7c..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaLibraryProjectPlugin.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.java - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import com.bybutter.sisyphus.project.gradle.tryApplyPluginClass -import org.gradle.api.Plugin -import org.gradle.api.Project - -class JavaLibraryProjectPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("java-library") { - apply(it) - }.also { - if (!it) return - } - - target.tryApplyPluginClass("nebula.plugin.publishing.maven.MavenPublishPlugin") - target.tryApplyPluginClass("nebula.plugin.publishing.publications.JavadocJarPlugin") - target.tryApplyPluginClass("nebula.plugin.publishing.publications.SourceJarPlugin") - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaPlatformProjectPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaPlatformProjectPlugin.kt deleted file mode 100644 index d921ed37..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/java/JavaPlatformProjectPlugin.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.java - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import com.bybutter.sisyphus.project.gradle.tryApplyPluginClass -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication - -class JavaPlatformProjectPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("java-platform") { - apply(it) - }.also { - if (!it) return - } - - target.tryApplyPluginClass("nebula.plugin.publishing.maven.MavenPublishPlugin") - - target.afterEvaluate { - val publishing = it.extensions.getByType(PublishingExtension::class.java) - publishing.publications.withType(MavenPublication::class.java) { - it.from(target.components.getByName("javaPlatform")) - } - } - target.pluginManager.apply(JavaDependenciesReplacePlugin::class.java) - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectContactsPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectContactsPlugin.kt deleted file mode 100644 index a76a479b..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectContactsPlugin.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.publishing - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import com.bybutter.sisyphus.project.gradle.tryApplyPluginClass -import nebula.plugin.contacts.ContactsExtension -import org.gradle.api.Plugin -import org.gradle.api.Project - -class ProjectContactsPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("nebula.maven-base-publish") { - apply(it) - }.also { - if (!it) return - } - - try { - Class.forName("nebula.plugin.contacts.ContactsExtension") - } catch (ex: ClassNotFoundException) { - return - } - val rootContacts = target.rootProject.extensions.findByType(ContactsExtension::class.java) ?: return - target.tryApplyPluginClass("nebula.plugin.contacts.ContactsPlugin") - if (target != target.rootProject) { - val currentContacts = target.extensions.getByType(ContactsExtension::class.java) - - for ((email, person) in rootContacts.people) { - if (!currentContacts.people.containsKey(email)) { - currentContacts.people[email] = person - } - } - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectLicensePlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectLicensePlugin.kt deleted file mode 100644 index 966e7a8e..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectLicensePlugin.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.publishing - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import nebula.plugin.info.scm.ScmInfoExtension -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import java.io.File - -class ProjectLicensePlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("nebula.maven-base-publish", "nebula.info-scm") { - apply(it) - }.also { - if (!it) return - } - - val file = detectLicenseFile(target) ?: return - val license = detectLicense(file) ?: return - - val scmInfo = target.extensions.getByType(ScmInfoExtension::class.java) - val repo = detectGithubRepo(scmInfo.origin) ?: return - val branch = scmInfo.branch ?: return - - val publishing = target.extensions.getByType(PublishingExtension::class.java) - publishing.publications.withType(MavenPublication::class.java) { - it.pom { - it.licenses { - it.license { - it.name.set(license) - it.url.set("https://github.com/$repo/blob/$branch/${file.name}") - it.distribution.set("repo") - } - } - } - } - } - - private fun detectLicenseFile(target: Project): File? { - for (file in target.rootProject.projectDir.listFiles() ?: arrayOf()) { - if (file.name.contains("license", true)) { - return file - } - } - return null - } - - private fun detectLicense(file: File): String? { - val license = file.readText() - - for ((name, regex) in licenseRegex) { - if (regex.containsMatchIn(license)) { - return name - } - } - return null - } - - private fun detectGithubRepo(origin: String?): String? { - origin ?: return null - - for (githubPattern in githubPatterns) { - val result = githubPattern.matchEntire(origin) ?: continue - return "${result.groups[1]?.value}/${result.groups[2]?.value}" - } - return null - } - - companion object { - private val licenseRegex = mapOf( - "MIT License" to "MIT License".toRegex(), - "Apache License 2.0" to """Apache License\s+Version 2\.0""".toRegex(), - "Mozilla Public License 2.0" to """Mozilla Public License Version 2\.0""".toRegex(), - "GNU AGPLv3" to """GNU AFFERO GENERAL PUBLIC LICENSE\s+Version 3""".toRegex(), - "GNU GPLv3" to """GNU GENERAL PUBLIC LICENSE\s+Version 3""".toRegex(), - "GNU LGPLv3" to """GNU LESSER GENERAL PUBLIC LICENSE\s+Version 3""".toRegex(), - "Boost Software License 1.0" to """Boost Software License - Version 1\.0""".toRegex(), - "The Unlicense" to """This is free and unencumbered software released into the public domain\.""".toRegex(), - "WTFPL" to "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE".toRegex() - ) - private val githubPatterns = listOf( - """git@github.com:([a-zA-Z0-9-_.]+?):([a-zA-Z0-9-_.]+?).git""".toRegex(), - """https?://github.com/([a-zA-Z0-9-_.]+?)/([a-zA-Z0-9-_.]+?)\.git""".toRegex(), - """https?://github.com/([a-zA-Z0-9-_.]+?)/([a-zA-Z0-9-_.]+)""".toRegex() - ) - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectPublishingPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectPublishingPlugin.kt deleted file mode 100644 index 6343b306..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectPublishingPlugin.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.publishing - -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import com.bybutter.sisyphus.project.gradle.applyFromRepositoryKeys -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import com.bybutter.sisyphus.project.gradle.isRelease -import com.bybutter.sisyphus.project.gradle.isSnapshot -import com.bybutter.sisyphus.project.gradle.tryApplyPluginClass -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension - -class ProjectPublishingPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("nebula.maven-base-publish") { - apply(it) - }.also { - if (!it) return - } - - target.tryApplyPluginClass("nebula.plugin.info.InfoPlugin") - - val sisyphus = target.extensions.getByType(SisyphusExtension::class.java) - val publishing = target.extensions.getByType(PublishingExtension::class.java) - - if (target.isRelease()) { - publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories.get(), sisyphus.releaseRepositories.get()) - } - if (target.isSnapshot()) { - publishing.repositories.applyFromRepositoryKeys(sisyphus.repositories.get(), sisyphus.snapshotRepositories.get()) - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectSigningPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectSigningPlugin.kt deleted file mode 100644 index 753744fa..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/publishing/ProjectSigningPlugin.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.publishing - -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.plugins.signing.SigningExtension -import org.gradle.plugins.signing.SigningPlugin - -class ProjectSigningPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("nebula.maven-base-publish") { - apply(it) - }.also { - if (!it) return - } - - val sisyphus = target.extensions.getByType(SisyphusExtension::class.java) - val publishing = target.extensions.getByType(PublishingExtension::class.java) - - if (target.hasProperty("signing.gnupg.keyName")) { - target.pluginManager.apply(SigningPlugin::class.java) - val signing = target.extensions.getByType(SigningExtension::class.java) - signing.useGpgCmd() - target.afterEvaluate { - publishing.publications.all { - signing.sign(it) - } - } - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusAntlrKotlinPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusAntlrKotlinPlugin.kt deleted file mode 100644 index 0772c700..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusAntlrKotlinPlugin.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.threepart - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.SourceSetContainer - -class SisyphusAntlrKotlinPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("org.gradle.antlr", "kotlin") { - apply(it) - }.also { - if (!it) return - } - - val sourceSets = target.extensions.getByType(SourceSetContainer::class.java) - for (sourceSet in sourceSets) { - val kotlinTask = target.tasks.findByName(sourceSet.getCompileTaskName("kotlin")) ?: continue - val antlrTask = target.tasks.findByName(sourceSet.getTaskName("generate", "GrammarSource")) ?: continue - kotlinTask.dependsOn(antlrTask) - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusDockerPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusDockerPlugin.kt deleted file mode 100644 index 629b1670..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusDockerPlugin.kt +++ /dev/null @@ -1,227 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.threepart - -import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage -import com.bmuschko.gradle.docker.tasks.image.DockerPushImage -import com.bmuschko.gradle.docker.tasks.image.DockerSaveImage -import com.bmuschko.gradle.docker.tasks.image.Dockerfile -import com.bmuschko.gradle.docker.tasks.image.Dockerfile.Instruction -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import com.bybutter.sisyphus.project.gradle.getJavaMajorVersion -import com.bybutter.sisyphus.project.gradle.threepart.docker.ExtractBootJarLayer -import org.gradle.api.DefaultTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory -import org.gradle.api.plugins.ExtensionAware -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.MapProperty -import org.gradle.api.provider.Property -import org.gradle.api.provider.SetProperty -import org.gradle.api.tasks.Sync -import org.gradle.util.internal.GUtil -import org.springframework.boot.gradle.tasks.bundling.BootJar - -class SisyphusDockerPlugin : Plugin { - override fun apply(target: Project) { - target.pluginManager.withPlugin("application") { - target.pluginManager.apply("com.bmuschko.docker-remote-api") - - val sisyphus = target.extensions.getByType(SisyphusExtension::class.java) - val docker = target.extensions.getByName("docker") as ExtensionAware - val sisyphusDocker = - docker.extensions.create("sisyphus", SisyphusDockerExtension::class.java, target.objects, sisyphus) - - target.afterEvaluate { - val bootJar = target.tasks.findByName("bootJar") as? BootJar ?: return@afterEvaluate - registerExtractLayerTask(target, bootJar) - registerDockerfileTask(target, sisyphusDocker, bootJar) - registerSyncDockerContent(target) - registerDockerBuild(target, sisyphusDocker) - registerDockerPush(target, sisyphusDocker, sisyphus) - registerDockerSave(target) - } - } - } - - private fun registerExtractLayerTask(target: Project, bootJar: BootJar) { - target.tasks.register("extractBootJarLayer", ExtractBootJarLayer::class.java) { - it.dependsOn(bootJar) - it.bootJars = bootJar.outputs.files - it.outputDirectory = target.buildDir.resolve("tmp/extractedBootJarLayer") - } - } - - private fun registerDockerfileTask(target: Project, sisyphusDocker: SisyphusDockerExtension, bootJar: BootJar) { - target.tasks.register("dockerfile", Dockerfile::class.java) { - it.arg("PROJECT_NAME") - it.arg("PROJECT_VERSION") - it.from(sisyphusDocker.baseImage.get()) - it.environmentVariable("PROJECT_NAME", "\$PROJECT_NAME") - it.environmentVariable("PROJECT_VERSION", "\$PROJECT_VERSION") - sisyphusDocker.env.get().forEach { (key, value) -> - it.environmentVariable(key, value) - } - - it.exposePort(sisyphusDocker.ports) - - sisyphusDocker.baseInstructions.get().forEach { instruction -> - it.instructions.add(instruction) - } - - bootJar.layered.layerOrder.forEach { layer -> - it.copyFile("$layer/", "./") - it.runCommand("true") - } - - sisyphusDocker.instructions.get().forEach { instruction -> - it.instructions.add(instruction) - } - - it.entryPoint( - "java", - *sisyphusDocker.jvmArgs.get().toTypedArray(), - "org.springframework.boot.loader.JarLauncher" - ) - } - } - - private fun registerSyncDockerContent(target: Project) { - target.tasks.register("dockerSync", Sync::class.java) { - val extractBootJar = target.tasks.named("extractBootJarLayer").get() as ExtractBootJarLayer - it.dependsOn(extractBootJar) - it.dependsOn(target.tasks.named("dockerfile")) - it.group = "docker" - - it.destinationDir = target.buildDir.resolve("docker") - it.from(extractBootJar.outputDirectory) - var project: Project? = target - while (project != null) { - it.from(project.projectDir.resolve("docker")) - project = project.parent - } - it.preserve { - it.include("Dockerfile") - } - } - } - - private fun registerDockerBuild(target: Project, sisyphusDocker: SisyphusDockerExtension) { - target.tasks.register("dockerBuild", DockerBuildImage::class.java) { - it.dependsOn(target.tasks.named("dockerSync")) - it.group = "docker" - it.buildArgs.put("PROJECT_NAME", target.name) - it.buildArgs.put("PROJECT_VERSION", target.version.toString()) - it.platform.set(sisyphusDocker.platform) - it.images.add("${target.name}:${target.version}") - it.images.addAll(sisyphusDocker.images) - } - } - - private fun registerDockerPush( - target: Project, - sisyphusDocker: SisyphusDockerExtension, - sisyphus: SisyphusExtension - ) { - val registries = sisyphus.dockerPublishRegistries.get().associate { - it to sisyphus.repositories.getting(it).orNull - } - - val baseName = "${target.name}:${target.version}" - - sisyphusDocker.images.get().forEach { image -> - val repository = registries.entries.firstOrNull { - val url = it.value?.url ?: return@firstOrNull false - image == "$url/$baseName" - } ?: return@forEach - - target.tasks.register("dockerPush" + GUtil.toCamelCase(repository.key), DockerPushImage::class.java) { - it.dependsOn(target.tasks.named("dockerBuild")) - it.group = "docker" - it.images.set(listOf(image)) - it.registryCredentials { - it.url.set(repository.value?.url) - it.username.set(repository.value?.username) - it.password.set(repository.value?.password) - } - } - } - - target.tasks.register("dockerPushAll", DefaultTask::class.java) { - it.dependsOn(target.tasks.withType(DockerPushImage::class.java)) - it.group = "docker" - } - } - - private fun registerDockerSave(target: Project) { - target.tasks.register("dockerSave", DockerSaveImage::class.java) { - it.dependsOn(target.tasks.named("dockerBuild")) - it.group = "docker" - it.images.add("${target.name}:${target.version}") - it.useCompression.set(true) - it.destFile.set { - if (it.useCompression.orNull == true) { - target.buildDir.resolve("distributions/${target.name}-${target.version}-docker.tgz") - } else { - target.buildDir.resolve("distributions/${target.name}-${target.version}-docker.tar") - } - } - } - } -} - -open class SisyphusDockerExtension(factory: ObjectFactory, sisyphus: SisyphusExtension) { - val platform: Property = factory.property(String::class.java) - val baseImage: Property = factory.property(String::class.java) - val ports: ListProperty = factory.listProperty(Int::class.java).empty() - val images: SetProperty = factory.setProperty(String::class.java).empty() - val jvmArgs: ListProperty = factory.listProperty(String::class.java).empty() - val env: MapProperty = factory.mapProperty(String::class.java, String::class.java).empty() - val baseInstructions: ListProperty = factory.listProperty(Instruction::class.java).empty() - val instructions: ListProperty = factory.listProperty(Instruction::class.java).empty() - - init { - when (val version = getJavaMajorVersion()) { - in 1..7, - in 9..10, - in 12..16, - null -> { - } - - else -> { - baseImage.set("amazoncorretto:$version") - } - } - - val baseName = "${sisyphus.project.name}:${sisyphus.project.version}" - - images.set( - sisyphus.dockerPublishRegistries.map { - it.mapNotNull { - sisyphus.repositories.getting(it).orNull - }.map { - "${it.url}/$baseName" - } - } - ) - } - - fun baseInstructions(configure: ListProperty.() -> Unit) { - configure(baseInstructions) - } - - fun instructions(configure: ListProperty.() -> Unit) { - configure(instructions) - } - - fun ListProperty.copyFile(source: String, destination: String) { - add(Dockerfile.CopyFileInstruction(Dockerfile.CopyFile(source, destination))) - } - - fun ListProperty.addFile(source: String, destination: String) { - add(Dockerfile.AddFileInstruction(Dockerfile.File(source, destination))) - } - - fun ListProperty.runCommand(command: String) { - add(Dockerfile.RunCommandInstruction(command)) - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusKtlintPlugin.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusKtlintPlugin.kt deleted file mode 100644 index 6b64a3c6..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/SisyphusKtlintPlugin.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.threepart - -import com.bybutter.sisyphus.project.gradle.ensurePlugin -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.jlleitschuh.gradle.ktlint.KtlintExtension -import org.jlleitschuh.gradle.ktlint.reporter.ReporterType -import java.io.File - -class SisyphusKtlintPlugin : Plugin { - override fun apply(target: Project) { - target.ensurePlugin("org.jlleitschuh.gradle.ktlint") { - apply(it) - }.also { - if (!it) return - } - - val extension = target.extensions.getByType(KtlintExtension::class.java) - extension.filter { - val pattern = "${File.separatorChar}generated${File.separatorChar}" - it.exclude { - it.file.path.contains(pattern) - } - } - extension.reporters { - it.reporter(ReporterType.CHECKSTYLE) - } - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/docker/ExtractBootJarLayer.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/docker/ExtractBootJarLayer.kt deleted file mode 100644 index bf1d7418..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/project/gradle/threepart/docker/ExtractBootJarLayer.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.bybutter.sisyphus.project.gradle.threepart.docker - -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.Exec -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory -import java.io.File -import kotlin.io.path.Path -import kotlin.io.path.absolutePathString - -open class ExtractBootJarLayer : Exec() { - @InputFiles - lateinit var bootJars: FileCollection - - @OutputDirectory - lateinit var outputDirectory: File - - init { - this.executable = Path(System.getProperty("java.home")).resolve("bin/java").absolutePathString() - - this.args("-Djarmode=layertools") - this.args("-jar") - } - - override fun exec() { - this.workingDir = outputDirectory - this.args(bootJars.firstOrNull { it.name.endsWith(".jar") }?.absolutePath ?: return) - this.args("extract") - super.exec() - } -} diff --git a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/org/gradle/kotlin/dsl/SisyphusDevelopmentLayer.kt b/tools/sisyphus-project-gradle-plugin/src/main/kotlin/org/gradle/kotlin/dsl/SisyphusDevelopmentLayer.kt deleted file mode 100644 index 73ecb3a7..00000000 --- a/tools/sisyphus-project-gradle-plugin/src/main/kotlin/org/gradle/kotlin/dsl/SisyphusDevelopmentLayer.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.gradle.kotlin.dsl - -import com.bybutter.sisyphus.project.gradle.SisyphusExtension -import org.gradle.api.Project -import org.gradle.api.artifacts.Dependency -import org.gradle.api.artifacts.ExternalModuleDependency -import org.gradle.api.attributes.Attribute - -enum class SisyphusDevelopmentLayer { - /** - * Just for implementation development, it will disable all internal module version replace. - */ - IMPLEMENTATION, - - /** - * Layer 1, Api schema and proto development - */ - API, - - /** - * Layer 2, Middleware and internal component development, include [API] - */ - PLATFORM, - - /** - * Layer 3, Framework development, include [API], [PLATFORM] - */ - FRAMEWORK; - - companion object { - val attribute = Attribute.of(SisyphusDevelopmentLayer::class.java) - } -} - -fun Project.apiLayer(dependency: T): T { - return layer(dependency, SisyphusDevelopmentLayer.API) -} - -fun Project.platformLayer(dependency: T): T { - return layer(dependency, SisyphusDevelopmentLayer.PLATFORM) -} - -fun Project.frameworkLayer(dependency: T): T { - return layer(dependency, SisyphusDevelopmentLayer.FRAMEWORK) -} - -fun Project.layer(dependency: T, layer: SisyphusDevelopmentLayer): T { - val sisyphus = extensions.findByType(SisyphusExtension::class.java) ?: return dependency - if (!sisyphus.developer.isPresent) return dependency - if (sisyphus.layer.get().ordinal < layer.ordinal) return dependency - - if (dependency is ExternalModuleDependency) { - dependency.version { - it.require(this@layer.version.toString()) - } - } - return dependency -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/build.gradle.kts b/tools/sisyphus-protobuf-gradle-plugin/build.gradle.kts deleted file mode 100644 index c4af294c..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/build.gradle.kts +++ /dev/null @@ -1,45 +0,0 @@ -tools - -plugins { - `java-library` - `java-gradle-plugin` - id("com.gradle.plugin-publish") -} - -description = "Plugin for compiling proto files with Gradle in Sisyphus Framework" - -dependencies { - implementation(project(":lib:sisyphus-common")) - implementation(project(":lib:sisyphus-jackson")) - implementation(project(":tools:sisyphus-protoc")) - implementation(project(":tools:sisyphus-api-linter-runner")) - - compileOnly("com.android.tools.build:gradle") - - implementation(Dependencies.Kotlin.reflect) - implementation(Dependencies.Kotlin.plugin) - implementation(Dependencies.Proto.apiCompiler) -} - -gradlePlugin { - plugins { - create("protobuf") { - id = "com.bybutter.sisyphus.protobuf" - displayName = "Sisyphus Protobuf Plugin" - description = "Protobuf compiler plugin for sisyphus framework." - implementationClass = "com.bybutter.sisyphus.protobuf.gradle.ProtobufPlugin" - } - } -} - -pluginBundle { - website = "https://github.com/ButterCam/sisyphus" - vcsUrl = "https://github.com/ButterCam/sisyphus" - description = "Protobuf compiler plugin for sisyphus framework." - - (plugins) { - "protobuf" { - tags = listOf("sisyphus", "protobuf", "grpc") - } - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BaseProtobufPlugin.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BaseProtobufPlugin.kt deleted file mode 100644 index 4bef2ad3..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BaseProtobufPlugin.kt +++ /dev/null @@ -1,152 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import org.gradle.api.GradleException -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.artifacts.Configuration -import org.gradle.api.artifacts.ModuleDependency -import org.gradle.api.attributes.Category -import org.gradle.api.attributes.LibraryElements -import org.gradle.api.attributes.Usage -import org.gradle.api.file.FileCollection -import java.io.File - -abstract class BaseProtobufPlugin : Plugin { - protected lateinit var project: Project - protected lateinit var extension: ProtobufExtension - private var applied = false - - final override fun apply(target: Project) { - if (applied) return - - this.project = target - applied = true - extension = protoExtension() - doApply() - project.afterEvaluate { - doAfterApply() - if (!applied) { - throw GradleException("The 'com.bybutter.sisyphus.protobuf' plugin requires 'java' or 'android' plugin.") - } - } - } - - protected abstract fun protoExtension(): ProtobufExtension - - protected open fun protoConfiguration(sourceSetName: String): Configuration { - return project.configurations.maybeCreate(protoConfigurationName(sourceSetName)).apply { - description = "Proto files to compile for source set '$sourceSetName'" - isCanBeConsumed = false - isCanBeResolved = true - this.withDependencies { - for (dependency in it) { - val moduleDependency = dependency as? ModuleDependency ?: continue - when (moduleDependency.attributes.getAttribute(Category.CATEGORY_ATTRIBUTE)?.name) { - Category.ENFORCED_PLATFORM, Category.REGULAR_PLATFORM, Category.LIBRARY -> { - dependency.isTransitive = true - } - else -> { - dependency.isTransitive = false - } - } - } - } - attributes.attribute( - Usage.USAGE_ATTRIBUTE, - project.objects.named(Usage::class.java, Usage.JAVA_API) - ) - } - } - - protected open fun protoApiConfiguration(sourceSetName: String): Configuration { - return project.configurations.maybeCreate(protoApiConfigurationName(sourceSetName)).apply { - description = "Proto dependency files for compiling of source set '$sourceSetName'" - isCanBeConsumed = false - isCanBeResolved = true - attributes.attribute( - Usage.USAGE_ATTRIBUTE, - project.objects.named(Usage::class.java, Usage.JAVA_API) - ) - attributes.attribute( - LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, - project.objects.named(LibraryElements::class.java, LibraryElements.RESOURCES) - ) - } - } - - protected open fun generateProtoTask(): Task { - val name = "generateProtos" - return project.tasks.findByName(name) ?: project.tasks.register(name) { - it.group = "proto" - it.description = "Generate protos for all source set." - }.get() - } - - protected abstract fun protoCompileFiles(sourceSetName: String): FileCollection - - protected abstract fun protoApiFiles(sourceSetName: String): FileCollection - - protected open fun extractProtoTask(sourceSetName: String): ExtractProtoTask { - val name = extractProtoTaskName(sourceSetName) - return project.tasks.findByName(name) as? ExtractProtoTask ?: project.tasks.register( - name, - ExtractProtoTask::class.java - ) { - it.resourceOutput.set(metadataDir(sourceSetName)) - it.protoPath.set(workDir(sourceSetName)) - it.protoApiFiles.from(protoApiFiles(sourceSetName)) - it.protoCompileFiles.from(protoCompileFiles(sourceSetName)) - it.group = "proto" - it.description = "Extract protos for '$sourceSetName' source set." - it.protobuf = extension - - it.dependsOn(protoConfiguration(sourceSetName)) - it.dependsOn(protoApiConfiguration(sourceSetName)) - }.get() - } - - protected open fun generateProtoTask(sourceSetName: String): GenerateProtoTask { - val name = generateProtoTaskName(sourceSetName) - return project.tasks.findByName(name) as? GenerateProtoTask ?: project.tasks.register( - name, - GenerateProtoTask::class.java - ) { - it.protoPath.set(workDir(sourceSetName)) - it.output.set(outDir(sourceSetName)) - it.resourceOutput.set(metadataDir(sourceSetName)) - it.group = "proto" - it.description = "Generate protos for '$sourceSetName' source set." - it.protobuf = extension - - it.dependsOn(extractProtoTask(sourceSetName)) - generateProtoTask().dependsOn(it) - }.get() - } - - protected open fun protoSrc(sourceSetName: String): File { - return extension.sourceSet(sourceSetName).srcDir?.let { - project.file(it) - } ?: project.file("src/$sourceSetName/proto") - } - - protected open fun metadataDir(sourceSetName: String): File { - return extension.sourceSet(sourceSetName).metadataDir?.let { - project.file(it) - } ?: project.buildDir.resolve("generated/proto/metadata/$sourceSetName") - } - - protected open fun outDir(sourceSetName: String): File { - return extension.sourceSet(sourceSetName).metadataDir?.let { - project.file(it) - } ?: project.buildDir.resolve("generated/proto/source/$sourceSetName") - } - - protected open fun workDir(sourceSetName: String): File { - return project.buildDir.resolve("tmp/proto/$sourceSetName") - } - - abstract fun doApply() - - abstract fun doAfterApply() -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BuildInPlugin.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BuildInPlugin.kt deleted file mode 100644 index 2af5abbe..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/BuildInPlugin.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -enum class BuildInPlugin { - BASIC_GENERATOR, - COROUTINE_SERVICE_GENERATOR, - SEPARATED_COROUTINE_SERVICE_GENERATOR, - RXJAVA_SERVICE_GENERATOR, - SEPARATED_RXJAVA_SERVICE_GENERATOR, - RESOURCE_NAME_GENERATOR, - LITE_DESCRIPTOR_GENERATOR, - INLINE_DESCRIPTOR_GENERATOR, - GENERATORS_FROM_SPI -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Extension.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Extension.kt deleted file mode 100644 index f1ed5d67..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Extension.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.android.build.gradle.AppExtension -import com.android.build.gradle.BaseExtension -import com.android.build.gradle.LibraryExtension -import com.android.build.gradle.api.BaseVariant -import org.gradle.api.DomainObjectSet -import org.gradle.api.GradleException -import org.gradle.api.Project -import org.gradle.api.tasks.SourceSetContainer - -val Project.android: BaseExtension - get() = project.extensions.getByType(BaseExtension::class.java) - -val Project.isAndroid: Boolean - get() = project.extensions.findByName("android") != null - -val Project.sourceSets: SourceSetContainer - get() { - return project.extensions.getByType(SourceSetContainer::class.java) - } - -val BaseExtension.variants: DomainObjectSet - get() { - return when (this) { - is AppExtension -> applicationVariants - is LibraryExtension -> libraryVariants - else -> throw GradleException("Unsupported android BaseExtension type") - } - } diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ExtractProtoTask.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ExtractProtoTask.kt deleted file mode 100644 index bc6b2f56..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ExtractProtoTask.kt +++ /dev/null @@ -1,135 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.bybutter.sisyphus.io.toUnixPath -import com.bybutter.sisyphus.protobuf.compiler.ProtocRunner -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import java.io.File -import java.nio.file.FileSystems -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths -import java.nio.file.SimpleFileVisitor -import java.nio.file.attribute.BasicFileAttributes - -open class ExtractProtoTask : DefaultTask() { - @get:OutputDirectory - val resourceOutput: DirectoryProperty = project.objects.directoryProperty() - - @get:OutputDirectory - val protoPath: DirectoryProperty = project.objects.directoryProperty() - - @get:InputFiles - val protoCompileFiles: ConfigurableFileCollection = project.objects.fileCollection() - - @get:InputFiles - val protoApiFiles: ConfigurableFileCollection = project.objects.fileCollection() - - @get:Internal - lateinit var protobuf: ProtobufExtension - - private val scannedMapping = mutableMapOf() - private val sourceProtos = mutableSetOf() - private val sourceFileMapping = mutableMapOf() - - private fun addProto(file: File) { - addProto(file, false) - } - - private fun addSource(file: File) { - addProto(file, true) - } - - private fun addProto(file: File, source: Boolean) { - if (file.isFile) { - FileSystems.newFileSystem(file.toPath(), javaClass.classLoader).use { - for (rootDirectory in it.rootDirectories) { - addProtoInternal(rootDirectory, source) - } - } - } else { - addProtoInternal(file.toPath(), source) - } - } - - private fun addProtoInternal(dir: Path, source: Boolean) { - if (!Files.exists(dir)) { - return - } - - Files.walkFileTree( - dir, - object : SimpleFileVisitor() { - override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { - if (file.fileName.toString().endsWith(".proto")) { - addProtoInternal(dir.relativize(file).toString(), Files.readAllBytes(file), file, source) - } - if (file.endsWith("protomap")) { - scannedMapping += Files.readAllLines(file).mapNotNull { - val map = it.split('=') - if (map.size == 2) { - map[0] to map[1] - } else { - null - } - } - } - return FileVisitResult.CONTINUE - } - } - ) - } - - private fun addProtoInternal(name: String, value: ByteArray, file: Path, source: Boolean) { - if (source) { - val protoName = name.toUnixPath() - sourceProtos += protoName - sourceFileMapping[protoName] = file.toString() - } - val targetFile = protoPath.asFile.get().toPath().resolve(name) - Files.createDirectories(targetFile.parent) - Files.deleteIfExists(targetFile) - Files.write(targetFile, value) - } - - @TaskAction - fun extractProto() { - resourceOutput.asFile.get().deleteRecursively() - resourceOutput.asFile.get().mkdirs() - - scannedMapping += protobuf.mapping - - for (file in protoApiFiles) { - addProto(file) - } - - for (file in protoCompileFiles) { - addSource(file) - } - - if (protobuf.mapping.isNotEmpty()) { - Files.write( - Paths.get(resourceOutput.asFile.get().toPath().toString(), "protomap"), - protobuf.mapping.map { "${it.key}=${it.value}" } - ) - } - - val desc = ProtocRunner.generate(protoPath.asFile.get(), sourceProtos) - Files.write(Paths.get(protoPath.asFile.get().toPath().toString(), "protodesc.pb"), desc.toByteArray()) - Files.write( - Paths.get(protoPath.asFile.get().toPath().toString(), "protomap"), - scannedMapping.map { "${it.key}=${it.value}" } - ) - Files.write(Paths.get(protoPath.asFile.get().toPath().toString(), "protosrc"), sourceProtos) - Files.write( - Paths.get(protoPath.asFile.get().toPath().toString(), "protofile"), - sourceFileMapping.map { "${it.key}=${it.value}" } - ) - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/GenerateProtoTask.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/GenerateProtoTask.kt deleted file mode 100644 index 5aa54389..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/GenerateProtoTask.kt +++ /dev/null @@ -1,121 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.bybutter.sisyphus.protobuf.compiler.CodeGenerators -import com.bybutter.sisyphus.protobuf.compiler.GeneratedDescriptorFile -import com.bybutter.sisyphus.protobuf.compiler.GeneratedKotlinFile -import com.bybutter.sisyphus.protobuf.compiler.ProtobufCompiler -import com.bybutter.sisyphus.protobuf.compiler.RuntimeTypes -import com.google.protobuf.DescriptorProtos -import com.squareup.kotlinpoet.TypeSpec -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import java.nio.charset.Charset -import java.nio.file.Files -import java.nio.file.Paths -import java.nio.file.StandardCopyOption - -open class GenerateProtoTask : DefaultTask() { - @get:InputDirectory - val protoPath: DirectoryProperty = project.objects.directoryProperty() - - @get:OutputDirectory - val output: DirectoryProperty = project.objects.directoryProperty() - - @get:OutputDirectory - val resourceOutput: DirectoryProperty = project.objects.directoryProperty() - - @get:Internal - lateinit var protobuf: ProtobufExtension - - @TaskAction - fun generateKotlin() { - output.asFile.get().deleteRecursively() - output.asFile.get().mkdirs() - - val descFile = protoPath.get().file("protodesc.pb").asFile - val desc = if (descFile.exists()) { - DescriptorProtos.FileDescriptorSet.parseFrom(descFile.readBytes()) - } else { - return - } - - val mappingFile = protoPath.get().file("protomap").asFile - val mapping = if (mappingFile.exists()) { - mappingFile.readLines().mapNotNull { - val map = it.split('=') - if (map.size == 2) { - map[0] to map[1] - } else { - null - } - }.associate { it } - } else { - mapOf() - } - - val sourceFile = protoPath.get().file("protosrc").asFile - val source = if (sourceFile.exists()) { - sourceFile.readLines().toSet() - } else { - setOf() - } - - val compiler = ProtobufCompiler(desc, mapping, protobuf.plugins.toCodeGenerators()) - val results = compiler.generate(source) - for (result in results.results) { - val sourceProto = result.descriptor.descriptor.name - if (protobuf.source) { - val sourceProtoFile = protoPath.get().file(sourceProto).asFile.toPath() - val protoFile = Paths.get(resourceOutput.get().asFile.toPath().toString(), sourceProto) - Files.createDirectories(protoFile.parent) - Files.copy(sourceProtoFile, protoFile, StandardCopyOption.REPLACE_EXISTING) - } - for (file in result.files) { - when (file) { - is GeneratedKotlinFile -> { - file.writeTo(output.get().asFile.toPath()) - } - - is GeneratedDescriptorFile -> { - file.writeTo(resourceOutput.get().asFile.toPath()) - } - } - } - } - results.booster?.let { - it.writeTo(output.get().asFile.toPath()) - val booster = Paths.get( - resourceOutput.get().asFile.toPath().toString(), - "META-INF/services/${RuntimeTypes.PROTOBUF_BOOSTER.canonicalName}" - ) - val boosterName = "${it.packageName}.${(it.members.first() as TypeSpec).name}" - Files.createDirectories(booster.parent) - Files.write(booster, boosterName.toByteArray(Charset.defaultCharset())) - } - } - - companion object { - private fun ProtoCompilerPlugins.toCodeGenerators(): CodeGenerators { - return CodeGenerators().apply { - for (buildInPlugin in this@toCodeGenerators.buildInPlugins) { - when (buildInPlugin) { - BuildInPlugin.BASIC_GENERATOR -> basic() - BuildInPlugin.COROUTINE_SERVICE_GENERATOR -> coroutineService() - BuildInPlugin.SEPARATED_COROUTINE_SERVICE_GENERATOR -> separatedCoroutineService() - BuildInPlugin.RXJAVA_SERVICE_GENERATOR -> rxjavaClient() - BuildInPlugin.SEPARATED_RXJAVA_SERVICE_GENERATOR -> separatedRxjavaClient() - BuildInPlugin.RESOURCE_NAME_GENERATOR -> resourceName() - BuildInPlugin.GENERATORS_FROM_SPI -> spi() - BuildInPlugin.LITE_DESCRIPTOR_GENERATOR -> liteDescriptor() - BuildInPlugin.INLINE_DESCRIPTOR_GENERATOR -> inlineDescriptor() - } - } - register(this@toCodeGenerators.plugins) - } - } - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoCompilerPlugins.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoCompilerPlugins.kt deleted file mode 100644 index 07ad8944..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoCompilerPlugins.kt +++ /dev/null @@ -1,128 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.bybutter.sisyphus.protobuf.compiler.CodeGenerator -import com.bybutter.sisyphus.protobuf.compiler.GroupedGenerator -import com.bybutter.sisyphus.protobuf.compiler.SortableGenerator -import com.bybutter.sisyphus.protobuf.compiler.core.state.GeneratingState -import com.bybutter.sisyphus.reflect.instance -import kotlin.reflect.KClass - -data class ProtoCompilerPlugins( - val buildInPlugins: MutableSet = mutableSetOf(), - val plugins: MutableList> = mutableListOf() -) { - fun spi(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.GENERATORS_FROM_SPI - return this - } - - fun liteDescriptor(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.LITE_DESCRIPTOR_GENERATOR - return this - } - - fun inlineDescriptor(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.INLINE_DESCRIPTOR_GENERATOR - return this - } - - fun basic(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.BASIC_GENERATOR - return this - } - - fun coroutine(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.COROUTINE_SERVICE_GENERATOR - return this - } - - fun separatedCoroutine(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.SEPARATED_COROUTINE_SERVICE_GENERATOR - return this - } - - fun rxJava(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.RXJAVA_SERVICE_GENERATOR - return this - } - - fun separatedRxJava(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.SEPARATED_RXJAVA_SERVICE_GENERATOR - return this - } - - fun resourceName(): ProtoCompilerPlugins { - buildInPlugins += BuildInPlugin.RESOURCE_NAME_GENERATOR - return this - } - - inline fun > inline(noinline block: (T) -> Unit) { - plugin(object : CodeGenerator { - override fun generate(state: T): Boolean { - block(state) - return true - } - }) - } - - inline fun > inline(order: Int, noinline block: (T) -> Unit) { - plugin(object : SortableGenerator { - override val order: Int get() = order - - override fun generate(state: T): Boolean { - block(state) - return true - } - }) - } - - inline fun > inline(group: String, noinline block: (T) -> Unit) { - plugin(object : GroupedGenerator { - override val group: String - get() = group - - override fun generate(state: T): Boolean { - block(state) - return true - } - }) - } - - inline fun > inline(group: String, order: Int, noinline block: (T) -> Unit) { - plugin(object : GroupedGenerator, SortableGenerator { - override val group: String - get() = group - - override val order: Int get() = order - - override fun generate(state: T): Boolean { - block(state) - return true - } - }) - } - - fun plugin(plugin: BuildInPlugin) { - buildInPlugins += plugin - } - - fun plugin(className: String) { - plugin(Class.forName(className) as Class>) - } - - fun plugin(clazz: KClass>) { - plugin(clazz.java) - } - - fun plugin(clazz: Class>) { - plugin(clazz.instance()) - } - - fun plugin(generator: CodeGenerator<*>) { - plugins += generator - } - - companion object { - val default = ProtoCompilerPlugins().basic().coroutine().resourceName() - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoGeneratingConfig.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoGeneratingConfig.kt deleted file mode 100644 index 4a088c21..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtoGeneratingConfig.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -data class ProtoGeneratingConfig( - var srcDir: String? = null, - var outputDir: String? = null, - var metadataDir: String? = null -) diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufAndroidPlugin.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufAndroidPlugin.kt deleted file mode 100644 index bd2c4449..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufAndroidPlugin.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.android.build.api.dsl.AndroidSourceSet -import com.android.build.gradle.api.BaseVariant -import org.gradle.api.attributes.Attribute -import org.gradle.api.file.FileCollection -import org.gradle.plugins.ide.idea.model.IdeaModel - -class ProtobufAndroidPlugin : BaseProtobufPlugin() { - override fun doApply() { - for (sourceSet in project.android.sourceSets) { - applySourceSet(sourceSet) - } - generateProtoTask() - } - - override fun doAfterApply() { - for (sourceSet in project.android.sourceSets) { - afterApplySourceSet(sourceSet) - } - - for (variant in project.android.variants) { - afterApplyVariant(variant) - } - - project.android.variants - } - - override fun protoExtension(): ProtobufExtension { - return project.extensions.create("protobuf", ProtobufExtension::class.java).apply { - source = false - plugins { - basic().rxJava().resourceName().liteDescriptor().inlineDescriptor() - } - } - } - - override fun protoApiFiles(sourceSetName: String): FileCollection { - val variant = project.android.variants.first { - it.name == sourceSetName - } - - return project.files( - variant.compileConfiguration.incoming.artifactView { - it.attributes { - it.attribute(Attribute.of("artifactType", String::class.java), "jar") - } - }.files, - variant.sourceSets.map { protoApiConfiguration(it.name) } - ) - } - - override fun protoCompileFiles(sourceSetName: String): FileCollection { - val variant = project.android.variants.first { - it.name == sourceSetName - } - return project.files( - variant.sourceSets.map { protoSrc(it.name) }, - variant.sourceSets.map { protoConfiguration(it.name) } - ) - } - - private fun applySourceSet(sourceSet: AndroidSourceSet) { - protoConfiguration(sourceSet.name) - protoApiConfiguration(sourceSet.name) - - sourceSet.resources { - srcDir(metadataDir(sourceSet.name)) - } - - sourceSet.java { - srcDir(outDir(sourceSet.name)) - } - } - - private fun afterApplySourceSet(sourceSet: AndroidSourceSet) { - project.extensions.findByType(IdeaModel::class.java)?.apply { - module.sourceDirs = module.sourceDirs + protoSrc(sourceSet.name) - module.generatedSourceDirs.add(outDir(sourceSet.name)) - this.module.scopes["PROVIDED"]?.get("plus")?.add(protoApiConfiguration(sourceSet.name)) - this.module.scopes["COMPILE"]?.get("plus")?.add(protoConfiguration(sourceSet.name)) - } - } - - private fun afterApplyVariant(variant: BaseVariant) { - extractProtoTask(variant.name) - generateProtoTask(variant.name) - - if (extension.autoGenerating) { - val kotlinTask = project.tasks.findByName(compileKotlinTaskName(variant.name)) - kotlinTask?.dependsOn(generateProtoTask(variant.name)) - variant.processJavaResourcesProvider.configure { - it.dependsOn(generateProtoTask(variant.name)) - } - } - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufExtension.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufExtension.kt deleted file mode 100644 index 0097575d..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufExtension.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -open class ProtobufExtension { - private val _configs: MutableMap = mutableMapOf() - private val _packageMapping = mutableMapOf() - private var _plugins = ProtoCompilerPlugins.default - - val mapping: Map get() = _packageMapping - - val plugins: ProtoCompilerPlugins get() = _plugins - - var source = true - - var autoGenerating = true - - fun sourceSet(name: String, block: ProtoGeneratingConfig.() -> Unit = {}): ProtoGeneratingConfig { - val config = _configs.getOrPut(name) { ProtoGeneratingConfig() } - config.block() - return config - } - - fun packageMapping(proto: String, kotlin: String) { - _packageMapping[proto] = kotlin - } - - fun packageMapping(vararg mapping: Pair) { - _packageMapping.putAll(mapping) - } - - fun plugins(block: ProtoCompilerPlugins.() -> Unit) { - _plugins = ProtoCompilerPlugins().apply(block) - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufJvmPlugin.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufJvmPlugin.kt deleted file mode 100644 index bf1ebdd2..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufJvmPlugin.kt +++ /dev/null @@ -1,90 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import org.gradle.api.artifacts.Configuration -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.SourceSet -import org.gradle.plugins.ide.idea.model.IdeaModel - -class ProtobufJvmPlugin : BaseProtobufPlugin() { - override fun doApply() { - for (sourceSet in project.sourceSets) { - applySourceSet(sourceSet) - } - } - - override fun doAfterApply() { - for (sourceSet in project.sourceSets) { - afterApplySourceSet(sourceSet) - } - } - - override fun protoExtension(): ProtobufExtension { - return project.extensions.create("protobuf", ProtobufExtension::class.java) - } - - override fun protoApiConfiguration(sourceSetName: String): Configuration { - return project.configurations.findByName(protoApiConfigurationName(sourceSetName)) ?: run { - val sourceSet = project.sourceSets.getByName(sourceSetName) - super.protoApiConfiguration(sourceSetName).apply { - this.extendsFrom(project.configurations.getByName(sourceSet.implementationConfigurationName)) - this.extendsFrom(project.configurations.getByName(sourceSet.compileOnlyConfigurationName)) - } - } - } - - override fun protoApiFiles(sourceSetName: String): FileCollection { - return if (sourceSetName == SourceSet.TEST_SOURCE_SET_NAME) { - val sourceSet = project.sourceSets.getByName(sourceSetName) - protoApiConfiguration(sourceSetName) + sourceSet.compileClasspath - } else { - protoApiConfiguration(sourceSetName) - } - } - - override fun protoCompileFiles(sourceSetName: String): FileCollection { - return protoConfiguration(sourceSetName) + project.files(protoSrc(sourceSetName)) - } - - private fun applySourceSet(sourceSet: SourceSet) { - protoConfiguration(sourceSet.name) - protoApiConfiguration(sourceSet.name) - generateProtoTask() - extractProtoTask(sourceSet.name) - generateProtoTask(sourceSet.name) - - sourceSet.extensions.add( - "proto", - project.objects.sourceDirectorySet(sourceSet.name, "proto source dir").apply { - srcDir(protoSrc(sourceSet.name)) - } - ) - - sourceSet.resources { - it.srcDir(metadataDir(sourceSet.name)) - } - - sourceSet.java { - it.srcDir(outDir(sourceSet.name)) - } - } - - private fun afterApplySourceSet(sourceSet: SourceSet) { - val kotlinTask = project.tasks.findByName(compileKotlinTaskName(sourceSet.name)) - if (extension.autoGenerating && kotlinTask != null) { - kotlinTask.dependsOn(generateProtoTask(sourceSet.name)) - } - - val processResourcesTask = project.tasks.findByName(sourceSet.processResourcesTaskName) - if (extension.autoGenerating && processResourcesTask != null) { - processResourcesTask.dependsOn(generateProtoTask(sourceSet.name)) - processResourcesTask.dependsOn(extractProtoTask(sourceSet.name)) - } - - project.extensions.findByType(IdeaModel::class.java)?.apply { - module.sourceDirs = module.sourceDirs + protoSrc(sourceSet.name) - module.generatedSourceDirs.add(outDir(sourceSet.name)) - this.module.scopes["PROVIDED"]?.get("plus")?.add(protoApiConfiguration(sourceSet.name)) - this.module.scopes["COMPILE"]?.get("plus")?.add(protoConfiguration(sourceSet.name)) - } - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufPlugin.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufPlugin.kt deleted file mode 100644 index e6c87c8a..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/ProtobufPlugin.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import org.gradle.api.Plugin -import org.gradle.api.Project - -class ProtobufPlugin : Plugin { - override fun apply(target: Project) { - target.pluginManager.withPlugin("com.android.base") { - target.pluginManager.apply(ProtobufAndroidPlugin::class.java) - } - target.pluginManager.withPlugin("org.gradle.java-library") { - target.pluginManager.apply(ProtobufJvmPlugin::class.java) - } - target.pluginManager.withPlugin("org.gradle.application") { - target.pluginManager.apply(ProtobufJvmPlugin::class.java) - } - } -} diff --git a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Util.kt b/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Util.kt deleted file mode 100644 index 46b86882..00000000 --- a/tools/sisyphus-protobuf-gradle-plugin/src/main/kotlin/com/bybutter/sisyphus/protobuf/gradle/Util.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.bybutter.sisyphus.protobuf.gradle - -import com.bybutter.sisyphus.string.toCamelCase - -fun protoConfigurationName(sourceSetName: String): String { - return if (sourceSetName == "main") { - "proto" - } else { - "$sourceSetName proto".toCamelCase() - } -} - -fun protoApiConfigurationName(sourceSetName: String): String { - return "${protoConfigurationName(sourceSetName)} api".toCamelCase() -} - -fun extractProtoTaskName(sourceSetName: String): String { - return "extract $sourceSetName proto".toCamelCase() -} - -fun generateProtoTaskName(sourceSetName: String): String { - return "generate $sourceSetName proto".toCamelCase() -} - -fun compileKotlinTaskName(sourceSetName: String): String { - return if (sourceSetName == "main") { - "compileKotlin" - } else { - "compile $sourceSetName Kotlin".toCamelCase() - } -} diff --git a/tools/sisyphus-protoc/build.gradle.kts b/tools/sisyphus-protoc/build.gradle.kts index b0a4309a..ba6bdd4a 100644 --- a/tools/sisyphus-protoc/build.gradle.kts +++ b/tools/sisyphus-protoc/build.gradle.kts @@ -7,17 +7,17 @@ plugins { description = "Proto compiler for Sisyphus customized Protobuf runtime" dependencies { - api(project(":lib:sisyphus-common")) - api(project(":tools:sisyphus-protoc-runner")) - api(Dependencies.Kotlin.poet) - api(Dependencies.Proto.base) + api(libs.kotlinpoet) - implementation(Dependencies.Proto.grpcProto) - implementation("com.google.api:api-common") + implementation(projects.lib.sisyphusCommon) + implementation(projects.tools.sisyphusProtocRunner) + implementation(libs.protobuf.java) + implementation(libs.kotlin.coroutines) + implementation(libs.google.commonProtos) + implementation(libs.google.apiCommon) + implementation(libs.rxjava) - implementation("io.reactivex.rxjava2:rxjava") - - testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation(project(":lib:sisyphus-grpc-coroutine")) - testImplementation(project(":lib:sisyphus-grpc-rxjava")) + testImplementation(libs.junit.jupiter) + testImplementation(projects.lib.sisyphusGrpcCoroutine) + testImplementation(projects.lib.sisyphusGrpcRxjava) } diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/MessageFieldDescriptor.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/MessageFieldDescriptor.kt index a0679eb1..9afe634b 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/MessageFieldDescriptor.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/MessageFieldDescriptor.kt @@ -152,7 +152,9 @@ fun DescriptorNode.mutableFieldType(): Ty MAP -> MUTABLE_MAP.parameterizedBy(name.typeArguments) else -> TODO() } - } else return fieldType() + } else { + return fieldType() + } } fun DescriptorNode.mapEntry(): MessageDescriptor? { diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/core/generator/MessageImplementationGenerator.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/core/generator/MessageImplementationGenerator.kt index 8a522253..f510f3c4 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/core/generator/MessageImplementationGenerator.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/core/generator/MessageImplementationGenerator.kt @@ -117,7 +117,8 @@ class MessageClearFieldInCurrentFunctionGenerator : GroupedGenerator", field.descriptor.name) @@ -160,7 +162,8 @@ class MessageClearFieldInCurrentFunctionGenerator : GroupedGenerator") @@ -219,7 +222,8 @@ class MessageGetFieldInCurrentFunctionGenerator : GroupedGenerator", field.descriptor.name) @@ -263,7 +268,8 @@ class MessageGetFieldInCurrentFunctionGenerator : GroupedGenerator") @@ -309,7 +315,8 @@ class MessageSetFieldInCurrentFunctionGenerator : GroupedGenerator", field.descriptor.name) @@ -353,7 +361,8 @@ class MessageSetFieldInCurrentFunctionGenerator : GroupedGenerator") @@ -381,12 +390,14 @@ class MessageFieldSetFieldInCurrentFunctionGenerator : addStatement("this.%N.clear()", state.descriptor.name()) if (state.descriptor.mapEntry() == null) { addStatement( - "this.%N.addAll(value.%M())", state.descriptor.name(), + "this.%N.addAll(value.%M())", + state.descriptor.name(), RuntimeMethods.UNCHECK_CAST ) } else { addStatement( - "this.%N.putAll(value.%M())", state.descriptor.name(), + "this.%N.putAll(value.%M())", + state.descriptor.name(), RuntimeMethods.UNCHECK_CAST ) } @@ -421,7 +432,8 @@ class MessageHasFieldInCurrentFunctionGenerator : GroupedGenerator", field.descriptor.name) @@ -464,7 +477,8 @@ class MessageHasFieldInCurrentFunctionGenerator : GroupedGenerator") @@ -539,8 +553,10 @@ class MessageFieldEqualsFunctionGenerator : GroupedGenerator { addStatement( - "if (!%N.%M(other.%N)) return·false", state.descriptor.name(), - RuntimeMethods.CONTENT_EQUALS, state.descriptor.name() + "if (!%N.%M(other.%N)) return·false", + state.descriptor.name(), + RuntimeMethods.CONTENT_EQUALS, + state.descriptor.name() ) } } @@ -819,14 +835,16 @@ class MessageFieldReadFunctionGenerator : GroupedGenerator reader.mapEntry({ it.${keyType.name.lowercase()}() }, { %T.newMutable().apply { readFrom(reader) } }) { k,·v·-> this.%N[k]·=·v }", - valueDescriptor.elementType(), state.descriptor.name() + valueDescriptor.elementType(), + state.descriptor.name() ) } } WireFormat.FieldType.ENUM -> { addStatement( "${state.descriptor.descriptor.number} -> reader.mapEntry({ it.${keyType.name.lowercase()}() }, { %T(it.int32()) }) { k,·v·-> this.%N[k]·=·v }", - valueDescriptor.elementType(), state.descriptor.name() + valueDescriptor.elementType(), + state.descriptor.name() ) } else -> { @@ -866,7 +884,8 @@ class MessageFieldReadFunctionGenerator : GroupedGenerator addStatement( - "${state.descriptor.descriptor.number} -> this.%N = %T(reader.int32())", state.descriptor.name(), + "${state.descriptor.descriptor.number} -> this.%N = %T(reader.int32())", + state.descriptor.name(), state.descriptor.elementType() ) else -> addStatement( diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceFields.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceFields.kt index 9de87316..5fb67851 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceFields.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceFields.kt @@ -52,7 +52,9 @@ object ResourceFields { val resource = resource(field) ?: return field.mutableFieldType() return if (field.descriptor.label == DescriptorProtos.FieldDescriptorProto.Label.LABEL_REPEATED) { MUTABLE_LIST.parameterizedBy(resource.className()) - } else fieldType(field) + } else { + fieldType(field) + } } val extensionRegistry = ExtensionRegistry.newInstance().apply { diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameFieldGenerator.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameFieldGenerator.kt index 7d7ee4fa..681c5ab8 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameFieldGenerator.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameFieldGenerator.kt @@ -299,14 +299,16 @@ class ResourceNameMessageFieldReadFunctionGenerator : state.target.apply { addStatement( "${state.descriptor.descriptor.number} -> this.%N += %T(reader.string())", - state.descriptor.name(), resource.className() + state.descriptor.name(), + resource.className() ) } } else { state.target.apply { addStatement( "${state.descriptor.descriptor.number} -> this.%N = %T(reader.string())", - state.descriptor.name(), resource.className() + state.descriptor.name(), + resource.className() ) } } diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameGenerator.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameGenerator.kt index 69ac5431..eaf694f3 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameGenerator.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/resourcename/ResourceNameGenerator.kt @@ -221,7 +221,6 @@ class ResourceNameCompanionBasicGenerator : GroupedGenerator { override fun generate(state: ResourceNameCompanionGeneratingState): Boolean { state.target.apply { - for (template in state.descriptor.templates) { val uniqueFields = template.vars() - state.descriptor.commonFields val functionName = if (uniqueFields.isEmpty()) { diff --git a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/rpc/CoroutineServiceGenerator.kt b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/rpc/CoroutineServiceGenerator.kt index 3a2cf903..f75939df 100644 --- a/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/rpc/CoroutineServiceGenerator.kt +++ b/tools/sisyphus-protoc/src/main/kotlin/com/bybutter/sisyphus/protobuf/compiler/rpc/CoroutineServiceGenerator.kt @@ -200,25 +200,29 @@ class CoroutineClientMethodGenerator : GroupedGenerator { !method.descriptor.clientStreaming && !method.descriptor.serverStreaming -> { addStatement( "return unaryCall(%T.${method.name()}, input, %T())", - method.parent.className(), RuntimeTypes.METADATA + method.parent.className(), + RuntimeTypes.METADATA ) } method.descriptor.clientStreaming && !method.descriptor.serverStreaming -> { addStatement( "return clientStreaming(%T.${method.name()}, input, %T())", - method.parent.className(), RuntimeTypes.METADATA + method.parent.className(), + RuntimeTypes.METADATA ) } !method.descriptor.clientStreaming && method.descriptor.serverStreaming -> { addStatement( "return serverStreaming(%T.${method.name()}, input, %T())", - method.parent.className(), RuntimeTypes.METADATA + method.parent.className(), + RuntimeTypes.METADATA ) } method.descriptor.clientStreaming && method.descriptor.serverStreaming -> { addStatement( "return bidiStreaming(%T.${method.name()}, input, %T())", - method.parent.className(), RuntimeTypes.METADATA + method.parent.className(), + RuntimeTypes.METADATA ) } }