diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index d989b05..5fd2416 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -18,10 +18,10 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Log in to the Container registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -29,12 +29,12 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . push: true diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000..1affeb0 --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,19 @@ +name: PR check + +on: + pull_request: + branches: ['main'] + +jobs: + docker-smoke-test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Build Docker image + run: docker build -t ci-worker-smoke . + + - name: Run self-test in Docker + run: docker run --rm ci-worker-smoke ci-worker self-test diff --git a/Dockerfile b/Dockerfile index 0b6d211..df2f461 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ -# GraalVM CE 22.3.3-b1 Java 17, Scala 3.3.3, SBT 1.9.9 -FROM sbtscala/scala-sbt:graalvm-ce-22.3.3-b1-java17_1.9.9_3.3.3 as builder +FROM sbtscala/scala-sbt:eclipse-temurin-25.0.3_9_1.12.12_3.8.4 AS builder # Copy the project sources COPY . /app @@ -9,11 +8,11 @@ WORKDIR /app RUN sbt assembly # Create the final image -FROM eclipse-temurin:19-jre-jammy -MAINTAINER "Piotr Sowiński " +FROM eclipse-temurin:25-jre-noble +LABEL maintainer="Piotr Sowiński " -RUN apt update && \ - apt install -y git wget && \ +RUN apt-get update && \ + apt-get install -y git wget && \ rm -rf /var/lib/apt/lists/* # Copy the executable jar diff --git a/build.sbt b/build.sbt index f28cff7..759b041 100644 --- a/build.sbt +++ b/build.sbt @@ -1,17 +1,17 @@ ThisBuild / version := "0.1.0-SNAPSHOT" -ThisBuild / scalaVersion := "3.7.1" +ThisBuild / scalaVersion := "3.8.4" resolvers += "Sonatype OSS Snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots" -lazy val circeV = "0.14.14" -lazy val jellyV = "3.4.0" +lazy val circeV = "0.14.15" +lazy val jellyV = "3.7.3" lazy val jenaV = "5.3.0" lazy val pekkoV = "1.1.5" -lazy val pekkoHttpV = "1.2.0" -lazy val pekkoConnV = "1.1.0" -lazy val rdf4jV = "5.1.4" -lazy val icu4jV = "77.1" +lazy val pekkoHttpV = "1.3.0" +lazy val pekkoConnV = "1.3.0" +lazy val rdf4jV = "5.3.1" +lazy val icu4jV = "78.3" lazy val root = (project in file(".")) .settings( @@ -20,7 +20,7 @@ lazy val root = (project in file(".")) // Scala 3 or not Scala at all libraryDependencies ++= Seq( - "com.google.guava" % "guava" % "33.4.8-jre", + "com.google.guava" % "guava" % "33.6.0-jre", "com.ibm.icu" % "icu4j" % icu4jV, "eu.neverblink.jelly" %% "jelly-pekko-stream" % jellyV, "eu.neverblink.jelly" % "jelly-jena" % jellyV, @@ -40,8 +40,7 @@ lazy val root = (project in file(".")) "org.eclipse.rdf4j" % "rdf4j-model" % rdf4jV, "org.eclipse.rdf4j" % "rdf4j-rio-turtle" % rdf4jV, "org.eclipse.rdf4j" % "rdf4j-rio-trig" % rdf4jV, - // datasketches 8 requires Java 21 it seems, so we use 7 for now - "org.apache.datasketches" % "datasketches-java" % "7.0.1", + "org.apache.datasketches" % "datasketches-java" % "9.0.0", ), // Discard module-info.class files diff --git a/src/main/scala/commands/PackageCommand.scala b/src/main/scala/commands/PackageCommand.scala index 38fd806..fcb1251 100644 --- a/src/main/scala/commands/PackageCommand.scala +++ b/src/main/scala/commands/PackageCommand.scala @@ -466,7 +466,7 @@ object PackageCommand extends Command: if !metadata.conformance.usesRdfStar then val rdfStar = ds.find().asScala .flatMap(q => q.getGraph :: q.getSubject :: q.getPredicate :: q.getObject :: Nil) - .exists(_.isNodeTriple) + .exists(_.isTripleTerm) if rdfStar then return Some(s"The dataset contains an RDF-star node, " + s"but the metadata does not declare the use of RDF-star.") diff --git a/src/main/scala/commands/batch/DegreeDistributionsCommand.scala b/src/main/scala/commands/batch/DegreeDistributionsCommand.scala index a8f0c04..c3978b1 100644 --- a/src/main/scala/commands/batch/DegreeDistributionsCommand.scala +++ b/src/main/scala/commands/batch/DegreeDistributionsCommand.scala @@ -104,7 +104,7 @@ object DegreeDistributionsCommand extends Command: counter.value += 1 val statementSource: Source[Triple | Quad, NotUsed] = Source.futureSource(response.map(_.entity.dataBytes)) - .via(Compression.gunzip()) + .via(Compression.gzipDecompress()) .toMat(StreamConverters.asInputStream())(Keep.right) .mapMaterializedValue(JellyIo.fromIoStream) .run() diff --git a/src/main/scala/util/StatCounterSuite.scala b/src/main/scala/util/StatCounterSuite.scala index f1b8fa7..f5498dc 100644 --- a/src/main/scala/util/StatCounterSuite.scala +++ b/src/main/scala/util/StatCounterSuite.scala @@ -115,7 +115,7 @@ class StatCounterSuite(val size: Long): // Find triples recursively – needed for RDF-star def getTriples(t: Triple): List[Triple] = t +: (t.getSubject :: t.getPredicate :: t.getObject :: Nil) - .filter(_.isNodeTriple) + .filter(_.isTripleTerm) .flatMap(n => getTriples(n.getTriple)) val allNodes = ds.find().asScala.flatMap(t => { @@ -148,7 +148,7 @@ class StatCounterSuite(val size: Long): datatypes += n.getLiteralDatatypeURI else simpleLiterals += n.getLiteralLexicalForm - else if n.isNodeTriple then + else if n.isTripleTerm then // isomorphism in RDF-star is a pain... quotedTripleCount += 1 }) diff --git a/src/main/scala/util/io/FileHelper.scala b/src/main/scala/util/io/FileHelper.scala index 0f3ada3..5a13c3d 100644 --- a/src/main/scala/util/io/FileHelper.scala +++ b/src/main/scala/util/io/FileHelper.scala @@ -41,7 +41,7 @@ object FileHelper: // Unfortunately, Pekko untar stage is glitchy with large archives, so we have to // use the non-reactive Apache Commons implementation instead. val tarIs = source - .via(Compression.gunzip()) + .via(Compression.gzipDecompress()) .toMat(StreamConverters.asInputStream())(Keep.right) .mapMaterializedValue(bytesIs => TarArchiveInputStream(bytesIs)) .run() diff --git a/src/main/scala/util/rdf/JsonLdEmbedding.scala b/src/main/scala/util/rdf/JsonLdEmbedding.scala index f40f0cb..4e54286 100644 --- a/src/main/scala/util/rdf/JsonLdEmbedding.scala +++ b/src/main/scala/util/rdf/JsonLdEmbedding.scala @@ -18,6 +18,7 @@ import org.apache.jena.vocabulary.* import java.io.FileOutputStream import java.nio.file.Path import java.util +import scala.annotation.nowarn import scala.collection.mutable import scala.jdk.CollectionConverters.* @@ -69,6 +70,7 @@ object JsonLdEmbedding: * @param m RDF model * @param mdFilePath file name of the original markdown file */ + @nowarn("msg=deprecated") def saveEmbed(m: Model, subject: Resource, mdFilePath: Path): Unit = val mCopy = translateDcatToSchema(m, subject) // val mCopy = ModelFactory.createDefaultModel().add(m) diff --git a/src/main/scala/util/rdf/SubjectNodeShape.scala b/src/main/scala/util/rdf/SubjectNodeShape.scala index c4d1b88..72083b3 100644 --- a/src/main/scala/util/rdf/SubjectNodeShape.scala +++ b/src/main/scala/util/rdf/SubjectNodeShape.scala @@ -35,7 +35,7 @@ object SubjectNodeShape: override def findInDs(ds: DatasetGraph) = customInstance match case RdfUtil.`yagoTarget` => ds.find(null, null, null, null).asScala .map(_.getSubject) - .filter(_.isNodeTriple) + .filter(_.isTripleTerm) .map(_.getTriple.getSubject) .toSeq case _ => throw new Exception(s"Unknown custom target instance: $customInstance")