diff --git a/src/main/scala/eu/neverblink/jelly/cli/App.scala b/src/main/scala/eu/neverblink/jelly/cli/App.scala index ef394a5..6741882 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/App.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/App.scala @@ -2,6 +2,7 @@ package eu.neverblink.jelly.cli import caseapp.* import eu.neverblink.jelly.cli.command.* +import eu.neverblink.jelly.cli.command.rdf.* /** Main entrypoint. */ @@ -11,4 +12,5 @@ object App extends CommandsEntryPoint: override def commands: Seq[Command[?]] = Seq( FoolAround, Version, + RdfFromJelly, ) diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala new file mode 100644 index 0000000..31af120 --- /dev/null +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -0,0 +1,16 @@ +package eu.neverblink.jelly.cli.command.rdf +import caseapp.* +import eu.neverblink.jelly.cli.JellyCommand + +case class FromJellyRdfOptions() + +object RdfFromJelly extends JellyCommand[FromJellyRdfOptions]: + override def names: List[List[String]] = List( + List("rdf", "from-jelly"), + ) + + override def run(options: FromJellyRdfOptions, remainingArgs: RemainingArgs): Unit = + // This is a placeholder for the actual implementation + println("rdf from-jelly") + println(options) + println(remainingArgs) diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala new file mode 100644 index 0000000..1b5f9ed --- /dev/null +++ b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala @@ -0,0 +1,12 @@ +package eu.neverblink.jelly.cli.command + +import eu.neverblink.jelly.cli.command.helpers.* +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpec + +class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpFilesAfterTest: + "rdf from-jelly command" should { + "be able to convert a Jelly file to NTriples" in { + val jellyFile = DataGenHelper.generateJellyFile(3) + } + } diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpFilesAfterTest.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpFilesAfterTest.scala new file mode 100644 index 0000000..6a3c705 --- /dev/null +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpFilesAfterTest.scala @@ -0,0 +1,11 @@ +package eu.neverblink.jelly.cli.command.helpers + +import org.scalatest.BeforeAndAfterEach +import org.scalatest.wordspec.AnyWordSpec + +trait CleanUpFilesAfterTest extends BeforeAndAfterEach { + this: AnyWordSpec => + override def afterEach(): Unit = { + DataGenHelper.cleanUpFile() + } +} diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala new file mode 100644 index 0000000..d81cf91 --- /dev/null +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala @@ -0,0 +1,50 @@ +package eu.neverblink.jelly.cli.command.helpers + +import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage +import org.apache.jena.rdf.model.{Model, ModelFactory, ResourceFactory} +import org.apache.jena.riot.RDFDataMgr + +import java.io.FileOutputStream +import java.nio.file.{Files, Paths} +import scala.util.Using + +/* + * This class will be used to generate test data + */ +object DataGenHelper: + + private val testFile = "testInput.jelly" + + /* + * This method generates a triple model with nTriples + * @param nTriples number of triples to generate + * @return Model + */ + def generateTripleModel(nTriples: Int): Model = + val model = ModelFactory.createDefaultModel() + val subStr = "http://example.org/subject" + val predStr = "http://example.org/predicate" + val objStr = "http://example.org/object" + val tripleList = (1 to nTriples).map { i => + val sub = ResourceFactory.createResource(s"$subStr/$i") + val pred = ResourceFactory.createProperty(s"$predStr/$i") + val obj = ResourceFactory.createResource(s"$objStr/$i") + val stat = ResourceFactory.createStatement(sub, pred, obj) + model.add(stat) + } + model + + /* This method generates a Jelly file with nTriples + * @param nTriples number of triples to generate + * @param fileName name of the file to generate + */ + def generateJellyFile(nTriples: Int): Unit = + val model = generateTripleModel(nTriples) + // TODO: Add configurable generation for different variants of Jelly (small strict etc) + Using.resource(FileOutputStream(testFile)) { file => + RDFDataMgr.write(file, model, JellyLanguage.JELLY) + } + + /* This method cleans up the file after the test*/ + def cleanUpFile(): Unit = + Files.deleteIfExists(Paths.get(testFile))