From 01323f0bd347d489e02fb14488ba8b0b4fc310b3 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Sun, 28 Jan 2024 15:19:53 +0800 Subject: [PATCH] feat: Add scala-cli script generator to verify jdk classes --- .github/workflows/verify-jdk9-classes.yml | 58 ++++++++++++++++ build.sbt | 1 + project/VerifyJDK9Classes.scala | 84 +++++++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 .github/workflows/verify-jdk9-classes.yml create mode 100644 project/VerifyJDK9Classes.scala diff --git a/.github/workflows/verify-jdk9-classes.yml b/.github/workflows/verify-jdk9-classes.yml new file mode 100644 index 00000000000..ec2cd9dd458 --- /dev/null +++ b/.github/workflows/verify-jdk9-classes.yml @@ -0,0 +1,58 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Verify JDK9 classes + +on: + pull_request: + +permissions: + contents: read + +jobs: + verify-jdk9-classes-check: + name: Verify JDK9 classes + runs-on: ubuntu-20.04 + if: github.repository == 'apache/incubator-pekko' + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Setup Java 11 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 11 + + - name: Cache Coursier cache + uses: coursier/cache-action@v6 + + - name: Publish Stream module local + run: sbt ";stream / publishLocal ;" + + - uses: VirtusLab/scala-cli-setup@v1.1.2 + - name: Use Scala-CLI to check + run: |- + scala-cli --version + scala-cli stream/target/scala-cli/VerifyJDK9Classes.sc || ( + echo "Error when VerifyJDK9Classes" + exit 1 + ) + diff --git a/build.sbt b/build.sbt index 5ada01d7f0f..627bac52ca9 100644 --- a/build.sbt +++ b/build.sbt @@ -434,6 +434,7 @@ lazy val stream = pekkoModule("stream") .settings(AutomaticModuleName.settings("pekko.stream")) .settings(OSGi.stream) .settings(Protobuf.settings) + .settings(VerifyJDK9Classes.settings) .enablePlugins(BoilerplatePlugin, Jdk9) lazy val streamTestkit = pekkoModule("stream-testkit") diff --git a/project/VerifyJDK9Classes.scala b/project/VerifyJDK9Classes.scala new file mode 100644 index 00000000000..faafe6896bc --- /dev/null +++ b/project/VerifyJDK9Classes.scala @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +object VerifyJDK9Classes { + import sbt.* + import sbt.Keys.* + + lazy val settings: Seq[Setting[_]] = inConfig(Compile) { + Seq { + sourceGenerators += { + generateAndWriteScalaCLIScript( + target, + _ / "scala-cli" / "VerifyJDK9Classes.sc") + } + } + } + + def generateAndWriteScalaCLIScript(dir: SettingKey[File], locate: File => File): Def.Initialize[Task[Seq[sbt.File]]] = + Def.task[Seq[File]] { + val script = generateScalaCLIScript(version.value) + val file = locate(dir.value) + val content = script.stripMargin.format(version.value) + if (!file.exists || IO.read(file) != content) IO.write(file, content) + // the generated file is not used. + Nil + } + + private def generateScalaCLIScript(version: String): String = + s""" + |/* + | * Licensed to the Apache Software Foundation (ASF) under one or more + | * contributor license agreements. See the NOTICE file distributed with + | * this work for additional information regarding copyright ownership. + | * The ASF licenses this file to You under the Apache License, Version 2.0 + | * (the "License"); you may not use this file except in compliance with + | * the License. You may obtain a copy of the License at + | * + | * http://www.apache.org/licenses/LICENSE-2.0 + | * + | * Unless required by applicable law or agreed to in writing, software + | * distributed under the License is distributed on an "AS IS" BASIS, + | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + | * See the License for the specific language governing permissions and + | * limitations under the License. + | */ + |//> using dep "org.apache.pekko::pekko-stream:${version}" + |////> using jvm 11 + |object VerifyJDK9Classes { + | def main(args: Array[String]): Unit = { + | import org.apache.pekko.actor.ActorSystem + | import org.apache.pekko.stream.scaladsl.{ JavaFlowSupport, Source } + | + | import java.lang.System.exit + | import scala.concurrent.Await + | import scala.concurrent.duration.DurationInt + | implicit val system: ActorSystem = ActorSystem.create("test") + | val future = Source(1 to 3).runWith( + | JavaFlowSupport.Sink.asPublisher[Int](fanout = false).mapMaterializedValue { p => + | JavaFlowSupport.Source.fromPublisher(p).runFold(0)(_ + _) + | }) + | + | val result = Await.result(future, 3.seconds) + | println(s"Result:" + result) + | system.terminate() + | exit(if (result == 6) 0 else 1) + | } + |} + | + |""".stripMargin +}