diff --git a/.github/workflows/aot-test.yml b/.github/workflows/aot-test.yml index c7b7c81..c2240d7 100644 --- a/.github/workflows/aot-test.yml +++ b/.github/workflows/aot-test.yml @@ -42,6 +42,9 @@ jobs: target/graalvm-native-image/jelly-cli \ rdf from-jelly --out-format=jsonld out.jelly > out.json && \ [ -s out.json ] + echo '{"@graph":[{"@id":"http://e.org/r","http://e.org/p":{"@value":"v"}}]}' | \ + target/graalvm-native-image/jelly-cli rdf to-jelly --in-format "jsonld" > jsonld.jelly && \ + [ -s jsonld.jelly ] - name: Upload binary uses: actions/upload-artifact@v4 diff --git a/build.sbt b/build.sbt index 387ca96..608ac93 100644 --- a/build.sbt +++ b/build.sbt @@ -26,6 +26,7 @@ lazy val graalOptions = Seq( ).flatten ++ Seq( "--features=eu.neverblink.jelly.cli.graal.ProtobufFeature", "-H:ReflectionConfigurationFiles=" + file("graal.json").getAbsolutePath, + "-H:+AddAllCharsets", // TODO: only add necessary charsets github.com/Jelly-RDF/cli/issues/154 ) lazy val root = (project in file(".")) diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJelly.scala index 2575771..65f65ac 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJelly.scala @@ -160,6 +160,7 @@ object RdfToJelly extends RdfSerDesCommand[RdfToJellyOptions, RdfFormat.Readable JellyStreamWriter(JenaConverterFactory.getInstance(), variant, outputStream) RDFParser.source(inputStream).lang(jenaLang).parse(jellyWriter) + jellyWriter.finish() /** Convert Jelly text to Jelly binary. * @param inputStream diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJellySpec.scala b/src/test/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJellySpec.scala index 86f636a..129b2c0 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJellySpec.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/rdf/RdfToJellySpec.scala @@ -50,7 +50,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: // Make sure it's written in the delimited format IoUtils.autodetectDelimiting(new ByteArrayInputStream(bytes)).isDelimited should be(true) val content = translateJellyBack(ByteArrayInputStream(bytes)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true } "a file to file" in withFullJenaFile { f => @@ -58,7 +60,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: val (out, err) = RdfToJelly.runTestCommand(List("rdf", "to-jelly", "--to", j, f)) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true } } @@ -71,7 +75,7 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(tripleModel.listStatements()) + content.containsAll(tripleModel.listStatements()) shouldBe true } "input stream to output stream, generalized RDF (N-Triples)" in { @@ -160,7 +164,7 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: val tripleModel = DataGenHelper.generateTripleModel(testCardinality) val (out, err) = RdfToJelly.runTestCommand(List("rdf", "to-jelly", "--to", j)) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(tripleModel.listStatements()) + content.containsAll(tripleModel.listStatements()) shouldBe true } "a file to file, modified stream options" in withFullJenaFile { f => @@ -183,7 +187,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) val opts = frames.head.getRows.asScala.head.getOptions opts.getStreamName should be("testName") @@ -211,7 +217,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) val opts = frames.head.getRows.asScala.head.getOptions opts.getStreamName should be("") @@ -241,7 +249,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) val opts = frames.head.getRows.asScala.head.getOptions opts.getStreamName should be("") @@ -270,7 +280,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) frames.size should be > 3 for frame <- frames do @@ -294,7 +306,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(j)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true // Note: no actual namespace declarations are present in the test data, because it's // N-Quads. // TODO: test if the namespace declarations are preserved with Turtle or RDF/XML input. @@ -336,7 +350,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true } "a file to file, physical type set to TRIPLES, logical type to GRAPHS" in withFullJenaFile( testCode = { f => @@ -356,7 +372,7 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: val content = translateJellyBack(new FileInputStream(j)) content.containsAll( DataGenHelper.generateTripleModel(testCardinality).listStatements(), - ) + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) val opts = frames.head.getRows.asScala.head.getOptions opts.getStreamName should be("") @@ -392,7 +408,7 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: val content = translateJellyBack(new FileInputStream(j)) content.containsAll( DataGenHelper.generateTripleModel(testCardinality).listStatements(), - ) + ) shouldBe true val frames = readJellyFile(new FileInputStream(j)) val opts = frames.head.getRows.asScala.head.getOptions opts.getStreamName should be("") @@ -422,7 +438,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true } "TriG" in withFullJenaFile( testCode = { f => @@ -430,7 +448,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: RdfToJelly.runTestCommand(List("rdf", "to-jelly", f)) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true }, jenaLang = RDFLanguages.TRIG, ) @@ -442,7 +462,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true }, jenaLang = RDFLanguages.RDFPROTO, ) @@ -452,7 +474,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: RdfToJelly.runTestCommand(List("rdf", "to-jelly", f)) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true }, jenaLang = RDFLanguages.RDFTHRIFT, ) @@ -464,7 +488,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true }, jenaLang = RDFLanguages.RDFXML, ) @@ -476,7 +502,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ) val newIn = new ByteArrayInputStream(RdfToJelly.getOutBytes) val content = translateJellyBack(newIn) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true }, jenaLang = RDFLanguages.JSONLD, ) @@ -494,7 +522,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(outFile)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true RdfToJelly.getErrString should include("WARNING: The Jelly text format is not stable") } } @@ -530,7 +560,9 @@ class RdfToJellySpec extends AnyWordSpec with TestFixtureHelper with Matchers: ), ) val content = translateJellyBack(new FileInputStream(outFile)) - content.containsAll(DataGenHelper.generateTripleModel(testCardinality).listStatements()) + content.containsAll( + DataGenHelper.generateTripleModel(testCardinality).listStatements(), + ) shouldBe true } }