From d8a3249f673ad1f3188f2f518d84758ffd6c2bb0 Mon Sep 17 00:00:00 2001 From: reidspencer Date: Thu, 4 Apr 2024 14:23:02 -0600 Subject: [PATCH 1/7] Minor cleanups --- .../scala/com/ossuminc/riddl/hugo/HugoCommand.scala | 8 ++++---- .../scala/com/ossuminc/riddl/hugo/HugoPass.scala | 7 +++---- .../ossuminc/riddl/hugo/themes/GeekDocTheme.scala | 12 +++++++++++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala index 35f3d7b..92225a5 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala @@ -12,11 +12,11 @@ import com.ossuminc.riddl.language.CommonOptions import com.ossuminc.riddl.language.Messages import com.ossuminc.riddl.language.Messages.Messages import com.ossuminc.riddl.passes.Pass.standardPasses -import com.ossuminc.riddl.passes.{Pass, PassInput, PassesOutput, PassesResult, PassesCreator} +import com.ossuminc.riddl.passes.{Pass, PassInput, PassesCreator, PassesOutput, PassesResult} import com.ossuminc.riddl.stats.StatsPass import com.ossuminc.riddl.diagrams.DiagramsPass +import com.ossuminc.riddl.hugo.themes.{DotdockTheme, GeekDocTheme} import com.ossuminc.riddl.utils.Logger - import pureconfig.ConfigCursor import pureconfig.ConfigReader import scopt.OParser @@ -135,8 +135,8 @@ class HugoCommand extends PassCommand[HugoCommand.Options]("hugo") { .action((v, c) => c.copy(hugoThemeName = Option(v))) .text("optional hugo theme name to use") .validate { - case "geekdoc" | "GeekDoc" => Right(Some("GeekDoc")) - case "techdoc" | "Techdoc" => Right(Some("TechDoc")) + case "geekdoc" | "GeekDoc" => Right(Some(GeekDocTheme.name)) + case "dotdoc" | "Dotdock" => Right(Some(DotdockTheme.name)) }, opt[Boolean]('e', name = "erase-output") .text("Erase entire output directory before putting out files") diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala index c11dc3a..9e6d3db 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala @@ -7,14 +7,13 @@ package com.ossuminc.riddl.hugo import com.ossuminc.riddl.commands.TranslatingState -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput} import com.ossuminc.riddl.diagrams.mermaid.* import com.ossuminc.riddl.language.* import com.ossuminc.riddl.language.AST.{Include, *} import com.ossuminc.riddl.language.Messages.Messages -import com.ossuminc.riddl.passes.{Pass, PassCreator, PassInfo, PassInput, PassOutput, PassesOutput, PassesResult} -import com.ossuminc.riddl.passes.resolve.{ReferenceMap, ResolutionOutput, ResolutionPass, Usages} -import com.ossuminc.riddl.passes.symbols.{SymbolsOutput, SymbolsPass} +import com.ossuminc.riddl.passes.{Pass, PassCreator, PassInfo, PassInput, PassOutput, PassesOutput} +import com.ossuminc.riddl.passes.resolve.ResolutionPass +import com.ossuminc.riddl.passes.symbols.SymbolsPass import com.ossuminc.riddl.passes.symbols.Symbols.ParentStack import com.ossuminc.riddl.passes.validate.ValidationPass import com.ossuminc.riddl.stats.StatsPass diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala index 9ed181e..8b511fe 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala @@ -5,6 +5,7 @@ import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.{PassInput, PassesOutput} import java.nio.file.Path +import java.net.URL object GeekDocTheme { val name: String = "GeekDoc" @@ -21,7 +22,16 @@ case class GeekDocTheme( def themeName: String = GeekDocTheme.name - def fileHead( + private val geekDoc_version = "v0.44.1" + private val geekDoc_file = "hugo-geekdoc.tar.gz" + val geekDoc_url: URL = java.net.URI + .create( + s"https://github.com/thegeeklab/hugo-geekdoc/releases/download/$geekDoc_version/$geekDoc_file" + ) + .toURL + + +def fileHead( title: String, weight: Int, desc: Option[String], From aefc138cef2cb292d7c0a4d4b9b3b4bf6f09ba60 Mon Sep 17 00:00:00 2001 From: reidspencer Date: Thu, 4 Apr 2024 18:12:01 -0600 Subject: [PATCH 2/7] Refactor MarkdownWriters * Put each vital definition in its own trait * Fix some obvious shortcomings --- .../com/ossuminc/riddl/hugo/HugoPass.scala | 171 ++---- .../com/ossuminc/riddl/hugo/Summarizer.scala | 116 +++++ .../riddl/hugo/themes/DotdockTheme.scala | 3 +- .../riddl/hugo/themes/GeekDocTheme.scala | 20 +- .../riddl/hugo/writers/AdaptorWriter.scala | 18 + .../hugo/writers/ApplicationWriter.scala | 24 + .../riddl/hugo/writers/ContextWriter.scala | 34 ++ .../riddl/hugo/writers/DomainWriter.scala | 27 + .../riddl/hugo/writers/EntityWriter.scala | 80 +++ .../riddl/hugo/writers/EpicWriter.scala | 72 +++ .../hugo/{ => writers}/MarkdownBasics.scala | 13 +- .../hugo/{ => writers}/MarkdownWriter.scala | 486 ++---------------- .../riddl/hugo/writers/ProjectorWriter.scala | 21 + .../riddl/hugo/writers/RepositoryWriter.scala | 19 + .../riddl/hugo/writers/SagaWriter.scala | 29 ++ .../riddl/hugo/writers/StreamletWriter.scala | 39 ++ .../riddl/hugo/writers/SummariesWriter.scala | 111 ++++ .../{themes => writers}/ThemeWriter.scala | 6 +- .../ossuminc/riddl/hugo/HugoTestBase.scala | 1 + .../riddl/hugo/MarkdownWriterTest.scala | 3 +- 20 files changed, 697 insertions(+), 596 deletions(-) create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala rename hugo/src/main/scala/com/ossuminc/riddl/hugo/{ => writers}/MarkdownBasics.scala (94%) rename hugo/src/main/scala/com/ossuminc/riddl/hugo/{ => writers}/MarkdownWriter.scala (50%) create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala rename hugo/src/main/scala/com/ossuminc/riddl/hugo/{themes => writers}/ThemeWriter.scala (86%) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala index 9e6d3db..ae06a0e 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala @@ -19,6 +19,7 @@ import com.ossuminc.riddl.passes.validate.ValidationPass import com.ossuminc.riddl.stats.StatsPass import com.ossuminc.riddl.utils.{PathUtils, Tar, Timer, TreeCopyFileVisitor, Zip} import com.ossuminc.riddl.hugo.themes.* +import com.ossuminc.riddl.hugo.writers.MarkdownWriter import java.io.File import java.net.URL @@ -48,8 +49,9 @@ case class HugoPass( ) extends Pass(input, outputs) with PassUtilities with TranslatingState[MarkdownWriter] - with UseCaseDiagramSupport { - + with UseCaseDiagramSupport + with Summarizer { + requires(SymbolsPass) requires(ResolutionPass) requires(ValidationPass) @@ -59,10 +61,10 @@ case class HugoPass( options.outputRoot.getFileName.toString.nonEmpty, "Output path is empty" ) - + val root: Root = input.root val name: String = HugoPass.name - + options.inputFile match { case Some(inFile) => if Files.exists(inFile) then makeDirectoryStructure(options.inputFile) @@ -74,15 +76,16 @@ case class HugoPass( private val maybeAuthor = root.authors.headOption.orElse { root.domains.headOption.flatMap(_.authors.headOption) } writeConfigToml(options, maybeAuthor) - private def addFile(parents: Seq[String], fileName: String): MarkdownWriter = { + def makeWriter(parents: Seq[String], fileName: String): MarkdownWriter = { val parDir = parents.foldLeft(options.contentRoot) { (next, par) => next.resolve(par) } val path = parDir.resolve(fileName) val mdw: MarkdownWriter = options.hugoThemeName match { case Some(GeekDocTheme.name) | None => GeekDocTheme(path, input, outputs, options) - case Some(DotdockTheme.name) => DotdockTheme(path, input, outputs, options) - case Some(s) => messages.addWarning((0, 0), s"Hugo theme named '$s' is not supported, using GeekDoc ") + case Some(DotdockTheme.name) => DotdockTheme(path, input, outputs, options) + case Some(s) => + messages.addWarning((0, 0), s"Hugo theme named '$s' is not supported, using GeekDoc ") GeekDocTheme(path, input, outputs, options) } addFile(mdw) @@ -104,46 +107,23 @@ case class HugoPass( val (mkd: MarkdownWriter, parents) = setUpContainer(container, stack) container match { + case a: Adaptor => mkd.emitAdaptor(a, parents) case a: Application => mkd.emitApplication(a, stack) - case s: State => - val maybeType = refMap.definitionOf[Type](s.typ.pathId, s) - maybeType match { - case Some(typ: AggregateTypeExpression) => - mkd.emitState(s, typ.fields, stack) - case Some(_) => - mkd.emitState(s, Seq.empty[Field], stack) - case None => - mkd.emitState(s, Seq.empty[Field], stack) - } - case h: Handler => mkd.emitHandler(h, parents) - case f: Function => mkd.emitFunction(f, parents) - case e: Entity => mkd.emitEntity(e, parents) - case c: Context => - val maybeDiagram = diagrams.contextDiagrams.get(c).map(data => ContextMapDiagram(c, data)) - mkd.emitContext(c, stack, maybeDiagram) - case d: Domain => - val diagram = DomainMapDiagram(d) - val summary_link = makeMessageSummary(d) match { - case Some(summary) => - val fileName = summary.filePath.getFileName.toString.dropRight(3).toLowerCase - Some(makeDocLink(d) + "/" + fileName) - case None => None - } - mkd.emitDomain(d, parents, summary_link, diagram) - - case a: Adaptor => mkd.emitAdaptor(a, parents) - case s: Streamlet => mkd.emitStreamlet(s, stack) - case p: Projector => mkd.emitProjector(p, parents) - case r: Repository => mkd.emitRepository(r, parents) - case s: Saga => mkd.emitSaga(s, parents) - case e: Epic => mkd.emitEpic(e, stack) - case uc: UseCase => mkd.emitUseCase(uc, stack, this) - - case _: OnOtherClause | _: OnInitClause | _: OnMessageClause | _: OnTerminationClause | _: Author | - _: Enumerator | _: Field | _: Method | _: Term | _: Constant | _: Invariant | _: Inlet | _: Outlet | - _: Connector | _: SagaStep | _: User | _: Interaction | _: Root | _: Include[Definition] @unchecked | - _: Output | _: Input | _: Group | _: ContainedGroup | _: Type => - // All of these are handled above in their containers content contribution + case c: Context => mkd.emitContext(c, stack) + case d: Domain => mkd.emitDomain(d, parents) + case e: Entity => mkd.emitEntity(e, stack) + case e: Epic => mkd.emitEpic(e, stack) + case p: Projector => mkd.emitProjector(p, parents) + case r: Repository => mkd.emitRepository(r, parents) + case s: Saga => mkd.emitSaga(s, parents) + case s: Streamlet => mkd.emitStreamlet(s, stack) + case uc: UseCase => mkd.emitUseCase(uc, stack, this) + + case _: Function | _: Handler | _: State | _: OnOtherClause | _: OnInitClause | _: OnMessageClause | + _: OnTerminationClause | _: Author | _: Enumerator | _: Field | _: Method | _: Term | _: Constant | + _: Invariant | _: Inlet | _: Outlet | _: Connector | _: SagaStep | _: User | _: Interaction | _: Root | + _: Include[Definition] @unchecked | _: Output | _: Input | _: Group | _: ContainedGroup | _: Type => + // All of these are handled above in their containers content output } case _: AST.NonDefinitionValues => // These aren't definitions so don't count for documentation generation (no names) @@ -151,6 +131,7 @@ case class HugoPass( } override def postProcess(root: AST.Root): Unit = { + summarize() close(root) } @@ -275,106 +256,12 @@ case class HugoPass( loadStaticAssets(inputPath, options) } - private def makeIndex(root: Root): Unit = { - Timer.time("Index Creation") { - - val mdw = addFile(Seq.empty[String], "_index.md") - mdw.fileHead("Index", 10, Option("The main index to the content")) - mdw.h2("Root Overview") - val diagram = RootOverviewDiagram(root) - mdw.emitMermaidDiagram(diagram.generate) - mdw.h2("Domains") - val domains = root.domains - .sortBy(_.id.value) - .map(d => s"[${d.id.value}](${d.id.value.toLowerCase}/)") - mdw.list(domains) - mdw.h2("Indices") - val glossary = - if options.withGlossary then { Seq("[Glossary](glossary)") } - else { Seq.empty[String] } - val todoList = { - if options.withTODOList then { Seq("[To Do List](todolist)") } - else { Seq.empty[String] } - } - val statistics = { - if options.withStatistics then { Seq("[Statistics](statistics)") } - else { Seq.empty[String] } - } - mdw.list(glossary ++ todoList ++ statistics) - mdw.emitIndex("Full", root, Seq.empty[String]) - } - } - - private val glossaryWeight = 970 - private val toDoWeight = 980 - private val statsWeight = 990 - - private def makeStatistics(): Unit = { - if options.withStatistics then { - Timer.time("Make Statistics") { - val mdw = addFile(Seq.empty[String], fileName = "statistics.md") - mdw.emitStatistics(statsWeight) - } - } - } - - private def makeGlossary(): Unit = { - if options.withGlossary then { - Timer.time("Make Glossary") { - val mdw = addFile(Seq.empty[String], "glossary.md") - outputs.outputOf[GlossaryOutput](GlossaryPass.name) match { - case Some(go) => - mdw.emitGlossary(glossaryWeight, go.entries) - case None => - mdw.emitGlossary(glossaryWeight, Seq.empty) - } - } - } - } - - private def makeToDoList(): Unit = { - if options.withTODOList then - Timer.time("Make ToDo List") { - outputs.outputOf[ToDoListOutput](ToDoListPass.name) match { - case Some(output) => - val mdw = addFile(Seq.empty[String], "todolist.md") - mdw.emitToDoList(toDoWeight, output.collected) - case None => - // do nothing - } - } - } - - private def makeMessageSummary(forDomain: Domain): Option[MarkdownWriter] = { - if options.withMessageSummary then { - Timer.time(s"Messages Summary for ${forDomain.identify}") { - outputs.outputOf[MessageOutput](MessagesPass.name) match { - case Some(mo) => - val fileName = s"${forDomain.id.value}-messages.md" - val infos = mo.collected.filter(_.link.contains(forDomain.id.value.toLowerCase)) - val mdw = { - addFile(Seq(forDomain.id.value), fileName) - } - mdw.emitMessageSummary(forDomain, infos) - Some(mdw) - case None => - // just skip - None - } - } - } else None - } - private def makeSystemLandscapeView: Seq[String] = { val rod = new RootOverviewDiagram(root) rod.generate } private def close(root: Root): Unit = { - makeIndex(root) - makeGlossary() - makeToDoList() - makeStatistics() Timer.time(s"Writing ${this.files.size} Files") { writeFiles(commonOptions.verbose || commonOptions.debug) } @@ -397,7 +284,7 @@ case class HugoPass( ): (MarkdownWriter, Seq[String]) = { addDir(c.id.format) val pars = makeStringParents(stack) - addFile(pars :+ c.id.format, "_index.md") -> pars + makeWriter(pars :+ c.id.format, "_index.md") -> pars } private def setUpLeaf( @@ -405,7 +292,7 @@ case class HugoPass( stack: Seq[Definition] ): (MarkdownWriter, Seq[String]) = { val pars = makeStringParents(stack) - addFile(pars, d.id.format + ".md") -> pars + makeWriter(pars, d.id.format + ".md") -> pars } // scalastyle:off method.length diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala new file mode 100644 index 0000000..33376d5 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala @@ -0,0 +1,116 @@ +package com.ossuminc.riddl.hugo + +import com.ossuminc.riddl.diagrams.mermaid.RootOverviewDiagram +import com.ossuminc.riddl.language.AST.{Domain, Root} +import com.ossuminc.riddl.utils.Timer + +trait Summarizer { this: HugoPass => + + def summarize(): Unit = { + makeIndex(root) + makeGlossary() + makeToDoList() + makeStatistics() + if options.withMessageSummary then for d <- root.domains do makeMessageSummary(d) + } + + private def makeIndex(root: Root): Unit = { + Timer.time("Index Creation") { + + val mdw = this.makeWriter(Seq.empty[String], "_index.md") + mdw.fileHead("Index", 10, Option("The main index to the content")) + mdw.h2("Root Overview") + val diagram = RootOverviewDiagram(root) + mdw.emitMermaidDiagram(diagram.generate) + mdw.h2("Domains") + val domains = root.domains + .sortBy(_.id.value) + .map(d => s"[${d.id.value}](${d.id.value.toLowerCase}/)") + mdw.list(domains) + mdw.h2("Indices") + val glossary = + if options.withGlossary then { + Seq("[Glossary](glossary)") + } else { + Seq.empty[String] + } + val todoList = { + if options.withTODOList then { + Seq("[To Do List](todolist)") + } else { + Seq.empty[String] + } + } + val statistics = { + if options.withStatistics then { + Seq("[Statistics](statistics)") + } else { + Seq.empty[String] + } + } + mdw.list(glossary ++ todoList ++ statistics) + mdw.emitIndex("Full", root, Seq.empty[String]) + } + } + + private val glossaryWeight = 970 + private val toDoWeight = 980 + private val statsWeight = 990 + + private def makeStatistics(): Unit = { + if options.withStatistics then { + Timer.time("Make Statistics") { + val mdw = makeWriter(Seq.empty[String], fileName = "statistics.md") + mdw.emitStatistics(statsWeight) + } + } + } + + + private def makeGlossary(): Unit = { + if options.withGlossary then { + Timer.time("Make Glossary") { + val mdw = makeWriter(Seq.empty[String], "glossary.md") + outputs.outputOf[GlossaryOutput](GlossaryPass.name) match { + case Some(go) => + mdw.emitGlossary(glossaryWeight, go.entries) + case None => + mdw.emitGlossary(glossaryWeight, Seq.empty) + } + } + } + } + + private def makeToDoList(): Unit = { + if options.withTODOList then + Timer.time("Make ToDo List") { + outputs.outputOf[ToDoListOutput](ToDoListPass.name) match { + case Some(output) => + val mdw = makeWriter(Seq.empty[String], "todolist.md") + mdw.emitToDoList(toDoWeight, output.collected) + case None => + // do nothing + } + } + } + + private def makeMessageSummary(domain: Domain): Unit = { + Timer.time(s"Messages Summary for ${domain.identify}") { + val fileName = s"${domain.id.value}-messages.md" + val mdw = makeWriter(Seq(domain.id.value), fileName) + mdw.fileHead( + s"${domain.identify} Message Summary", + 25, + Some(s"Message Summary for ${domain.identify}") + ) + outputs.outputOf[MessageOutput](MessagesPass.name) match { + case Some(mo) => + val infos = mo.collected.filter(_.link.contains(domain.id.value.toLowerCase)) + mdw.emitMessageSummary(domain, infos) + case None => + mdw.emitMessageSummary(domain, Seq.empty) + + } + } + } +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala index 300d2fc..e0d6f1f 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala @@ -1,6 +1,7 @@ package com.ossuminc.riddl.hugo.themes -import com.ossuminc.riddl.hugo.{HugoCommand, MarkdownWriter, PassUtilities} +import com.ossuminc.riddl.hugo.writers.MarkdownWriter +import com.ossuminc.riddl.hugo.{HugoCommand, PassUtilities} import com.ossuminc.riddl.language.{AST, CommonOptions} import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.{PassInput, PassesOutput} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala index 8b511fe..96abaec 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala @@ -1,6 +1,7 @@ package com.ossuminc.riddl.hugo.themes -import com.ossuminc.riddl.hugo.{HugoCommand, MarkdownWriter} +import com.ossuminc.riddl.hugo.HugoCommand +import com.ossuminc.riddl.hugo.writers.MarkdownWriter import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.{PassInput, PassesOutput} @@ -17,21 +18,20 @@ case class GeekDocTheme( input: PassInput, outputs: PassesOutput, options: HugoCommand.Options -) extends MarkdownWriter - with ThemeWriter { +) extends MarkdownWriter { def themeName: String = GeekDocTheme.name private val geekDoc_version = "v0.44.1" private val geekDoc_file = "hugo-geekdoc.tar.gz" - val geekDoc_url: URL = java.net.URI - .create( - s"https://github.com/thegeeklab/hugo-geekdoc/releases/download/$geekDoc_version/$geekDoc_file" - ) - .toURL - + val geekDoc_url: URL = + java.net.URI + .create( + s"https://github.com/thegeeklab/hugo-geekdoc/releases/download/$geekDoc_version/$geekDoc_file" + ) + .toURL -def fileHead( + def fileHead( title: String, weight: Int, desc: Option[String], diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala new file mode 100644 index 0000000..d4c0782 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala @@ -0,0 +1,18 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.{Adaptor, AdaptorOption, OccursInAdaptor} + +trait AdaptorWriter { this: MarkdownWriter => + + def emitAdaptor(adaptor: Adaptor, parents: Seq[String]): this.type = { + containerHead(adaptor, "Adaptor") + emitDefDoc(adaptor, parents) + p(s"Direction: ${adaptor.direction.format} ${adaptor.context.format}") + emitProcessorToc[AdaptorOption, OccursInAdaptor](adaptor) + emitUsage(adaptor) + emitTerms(adaptor.terms) + emitIndex("Adaptor", adaptor, parents) + } + + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala new file mode 100644 index 0000000..7e29dd7 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala @@ -0,0 +1,24 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.* + +trait ApplicationWriter { this: MarkdownWriter => + + + def emitApplication( + application: Application, + stack: Seq[Definition] + ): Unit = { + containerHead(application, "Application") + val parents = makeStringParents(stack) + emitDefDoc(application, parents) + for group <- application.groups do { + h2(group.identify) + list(group.elements.map(_.format)) + } + emitUsage(application) + emitTerms(application.terms) + emitIndex("Application", application, parents) + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala new file mode 100644 index 0000000..561e9c1 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala @@ -0,0 +1,34 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.diagrams.mermaid.ContextMapDiagram +import com.ossuminc.riddl.language.AST.{Context, ContextOption, Definition, OccursInContext} + +trait ContextWriter { this: MarkdownWriter => + + private def emitContextMap(context: Context, diagram: Option[ContextMapDiagram]): Unit = { + if diagram.nonEmpty then + h2("Context Map") + val lines = diagram.get.generate + emitMermaidDiagram(lines) + end if + } + + def emitContext(context: Context, stack: Seq[Definition]): Unit = { + containerHead(context, "Context") + val maybeDiagram = diagrams.contextDiagrams.get(context).map(data => ContextMapDiagram(context, data)) + val parents = makeStringParents(stack) + emitDefDoc(context, parents) + emitContextMap(context, maybeDiagram) + emitOptions(context.options) + emitTypesToc(context) + definitionToc("Entities", context.entities) + definitionToc("Adaptors", context.adaptors) + definitionToc("Sagas", context.sagas) + definitionToc("Streamlets", context.streamlets) + list("Connectors", context.connectors) + emitProcessorToc[ContextOption, OccursInContext](context) + // TODO: generate a diagram for the processors and pipes + emitIndex("Context", context, parents) + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala new file mode 100644 index 0000000..05721c6 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala @@ -0,0 +1,27 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram +import com.ossuminc.riddl.language.AST.* + +trait DomainWriter { this: MarkdownWriter => + + def emitDomain(domain: Domain, parents: Seq[String]): Unit = { + val diagram = DomainMapDiagram(domain) + + containerHead(domain, "Domain") + emitDefDoc(domain, parents) + emitAuthorInfo(domain.authors) + h2("Domain Map") + emitMermaidDiagram(diagram.generate) + definitionToc("Subdomains", domain.domains) + definitionToc("Contexts", domain.contexts) + definitionToc("Applications", domain.applications) + definitionToc("Epics", domain.epics) + emitTypesToc(domain) + emitUsage(domain) + emitTerms(domain.terms) + emitIndex("Domain", domain, parents) + } + + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala new file mode 100644 index 0000000..819c114 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala @@ -0,0 +1,80 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.diagrams.mermaid.EntityRelationshipDiagram +import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents + +import scala.annotation.unused + +trait EntityWriter { this: MarkdownWriter => + + private def emitState( + state: State, + parents: Parents + ): this.type = { + h2(state.identify) + val stringParents = makeStringParents(parents) + emitDefDoc(state, stringParents) + val maybeType = refMap.definitionOf[Type](state.typ.pathId, state) + val fields = maybeType match { + case Some(typ: AggregateTypeExpression) => typ.fields + case Some(_) => Seq.empty[Field] + case None => Seq.empty[Field] + } + emitERD(state.id.format, fields, parents) + h2("Fields") + emitFields(fields) + for h <- state.handlers do emitHandler(h, state.id.value +: stringParents) + emitUsage(state) + } + + private def emitERD( + name: String, + fields: Seq[Field], + parents: Seq[Definition] + ): Unit = { + h2("Entity Relationships") + val erd = EntityRelationshipDiagram(refMap) + val lines = erd.generate(name, fields, parents) + emitMermaidDiagram(lines) + } + + def emitHandler(handler: Handler, parents: Seq[String]): this.type = { + containerHead(handler, "Handler") + emitDefDoc(handler, parents) + handler.clauses.foreach { clause => + clause match { + case oic: OnInitClause => h3(oic.kind) + case omc: OnMessageClause => h3(clause.kind + " " + omc.msg.format) + case otc: OnTerminationClause => h3(otc.kind) + case ooc: OnOtherClause => h3(ooc.kind) + } + emitShortDefDoc(clause) + codeBlock("Statements", clause.statements, 4) + } + emitUsage(handler) + this + } + + private def emitFiniteStateMachine(@unused entity: Entity): Unit = () + + def emitEntity(entity: Entity, parents: Parents): Unit = { + containerHead(entity, "Entity") + val stringParents = makeStringParents(parents) + emitDefDoc(entity, stringParents) + emitOptions(entity.options) + if entity.hasOption[EntityIsFiniteStateMachine] then { + h2("Finite State Machine") + emitFiniteStateMachine(entity) + } + emitInvariants(entity.invariants) + emitTypesToc(entity) + for state <- entity.states do emitState(state, entity +: parents) + for handler <- entity.handlers do emitHandler(handler, entity.id.value +: stringParents) + for function <- entity.functions do emitFunction(function, entity.id.value +: stringParents) + emitUsage(entity) + emitTerms(entity.terms) + emitIndex("Entity", entity, stringParents) + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala new file mode 100644 index 0000000..d9e7334 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala @@ -0,0 +1,72 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData} +import com.ossuminc.riddl.diagrams.mermaid.{UseCaseDiagram, UseCaseDiagramSupport} +import com.ossuminc.riddl.language.AST.{Definition, Epic, UseCase, User, UserStory} + +trait EpicWriter { this: MarkdownWriter => + + + def emitEpic(epic: Epic, stack: Seq[Definition]): this.type = { + containerHead(epic, "Epic") + val parents = makeStringParents(stack) + emitBriefly(epic, parents) + if epic.userStory.nonEmpty then { + val userPid = epic.userStory.getOrElse(UserStory()).user.pathId + val parent = stack.head + val maybeUser = refMap.definitionOf[User](userPid, parent) + h2("User Story") + maybeUser match { + case None => p(s"Unresolvable User id: ${userPid.format}") + case Some(user) => + val name = user.id.value + val role = user.is_a.s + val us = epic.userStory.get + val benefit = us.benefit.s + val capability = us.capability.s + val storyText = + s"I, $name, as $role, want $capability, so that $benefit" + p(italic(storyText)) + } + } + emitDescription(epic.description) + list("Visualizations", epic.shownBy.map(u => s"($u)[$u]")) + definitionToc("Use Cases", epic.cases) + emitUsage(epic) + emitTerms(epic.terms) + emitIndex("Epic", epic, parents) + } + + def emitUser(u: User, parents: Seq[String]): this.type = { + leafHead(u, weight = 20) + p(s"${u.identify} is a ${u.is_a.s}.") + emitDefDoc(u, parents) + } + + def emitUseCase(uc: UseCase, parents: Seq[Definition], sds: UseCaseDiagramSupport): Unit = { + leafHead(uc, weight = 20) + val parList = makeStringParents(parents) + emitDefDoc(uc, parList) + h2("Sequence Diagram") + parents.headOption match + case Some(p1) => + val epic = p1.asInstanceOf[Epic] + outputs.outputOf[DiagramsPassOutput](DiagramsPass.name) match + case Some(dpo) => + dpo.userCaseDiagrams.get(uc) match + case Some(useCaseDiagramData: UseCaseDiagramData) => + val ucd = UseCaseDiagram(sds, useCaseDiagramData) + val lines = ucd.generate + emitMermaidDiagram(lines) + + case None => + notAvailable("Sequence diagram is not available") + end match + case None => + notAvailable("Sequence diagram is not available") + end match + case None => + notAvailable("Sequence diagram is not available") + end match + } +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownBasics.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala similarity index 94% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownBasics.scala rename to hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala index 663bc83..c92385a 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownBasics.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala @@ -1,13 +1,13 @@ -package com.ossuminc.riddl.hugo +package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.hugo.themes.ThemeWriter +import com.ossuminc.riddl.hugo.writers.{MarkdownWriter, ThemeWriter} import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.utils.TextFileWriter -trait MarkdownBasics extends TextFileWriter with ThemeWriter { this: MarkdownWriter => +trait MarkdownBasics extends TextFileWriter with ThemeWriter { this: MarkdownWriter => protected val containerWeight: Int = 2 * 5 - + protected def tbd(definition: Definition): Unit = { if definition.isEmpty then { p("TBD: To Be Defined") @@ -151,6 +151,11 @@ trait MarkdownBasics extends TextFileWriter with ThemeWriter { this: MarkdownWri } sb.append(description.lines.map(line => s"$ndnt$listItem${line.s}\n")) } + + def definitionToc(kindOfThing: String, list:Seq[Definition], level:Int = 2): Unit = { + val strList = list.map(c => c.id.value) + toc(kindOfThing, strList, level) + } def toc( kindOfThing: String, diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala similarity index 50% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownWriter.scala rename to hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala index 6293378..b526a69 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/MarkdownWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala @@ -4,33 +4,41 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.hugo +package com.ossuminc.riddl.hugo.writers +import com.ossuminc.riddl.diagrams.mermaid.* import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData, mermaid} -import com.ossuminc.riddl.diagrams.mermaid.{ContextMapDiagram, DomainMapDiagram, EntityRelationshipDiagram, UseCaseDiagram, UseCaseDiagramSupport} -import com.ossuminc.riddl.hugo.themes.ThemeWriter +import com.ossuminc.riddl.hugo.writers.{AdaptorWriter, DomainWriter} +import com.ossuminc.riddl.hugo.PassUtilities import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.language.CommonOptions import com.ossuminc.riddl.language.parsing.Keywords -import com.ossuminc.riddl.passes.{PassInput, PassesOutput} -import com.ossuminc.riddl.stats.{KindStats, StatsOutput, StatsPass} import com.ossuminc.riddl.passes.resolve.{ReferenceMap, Usages} +import com.ossuminc.riddl.passes.symbols.Symbols.Parents import com.ossuminc.riddl.passes.symbols.SymbolsOutput -import com.ossuminc.riddl.utils.TextFileWriter +import com.ossuminc.riddl.passes.{PassInput, PassesOutput} +import com.ossuminc.riddl.stats.{KindStats, StatsOutput, StatsPass} +import com.ossuminc.riddl.utils.{TextFileWriter, Timer} import java.nio.file.Path import scala.annotation.unused - -/** Base */ -trait MarkdownWriter extends MarkdownBasics with PassUtilities { - - private def mkTocSeq( - list: Seq[Definition] - ): Seq[String] = { - val result = list.map(c => c.id.value) - result - } - +import scala.collection.immutable.Seq + +/** Base */ +trait MarkdownWriter + extends MarkdownBasics + with AdaptorWriter + with ApplicationWriter + with ContextWriter + with DomainWriter + with EntityWriter + with EpicWriter + with ProjectorWriter + with RepositoryWriter + with SagaWriter + with StreamletWriter + with SummariesWriter + with PassUtilities { private case class Level(name: String, href: String, children: Seq[Level]) { override def toString: String = { @@ -51,7 +59,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { ) } - private def emitUsage(definition: Definition): this.type = { + protected def emitUsage(definition: Definition): this.type = { usage.getUsers(definition) match { case users: Seq[Definition] if users.nonEmpty => listOf("Used By", users) @@ -127,20 +135,20 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { emitMermaidDiagram(lines) } - private def emitTerms(terms: Seq[Term]): Unit = { + def emitTerms(terms: Seq[Term]): Unit = { list( "Terms", terms.map(t => (t.id.format, t.brief.map(_.s).getOrElse("{no brief}"), t.description)) ) } - private def emitFields(fields: Seq[Field]): Unit = { + protected def emitFields(fields: Seq[Field]): Unit = { list(fields.map { field => (field.id.format, field.typeEx.format, field.brief, field.description) }) } - private def emitBriefly( + protected def emitBriefly( d: Definition, parents: Seq[String], @unused level: Int = 2 @@ -205,7 +213,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { } } - private def emitOptions[OT <: OptionValue]( + protected def emitOptions[OT <: OptionValue]( options: Seq[OT], level: Int = 2 ): this.type = { @@ -213,7 +221,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { this } - private def emitDefDoc( + protected def emitDefDoc( definition: Definition, parents: Seq[String], level: Int = 2 @@ -222,7 +230,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { emitDescription(definition.description, level) } - private def emitShortDefDoc( + protected def emitShortDefDoc( definition: Definition ): this.type = { definition.brief.foreach(b => p(italic(b.s))) @@ -230,7 +238,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { this } - private def makePathIdRef( + protected def makePathIdRef( pid: PathIdentifier, parents: Seq[Definition] ): String = { @@ -250,7 +258,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { s"[${resolved.head.identify}]($link) [{{< icon \"gdoc_code\" >}}]($slink)" } - private def makeTypeName( + protected def makeTypeName( pid: PathIdentifier, parents: Seq[Definition] ): String = { @@ -263,7 +271,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { } } - private def makeTypeName( + protected def makeTypeName( typeEx: TypeExpression, parents: Seq[Definition] ): String = { @@ -282,7 +290,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { name.replace(" ", "-") } - private def resolveTypeExpression( + protected def resolveTypeExpression( typeEx: TypeExpression, parents: Seq[Definition] ): String = { @@ -312,7 +320,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { } } - private def emitAggregateMembers(agg: AggregateTypeExpression, parents: Seq[Definition]): this.type = { + protected def emitAggregateMembers(agg: AggregateTypeExpression, parents: Seq[Definition]): this.type = { val data = agg.contents.map { case f: AggregateValue => (f.id.format, resolveTypeExpression(f.typeEx, parents)) case _ => ("", "") @@ -376,13 +384,12 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { case mt: AggregateUseCaseTypeExpression => mt.usecase.useCase case _ => "Type" } - containerHead(typ, suffix) emitDefDoc(typ, makeStringParents(stack)) emitTypeExpression(typ.typ, typ +: stack) emitUsage(typ) } - private def emitTypesToc(definition: WithTypes): Unit = { + protected def emitTypesToc(definition: WithTypes): Unit = { val groups = definition.types .groupBy { typ => typ.typ match { @@ -393,7 +400,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { .toSeq .sortBy(_._1) h2("Types") - for (label, list) <- groups do { toc(label, mkTocSeq(list), 3) } + for (label, list) <- groups do { definitionToc(label, list, 3) } } private def emitVitalDefinitionTail[OV <: OptionValue, DEF <: RiddlValue](vd: VitalDefinition[OV, DEF]): Unit = { @@ -403,18 +410,18 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { if vd.authorRefs.nonEmpty then toc("Authors", vd.authorRefs.map(_.format)) } - private def emitProcessorToc[OV <: OptionValue, DEF <: RiddlValue](processor: Processor[OV, DEF]): Unit = { + protected def emitProcessorToc[OV <: OptionValue, DEF <: RiddlValue](processor: Processor[OV, DEF]): Unit = { if processor.types.nonEmpty then emitTypesToc(processor) - if processor.constants.nonEmpty then toc("Constants", mkTocSeq(processor.constants)) - if processor.functions.nonEmpty then toc("Functions", mkTocSeq(processor.functions)) - if processor.invariants.nonEmpty then toc("Invariants", mkTocSeq(processor.invariants)) - if processor.handlers.nonEmpty then toc("Handlers", mkTocSeq(processor.handlers)) - if processor.inlets.nonEmpty then toc("Inlets", mkTocSeq(processor.inlets)) - if processor.outlets.nonEmpty then toc("Outlets", mkTocSeq(processor.outlets)) + if processor.constants.nonEmpty then definitionToc("Constants", processor.constants) + if processor.functions.nonEmpty then definitionToc("Functions", processor.functions) + if processor.invariants.nonEmpty then definitionToc("Invariants", processor.invariants) + if processor.handlers.nonEmpty then definitionToc("Handlers", processor.handlers) + if processor.inlets.nonEmpty then definitionToc("Inlets", processor.inlets) + if processor.outlets.nonEmpty then definitionToc("Outlets", processor.outlets) emitVitalDefinitionTail[OV, DEF](processor) } - private def emitAuthorInfo(authors: Seq[Author], level: Int = 2): this.type = { + protected def emitAuthorInfo(authors: Seq[Author], level: Int = 2): this.type = { for a <- authors do { val items = Seq("Name" -> a.name.s, "Email" -> a.email.s) ++ a.organization.fold(Seq.empty[(String, String)])(ls => Seq("Organization" -> ls.s)) ++ @@ -424,34 +431,7 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { this } - def emitDomain( - domain: Domain, - parents: Seq[String], - summary: Option[String], - diagram: DomainMapDiagram - ): this.type = { - containerHead(domain, "Domain") - emitDefDoc(domain, parents) - heading("Domain Map") - emitMermaidDiagram(diagram.generate) - toc("Subdomains", mkTocSeq(domain.domains)) - toc("Contexts", mkTocSeq(domain.contexts)) - toc("Applications", mkTocSeq(domain.applications)) - toc("Epics", mkTocSeq(domain.epics)) - emitTypesToc(domain) - summary match { - case Some(link) => - h3(s"[Message Summary]($link)") - case None => - } - emitUsage(domain) - emitTerms(domain.terms) - emitAuthorInfo(domain.authors) - emitIndex("Domain", domain, parents) - this - } - - private def emitInputOutput( + protected def emitInputOutput( input: Option[Aggregation], output: Option[Aggregation] ): this.type = { @@ -459,78 +439,24 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { h4("Requires (Input)") emitFields(input.get.fields) if output.nonEmpty then - h4("Yields (Output)") + h4("Returns (Output)") output match case None => case Some(agg) => emitFields(agg.fields) this } - def emitFunction(function: Function, parents: Seq[String]): this.type = { - containerHead(function, "Function") - h2(function.id.format) + def emitFunction(function: Function, parents: Seq[String]): Unit = { + h2(function.identify) emitDefDoc(function, parents) emitTypesToc(function) emitInputOutput(function.input, function.output) codeBlock("Statements", function.statements) emitUsage(function) emitTerms(function.terms) - this - } - - private def emitContextMap(context: Context, diagram: Option[ContextMapDiagram]): this.type = { - if diagram.nonEmpty then - h2("Context Map") - val lines = diagram.get.generate - emitMermaidDiagram(lines) - end if - this - } - - def emitContext(context: Context, stack: Seq[Definition], diagram: Option[ContextMapDiagram]): this.type = { - containerHead(context, "Context") - val parents = makeStringParents(stack) - emitDefDoc(context, parents) - emitContextMap(context, diagram) - emitOptions(context.options) - emitTypesToc(context) - toc("Entities", mkTocSeq(context.entities)) - toc("Adaptors", mkTocSeq(context.adaptors)) - toc("Sagas", mkTocSeq(context.sagas)) - toc("Streamlets", mkTocSeq(context.streamlets)) - list("Connections", mkTocSeq(context.connectors)) - emitProcessorToc[ContextOption, OccursInContext](context) - // TODO: generate a diagram for the processors and pipes - emitIndex("Context", context, parents) - this - } - - def emitState( - state: State, - fields: Seq[Field], - parents: Seq[Definition] - ): this.type = { - containerHead(state, "State") - emitDefDoc(state, makeStringParents(parents)) - emitERD(state.id.format, fields, parents) - h2("Fields") - emitFields(fields) - emitUsage(state) - } - - private def emitERD( - name: String, - fields: Seq[Field], - parents: Seq[Definition] - ): this.type = { - h2("Entity Relationships") - val erd = EntityRelationshipDiagram(refMap) - val lines = erd.generate(name, fields, parents) - emitMermaidDiagram(lines) - this } - private def emitInvariants(invariants: Seq[Invariant]): this.type = { + protected def emitInvariants(invariants: Seq[Invariant]): this.type = { if invariants.nonEmpty then { h2("Invariants") invariants.foreach { invariant => @@ -542,312 +468,4 @@ trait MarkdownWriter extends MarkdownBasics with PassUtilities { this } - def emitHandler(handler: Handler, parents: Seq[String]): this.type = { - containerHead(handler, "Handler") - emitDefDoc(handler, parents) - handler.clauses.foreach { clause => - clause match { - case oic: OnInitClause => h3(oic.kind) - case omc: OnMessageClause => h3(clause.kind + " " + omc.msg.format) - case otc: OnTerminationClause => h3(otc.kind) - case ooc: OnOtherClause => h3(ooc.kind) - } - emitShortDefDoc(clause) - codeBlock("Statements", clause.statements, 4) - } - emitUsage(handler) - this - } - - private def emitFiniteStateMachine( - @unused entity: Entity - ): this.type = { this } - - def emitEntity(entity: Entity, parents: Seq[String]): this.type = { - containerHead(entity, "Entity") - emitDefDoc(entity, parents) - emitOptions(entity.options) - if entity.hasOption[EntityIsFiniteStateMachine] then { - h2("Finite State Machine") - emitFiniteStateMachine(entity) - } - emitInvariants(entity.invariants) - emitTypesToc(entity) - // for state <- entity.states do emitState(state,) - toc("States", mkTocSeq(entity.states)) - toc("Functions", mkTocSeq(entity.functions)) - toc("Handlers", mkTocSeq(entity.handlers)) - emitUsage(entity) - emitTerms(entity.terms) - emitIndex("Entity", entity, parents) - } - - private def emitSagaSteps(actions: Seq[SagaStep]): this.type = { - h2("Saga Actions") - actions.foreach { step => - h3(step.identify) - emitShortDefDoc(step) - list(typeOfThing = "Do Statements", step.doStatements.map(_.format), 4) - list(typeOfThing = "Undo Statements", step.doStatements.map(_.format), 4) - } - this - } - - def emitSaga(saga: Saga, parents: Seq[String]): Unit = { - containerHead(saga, "Saga") - emitDefDoc(saga, parents) - emitOptions(saga.options) - emitInputOutput(saga.input, saga.output) - emitSagaSteps(saga.sagaSteps) - emitIndex("Saga", saga, parents) - emitUsage(saga) - emitTerms(saga.terms) - } - - def emitApplication( - application: Application, - stack: Seq[Definition] - ): Unit = { - containerHead(application, "Application") - val parents = makeStringParents(stack) - emitDefDoc(application, parents) - for group <- application.groups do { - h2(group.identify) - list(group.elements.map(_.format)) - } - emitUsage(application) - emitTerms(application.terms) - } - - def emitEpic(epic: Epic, stack: Seq[Definition]): this.type = { - containerHead(epic, "Epic") - val parents = makeStringParents(stack) - emitBriefly(epic, parents) - if epic.userStory.nonEmpty then { - val userPid = epic.userStory.getOrElse(UserStory()).user.pathId - val parent = stack.head - val maybeUser = refMap.definitionOf[User](userPid, parent) - h2("User Story") - maybeUser match { - case None => p(s"Unresolvable User id: ${userPid.format}") - case Some(user) => - val name = user.id.value - val role = user.is_a.s - val us = epic.userStory.get - val benefit = us.benefit.s - val capability = us.capability.s - val storyText = - s"I, $name, as $role, want $capability, so that $benefit" - p(italic(storyText)) - } - } - emitDescription(epic.description) - list("Visualizations", epic.shownBy.map(u => s"($u)[$u]")) - toc("Use Cases", mkTocSeq(epic.cases)) - emitUsage(epic) - emitTerms(epic.terms) - emitIndex("Epic", epic, parents) - } - - def emitUser(u: User, parents: Seq[String]): this.type = { - leafHead(u, weight = 20) - p(s"${u.identify} is a ${u.is_a.s}.") - emitDefDoc(u, parents) - } - - def emitUseCase(uc: UseCase, parents: Seq[Definition], sds: UseCaseDiagramSupport): Unit = { - leafHead(uc, weight = 20) - val parList = makeStringParents(parents) - emitDefDoc(uc, parList) - h2("Sequence Diagram") - parents.headOption match - case Some(p1) => - val epic = p1.asInstanceOf[Epic] - outputs.outputOf[DiagramsPassOutput](DiagramsPass.name) match - case Some(dpo) => - dpo.userCaseDiagrams.get(uc) match - case Some(useCaseDiagramData: UseCaseDiagramData) => - val ucd = UseCaseDiagram(sds, useCaseDiagramData) - val lines = ucd.generate - emitMermaidDiagram(lines) - - case None => - notAvailable("Sequence diagram is not available") - end match - case None => - notAvailable("Sequence diagram is not available") - end match - case None => - notAvailable("Sequence diagram is not available") - end match - } - - def emitConnector(conn: Connector, parents: Seq[String]): this.type = { - leafHead(conn, weight = 20) - emitDefDoc(conn, parents) - if conn.from.nonEmpty && conn.to.nonEmpty then { - p(s"from ${conn.from.format} to ${conn.to.format}") - - } - emitUsage(conn) - } - - def emitStreamlet(proc: Streamlet, parents: Seq[Definition]): this.type = { - leafHead(proc, weight = 30) - val parList = makeStringParents(parents) - emitDefDoc(proc, parList) - h2("Inlets") - proc.inlets.foreach { inlet => - val typeRef = makePathIdRef(inlet.type_.pathId, parents) - h3(inlet.id.format) - p(typeRef) - emitShortDefDoc(inlet) - } - h2("Outlets") - proc.outlets.foreach { outlet => - val typeRef = makePathIdRef(outlet.type_.pathId, parents) - h3(outlet.id.format) - p(typeRef) - emitShortDefDoc(outlet) - } - emitUsage(proc) - emitTerms(proc.terms) - emitIndex("Processor", proc, parList) - } - - def emitProjector( - projector: Projector, - parents: Seq[String] - ): this.type = { - containerHead(projector, "Projector") - emitDefDoc(projector, parents) - - emitProcessorToc[ProjectorOption, OccursInProjector](projector) - emitIndex("Projector", projector, parents) - } - - def emitRepository( - repository: Repository, - parents: Seq[String] - ): this.type = { - containerHead(repository, "Repository") - emitDefDoc(repository, parents) - emitProcessorToc[RepositoryOption, OccursInRepository](repository) - emitIndex("Repository", repository, parents) - } - - def emitAdaptor(adaptor: Adaptor, parents: Seq[String]): this.type = { - containerHead(adaptor, "Adaptor") - emitDefDoc(adaptor, parents) - p(s"Direction: ${adaptor.direction.format} ${adaptor.context.format}") - emitProcessorToc[AdaptorOption, OccursInAdaptor](adaptor) - emitIndex("Adaptor", adaptor, parents) - } - - - private def makeIconLink(id: String, title: String, link: String): String = { - if link.nonEmpty then { s"[{{< icon \"$id\" >}}]($link \"$title\")" } - else { "" } - } - - private def emitTermRow(entry: GlossaryEntry): Unit = { - val source_link = makeIconLink("gdoc_github", "Source Link", entry.sourceLink) - val term = s"[${mono(entry.term)}](${entry.link})$source_link" - val concept_link = - s"[${entry.kind.toLowerCase}](https://riddl.tech/concepts/${entry.kind.toLowerCase}/)" - emitTableRow(term, concept_link, entry.brief) - } - - def emitGlossary( - weight: Int, - terms: Seq[GlossaryEntry] - ): this.type = { - fileHead("Glossary Of Terms", weight, Some("A generated glossary of terms")) - - emitTableHead(Seq("Term" -> 'C', "Type" -> 'C', "Brief Description" -> 'L')) - - terms.sortBy(_.term).foreach { entry => emitTermRow(entry) } - this - } - - def emitToDoList(weight: Int, items: Seq[ToDoItem]): Unit = { - fileHead( - "To Do List", - weight, - Option("A list of definitions needing more work") - ) - h2("Definitions With Missing Content") - for { (author, info) <- items.groupBy(_.author) } do { - h3(author) - emitTableHead( - Seq( - "Item Name" -> 'C', - "Path To Item" -> 'C' - ) - ) - for { item <- info.map { item => item.item -> s"[${item.path}](${item.link})" } } do - emitTableRow(item._1, item._2) - } - } - - def emitStatistics(weight: Int): this.type = { - fileHead( - "Model Statistics", - weight, - Some("Statistical information about the RIDDL model documented") - ) - - val stats = outputs.outputOf[StatsOutput](StatsPass.name).getOrElse(StatsOutput()) - emitTableHead( - Seq( - "Category" -> 'L', - "count" -> 'R', - "% of All" -> 'R', - "% documented" -> 'R', - "number empty" -> 'R', - "avg completeness" -> 'R', - "avg complexity" -> 'R', - "avg containment" -> 'R' - ) - ) - val total_stats: KindStats = stats.categories.getOrElse("All", KindStats()) - stats.categories.foreach { case (key, s) => - emitTableRow( - key, - s.count.toString, - f"%%1.2f".format(s.percent_of_all(total_stats.count)), - f"%%1.2f".format(s.percent_documented), - s.numEmpty.toString, - f"%%1.3f".format(s.completeness), - f"%%1.3f".format(s.complexity), - f"%%1.3f".format(s.averageContainment) - ) - } - this - } - - def emitMessageSummary(domain: Domain, messages: Seq[MessageInfo]): Unit = { - fileHead( - s"${domain.identify} Message Summary", - containerWeight + 5, - Some(s"Message Summary for ${domain.identify}") - ) - emitTableHead( - Seq( - "Name" -> 'C', - "Users" -> 'C', - "Description" -> 'L' - ) - ) - - for { - message <- messages - } do { - emitTableRow( - message.message, - message.users, - message.description - ) - } - } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala new file mode 100644 index 0000000..2d64a1c --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala @@ -0,0 +1,21 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.{OccursInProjector, Projector, ProjectorOption} + +trait ProjectorWriter { this: MarkdownWriter => + + def emitProjector( + projector: Projector, + parents: Seq[String] + ): this.type = { + containerHead(projector, "Projector") + emitDefDoc(projector, parents) + + emitProcessorToc[ProjectorOption, OccursInProjector](projector) + emitUsage(projector) + emitTerms(projector.terms) + emitIndex("Projector", projector, parents) + } + + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala new file mode 100644 index 0000000..15a7574 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala @@ -0,0 +1,19 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.{OccursInRepository, Repository, RepositoryOption} + +trait RepositoryWriter { this: MarkdownWriter => + + def emitRepository( + repository: Repository, + parents: Seq[String] + ): Unit = { + containerHead(repository, "Repository") + emitDefDoc(repository, parents) + emitProcessorToc[RepositoryOption, OccursInRepository](repository) + emitUsage(repository) + emitTerms(repository.terms) + emitIndex("Repository", repository, parents) + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala new file mode 100644 index 0000000..9ab4958 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala @@ -0,0 +1,29 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.hugo.writers.MarkdownWriter +import com.ossuminc.riddl.language.AST.* + +trait SagaWriter { this: MarkdownWriter => + + private def emitSagaSteps(actions: Seq[SagaStep]): this.type = { + h2("Saga Actions") + actions.foreach { step => + h3(step.identify) + emitShortDefDoc(step) + list(typeOfThing = "Do Statements", step.doStatements.map(_.format), 4) + list(typeOfThing = "Undo Statements", step.doStatements.map(_.format), 4) + } + this + } + + def emitSaga(saga: Saga, parents: Seq[String]): Unit = { + containerHead(saga, "Saga") + emitDefDoc(saga, parents) + emitOptions(saga.options) + emitInputOutput(saga.input, saga.output) + emitSagaSteps(saga.sagaSteps) + emitUsage(saga) + emitTerms(saga.terms) + emitIndex("Saga", saga, parents) + } +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala new file mode 100644 index 0000000..8554f22 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala @@ -0,0 +1,39 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.* + +trait StreamletWriter { this: MarkdownWriter => + + def emitConnector(conn: Connector, parents: Seq[String]): this.type = { + leafHead(conn, weight = 20) + emitDefDoc(conn, parents) + if conn.from.nonEmpty && conn.to.nonEmpty then { + p(s"from ${conn.from.format} to ${conn.to.format}") + + } + emitUsage(conn) + } + + def emitStreamlet(streamlet: Streamlet, parents: Seq[Definition]): this.type = { + leafHead(streamlet, weight = 30) + val parList = makeStringParents(parents) + emitDefDoc(streamlet, parList) + h2("Inlets") + streamlet.inlets.foreach { inlet => + val typeRef = makePathIdRef(inlet.type_.pathId, parents) + h3(inlet.id.format) + p(typeRef) + emitShortDefDoc(inlet) + } + h2("Outlets") + streamlet.outlets.foreach { outlet => + val typeRef = makePathIdRef(outlet.type_.pathId, parents) + h3(outlet.id.format) + p(typeRef) + emitShortDefDoc(outlet) + } + emitUsage(streamlet) + emitTerms(streamlet.terms) + emitIndex("Streamlet", streamlet, parList) + } +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala new file mode 100644 index 0000000..eccee88 --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala @@ -0,0 +1,111 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.hugo.{GlossaryEntry, MessageInfo, ToDoItem} +import com.ossuminc.riddl.language.AST.Domain +import com.ossuminc.riddl.stats.{KindStats, StatsOutput, StatsPass} + +trait SummariesWriter { this: MarkdownWriter => + + def emitStatistics(weight: Int): Unit = { + fileHead( + "Model Statistics", + weight, + Some("Statistical information about the RIDDL model documented") + ) + + val stats = outputs.outputOf[StatsOutput](StatsPass.name).getOrElse(StatsOutput()) + emitTableHead( + Seq( + "Category" -> 'L', + "count" -> 'R', + "% of All" -> 'R', + "% documented" -> 'R', + "number empty" -> 'R', + "avg completeness" -> 'R', + "avg complexity" -> 'R', + "avg containment" -> 'R' + ) + ) + val total_stats: KindStats = stats.categories.getOrElse("All", KindStats()) + stats.categories.foreach { case (key, s) => + emitTableRow( + key, + s.count.toString, + f"%%1.2f".format(s.percent_of_all(total_stats.count)), + f"%%1.2f".format(s.percent_documented), + s.numEmpty.toString, + f"%%1.3f".format(s.completeness), + f"%%1.3f".format(s.complexity), + f"%%1.3f".format(s.averageContainment) + ) + } + } + + private def makeIconLink(id: String, title: String, link: String): String = { + if link.nonEmpty then { + s"[{{< icon \"$id\" >}}]($link \"$title\")" + } else { + "" + } + } + + private def emitTermRow(entry: GlossaryEntry): Unit = { + val source_link = makeIconLink("gdoc_github", "Source Link", entry.sourceLink) + val term = s"[${mono(entry.term)}](${entry.link})$source_link" + val concept_link = + s"[${entry.kind.toLowerCase}](https://riddl.tech/concepts/${entry.kind.toLowerCase}/)" + emitTableRow(term, concept_link, entry.brief) + } + + def emitGlossary( + weight: Int, + terms: Seq[GlossaryEntry] + ): Unit = { + fileHead("Glossary Of Terms", weight, Some("A generated glossary of terms")) + + emitTableHead(Seq("Term" -> 'C', "Type" -> 'C', "Brief Description" -> 'L')) + + terms.sortBy(_.term).foreach { entry => emitTermRow(entry) } + } + + def emitToDoList(weight: Int, items: Seq[ToDoItem]): Unit = { + fileHead( + "To Do List", + weight, + Option("A list of definitions needing more work") + ) + h2("Definitions With Missing Content") + for { (author, info) <- items.groupBy(_.author) } do { + h3(author) + emitTableHead( + Seq( + "Item Name" -> 'C', + "Path To Item" -> 'C' + ) + ) + for { item <- info.map { item => item.item -> s"[${item.path}](${item.link})" } } do + emitTableRow(item._1, item._2) + } + } + + def emitMessageSummary(domain: Domain, messages: Seq[MessageInfo]): Unit = { + emitTableHead( + Seq( + "Name" -> 'C', + "Users" -> 'C', + "Description" -> 'L' + ) + ) + + for { + message <- messages + } do { + emitTableRow( + message.message, + message.users, + message.description + ) + } + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/ThemeWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala similarity index 86% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/ThemeWriter.scala rename to hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala index b384056..0889043 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/ThemeWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala @@ -1,6 +1,5 @@ -package com.ossuminc.riddl.hugo.themes +package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.hugo.{HugoCommand, MarkdownBasics, MarkdownWriter, PassUtilities} import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.language.Messages import com.ossuminc.riddl.passes.{PassInput, PassesOutput} @@ -10,8 +9,7 @@ trait ThemeWriter { def themeName: String - protected val messages: Messages.Accumulator = Messages.Accumulator.empty - + protected val messages: Messages.Accumulator = Messages.Accumulator.empty def fileHead( title: String, diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala index 656a03d..4356203 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala @@ -1,6 +1,7 @@ package com.ossuminc.riddl.hugo import com.ossuminc.riddl.hugo.themes.GeekDocTheme +import com.ossuminc.riddl.hugo.writers.MarkdownWriter import com.ossuminc.riddl.language.{CommonOptions, Messages} import com.ossuminc.riddl.language.Messages.Messages import com.ossuminc.riddl.language.AST.Root diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala index d5d093a..a803a50 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala @@ -7,6 +7,7 @@ package com.ossuminc.riddl.hugo import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram +import com.ossuminc.riddl.hugo.writers.MarkdownWriter import com.ossuminc.riddl.language.AST.Root import com.ossuminc.riddl.language.parsing.RiddlParserInput import com.ossuminc.riddl.passes.PassesResult @@ -39,7 +40,7 @@ class MarkdownWriterTest extends HugoTestBase { val domain = root.domains.head val mkd = makeMDW(output, PassesResult.empty) val diagram = DomainMapDiagram(domain) - mkd.emitDomain(domain, paths.dropRight(1), None, diagram) + mkd.emitDomain(domain, paths.dropRight(1)) val emitted = mkd.toString info(emitted) val expected = From fd65f69a8d635d9971ea5650d1c759c72fda11d1 Mon Sep 17 00:00:00 2001 From: reidspencer Date: Thu, 4 Apr 2024 19:58:12 -0700 Subject: [PATCH 3/7] Fix a bug caused by re-ordering output --- .../scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala index 05721c6..9ca0485 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala @@ -3,14 +3,13 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram import com.ossuminc.riddl.language.AST.* -trait DomainWriter { this: MarkdownWriter => +trait DomainWriter { this: MarkdownWriter => def emitDomain(domain: Domain, parents: Seq[String]): Unit = { val diagram = DomainMapDiagram(domain) containerHead(domain, "Domain") emitDefDoc(domain, parents) - emitAuthorInfo(domain.authors) h2("Domain Map") emitMermaidDiagram(diagram.generate) definitionToc("Subdomains", domain.domains) @@ -19,6 +18,7 @@ trait DomainWriter { this: MarkdownWriter => definitionToc("Epics", domain.epics) emitTypesToc(domain) emitUsage(domain) + emitAuthorInfo(domain.authors) emitTerms(domain.terms) emitIndex("Domain", domain, parents) } From eff8ff4b9ae6b201d17bab83fdbce6395e085c43 Mon Sep 17 00:00:00 2001 From: reidspencer Date: Sun, 7 Apr 2024 14:48:48 -0700 Subject: [PATCH 4/7] Refactor VitalDefinition & Processor output --- .../com/ossuminc/riddl/hugo/HugoPass.scala | 35 ++-- .../com/ossuminc/riddl/hugo/Summarizer.scala | 3 +- .../riddl/hugo/themes/DotdockTheme.scala | 3 + .../riddl/hugo/themes/GeekDocTheme.scala | 7 + .../riddl/hugo/writers/AdaptorWriter.scala | 11 +- .../hugo/writers/ApplicationWriter.scala | 13 +- .../riddl/hugo/writers/ContextWriter.scala | 8 +- .../riddl/hugo/writers/DomainWriter.scala | 12 +- .../riddl/hugo/writers/EntityWriter.scala | 36 ++-- .../riddl/hugo/writers/EpicWriter.scala | 16 +- .../riddl/hugo/writers/MarkdownBasics.scala | 2 +- .../riddl/hugo/writers/MarkdownWriter.scala | 167 +++++++++++------- .../riddl/hugo/writers/ProjectorWriter.scala | 14 +- .../riddl/hugo/writers/RepositoryWriter.scala | 12 +- .../riddl/hugo/writers/SagaWriter.scala | 5 +- .../riddl/hugo/writers/StreamletWriter.scala | 28 +-- .../riddl/hugo/writers/ThemeWriter.scala | 4 +- .../riddl/hugo/MarkdownWriterTest.scala | 2 +- 18 files changed, 197 insertions(+), 181 deletions(-) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala index ae06a0e..7bbb653 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala @@ -95,30 +95,27 @@ case class HugoPass( override def process(value: AST.RiddlValue, parents: ParentStack): Unit = { val stack = parents.toSeq value match { - case c: Connector => - val (md: MarkdownWriter, parents) = setUpLeaf(c, stack) - md.emitConnector(c, parents) - case u: User => - val (md: MarkdownWriter, parents) = setUpLeaf(u, stack) - md.emitUser(u, parents) + // We only process containers here since they start their own + // documentation section. Everything else is a leaf or a detail + // on the container's index page. case container: Definition => - // Everything else is a container and definitely needs its own page - // and glossary entry. - val (mkd: MarkdownWriter, parents) = setUpContainer(container, stack) + // Create the writer for this container + val mkd: MarkdownWriter = setUpContainer(container, stack) - container match { - case a: Adaptor => mkd.emitAdaptor(a, parents) + container match { // match the processors + case a: Adaptor => mkd.emitAdaptor(a, stack) case a: Application => mkd.emitApplication(a, stack) case c: Context => mkd.emitContext(c, stack) - case d: Domain => mkd.emitDomain(d, parents) + case d: Domain => mkd.emitDomain(d, stack) case e: Entity => mkd.emitEntity(e, stack) case e: Epic => mkd.emitEpic(e, stack) - case p: Projector => mkd.emitProjector(p, parents) - case r: Repository => mkd.emitRepository(r, parents) - case s: Saga => mkd.emitSaga(s, parents) + case p: Projector => mkd.emitProjector(p, stack) + case r: Repository => mkd.emitRepository(r, stack) + case s: Saga => mkd.emitSaga(s, stack) case s: Streamlet => mkd.emitStreamlet(s, stack) case uc: UseCase => mkd.emitUseCase(uc, stack, this) + // ignore the non-processors case _: Function | _: Handler | _: State | _: OnOtherClause | _: OnInitClause | _: OnMessageClause | _: OnTerminationClause | _: Author | _: Enumerator | _: Field | _: Method | _: Term | _: Constant | _: Invariant | _: Inlet | _: Outlet | _: Connector | _: SagaStep | _: User | _: Interaction | _: Root | @@ -281,18 +278,18 @@ case class HugoPass( private def setUpContainer( c: Definition, stack: Seq[Definition] - ): (MarkdownWriter, Seq[String]) = { + ): MarkdownWriter = { addDir(c.id.format) val pars = makeStringParents(stack) - makeWriter(pars :+ c.id.format, "_index.md") -> pars + makeWriter(pars :+ c.id.format, "_index.md") } private def setUpLeaf( d: Definition, stack: Seq[Definition] - ): (MarkdownWriter, Seq[String]) = { + ): MarkdownWriter = { val pars = makeStringParents(stack) - makeWriter(pars, d.id.format + ".md") -> pars + makeWriter(pars, d.id.format + ".md") } // scalastyle:off method.length diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala index 33376d5..42b2d3b 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala @@ -11,6 +11,8 @@ trait Summarizer { this: HugoPass => makeGlossary() makeToDoList() makeStatistics() + + // TODO: makeUsers() if options.withMessageSummary then for d <- root.domains do makeMessageSummary(d) } @@ -49,7 +51,6 @@ trait Summarizer { this: HugoPass => } } mdw.list(glossary ++ todoList ++ statistics) - mdw.emitIndex("Full", root, Seq.empty[String]) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala index e0d6f1f..0206fa8 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala @@ -52,6 +52,8 @@ case class DotdockTheme( def notAvailable(thing: String, title: String = "Unavailable"): Unit = ??? def emitMermaidDiagram(lines: Seq[String]): Unit = ??? + + def processorIndex(processor: Processor[_,_]): Unit = ??? // Members declared in com.ossuminc.riddl.hugo.themes.ThemeWriter @@ -80,4 +82,5 @@ case class DotdockTheme( // weight = 2 } + override def processorToc(processor: Processor[_, _]): Unit = ??? } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala index 96abaec..91a98b1 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala @@ -108,4 +108,11 @@ case class GeekDocTheme( } } + def processorIndex(processor: Processor[_,_]): Unit = { + if processor.authorRefs.nonEmpty then toc("Authors", processor.authorRefs.map(_.format)) + h2("Index") + p("{{< toc-tree >}}") + } + + override def processorToc(processor: Processor[_, _]): Unit = ??? } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala index d4c0782..a1dcd1b 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala @@ -1,18 +1,15 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.language.AST.{Adaptor, AdaptorOption, OccursInAdaptor} +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait AdaptorWriter { this: MarkdownWriter => - def emitAdaptor(adaptor: Adaptor, parents: Seq[String]): this.type = { + def emitAdaptor(adaptor: Adaptor, parents: Parents): Unit = { containerHead(adaptor, "Adaptor") emitDefDoc(adaptor, parents) p(s"Direction: ${adaptor.direction.format} ${adaptor.context.format}") - emitProcessorToc[AdaptorOption, OccursInAdaptor](adaptor) - emitUsage(adaptor) - emitTerms(adaptor.terms) - emitIndex("Adaptor", adaptor, parents) + emitProcessorDetails[AdaptorOption, OccursInAdaptor](adaptor, parents) + } - - } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala index 7e29dd7..18e4f81 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala @@ -1,24 +1,21 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait ApplicationWriter { this: MarkdownWriter => - def emitApplication( - application: Application, - stack: Seq[Definition] - ): Unit = { + application: Application, + parents: Parents + ): Unit = { containerHead(application, "Application") - val parents = makeStringParents(stack) emitDefDoc(application, parents) for group <- application.groups do { h2(group.identify) list(group.elements.map(_.format)) } - emitUsage(application) - emitTerms(application.terms) - emitIndex("Application", application, parents) + emitProcessorDetails(application, parents) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala index 561e9c1..dffa674 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala @@ -13,22 +13,20 @@ trait ContextWriter { this: MarkdownWriter => end if } - def emitContext(context: Context, stack: Seq[Definition]): Unit = { + def emitContext(context: Context, parents: Seq[Definition]): Unit = { containerHead(context, "Context") val maybeDiagram = diagrams.contextDiagrams.get(context).map(data => ContextMapDiagram(context, data)) - val parents = makeStringParents(stack) emitDefDoc(context, parents) emitContextMap(context, maybeDiagram) emitOptions(context.options) - emitTypesToc(context) + emitTypes(context, context +: parents ) definitionToc("Entities", context.entities) definitionToc("Adaptors", context.adaptors) definitionToc("Sagas", context.sagas) definitionToc("Streamlets", context.streamlets) list("Connectors", context.connectors) - emitProcessorToc[ContextOption, OccursInContext](context) + emitProcessorDetails[ContextOption, OccursInContext](context, parents) // TODO: generate a diagram for the processors and pipes - emitIndex("Context", context, parents) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala index 9ca0485..3603e87 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala @@ -2,25 +2,25 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait DomainWriter { this: MarkdownWriter => - def emitDomain(domain: Domain, parents: Seq[String]): Unit = { + def emitDomain(domain: Domain, parents: Parents): Unit = { val diagram = DomainMapDiagram(domain) containerHead(domain, "Domain") emitDefDoc(domain, parents) h2("Domain Map") emitMermaidDiagram(diagram.generate) + emitTypes(domain, domain +: parents) + emitUsage(domain) + emitAuthorInfo(domain.authors) + emitTerms(domain.terms) definitionToc("Subdomains", domain.domains) definitionToc("Contexts", domain.contexts) definitionToc("Applications", domain.applications) definitionToc("Epics", domain.epics) - emitTypesToc(domain) - emitUsage(domain) - emitAuthorInfo(domain.authors) - emitTerms(domain.terms) - emitIndex("Domain", domain, parents) } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala index 819c114..97cfee0 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala @@ -13,41 +13,40 @@ trait EntityWriter { this: MarkdownWriter => parents: Parents ): this.type = { h2(state.identify) - val stringParents = makeStringParents(parents) - emitDefDoc(state, stringParents) + emitDefDoc(state, parents) val maybeType = refMap.definitionOf[Type](state.typ.pathId, state) val fields = maybeType match { case Some(typ: AggregateTypeExpression) => typ.fields - case Some(_) => Seq.empty[Field] - case None => Seq.empty[Field] + case Some(_) => Seq.empty[Field] + case None => Seq.empty[Field] } emitERD(state.id.format, fields, parents) h2("Fields") emitFields(fields) - for h <- state.handlers do emitHandler(h, state.id.value +: stringParents) + for h <- state.handlers do emitHandler(h, state +: parents) emitUsage(state) } private def emitERD( - name: String, - fields: Seq[Field], - parents: Seq[Definition] - ): Unit = { + name: String, + fields: Seq[Field], + parents: Seq[Definition] + ): Unit = { h2("Entity Relationships") val erd = EntityRelationshipDiagram(refMap) val lines = erd.generate(name, fields, parents) emitMermaidDiagram(lines) } - def emitHandler(handler: Handler, parents: Seq[String]): this.type = { + def emitHandler(handler: Handler, parents: Parents): this.type = { containerHead(handler, "Handler") emitDefDoc(handler, parents) handler.clauses.foreach { clause => clause match { - case oic: OnInitClause => h3(oic.kind) - case omc: OnMessageClause => h3(clause.kind + " " + omc.msg.format) + case oic: OnInitClause => h3(oic.kind) + case omc: OnMessageClause => h3(clause.kind + " " + omc.msg.format) case otc: OnTerminationClause => h3(otc.kind) - case ooc: OnOtherClause => h3(ooc.kind) + case ooc: OnOtherClause => h3(ooc.kind) } emitShortDefDoc(clause) codeBlock("Statements", clause.statements, 4) @@ -60,21 +59,20 @@ trait EntityWriter { this: MarkdownWriter => def emitEntity(entity: Entity, parents: Parents): Unit = { containerHead(entity, "Entity") - val stringParents = makeStringParents(parents) - emitDefDoc(entity, stringParents) + emitDefDoc(entity, parents) emitOptions(entity.options) if entity.hasOption[EntityIsFiniteStateMachine] then { h2("Finite State Machine") emitFiniteStateMachine(entity) } emitInvariants(entity.invariants) - emitTypesToc(entity) + emitTypes(entity, entity +: parents) for state <- entity.states do emitState(state, entity +: parents) - for handler <- entity.handlers do emitHandler(handler, entity.id.value +: stringParents) - for function <- entity.functions do emitFunction(function, entity.id.value +: stringParents) + for handler <- entity.handlers do emitHandler(handler, entity +: parents) + for function <- entity.functions do emitFunction(function, entity +: parents) + emitProcessorDetails(entity, parents) emitUsage(entity) emitTerms(entity.terms) - emitIndex("Entity", entity, stringParents) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala index d9e7334..bc2f0ef 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala @@ -3,17 +3,17 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData} import com.ossuminc.riddl.diagrams.mermaid.{UseCaseDiagram, UseCaseDiagramSupport} import com.ossuminc.riddl.language.AST.{Definition, Epic, UseCase, User, UserStory} +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait EpicWriter { this: MarkdownWriter => - def emitEpic(epic: Epic, stack: Seq[Definition]): this.type = { + def emitEpic(epic: Epic, parents: Parents): Unit = { containerHead(epic, "Epic") - val parents = makeStringParents(stack) emitBriefly(epic, parents) if epic.userStory.nonEmpty then { val userPid = epic.userStory.getOrElse(UserStory()).user.pathId - val parent = stack.head + val parent = parents.head val maybeUser = refMap.definitionOf[User](userPid, parent) h2("User Story") maybeUser match { @@ -31,22 +31,20 @@ trait EpicWriter { this: MarkdownWriter => } emitDescription(epic.description) list("Visualizations", epic.shownBy.map(u => s"($u)[$u]")) - definitionToc("Use Cases", epic.cases) emitUsage(epic) emitTerms(epic.terms) - emitIndex("Epic", epic, parents) + definitionToc("Use Cases", epic.cases) } - def emitUser(u: User, parents: Seq[String]): this.type = { + def emitUser(u: User, parents: Parents): this.type = { leafHead(u, weight = 20) p(s"${u.identify} is a ${u.is_a.s}.") emitDefDoc(u, parents) } - def emitUseCase(uc: UseCase, parents: Seq[Definition], sds: UseCaseDiagramSupport): Unit = { + def emitUseCase(uc: UseCase, parents: Parents, sds: UseCaseDiagramSupport): Unit = { leafHead(uc, weight = 20) - val parList = makeStringParents(parents) - emitDefDoc(uc, parList) + emitDefDoc(uc, parents) h2("Sequence Diagram") parents.headOption match case Some(p1) => diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala index c92385a..b73fde9 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala @@ -86,7 +86,7 @@ trait MarkdownBasics extends TextFileWriter with ThemeWriter { this: MarkdownWri for item <- items do { item match { case body: String => sb.append(s"* $body\n") - case rnod: RiddlValue => sb.append(s"* ${rnod.format}") + case rval: RiddlValue => sb.append(s"* ${rval.format}") case ( prefix: String, description: String, diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala index b526a69..720e1ce 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala @@ -72,35 +72,6 @@ trait MarkdownWriter this } - def emitIndex( - kind: String, - top: Definition, - parents: Seq[String] - ): this.type = { - if options.withGraphicalTOC then { - h2(s"Graphical $kind Index") - val json = makeData(top, parents).toString - val resourceName = "js/tree-map-hierarchy2.js" - val javascript = - s""" - |
- | - | - | - |
- """.stripMargin - p(javascript) - } - h2(s"Textual $kind Index") - p("{{< toc-tree >}}") - } - private def emitC4ContainerDiagram( definition: Context, parents: Seq[Definition] @@ -150,7 +121,7 @@ trait MarkdownWriter protected def emitBriefly( d: Definition, - parents: Seq[String], + parents: Parents, @unused level: Int = 2 ): Unit = { emitTableHead(Seq("Item" -> 'C', "Value" -> 'L')) @@ -161,7 +132,7 @@ trait MarkdownWriter val authors = d.asInstanceOf[VitalDefinition[?, ?]].authorRefs emitTableRow(italic("Authors"), authors.map(_.format).mkString(", ")) } - val path = (parents :+ d.id.format).mkString(".") + val path = (parents.map(_.id.value) :+ d.id.value).mkString(".") emitTableRow(italic("Definition Path"), path) val link = makeSourceLink(d) emitTableRow(italic("View Source Link"), s"[${d.loc}]($link)") @@ -223,7 +194,7 @@ trait MarkdownWriter protected def emitDefDoc( definition: Definition, - parents: Seq[String], + parents: Parents, level: Int = 2 ): this.type = { emitBriefly(definition, parents, level) @@ -258,7 +229,7 @@ trait MarkdownWriter s"[${resolved.head.identify}]($link) [{{< icon \"gdoc_code\" >}}]($slink)" } - protected def makeTypeName( + private def makeTypeName( pid: PathIdentifier, parents: Seq[Definition] ): String = { @@ -290,7 +261,7 @@ trait MarkdownWriter name.replace(" ", "-") } - protected def resolveTypeExpression( + private def resolveTypeExpression( typeEx: TypeExpression, parents: Seq[Definition] ): String = { @@ -320,7 +291,7 @@ trait MarkdownWriter } } - protected def emitAggregateMembers(agg: AggregateTypeExpression, parents: Seq[Definition]): this.type = { + private def emitAggregateMembers(agg: AggregateTypeExpression, parents: Seq[Definition]): this.type = { val data = agg.contents.map { case f: AggregateValue => (f.id.format, resolveTypeExpression(f.typeEx, parents)) case _ => ("", "") @@ -379,46 +350,42 @@ trait MarkdownWriter } } - def emitType(typ: Type, stack: Seq[Definition]): Unit = { - val suffix = typ.typ match { - case mt: AggregateUseCaseTypeExpression => mt.usecase.useCase - case _ => "Type" - } - emitDefDoc(typ, makeStringParents(stack)) - emitTypeExpression(typ.typ, typ +: stack) + private def emitType(typ: Type, parents: Parents): Unit = { + h4(typ.identify) + emitDefDoc(typ, parents) + emitTypeExpression(typ.typ, typ +: parents) emitUsage(typ) } - protected def emitTypesToc(definition: WithTypes): Unit = { + protected def emitTypes(definition: Definition & WithTypes, parents: Parents): Unit = { val groups = definition.types .groupBy { typ => typ.typ match { - case mt: AggregateUseCaseTypeExpression => mt.usecase.format - case _ => "Others" + case mt: AggregateUseCaseTypeExpression => mt.usecase.format + case AliasedTypeExpression(loc, keyword, pathId) => "Alias " + case EntityReferenceTypeExpression(loc, entity) => "Reference " + case numericType: NumericType => "Numeric " + case PredefinedType(str) => "Predefined " + case _ => "Structural" } } .toSeq - .sortBy(_._1) + .sortBy(_._2.size) h2("Types") - for (label, list) <- groups do { definitionToc(label, list, 3) } - } - - private def emitVitalDefinitionTail[OV <: OptionValue, DEF <: RiddlValue](vd: VitalDefinition[OV, DEF]): Unit = { - emitOptions(vd.options) - emitTerms(vd.terms) - emitUsage(vd) - if vd.authorRefs.nonEmpty then toc("Authors", vd.authorRefs.map(_.format)) + for { + (label, list) <- groups + } do { + h3(label + " Types") + for typ <- list do emitType(typ, parents) + } } - protected def emitProcessorToc[OV <: OptionValue, DEF <: RiddlValue](processor: Processor[OV, DEF]): Unit = { - if processor.types.nonEmpty then emitTypesToc(processor) - if processor.constants.nonEmpty then definitionToc("Constants", processor.constants) - if processor.functions.nonEmpty then definitionToc("Functions", processor.functions) - if processor.invariants.nonEmpty then definitionToc("Invariants", processor.invariants) - if processor.handlers.nonEmpty then definitionToc("Handlers", processor.handlers) - if processor.inlets.nonEmpty then definitionToc("Inlets", processor.inlets) - if processor.outlets.nonEmpty then definitionToc("Outlets", processor.outlets) - emitVitalDefinitionTail[OV, DEF](processor) + private def emitConstants(withConstants: Definition & WithConstants, parents: Parents): Unit = { + h2("Constants") + for { c <- withConstants.constants } do + emitDefDoc(c, withConstants +: parents) + p(s"* type: ${c.typeEx.format}") + p(s"* value: ${c.value.format}") } protected def emitAuthorInfo(authors: Seq[Author], level: Int = 2): this.type = { @@ -446,16 +413,24 @@ trait MarkdownWriter this } - def emitFunction(function: Function, parents: Seq[String]): Unit = { + def emitFunction(function: Function, parents: Parents): Unit = { h2(function.identify) - emitDefDoc(function, parents) - emitTypesToc(function) + emitDefDoc(function, parents, 3) + emitTypes(function, parents) emitInputOutput(function.input, function.output) codeBlock("Statements", function.statements) emitUsage(function) emitTerms(function.terms) } + private def emitFunctions(withFunc: Definition & WithFunctions, stack: Parents): Unit = { + h2("Functions") + for { f <- withFunc.functions } do { + val parents = withFunc + emitFunction(f, withFunc +: stack) + } + } + protected def emitInvariants(invariants: Seq[Invariant]): this.type = { if invariants.nonEmpty then { h2("Invariants") @@ -468,4 +443,64 @@ trait MarkdownWriter this } + private def emitHandlers( + withHandlers: Definition & WithHandlers, + parents: Parents + ): Unit = { + h2("Handlers") + for { h <- withHandlers.handlers } do { + emitHandler(h, withHandlers +: parents) + } + } + + private def emitInlet(inlet: Inlet, parents: Parents): Unit = { + emitDefDoc(inlet, parents, 3) + val typeRef = makePathIdRef(inlet.type_.pathId, parents) + p(s"Receives type $typeRef") + } + + protected def emitInlets(withInlets: Definition & WithInlets, parents: Parents): Unit = { + h2("Inlets") + for { i <- withInlets.inlets } do { + emitInlet(i, withInlets +: parents) + } + } + + private def emitOutlet(outlet: Outlet, parents: Parents): Unit = { + emitDefDoc(outlet, parents, 3) + val typeRef = makePathIdRef(outlet.type_.pathId, parents) + p(s"Transmits type $typeRef") + } + + protected def emitOutlets(withOutlets: Definition & WithOutlets, parents: Parents): Unit = { + h2("Outlets") + for { o <- withOutlets.outlets } do { + emitOutlet(o, withOutlets +: parents) + } + } + + protected def emitVitalDefinitionDetails[OV <: OptionValue, CT <: RiddlValue]( + vd: VitalDefinition[OV, CT], + stack: Parents + ): Unit = { + emitDefDoc(vd, stack) + emitOptions(vd.options) + emitTerms(vd.terms) + emitUsage(vd) + } + protected def emitProcessorDetails[OV <: OptionValue, DEF <: RiddlValue]( + processor: Processor[OV, DEF], + stack: Parents + ): Unit = { + emitVitalDefinitionDetails(processor, stack) + if processor.types.nonEmpty then emitTypes(processor, stack) + if processor.constants.nonEmpty then emitConstants(processor, stack) + if processor.functions.nonEmpty then emitFunctions(processor, stack) + if processor.invariants.nonEmpty then emitInvariants(processor.invariants) + if processor.handlers.nonEmpty then emitHandlers(processor, stack) + if processor.inlets.nonEmpty then emitInlets(processor, stack) + if processor.outlets.nonEmpty then emitOutlets(processor, stack) + processorToc(processor) + } + } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala index 2d64a1c..b16ed07 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala @@ -1,21 +1,15 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.language.AST.{OccursInProjector, Projector, ProjectorOption} +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait ProjectorWriter { this: MarkdownWriter => - def emitProjector( - projector: Projector, - parents: Seq[String] - ): this.type = { + def emitProjector(projector: Projector, parents: Parents): Unit = { containerHead(projector, "Projector") emitDefDoc(projector, parents) - - emitProcessorToc[ProjectorOption, OccursInProjector](projector) - emitUsage(projector) - emitTerms(projector.terms) - emitIndex("Projector", projector, parents) + list("Repository", projector.repositories) + emitProcessorDetails[ProjectorOption, OccursInProjector](projector, parents) } - } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala index 15a7574..7adad72 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala @@ -1,19 +1,21 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.language.AST.{OccursInRepository, Repository, RepositoryOption} +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait RepositoryWriter { this: MarkdownWriter => + def emitSchema(repository: Repository): Unit = { + //TODO: Schema writing + } def emitRepository( repository: Repository, - parents: Seq[String] + parents: Parents ): Unit = { containerHead(repository, "Repository") emitDefDoc(repository, parents) - emitProcessorToc[RepositoryOption, OccursInRepository](repository) - emitUsage(repository) - emitTerms(repository.terms) - emitIndex("Repository", repository, parents) + emitSchema(repository) + emitProcessorDetails[RepositoryOption, OccursInRepository](repository, parents) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala index 9ab4958..d8a3b5e 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala @@ -2,6 +2,7 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.hugo.writers.MarkdownWriter import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait SagaWriter { this: MarkdownWriter => @@ -16,14 +17,14 @@ trait SagaWriter { this: MarkdownWriter => this } - def emitSaga(saga: Saga, parents: Seq[String]): Unit = { + def emitSaga(saga: Saga, parents: Parents): Unit = { containerHead(saga, "Saga") emitDefDoc(saga, parents) emitOptions(saga.options) emitInputOutput(saga.input, saga.output) emitSagaSteps(saga.sagaSteps) + // emitProcessorDetails(saga, parents) emitUsage(saga) emitTerms(saga.terms) - emitIndex("Saga", saga, parents) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala index 8554f22..4d05ae1 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala @@ -1,10 +1,11 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait StreamletWriter { this: MarkdownWriter => - def emitConnector(conn: Connector, parents: Seq[String]): this.type = { + def emitConnector(conn: Connector, parents: Parents): Unit = { leafHead(conn, weight = 20) emitDefDoc(conn, parents) if conn.from.nonEmpty && conn.to.nonEmpty then { @@ -14,26 +15,11 @@ trait StreamletWriter { this: MarkdownWriter => emitUsage(conn) } - def emitStreamlet(streamlet: Streamlet, parents: Seq[Definition]): this.type = { + def emitStreamlet(streamlet: Streamlet, parents: Parents): Unit = { leafHead(streamlet, weight = 30) - val parList = makeStringParents(parents) - emitDefDoc(streamlet, parList) - h2("Inlets") - streamlet.inlets.foreach { inlet => - val typeRef = makePathIdRef(inlet.type_.pathId, parents) - h3(inlet.id.format) - p(typeRef) - emitShortDefDoc(inlet) - } - h2("Outlets") - streamlet.outlets.foreach { outlet => - val typeRef = makePathIdRef(outlet.type_.pathId, parents) - h3(outlet.id.format) - p(typeRef) - emitShortDefDoc(outlet) - } - emitUsage(streamlet) - emitTerms(streamlet.terms) - emitIndex("Streamlet", streamlet, parList) + emitProcessorDetails(streamlet, parents) + emitInlets(streamlet, streamlet +: parents) + emitOutlets(streamlet, streamlet +: parents) + // TODO: emit a diagram of the streamlet's data flow } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala index 0889043..33d4a9a 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala @@ -29,6 +29,8 @@ trait ThemeWriter { def emitMermaidDiagram(lines: Seq[String]): Unit def makeDocLink(definition: NamedValue, parents: Seq[String]): String - + def makeDocAndParentsLinks(definition: NamedValue): String + + def processorToc(processor: Processor[_, _]): Unit } diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala index a803a50..0448a90 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala @@ -40,7 +40,7 @@ class MarkdownWriterTest extends HugoTestBase { val domain = root.domains.head val mkd = makeMDW(output, PassesResult.empty) val diagram = DomainMapDiagram(domain) - mkd.emitDomain(domain, paths.dropRight(1)) + mkd.emitDomain(domain, Seq(root)) val emitted = mkd.toString info(emitted) val expected = From c1110395caf08fc413c6b9f86a993343fd7f43fa Mon Sep 17 00:00:00 2001 From: reidspencer Date: Mon, 8 Apr 2024 15:53:13 -0400 Subject: [PATCH 5/7] Add an adaptor test and make it pass --- .../com/ossuminc/riddl/hugo/HugoPass.scala | 3 +- .../riddl/hugo/themes/DotdockTheme.scala | 4 +- .../riddl/hugo/themes/GeekDocTheme.scala | 13 ++- .../riddl/hugo/writers/AdaptorWriter.scala | 5 +- .../hugo/writers/ApplicationWriter.scala | 1 + .../riddl/hugo/writers/ContextWriter.scala | 2 +- .../riddl/hugo/writers/DomainWriter.scala | 4 +- .../riddl/hugo/writers/EntityWriter.scala | 32 ++++--- .../riddl/hugo/writers/EpicWriter.scala | 3 +- .../riddl/hugo/writers/FunctionWriter.scala | 18 ++++ .../riddl/hugo/writers/MarkdownWriter.scala | 22 ++--- .../riddl/hugo/writers/ThemeWriter.scala | 3 +- hugo/src/test/input/adaptors.riddl | 18 ++++ .../hugo/writers/AdaptorWriterTest.scala | 84 +++++++++++++++++++ .../{ => writers}/MarkdownWriterTest.scala | 35 +++++--- .../riddl/hugo/writers/WriterTest.scala | 37 ++++++++ 16 files changed, 219 insertions(+), 65 deletions(-) create mode 100644 hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala create mode 100644 hugo/src/test/input/adaptors.riddl create mode 100644 hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala rename hugo/src/test/scala/com/ossuminc/riddl/hugo/{ => writers}/MarkdownWriterTest.scala (85%) create mode 100644 hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala index 7bbb653..8dbc57a 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala @@ -109,11 +109,12 @@ case class HugoPass( case d: Domain => mkd.emitDomain(d, stack) case e: Entity => mkd.emitEntity(e, stack) case e: Epic => mkd.emitEpic(e, stack) + case f: Function => mkd.emitFunction(f, stack) + case u: UseCase => mkd.emitUseCase(u, stack, this) case p: Projector => mkd.emitProjector(p, stack) case r: Repository => mkd.emitRepository(r, stack) case s: Saga => mkd.emitSaga(s, stack) case s: Streamlet => mkd.emitStreamlet(s, stack) - case uc: UseCase => mkd.emitUseCase(uc, stack, this) // ignore the non-processors case _: Function | _: Handler | _: State | _: OnOtherClause | _: OnInitClause | _: OnMessageClause | diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala index 0206fa8..8f4f879 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala @@ -47,7 +47,7 @@ case class DotdockTheme( def leafHead(definition: Definition, weight: Int): Unit = ??? - def codeBlock(headline: String, items: Seq[Statement], level: Int = 2): Unit = ??? + def codeBlock(items: Seq[Statement]): Unit = ??? def notAvailable(thing: String, title: String = "Unavailable"): Unit = ??? @@ -81,6 +81,4 @@ case class DotdockTheme( // url = "https://gohugo.io/" // weight = 2 } - - override def processorToc(processor: Processor[_, _]): Unit = ??? } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala index 91a98b1..4eac83d 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala @@ -99,20 +99,17 @@ case class GeekDocTheme( } } - def codeBlock(headline: String, items: Seq[Statement], level: Int = 2): Unit = { + def codeBlock(items: Seq[Statement]): Unit = { if items.nonEmpty then { - heading(headline, level) - sb.append("```\\n") - sb.append(items.map(_.format).mkString) - sb.append("```\\n") + sb.append(s"```") + sb.append(items.map(_.format).mkString(new_line, new_line, new_line)) + sb.append(s"```$new_line") } } - def processorIndex(processor: Processor[_,_]): Unit = { + def processorIndex(processor: Processor[_, _]): Unit = { if processor.authorRefs.nonEmpty then toc("Authors", processor.authorRefs.map(_.format)) h2("Index") p("{{< toc-tree >}}") } - - override def processorToc(processor: Processor[_, _]): Unit = ??? } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala index a1dcd1b..92736e0 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala @@ -7,9 +7,8 @@ trait AdaptorWriter { this: MarkdownWriter => def emitAdaptor(adaptor: Adaptor, parents: Parents): Unit = { containerHead(adaptor, "Adaptor") - emitDefDoc(adaptor, parents) - p(s"Direction: ${adaptor.direction.format} ${adaptor.context.format}") + emitVitalDefinitionDetails(adaptor, parents) + h2(s"Direction: ${adaptor.direction.format} ${adaptor.context.format}") emitProcessorDetails[AdaptorOption, OccursInAdaptor](adaptor, parents) - } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala index 18e4f81..7aa48b6 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala @@ -10,6 +10,7 @@ trait ApplicationWriter { this: MarkdownWriter => parents: Parents ): Unit = { containerHead(application, "Application") + emitVitalDefinitionDetails(application, parents) emitDefDoc(application, parents) for group <- application.groups do { h2(group.identify) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala index dffa674..e48e65a 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala @@ -16,7 +16,7 @@ trait ContextWriter { this: MarkdownWriter => def emitContext(context: Context, parents: Seq[Definition]): Unit = { containerHead(context, "Context") val maybeDiagram = diagrams.contextDiagrams.get(context).map(data => ContextMapDiagram(context, data)) - emitDefDoc(context, parents) + emitVitalDefinitionDetails(context, parents) emitContextMap(context, maybeDiagram) emitOptions(context.options) emitTypes(context, context +: parents ) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala index 3603e87..2ea0eac 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala @@ -10,13 +10,11 @@ trait DomainWriter { this: MarkdownWriter => val diagram = DomainMapDiagram(domain) containerHead(domain, "Domain") - emitDefDoc(domain, parents) + emitVitalDefinitionDetails(domain, parents) h2("Domain Map") emitMermaidDiagram(diagram.generate) emitTypes(domain, domain +: parents) - emitUsage(domain) emitAuthorInfo(domain.authors) - emitTerms(domain.terms) definitionToc("Subdomains", domain.domains) definitionToc("Contexts", domain.contexts) definitionToc("Applications", domain.applications) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala index 97cfee0..f0e1ea0 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala @@ -27,6 +27,21 @@ trait EntityWriter { this: MarkdownWriter => emitUsage(state) } + def emitHandler(handler: Handler, parents: Parents, level: Int = 3): Unit = { + heading(handler.identify, level) + emitDefDoc(handler, parents) + emitUsage(handler) + handler.clauses.foreach { clause => + clause match { + case oic: OnInitClause => heading("Initialize", level + 1) + case omc: OnMessageClause => heading(" On " + omc.msg.format, level + 1) + case otc: OnTerminationClause => heading("Terminate", level + 1) + case ooc: OnOtherClause => heading("Other", level + 1) + } + codeBlock(clause.statements) + } + } + private def emitERD( name: String, fields: Seq[Field], @@ -38,23 +53,6 @@ trait EntityWriter { this: MarkdownWriter => emitMermaidDiagram(lines) } - def emitHandler(handler: Handler, parents: Parents): this.type = { - containerHead(handler, "Handler") - emitDefDoc(handler, parents) - handler.clauses.foreach { clause => - clause match { - case oic: OnInitClause => h3(oic.kind) - case omc: OnMessageClause => h3(clause.kind + " " + omc.msg.format) - case otc: OnTerminationClause => h3(otc.kind) - case ooc: OnOtherClause => h3(ooc.kind) - } - emitShortDefDoc(clause) - codeBlock("Statements", clause.statements, 4) - } - emitUsage(handler) - this - } - private def emitFiniteStateMachine(@unused entity: Entity): Unit = () def emitEntity(entity: Entity, parents: Parents): Unit = { diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala index bc2f0ef..e534db5 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala @@ -7,9 +7,9 @@ import com.ossuminc.riddl.passes.symbols.Symbols.Parents trait EpicWriter { this: MarkdownWriter => - def emitEpic(epic: Epic, parents: Parents): Unit = { containerHead(epic, "Epic") + h2(epic.identify) emitBriefly(epic, parents) if epic.userStory.nonEmpty then { val userPid = epic.userStory.getOrElse(UserStory()).user.pathId @@ -30,6 +30,7 @@ trait EpicWriter { this: MarkdownWriter => } } emitDescription(epic.description) + emitOptions(epic.options) list("Visualizations", epic.shownBy.map(u => s"($u)[$u]")) emitUsage(epic) emitTerms(epic.terms) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala new file mode 100644 index 0000000..959898c --- /dev/null +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala @@ -0,0 +1,18 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.passes.symbols.Symbols.Parents + +trait FunctionWriter { this: MarkdownWriter => + + def emitFunction(function: Function, parents: Parents): Unit = { + containerHead(function, "Function") + h2(function.identify) + emitVitalDefinitionDetails(function, parents) + emitInputOutput(function.input, function.output) + codeBlock(function.statements) + emitUsage(function) + emitTerms(function.terms) + } + +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala index 720e1ce..7634ed0 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala @@ -33,6 +33,7 @@ trait MarkdownWriter with DomainWriter with EntityWriter with EpicWriter + with FunctionWriter with ProjectorWriter with RepositoryWriter with SagaWriter @@ -357,7 +358,7 @@ trait MarkdownWriter emitUsage(typ) } - protected def emitTypes(definition: Definition & WithTypes, parents: Parents): Unit = { + protected def emitTypes(definition: Definition & WithTypes, parents: Parents, level: Int = 2): Unit = { val groups = definition.types .groupBy { typ => typ.typ match { @@ -371,11 +372,11 @@ trait MarkdownWriter } .toSeq .sortBy(_._2.size) - h2("Types") + heading("Types", level) for { (label, list) <- groups } do { - h3(label + " Types") + heading(label + " Types", level + 1) for typ <- list do emitType(typ, parents) } } @@ -413,16 +414,6 @@ trait MarkdownWriter this } - def emitFunction(function: Function, parents: Parents): Unit = { - h2(function.identify) - emitDefDoc(function, parents, 3) - emitTypes(function, parents) - emitInputOutput(function.input, function.output) - codeBlock("Statements", function.statements) - emitUsage(function) - emitTerms(function.terms) - } - private def emitFunctions(withFunc: Definition & WithFunctions, stack: Parents): Unit = { h2("Functions") for { f <- withFunc.functions } do { @@ -447,7 +438,7 @@ trait MarkdownWriter withHandlers: Definition & WithHandlers, parents: Parents ): Unit = { - h2("Handlers") + h3("Handlers") for { h <- withHandlers.handlers } do { emitHandler(h, withHandlers +: parents) } @@ -483,6 +474,7 @@ trait MarkdownWriter vd: VitalDefinition[OV, CT], stack: Parents ): Unit = { + h2(vd.identify) emitDefDoc(vd, stack) emitOptions(vd.options) emitTerms(vd.terms) @@ -492,7 +484,6 @@ trait MarkdownWriter processor: Processor[OV, DEF], stack: Parents ): Unit = { - emitVitalDefinitionDetails(processor, stack) if processor.types.nonEmpty then emitTypes(processor, stack) if processor.constants.nonEmpty then emitConstants(processor, stack) if processor.functions.nonEmpty then emitFunctions(processor, stack) @@ -500,7 +491,6 @@ trait MarkdownWriter if processor.handlers.nonEmpty then emitHandlers(processor, stack) if processor.inlets.nonEmpty then emitInlets(processor, stack) if processor.outlets.nonEmpty then emitOutlets(processor, stack) - processorToc(processor) } } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala index 33d4a9a..f095cbe 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala +++ b/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala @@ -22,7 +22,7 @@ trait ThemeWriter { def leafHead(definition: Definition, weight: Int): Unit - def codeBlock(headline: String, items: Seq[Statement], level: Int = 2): Unit + def codeBlock(items: Seq[Statement]): Unit def notAvailable(thing: String, title: String = "Unavailable"): Unit @@ -32,5 +32,4 @@ trait ThemeWriter { def makeDocAndParentsLinks(definition: NamedValue): String - def processorToc(processor: Processor[_, _]): Unit } diff --git a/hugo/src/test/input/adaptors.riddl b/hugo/src/test/input/adaptors.riddl new file mode 100644 index 0000000..8804e02 --- /dev/null +++ b/hugo/src/test/input/adaptors.riddl @@ -0,0 +1,18 @@ +domain Adaptors is { + context One is { + command TwoIsDone is { ??? } + adaptor FromTwo from context Two is { + option css("background: blue") + handler Adaptation is { + on event Adaptors.Two.DidIt from context Two { + "convert Two.DidIt to One.TwoIsDone" + tell command Adaptors.One.TwoIsDone to context One + } + } + } + } + context Two is { + event DidIt is { ??? } + event ReservedIt is { ??? } + } +} diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala new file mode 100644 index 0000000..ddbc630 --- /dev/null +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala @@ -0,0 +1,84 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.language.AST.* +import com.ossuminc.riddl.language.CommonOptions +import com.ossuminc.riddl.language.parsing.RiddlParserInput +import com.ossuminc.riddl.passes.PassesResult +import org.scalatest.Assertion + +import java.nio.file.Path + +class AdaptorWriterTest extends WriterTest { + + val base = Path.of("hugo", "src", "test", "input") + "AdaptorWriter" must { + "handle a message rename" in { + val output = Path.of("hugo", "target", "test", "adaptors") + val testFile = base.resolve("adaptors.riddl") + val input = RiddlParserInput(testFile) + val options = CommonOptions() + validateRoot(input,options) { + case (passesResult: PassesResult) => + val mkd = makeMDW(output, PassesResult.empty) + val root = passesResult.root + val domain = root.domains.head + val context = domain.contexts.head + val adaptor = context.adaptors.head + val parents = Seq(root, domain, context) + mkd.emitAdaptor(adaptor, parents) + val result = mkd.toString + info(result) + result mustNot be(empty) + val expected = """--- + |title: "FromTwo: Adaptor" + |weight: 10 + |draft: "false" + |description: "FromTwo has no brief description." + |geekdocAnchor: true + |geekdocToC: 4 + |geekdocCollapseSection: true + |geekdocFilePath: no-such-file + |--- + | + |## *Adaptor 'FromTwo'* + || Item | Value | + || :---: | :--- | + || _Briefly_ | Brief description missing. | + || _Authors_ | | + || _Definition Path_ | Root.Adaptors.One.FromTwo | + || _View Source Link_ | [adaptors.riddl(4:5)]() | + | + |## *RiddlOptions* + |* css("background: blue") + | + |## *Used By None* + | + |## *Uses Nothing* + | + |## *Direction: from context Two* + | + |### _Handlers_ + | + |### _Handler 'Adaptation'_ + || Item | Value | + || :---: | :--- | + || _Briefly_ | Brief description missing. | + || _Definition Path_ | FromTwo.Root.Adaptors.One.Adaptation | + || _View Source Link_ | [adaptors.riddl(6:15)]() | + | + |## *Used By None* + | + |## *Uses Nothing* + | + |#### On event Adaptors.Two.DidIt + |``` + |"convert Two.DidIt to One.TwoIsDone" + |tell command Adaptors.One.TwoIsDone to context One + |``` + |""".stripMargin + + result must be(expected) + } + } + } +} diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala similarity index 85% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala rename to hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala index 0448a90..4cdba75 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MarkdownWriterTest.scala +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala @@ -4,16 +4,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.hugo +package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram import com.ossuminc.riddl.hugo.writers.MarkdownWriter +import com.ossuminc.riddl.hugo.{GlossaryEntry, HugoTestBase} import com.ossuminc.riddl.language.AST.Root import com.ossuminc.riddl.language.parsing.RiddlParserInput import com.ossuminc.riddl.passes.PassesResult -import java.io.PrintWriter -import java.io.StringWriter +import java.io.{PrintWriter, StringWriter} import java.nio.file.Path class MarkdownWriterTest extends HugoTestBase { @@ -21,7 +21,7 @@ class MarkdownWriterTest extends HugoTestBase { "MarkdownWriterTest" must { "emit a domain" in { val paths = - Seq[String]("hugo-translator", "target", "test-output", "container.md") + Seq[String]("hugo", "target", "test-output", "container.md") val output = Path.of(paths.head, paths.tail*) val input = """domain TestDomain { @@ -54,17 +54,23 @@ class MarkdownWriterTest extends HugoTestBase { |geekdocCollapseSection: true |geekdocFilePath: no-such-file |--- + | + |## *Domain 'TestDomain'* || Item | Value | || :---: | :--- | || _Briefly_ | Just For Testing | || _Authors_ | | - || _Definition Path_ | hugo-translator.target.test-output.TestDomain | + || _Definition Path_ | Root.TestDomain | || _View Source Link_ | [empty(1:1)]() | | |## *Description* |A test domain for ensuring that documentation for domains is |generated sufficiently. | + |## *Used By None* + | + |## *Uses Nothing* + | |## *Domain Map* |{{< mermaid class="text-center">}} |--- @@ -87,8 +93,20 @@ class MarkdownWriterTest extends HugoTestBase { | |## *Types* | - |### _Others_ - |* [MyString](mystring) + |### _Predefined Types_ + | + |#### Type 'MyString' + || Item | Value | + || :---: | :--- | + || _Briefly_ | Brief description missing. | + || _Definition Path_ | TestDomain.Root.MyString | + || _View Source Link_ | [empty(3:3)]() | + | + |## *Description* + |Just a renamed string + | + |## *Type* + |String | |## *Used By None* | @@ -97,9 +115,6 @@ class MarkdownWriterTest extends HugoTestBase { |## *Author* |* _Name_: Reid Spencer |* _Email_: reid@ossuminc.com - | - |## *Textual Domain Index* - |{{< toc-tree >}} |""".stripMargin emitted mustBe expected } diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala new file mode 100644 index 0000000..fa0e9cf --- /dev/null +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala @@ -0,0 +1,37 @@ +package com.ossuminc.riddl.hugo.writers + +import com.ossuminc.riddl.hugo.HugoCommand +import com.ossuminc.riddl.hugo.themes.GeekDocTheme +import com.ossuminc.riddl.language.{CommonOptions, Messages} +import com.ossuminc.riddl.language.parsing.RiddlParserInput +import com.ossuminc.riddl.passes.{Pass, PassesResult, Riddl} +import org.scalatest.Assertion +import org.scalatest.matchers.must.Matchers +import org.scalatest.wordspec.AnyWordSpec + +import java.nio.file.Path + +class WriterTest extends AnyWordSpec with Matchers{ + + def makeMDW(filePath: Path, passesResult: PassesResult): MarkdownWriter = { + val symbols = passesResult.symbols + val refMap = passesResult.refMap + val usages = passesResult.usage + GeekDocTheme(filePath, passesResult.input, passesResult.outputs, HugoCommand.Options()) + } + + def runPasses(input: RiddlParserInput, options:CommonOptions = CommonOptions()): Either[Messages.Messages,PassesResult] = { + Riddl.parseAndValidate(input, options, shouldFailOnError = true, Pass.standardPasses) + } + + def validateRoot(input: RiddlParserInput, options:CommonOptions = CommonOptions())( + validate: (root: PassesResult) => Assertion) = { + runPasses(input, options) match { + case Left(messages) => + fail(messages.justErrors.format) + case Right(passesResult: PassesResult) => + validate(passesResult) + } + } + +} From b403aa85ffb03c89a92883b7507b5553eff9ed75 Mon Sep 17 00:00:00 2001 From: reidspencer Date: Mon, 15 Apr 2024 13:50:05 -0400 Subject: [PATCH 6/7] Add test case --- .../riddl/hugo/RunHugoOnExamplesTest.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala b/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala index b2c87a3..2ee4182 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala +++ b/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala @@ -20,11 +20,15 @@ import scala.annotation.unused class RunHugoOnExamplesTest extends RunCommandOnExamplesTest[HugoCommand.Options, HugoCommand]("hugo") { - override val outDir: Path = Path.of("riddlc/target/test/hugo-examples") - - override def validateTestName(name: String): Boolean = name == "ReactiveBBQ" - - "Run Hugo On Examples" should { "should work" in { runTests() } } + val validTestNames = Seq("ReactiveBBQ", "dokn", "ReactiveSummit") + + override def validateTestName(name: String): Boolean = validTestNames.exists(name.endsWith) + + "Run Hugo On Examples" should { + "correctly process ReactiveBBQ" in { + runTest("ReactiveBBQ") + } + } override def onSuccess(@unused commandName: String, @unused caseName: String, From 2d200a2b5c43ee10662a66dcb717227dc3e1c67e Mon Sep 17 00:00:00 2001 From: reidspencer Date: Tue, 16 Apr 2024 22:50:18 -0400 Subject: [PATCH 7/7] Prepare for Single Module * DiagramPass moved to riddl-analyses * consolidate classes to one module * Base on riddl 0.43.0 in preparation for eventual base on 0.44 --- build.sbt | 34 +++++------- .../mermaid/DataFlowDiagramTest.scala | 0 project/Deps.scala | 8 +-- .../com.ossuminc.riddl.commands.CommandPlugin | 0 .../main/resources/hugo/archetypes/default.md | 0 .../hugo/layouts/partials/head/custom.html | 0 .../hugo/layouts/shortcodes/collapse.html | 0 .../hugo/layouts/shortcodes/faq.html | 0 .../main/resources/hugo/static/custom.css | 0 .../hugo/static/images/RIDDL-Logo.ico | Bin .../hugo/static/images/popup-link-icon.svg | 0 .../hugo/static/js/tree-map-hierarchy.js | 0 .../hugo/static/js/tree-map-hierarchy2.js | 0 .../hugo/static/js/zoomable-circle-pack.js | 0 .../template/layouts/_default/changelog.html | 0 .../template/layouts/_default/faq.html | 0 .../layouts/shortcodes/changelog.html | 0 .../template/layouts/shortcodes/notice.html | 0 .../ossuminc/riddl/hugo/GlossaryPass.scala | 0 .../com/ossuminc/riddl/hugo/HugoCommand.scala | 15 +++--- .../com/ossuminc/riddl/hugo/HugoPass.scala | 10 ++-- .../ossuminc/riddl/hugo/MessagesPass.scala | 0 .../ossuminc/riddl/hugo/PassUtilities.scala | 26 +++++---- .../riddl/hugo/RiddlToHugoTranslator.scala | 0 .../com/ossuminc/riddl/hugo/Summarizer.scala | 4 +- .../ossuminc/riddl/hugo/ToDoListPass.scala | 0 .../riddl/hugo}/diagrams/DiagramsPass.scala | 2 +- .../riddl/hugo}/diagrams/d3/D3Diagrams.scala | 2 +- .../hugo}/diagrams/mermaid/C4Diagram.scala | 3 +- .../diagrams/mermaid/ContextMapDiagram.scala | 6 +-- .../diagrams/mermaid/DataFlowDiagram.scala | 3 +- .../diagrams/mermaid/DomainMapDiagram.scala | 8 +-- .../mermaid/EntityRelationshipDiagram.scala | 2 +- .../mermaid/FlowchartDiagramGenerator.scala | 6 +-- .../mermaid/MermaidDiagramGenerator.scala | 2 +- .../mermaid/RootOverviewDiagram.scala | 2 +- .../mermaid/SequenceDiagramGenerator.scala | 2 +- .../diagrams/mermaid/UseCaseDiagram.scala | 10 ++-- .../mermaid/UseCaseDiagramSupport.scala | 2 +- .../riddl/hugo/themes/DotdockTheme.scala | 2 +- .../riddl/hugo/themes/GeekDocTheme.scala | 2 +- .../hugo/utils/TreeCopyFileVisitor.scala | 49 +++++++++++++++++ .../riddl/hugo/writers/AdaptorWriter.scala | 0 .../hugo/writers/ApplicationWriter.scala | 0 .../riddl/hugo/writers/ContextWriter.scala | 5 +- .../riddl/hugo/writers/DomainWriter.scala | 2 +- .../riddl/hugo/writers/EntityWriter.scala | 4 +- .../riddl/hugo/writers/EpicWriter.scala | 4 +- .../riddl/hugo/writers/FunctionWriter.scala | 0 .../riddl/hugo/writers/MarkdownBasics.scala | 0 .../riddl/hugo/writers/MarkdownWriter.scala | 50 ++++++++++++++++-- .../riddl/hugo/writers/ProjectorWriter.scala | 0 .../riddl/hugo/writers/RepositoryWriter.scala | 0 .../riddl/hugo/writers/SagaWriter.scala | 0 .../riddl/hugo/writers/StreamletWriter.scala | 0 .../riddl/hugo/writers/SummariesWriter.scala | 2 +- .../riddl/hugo/writers/ThemeWriter.scala | 0 {hugo/src => src}/test/input/adaptors.riddl | 0 .../test/input/context-relationships.riddl | 0 {diagrams/src => src}/test/input/epic.riddl | 0 {hugo/src => src}/test/input/everything.riddl | 0 {hugo/src => src}/test/input/hugo.conf | 0 {hugo/src => src}/test/input/rbbq.riddl | 0 .../test/input/regressions/match-error.riddl | 0 {hugo/src => src}/test/input/validate.conf | 0 .../riddl/hugo/GlossaryPassTest.scala | 0 .../ossuminc/riddl/hugo/HugoCommandTest.scala | 0 .../ossuminc/riddl/hugo/HugoPassTest.scala | 0 .../ossuminc/riddl/hugo/HugoTestBase.scala | 0 .../riddl/hugo/MessagesPassTest.scala | 0 .../ossuminc/riddl/hugo/RegressionTests.scala | 0 .../riddl/hugo/RunHugoOnExamplesTest.scala | 0 .../ossuminc/riddl/hugo/RunHugoTestBase.scala | 0 .../riddl/hugo/ToDoPassListTest.scala | 0 .../hugo}/diagrams/DiagramsPassTest.scala | 2 +- .../mermaid/ContextMapDiagramTest.scala | 31 ++++++----- .../mermaid/DataFlowDiagramTest.scala | 2 + .../mermaid/RootOverviewDiagramTest.scala | 11 ++-- .../diagrams/mermaid/UseCaseDiagramTest.scala | 4 +- .../hugo/writers/AdaptorWriterTest.scala | 0 .../hugo/writers/MarkdownWriterTest.scala | 2 +- .../riddl/hugo/writers/WriterTest.scala | 0 82 files changed, 201 insertions(+), 118 deletions(-) delete mode 100644 diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagramTest.scala rename {hugo/src => src}/main/resources/META-INF/services/com.ossuminc.riddl.commands.CommandPlugin (100%) rename {hugo/src => src}/main/resources/hugo/archetypes/default.md (100%) rename {hugo/src => src}/main/resources/hugo/layouts/partials/head/custom.html (100%) rename {hugo/src => src}/main/resources/hugo/layouts/shortcodes/collapse.html (100%) rename {hugo/src => src}/main/resources/hugo/layouts/shortcodes/faq.html (100%) rename {hugo/src => src}/main/resources/hugo/static/custom.css (100%) rename {hugo/src => src}/main/resources/hugo/static/images/RIDDL-Logo.ico (100%) rename {hugo/src => src}/main/resources/hugo/static/images/popup-link-icon.svg (100%) rename {hugo/src => src}/main/resources/hugo/static/js/tree-map-hierarchy.js (100%) rename {hugo/src => src}/main/resources/hugo/static/js/tree-map-hierarchy2.js (100%) rename {hugo/src => src}/main/resources/hugo/static/js/zoomable-circle-pack.js (100%) rename {hugo/src => src}/main/resources/template/layouts/_default/changelog.html (100%) rename {hugo/src => src}/main/resources/template/layouts/_default/faq.html (100%) rename {hugo/src => src}/main/resources/template/layouts/shortcodes/changelog.html (100%) rename {hugo/src => src}/main/resources/template/layouts/shortcodes/notice.html (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/GlossaryPass.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala (97%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala (98%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/MessagesPass.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala (92%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/RiddlToHugoTranslator.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala (98%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/ToDoListPass.scala (100%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/DiagramsPass.scala (99%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/d3/D3Diagrams.scala (96%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/C4Diagram.scala (65%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/ContextMapDiagram.scala (81%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/DataFlowDiagram.scala (98%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/DomainMapDiagram.scala (73%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/EntityRelationshipDiagram.scala (98%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/FlowchartDiagramGenerator.scala (97%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/MermaidDiagramGenerator.scala (98%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/RootOverviewDiagram.scala (96%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/SequenceDiagramGenerator.scala (83%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/UseCaseDiagram.scala (97%) rename {diagrams/src/main/scala/com/ossuminc/riddl => src/main/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/UseCaseDiagramSupport.scala (93%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala (97%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala (98%) create mode 100644 src/main/scala/com/ossuminc/riddl/hugo/utils/TreeCopyFileVisitor.scala rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala (87%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala (91%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala (97%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala (92%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala (91%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala (100%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala (97%) rename {hugo/src => src}/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala (100%) rename {hugo/src => src}/test/input/adaptors.riddl (100%) rename {diagrams/src => src}/test/input/context-relationships.riddl (100%) rename {diagrams/src => src}/test/input/epic.riddl (100%) rename {hugo/src => src}/test/input/everything.riddl (100%) rename {hugo/src => src}/test/input/hugo.conf (100%) rename {hugo/src => src}/test/input/rbbq.riddl (100%) rename {hugo/src => src}/test/input/regressions/match-error.riddl (100%) rename {hugo/src => src}/test/input/validate.conf (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/GlossaryPassTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/HugoCommandTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/HugoPassTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/MessagesPassTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/RegressionTests.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/RunHugoTestBase.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/ToDoPassListTest.scala (100%) rename {diagrams/src/test/scala/com/ossuminc/riddl => src/test/scala/com/ossuminc/riddl/hugo}/diagrams/DiagramsPassTest.scala (86%) rename {diagrams/src/test/scala/com/ossuminc/riddl => src/test/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/ContextMapDiagramTest.scala (91%) create mode 100644 src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagramTest.scala rename {diagrams/src/test/scala/com/ossuminc/riddl => src/test/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/RootOverviewDiagramTest.scala (92%) rename {diagrams/src/test/scala/com/ossuminc/riddl => src/test/scala/com/ossuminc/riddl/hugo}/diagrams/mermaid/UseCaseDiagramTest.scala (90%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala (100%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala (98%) rename {hugo/src => src}/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala (100%) diff --git a/build.sbt b/build.sbt index b103aaf..1ece9d0 100644 --- a/build.sbt +++ b/build.sbt @@ -1,35 +1,25 @@ import com.ossuminc.sbt.OssumIncPlugin -import com.ossuminc.sbt.helpers.RootProjectInfo.Keys.{ - gitHubOrganization, - gitHubRepository -} +import com.ossuminc.sbt.helpers.RootProjectInfo.Keys.{gitHubOrganization, gitHubRepository} Global / onChangedBuildSource := ReloadOnSourceChanges enablePlugins(OssumIncPlugin) -lazy val `riddl-hugo` = +lazy val hugo = Root( "riddl-hugo", "ossuminc", "com.ossuminc.hugo", "Ossum, Inc.", startYr = 2024 - ).configure(With.noPublishing, With.git, With.dynver) - .aggregate(diagrams, hugo) - -lazy val hugo: Project = Module("hugo", "riddl-hugo") - .configure(With.typical, With.coverage(50), With.publishing, With.scalafmt) - .settings( - description := "The hugo command turns a RIDDL AST into source input for hugo static site generator", - Compile / unmanagedResourceDirectories += { - baseDirectory.value / "resources" - }, - Test / parallelExecution := false, - libraryDependencies ++= Deps.pureconfig ++ Deps.riddl ) - .dependsOn(diagrams) - -lazy val diagrams = Module("diagrams", "riddl-hugo-diagrams") - .configure(With.typical, With.coverage(90.0), With.publishing) - .settings(libraryDependencies ++= Deps.riddl) + .configure(With.typical, With.coverage(50), With.publishing, With.scalafmt) + .settings( + scalaVersion := "3.4.1", + description := "The hugo command turns a RIDDL AST into source input for hugo static site generator", + Compile / unmanagedResourceDirectories += { + baseDirectory.value / "resources" + }, + Test / parallelExecution := false, + libraryDependencies ++= Deps.pureconfig ++ Deps.riddl + ) diff --git a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagramTest.scala b/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagramTest.scala deleted file mode 100644 index e69de29..0000000 diff --git a/project/Deps.scala b/project/Deps.scala index f85ac3c..e416dcf 100644 --- a/project/Deps.scala +++ b/project/Deps.scala @@ -7,19 +7,21 @@ object Deps { val config = "1.4.1" val lang3 = "3.12.0" val pureconfig = "0.17.5" - val riddl = "0.42.0" + val riddl = "0.43.0-1-bf64a02e-20240416-2153" val scalacheck = "1.15.4" val scalatest = "3.2.9" val scopt = "4.1.0" } val riddl: Seq[ModuleID] = Seq( + "com.ossuminc" %% "riddl-utils" % V.riddl, "com.ossuminc" %% "riddl-language" % V.riddl, + "com.ossuminc" %% "riddl-passes" % V.riddl, + "com.ossuminc" %% "riddl-analyses" % V.riddl, "com.ossuminc" %% "riddl-commands" % V.riddl, - "com.ossuminc" %% "riddl-stats" % V.riddl, "com.ossuminc" %% "riddl-testkit" % V.riddl % Test ) val pureconfig: Seq[ModuleID] = - Seq[ModuleID ]("com.github.pureconfig" %% "pureconfig-core" % V.pureconfig) + Seq[ModuleID]("com.github.pureconfig" %% "pureconfig-core" % V.pureconfig) } diff --git a/hugo/src/main/resources/META-INF/services/com.ossuminc.riddl.commands.CommandPlugin b/src/main/resources/META-INF/services/com.ossuminc.riddl.commands.CommandPlugin similarity index 100% rename from hugo/src/main/resources/META-INF/services/com.ossuminc.riddl.commands.CommandPlugin rename to src/main/resources/META-INF/services/com.ossuminc.riddl.commands.CommandPlugin diff --git a/hugo/src/main/resources/hugo/archetypes/default.md b/src/main/resources/hugo/archetypes/default.md similarity index 100% rename from hugo/src/main/resources/hugo/archetypes/default.md rename to src/main/resources/hugo/archetypes/default.md diff --git a/hugo/src/main/resources/hugo/layouts/partials/head/custom.html b/src/main/resources/hugo/layouts/partials/head/custom.html similarity index 100% rename from hugo/src/main/resources/hugo/layouts/partials/head/custom.html rename to src/main/resources/hugo/layouts/partials/head/custom.html diff --git a/hugo/src/main/resources/hugo/layouts/shortcodes/collapse.html b/src/main/resources/hugo/layouts/shortcodes/collapse.html similarity index 100% rename from hugo/src/main/resources/hugo/layouts/shortcodes/collapse.html rename to src/main/resources/hugo/layouts/shortcodes/collapse.html diff --git a/hugo/src/main/resources/hugo/layouts/shortcodes/faq.html b/src/main/resources/hugo/layouts/shortcodes/faq.html similarity index 100% rename from hugo/src/main/resources/hugo/layouts/shortcodes/faq.html rename to src/main/resources/hugo/layouts/shortcodes/faq.html diff --git a/hugo/src/main/resources/hugo/static/custom.css b/src/main/resources/hugo/static/custom.css similarity index 100% rename from hugo/src/main/resources/hugo/static/custom.css rename to src/main/resources/hugo/static/custom.css diff --git a/hugo/src/main/resources/hugo/static/images/RIDDL-Logo.ico b/src/main/resources/hugo/static/images/RIDDL-Logo.ico similarity index 100% rename from hugo/src/main/resources/hugo/static/images/RIDDL-Logo.ico rename to src/main/resources/hugo/static/images/RIDDL-Logo.ico diff --git a/hugo/src/main/resources/hugo/static/images/popup-link-icon.svg b/src/main/resources/hugo/static/images/popup-link-icon.svg similarity index 100% rename from hugo/src/main/resources/hugo/static/images/popup-link-icon.svg rename to src/main/resources/hugo/static/images/popup-link-icon.svg diff --git a/hugo/src/main/resources/hugo/static/js/tree-map-hierarchy.js b/src/main/resources/hugo/static/js/tree-map-hierarchy.js similarity index 100% rename from hugo/src/main/resources/hugo/static/js/tree-map-hierarchy.js rename to src/main/resources/hugo/static/js/tree-map-hierarchy.js diff --git a/hugo/src/main/resources/hugo/static/js/tree-map-hierarchy2.js b/src/main/resources/hugo/static/js/tree-map-hierarchy2.js similarity index 100% rename from hugo/src/main/resources/hugo/static/js/tree-map-hierarchy2.js rename to src/main/resources/hugo/static/js/tree-map-hierarchy2.js diff --git a/hugo/src/main/resources/hugo/static/js/zoomable-circle-pack.js b/src/main/resources/hugo/static/js/zoomable-circle-pack.js similarity index 100% rename from hugo/src/main/resources/hugo/static/js/zoomable-circle-pack.js rename to src/main/resources/hugo/static/js/zoomable-circle-pack.js diff --git a/hugo/src/main/resources/template/layouts/_default/changelog.html b/src/main/resources/template/layouts/_default/changelog.html similarity index 100% rename from hugo/src/main/resources/template/layouts/_default/changelog.html rename to src/main/resources/template/layouts/_default/changelog.html diff --git a/hugo/src/main/resources/template/layouts/_default/faq.html b/src/main/resources/template/layouts/_default/faq.html similarity index 100% rename from hugo/src/main/resources/template/layouts/_default/faq.html rename to src/main/resources/template/layouts/_default/faq.html diff --git a/hugo/src/main/resources/template/layouts/shortcodes/changelog.html b/src/main/resources/template/layouts/shortcodes/changelog.html similarity index 100% rename from hugo/src/main/resources/template/layouts/shortcodes/changelog.html rename to src/main/resources/template/layouts/shortcodes/changelog.html diff --git a/hugo/src/main/resources/template/layouts/shortcodes/notice.html b/src/main/resources/template/layouts/shortcodes/notice.html similarity index 100% rename from hugo/src/main/resources/template/layouts/shortcodes/notice.html rename to src/main/resources/template/layouts/shortcodes/notice.html diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/GlossaryPass.scala b/src/main/scala/com/ossuminc/riddl/hugo/GlossaryPass.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/GlossaryPass.scala rename to src/main/scala/com/ossuminc/riddl/hugo/GlossaryPass.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala b/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala similarity index 97% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala rename to src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala index 92225a5..72d2bd1 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/HugoCommand.scala @@ -7,16 +7,17 @@ package com.ossuminc.riddl.hugo import com.ossuminc.riddl.commands.CommandOptions.optional -import com.ossuminc.riddl.commands.{CommandOptions, PassCommand, TranslatingOptions} +import com.ossuminc.riddl.commands.{CommandOptions, PassCommand, PassCommandOptions} import com.ossuminc.riddl.language.CommonOptions import com.ossuminc.riddl.language.Messages import com.ossuminc.riddl.language.Messages.Messages import com.ossuminc.riddl.passes.Pass.standardPasses import com.ossuminc.riddl.passes.{Pass, PassInput, PassesCreator, PassesOutput, PassesResult} -import com.ossuminc.riddl.stats.StatsPass -import com.ossuminc.riddl.diagrams.DiagramsPass +import com.ossuminc.riddl.analyses.StatsPass import com.ossuminc.riddl.hugo.themes.{DotdockTheme, GeekDocTheme} +import com.ossuminc.riddl.passes.translate.TranslatingOptions import com.ossuminc.riddl.utils.Logger +import diagrams.DiagramsPass import pureconfig.ConfigCursor import pureconfig.ConfigReader import scopt.OParser @@ -28,9 +29,9 @@ import scala.annotation.unused /** Unit Tests For HugoCommand */ object HugoCommand { case class Options( - inputFile: Option[Path] = None, - outputDir: Option[Path] = None, - projectName: Option[String] = None, + override val inputFile: Option[Path] = None, + override val outputDir: Option[Path] = None, + override val projectName: Option[String] = None, hugoThemeName: Option[String] = None, enterpriseName: Option[String] = None, eraseOutput: Boolean = false, @@ -48,7 +49,7 @@ object HugoCommand { withGraphicalTOC: Boolean = false, withStatistics: Boolean = true, withMessageSummary: Boolean = true - ) extends CommandOptions + ) extends PassCommandOptions with TranslatingOptions { def command: String = "hugo" diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala b/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala similarity index 98% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala rename to src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala index 8dbc57a..dafc49a 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/HugoPass.scala @@ -6,8 +6,9 @@ package com.ossuminc.riddl.hugo -import com.ossuminc.riddl.commands.TranslatingState -import com.ossuminc.riddl.diagrams.mermaid.* +import com.ossuminc.riddl.passes.translate.TranslatingState +import com.ossuminc.riddl.hugo.diagrams.mermaid.* +import com.ossuminc.riddl.hugo.utils.TreeCopyFileVisitor import com.ossuminc.riddl.language.* import com.ossuminc.riddl.language.AST.{Include, *} import com.ossuminc.riddl.language.Messages.Messages @@ -16,10 +17,11 @@ import com.ossuminc.riddl.passes.resolve.ResolutionPass import com.ossuminc.riddl.passes.symbols.SymbolsPass import com.ossuminc.riddl.passes.symbols.Symbols.ParentStack import com.ossuminc.riddl.passes.validate.ValidationPass -import com.ossuminc.riddl.stats.StatsPass -import com.ossuminc.riddl.utils.{PathUtils, Tar, Timer, TreeCopyFileVisitor, Zip} +import com.ossuminc.riddl.analyses.StatsPass +import com.ossuminc.riddl.utils.{PathUtils, Tar, Timer, Zip} import com.ossuminc.riddl.hugo.themes.* import com.ossuminc.riddl.hugo.writers.MarkdownWriter +import diagrams.mermaid.{RootOverviewDiagram, UseCaseDiagramSupport} import java.io.File import java.net.URL diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/MessagesPass.scala b/src/main/scala/com/ossuminc/riddl/hugo/MessagesPass.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/MessagesPass.scala rename to src/main/scala/com/ossuminc/riddl/hugo/MessagesPass.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala b/src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala similarity index 92% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala rename to src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala index 30453ea..5f4802b 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/PassUtilities.scala @@ -1,12 +1,12 @@ package com.ossuminc.riddl.hugo -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput} import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.language.{CommonOptions, Messages} import com.ossuminc.riddl.language.parsing.FileParserInput import com.ossuminc.riddl.passes.resolve.{ReferenceMap, ResolutionOutput, ResolutionPass, Usages} import com.ossuminc.riddl.passes.symbols.SymbolsOutput import com.ossuminc.riddl.passes.{PassInput, PassesOutput, PassesResult} +import diagrams.{DiagramsPass, DiagramsPassOutput} import java.nio.file.Path import scala.collection.mutable @@ -14,9 +14,9 @@ import scala.collection.mutable trait PassUtilities { def input: PassInput - + def outputs: PassesOutput - + def options: HugoCommand.Options protected val messages: Messages.Accumulator @@ -29,7 +29,7 @@ trait PassUtilities { lazy val diagrams: DiagramsPassOutput = outputs.outputOf[DiagramsPassOutput](DiagramsPass.name).getOrElse(DiagramsPassOutput()) lazy val passesResult: PassesResult = PassesResult(input, outputs) - + def makeFullName(definition: Definition): String = { val defs = outputs.symbols.parentsOf(definition).reverse :+ definition defs.map(_.id.format).mkString(".") @@ -48,10 +48,12 @@ trait PassUtilities { } def makeBreadCrumbs(parents: Seq[Definition]): String = { - parents.map { defn => - val link = makeDocLink(defn, parents.map(_.id.value)) - s"[${defn.id.value}]($link)" - }.mkString("/") + parents + .map { defn => + val link = makeDocLink(defn, parents.map(_.id.value)) + s"[${defn.id.value}]($link)" + } + .mkString("/") } def makeDocLink(definition: NamedValue): String = { @@ -65,7 +67,7 @@ trait PassUtilities { case _: OnMessageClause | _: OnInitClause | _: OnTerminationClause | _: OnOtherClause | _: Inlet | _: Outlet => pars + "#" + definition.id.value.toLowerCase case _: Field | _: Enumerator | _: Invariant | _: Author | _: SagaStep | _: Include[Definition] @unchecked | - _: Root | _: Term => + _: Root | _: Term => pars case _ => if parents.isEmpty then pars + definition.id.value.toLowerCase @@ -93,11 +95,7 @@ trait PassUtilities { /** Generate a string that is the file path portion of a url including the line number. */ def makeFilePath(definition: Definition): Option[String] = { - definition.loc.source match { - case FileParserInput(file) => - pathRelativeToRepo(file.getAbsoluteFile.toPath) - case _ => Option.empty[String] - } + definition.loc.source.path.map(_.toString) } def pathRelativeToRepo(path: Path): Option[String] = { diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/RiddlToHugoTranslator.scala b/src/main/scala/com/ossuminc/riddl/hugo/RiddlToHugoTranslator.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/RiddlToHugoTranslator.scala rename to src/main/scala/com/ossuminc/riddl/hugo/RiddlToHugoTranslator.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala b/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala similarity index 98% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala rename to src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala index 42b2d3b..344d702 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/Summarizer.scala @@ -1,8 +1,8 @@ package com.ossuminc.riddl.hugo -import com.ossuminc.riddl.diagrams.mermaid.RootOverviewDiagram import com.ossuminc.riddl.language.AST.{Domain, Root} import com.ossuminc.riddl.utils.Timer +import diagrams.mermaid.RootOverviewDiagram trait Summarizer { this: HugoPass => @@ -11,7 +11,7 @@ trait Summarizer { this: HugoPass => makeGlossary() makeToDoList() makeStatistics() - + // TODO: makeUsers() if options.withMessageSummary then for d <- root.domains do makeMessageSummary(d) } diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/ToDoListPass.scala b/src/main/scala/com/ossuminc/riddl/hugo/ToDoListPass.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/ToDoListPass.scala rename to src/main/scala/com/ossuminc/riddl/hugo/ToDoListPass.scala diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/DiagramsPass.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPass.scala similarity index 99% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/DiagramsPass.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPass.scala index 0afdb68..3cd7211 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/DiagramsPass.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPass.scala @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.diagrams +package com.ossuminc.riddl.hugo.diagrams import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.language.{AST, Messages} diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/d3/D3Diagrams.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/d3/D3Diagrams.scala similarity index 96% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/d3/D3Diagrams.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/d3/D3Diagrams.scala index 7abdc24..f868119 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/d3/D3Diagrams.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/d3/D3Diagrams.scala @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.diagrams.d3 +package com.ossuminc.riddl.hugo.diagrams.d3 import com.ossuminc.riddl.utils.PathUtils diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/C4Diagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/C4Diagram.scala similarity index 65% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/C4Diagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/C4Diagram.scala index b636835..5418015 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/C4Diagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/C4Diagram.scala @@ -1,4 +1,5 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid + import com.ossuminc.riddl.passes.PassesResult class C4Diagram (passesResult: PassesResult) { diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagram.scala similarity index 81% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagram.scala index 5e4d03c..dc0559b 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagram.scala @@ -1,7 +1,7 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid +import com.ossuminc.riddl.hugo.diagrams.ContextDiagramData import com.ossuminc.riddl.language.AST.{Context, Definition, Processor} -import com.ossuminc.riddl.diagrams.ContextDiagramData /** Context Diagram generator using a DataFlow Diagram from Mermaid * @@ -16,7 +16,7 @@ case class ContextMapDiagram(context: Context, data: ContextDiagramData) private def relatedContexts = data.relationships.map(_._1).distinct private def nodes: Seq[Processor[?, ?]] = context +: relatedContexts - private def relationships: Seq[(Processor[_, _], String)] = data.relationships + private def relationships: Seq[(Processor[?, ?], String)] = data.relationships emitDefaultClassDef() emitClassDefs(nodes) diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagram.scala similarity index 98% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagram.scala index e5d09cd..9f5b72a 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DataFlowDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagram.scala @@ -4,7 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid + import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.PassesResult import com.ossuminc.riddl.utils.FileBuilder diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DomainMapDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DomainMapDiagram.scala similarity index 73% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DomainMapDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DomainMapDiagram.scala index ce00253..7ce3b7a 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/DomainMapDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DomainMapDiagram.scala @@ -1,13 +1,13 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid -import com.ossuminc.riddl.diagrams.DomainDiagramData +import com.ossuminc.riddl.hugo.diagrams.DomainDiagramData import com.ossuminc.riddl.language.AST.{Definition, Context, Domain, Processor} class DomainMapDiagram(domain: Domain) extends FlowchartDiagramGenerator(s"Map For ${domain.identify}", "TB") { - + private def nodes = domain.contents.processors ++ domain.includes.flatMap(_.contents.processors) - private def relationships: Seq[(Processor[_, _], String)] = nodes.zip(List.fill(nodes.size)("contains")) + private def relationships: Seq[(Processor[?, ?], String)] = nodes.zip(List.fill(nodes.size)("contains")) emitDefaultClassDef() emitClassDefs(nodes) diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/EntityRelationshipDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/EntityRelationshipDiagram.scala similarity index 98% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/EntityRelationshipDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/EntityRelationshipDiagram.scala index f640f90..a1cc5fd 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/EntityRelationshipDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/EntityRelationshipDiagram.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.PassesResult diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/FlowchartDiagramGenerator.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/FlowchartDiagramGenerator.scala similarity index 97% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/FlowchartDiagramGenerator.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/FlowchartDiagramGenerator.scala index 8a933bb..9608781 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/FlowchartDiagramGenerator.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/FlowchartDiagramGenerator.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.language.AST.{Definition, NamedValue, Processor} @@ -35,7 +35,7 @@ trait FlowchartDiagramGenerator(val title: String, direction: String = "LR") ext protected def emitDefaultClassDef(): Unit = { addLine("classDef default fill:#666,stroke:black,stroke-width:3px,color:white;") } - + protected def emitClassDefs(nodes: Seq[Definition]): Unit = { for { node <- nodes @@ -94,7 +94,7 @@ trait FlowchartDiagramGenerator(val title: String, direction: String = "LR") ext val iconName = getIconFor(definition) val faicon = if iconName.nonEmpty then "fa:" + iconName + "
" else "" val defName: String = definition.id.value - val displayName: String = definition.identify + val displayName: String = definition.identify val numWords = displayName.count(_.isSpaceChar) + 1 val spacedName = if numWords > 4 then diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/MermaidDiagramGenerator.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/MermaidDiagramGenerator.scala similarity index 98% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/MermaidDiagramGenerator.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/MermaidDiagramGenerator.scala index cd2a3ac..606530c 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/MermaidDiagramGenerator.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/MermaidDiagramGenerator.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.utils.FileBuilder import com.ossuminc.riddl.language.AST.* diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagram.scala similarity index 96% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagram.scala index 273e429..a2c2823 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagram.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.language.AST.{Definition, Domain, Root} diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/SequenceDiagramGenerator.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/SequenceDiagramGenerator.scala similarity index 83% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/SequenceDiagramGenerator.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/SequenceDiagramGenerator.scala index 16510db..9b05aa8 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/SequenceDiagramGenerator.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/SequenceDiagramGenerator.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid /** A mermaid diagram generator for making sequence diagrams */ diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagram.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagram.scala similarity index 97% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagram.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagram.scala index 1531e89..f1849cf 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagram.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagram.scala @@ -4,12 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid +import com.ossuminc.riddl.hugo.diagrams.UseCaseDiagramData import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.PassesResult import com.ossuminc.riddl.utils.FileBuilder -import com.ossuminc.riddl.diagrams.UseCaseDiagramData import scala.reflect.ClassTag @@ -18,15 +18,15 @@ import scala.reflect.ClassTag * The UseCaseDiagramData from the DiagramsPass for this */ case class UseCaseDiagram(sds: UseCaseDiagramSupport, ucdd: UseCaseDiagramData) extends SequenceDiagramGenerator { - + private val participants: Seq[Definition] = ucdd.actors.values.toSeq.sortBy(_.kind) makeParticipants(participants) generateInteractions(ucdd.interactions) decr nl - + def title: String = ucdd.name - + def frontMatterItems: Map[String, String] = Map( "theme" -> "dark", "forceMenus" -> "true", diff --git a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramSupport.scala b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramSupport.scala similarity index 93% rename from diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramSupport.scala rename to src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramSupport.scala index afe573f..91bbe3c 100644 --- a/diagrams/src/main/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramSupport.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramSupport.scala @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.PassesResult diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala b/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala similarity index 97% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala rename to src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala index 8f4f879..bf534fa 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/themes/DotdockTheme.scala @@ -53,7 +53,7 @@ case class DotdockTheme( def emitMermaidDiagram(lines: Seq[String]): Unit = ??? - def processorIndex(processor: Processor[_,_]): Unit = ??? + def processorIndex(processor: Processor[?,?]): Unit = ??? // Members declared in com.ossuminc.riddl.hugo.themes.ThemeWriter diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala b/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala similarity index 98% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala rename to src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala index 4eac83d..a054eb5 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/themes/GeekDocTheme.scala @@ -107,7 +107,7 @@ case class GeekDocTheme( } } - def processorIndex(processor: Processor[_, _]): Unit = { + def processorIndex(processor: Processor[?, ?]): Unit = { if processor.authorRefs.nonEmpty then toc("Authors", processor.authorRefs.map(_.format)) h2("Index") p("{{< toc-tree >}}") diff --git a/src/main/scala/com/ossuminc/riddl/hugo/utils/TreeCopyFileVisitor.scala b/src/main/scala/com/ossuminc/riddl/hugo/utils/TreeCopyFileVisitor.scala new file mode 100644 index 0000000..067c588 --- /dev/null +++ b/src/main/scala/com/ossuminc/riddl/hugo/utils/TreeCopyFileVisitor.scala @@ -0,0 +1,49 @@ +/* + * Copyright 2019 Ossum, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.ossuminc.riddl.hugo.utils + +import com.ossuminc.riddl.utils.{Logger, SysLogger} + +import java.io.IOException +import java.nio.file.* +import java.nio.file.attribute.BasicFileAttributes + +/** Unit Tests For TreeCopyFileVisitor */ +case class TreeCopyFileVisitor(source: Path, target: Path, log: Logger = SysLogger()) + extends SimpleFileVisitor[Path] { + + @throws[IOException] + override def preVisitDirectory( + dir: Path, + attrs: BasicFileAttributes + ): FileVisitResult = { + val resolve = target.resolve(source.relativize(dir)) + if Files.notExists(resolve) then { Files.createDirectories(resolve) } + FileVisitResult.CONTINUE + } + + @throws[IOException] + override def visitFile( + file: Path, + attrs: BasicFileAttributes + ): FileVisitResult = { + val resolve = target.resolve(source.relativize(file)) + if !file.getFileName.startsWith(".") then { + if Files.exists(resolve) then { Files.delete(resolve) } + Files.copy(file, resolve, StandardCopyOption.REPLACE_EXISTING) + } + FileVisitResult.CONTINUE + } + + override def visitFileFailed( + file: Path, + exc: IOException + ): FileVisitResult = { + log.error(s"Unable to copy: $file: $exc\n") + FileVisitResult.CONTINUE + } +} diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/ApplicationWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala similarity index 87% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala index e48e65a..f71d857 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/ContextWriter.scala @@ -1,6 +1,7 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.mermaid.ContextMapDiagram +import com.ossuminc.riddl.hugo.diagrams.mermaid +import com.ossuminc.riddl.hugo.diagrams.mermaid.ContextMapDiagram import com.ossuminc.riddl.language.AST.{Context, ContextOption, Definition, OccursInContext} trait ContextWriter { this: MarkdownWriter => @@ -15,7 +16,7 @@ trait ContextWriter { this: MarkdownWriter => def emitContext(context: Context, parents: Seq[Definition]): Unit = { containerHead(context, "Context") - val maybeDiagram = diagrams.contextDiagrams.get(context).map(data => ContextMapDiagram(context, data)) + val maybeDiagram = diagrams.contextDiagrams.get(context).map(data => mermaid.ContextMapDiagram(context, data)) emitVitalDefinitionDetails(context, parents) emitContextMap(context, maybeDiagram) emitOptions(context.options) diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala similarity index 91% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala index 2ea0eac..1d0f74e 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/DomainWriter.scala @@ -1,6 +1,6 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram +import com.ossuminc.riddl.hugo.diagrams.mermaid.DomainMapDiagram import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.symbols.Symbols.Parents diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala similarity index 97% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala index f0e1ea0..4ea956e 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/EntityWriter.scala @@ -1,6 +1,6 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.mermaid.EntityRelationshipDiagram +import com.ossuminc.riddl.hugo.diagrams.mermaid.EntityRelationshipDiagram import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.passes.symbols.Symbols.Parents @@ -41,7 +41,7 @@ trait EntityWriter { this: MarkdownWriter => codeBlock(clause.statements) } } - + private def emitERD( name: String, fields: Seq[Field], diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala similarity index 92% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala index e534db5..2b1334f 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/EpicWriter.scala @@ -1,7 +1,7 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData} -import com.ossuminc.riddl.diagrams.mermaid.{UseCaseDiagram, UseCaseDiagramSupport} +import com.ossuminc.riddl.hugo.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData} +import com.ossuminc.riddl.hugo.diagrams.mermaid.{UseCaseDiagram, UseCaseDiagramSupport} import com.ossuminc.riddl.language.AST.{Definition, Epic, UseCase, User, UserStory} import com.ossuminc.riddl.passes.symbols.Symbols.Parents diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/FunctionWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownBasics.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala similarity index 91% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala index 7634ed0..1a109c7 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriter.scala @@ -6,18 +6,20 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.mermaid.* -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData, mermaid} +import com.ossuminc.riddl.hugo.diagrams.mermaid.* +import com.ossuminc.riddl.hugo.diagrams.mermaid import com.ossuminc.riddl.hugo.writers.{AdaptorWriter, DomainWriter} import com.ossuminc.riddl.hugo.PassUtilities +import com.ossuminc.riddl.hugo.diagrams.{DiagramsPass, DiagramsPassOutput, UseCaseDiagramData} import com.ossuminc.riddl.language.AST.* import com.ossuminc.riddl.language.CommonOptions -import com.ossuminc.riddl.language.parsing.Keywords +import com.ossuminc.riddl.language.parsing.{Keyword, Keywords} import com.ossuminc.riddl.passes.resolve.{ReferenceMap, Usages} import com.ossuminc.riddl.passes.symbols.Symbols.Parents import com.ossuminc.riddl.passes.symbols.SymbolsOutput import com.ossuminc.riddl.passes.{PassInput, PassesOutput} -import com.ossuminc.riddl.stats.{KindStats, StatsOutput, StatsPass} +import com.ossuminc.riddl.analyses.{KindStats, StatsOutput, StatsPass} +import com.ossuminc.riddl.language.parsing.Keywords.{adaptor, application, author, case_, command, connector, constant, context, entity, epic, field, flow, function, group, handler, inlet, input, invariant, outlet, output, pipe, projector, query, record, replica, reply, repository, result, saga, sink, source, state, streamlet, term, user} import com.ossuminc.riddl.utils.{TextFileWriter, Timer} import java.nio.file.Path @@ -141,7 +143,45 @@ trait MarkdownWriter // This substitutions domain contains context referenced - private val keywords: String = Keywords.definition_keywords.mkString("(", "|", ")") + private final val definition_keywords: Seq[String] = Seq( + Keyword.adaptor, + Keyword.application, + Keyword.author, + Keyword.case_, + Keyword.command, + Keyword.connector, + Keyword.constant, + Keyword.context, + Keyword.entity, + Keyword.epic, + Keyword.field, + Keyword.flow, + Keyword.function, + Keyword.group, + Keyword.handler, + Keyword.inlet, + Keyword.input, + Keyword.invariant, + Keyword.outlet, + Keyword.output, + Keyword.pipe, + Keyword.projector, + Keyword.query, + Keyword.replica, + Keyword.reply, + Keyword.repository, + Keyword.record, + Keyword.result, + Keyword.saga, + Keyword.sink, + Keyword.source, + Keyword.state, + Keyword.streamlet, + Keyword.term, + Keyword.user + ) + + private val keywords: String = definition_keywords.mkString("(", "|", ")") private val pathIdRegex = s" ($keywords) (\\w+(\\.\\w+)*)".r private def substituteIn(lineToReplace: String): String = { val matches = pathIdRegex.findAllMatchIn(lineToReplace).toSeq.reverse diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/ProjectorWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/RepositoryWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/SagaWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/StreamletWriter.scala diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala similarity index 97% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala index eccee88..6dc2417 100644 --- a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala +++ b/src/main/scala/com/ossuminc/riddl/hugo/writers/SummariesWriter.scala @@ -2,7 +2,7 @@ package com.ossuminc.riddl.hugo.writers import com.ossuminc.riddl.hugo.{GlossaryEntry, MessageInfo, ToDoItem} import com.ossuminc.riddl.language.AST.Domain -import com.ossuminc.riddl.stats.{KindStats, StatsOutput, StatsPass} +import com.ossuminc.riddl.analyses.{KindStats, StatsOutput, StatsPass} trait SummariesWriter { this: MarkdownWriter => diff --git a/hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala b/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala similarity index 100% rename from hugo/src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala rename to src/main/scala/com/ossuminc/riddl/hugo/writers/ThemeWriter.scala diff --git a/hugo/src/test/input/adaptors.riddl b/src/test/input/adaptors.riddl similarity index 100% rename from hugo/src/test/input/adaptors.riddl rename to src/test/input/adaptors.riddl diff --git a/diagrams/src/test/input/context-relationships.riddl b/src/test/input/context-relationships.riddl similarity index 100% rename from diagrams/src/test/input/context-relationships.riddl rename to src/test/input/context-relationships.riddl diff --git a/diagrams/src/test/input/epic.riddl b/src/test/input/epic.riddl similarity index 100% rename from diagrams/src/test/input/epic.riddl rename to src/test/input/epic.riddl diff --git a/hugo/src/test/input/everything.riddl b/src/test/input/everything.riddl similarity index 100% rename from hugo/src/test/input/everything.riddl rename to src/test/input/everything.riddl diff --git a/hugo/src/test/input/hugo.conf b/src/test/input/hugo.conf similarity index 100% rename from hugo/src/test/input/hugo.conf rename to src/test/input/hugo.conf diff --git a/hugo/src/test/input/rbbq.riddl b/src/test/input/rbbq.riddl similarity index 100% rename from hugo/src/test/input/rbbq.riddl rename to src/test/input/rbbq.riddl diff --git a/hugo/src/test/input/regressions/match-error.riddl b/src/test/input/regressions/match-error.riddl similarity index 100% rename from hugo/src/test/input/regressions/match-error.riddl rename to src/test/input/regressions/match-error.riddl diff --git a/hugo/src/test/input/validate.conf b/src/test/input/validate.conf similarity index 100% rename from hugo/src/test/input/validate.conf rename to src/test/input/validate.conf diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/GlossaryPassTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/GlossaryPassTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/GlossaryPassTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/GlossaryPassTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoCommandTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/HugoCommandTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoCommandTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/HugoCommandTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoPassTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/HugoPassTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoPassTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/HugoPassTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala b/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala rename to src/test/scala/com/ossuminc/riddl/hugo/HugoTestBase.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/MessagesPassTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/MessagesPassTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/MessagesPassTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/MessagesPassTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/RegressionTests.scala b/src/test/scala/com/ossuminc/riddl/hugo/RegressionTests.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/RegressionTests.scala rename to src/test/scala/com/ossuminc/riddl/hugo/RegressionTests.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/RunHugoOnExamplesTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoTestBase.scala b/src/test/scala/com/ossuminc/riddl/hugo/RunHugoTestBase.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/RunHugoTestBase.scala rename to src/test/scala/com/ossuminc/riddl/hugo/RunHugoTestBase.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/ToDoPassListTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/ToDoPassListTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/ToDoPassListTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/ToDoPassListTest.scala diff --git a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/DiagramsPassTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPassTest.scala similarity index 86% rename from diagrams/src/test/scala/com/ossuminc/riddl/diagrams/DiagramsPassTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPassTest.scala index 0ec2ca3..e6ef616 100644 --- a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/DiagramsPassTest.scala +++ b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/DiagramsPassTest.scala @@ -1,4 +1,4 @@ -package com.ossuminc.riddl.diagrams +package com.ossuminc.riddl.hugo.diagrams import com.ossuminc.riddl.testkit.RunPassTestBase import org.scalatest.wordspec.AnyWordSpec diff --git a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagramTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagramTest.scala similarity index 91% rename from diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagramTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagramTest.scala index 8f7a67d..7d4901a 100644 --- a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/ContextMapDiagramTest.scala +++ b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/ContextMapDiagramTest.scala @@ -1,6 +1,5 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput} import com.ossuminc.riddl.language.parsing.RiddlParserInput import com.ossuminc.riddl.testkit.RunPassTestBase @@ -15,7 +14,7 @@ class ContextMapDiagramTest extends RunPassTestBase { val maybeDPO = result.outputOf[DiagramsPassOutput](DiagramsPass.name) maybeDPO match case Some(dpo: DiagramsPassOutput) => - var failures = Seq.empty[String] + var failures = Seq.empty[String] for { (context, data) <- dpo.contextDiagrams diagram = ContextMapDiagram(context, data) @@ -37,9 +36,9 @@ class ContextMapDiagramTest extends RunPassTestBase { | |flowchart TB | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; - | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; - | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; + | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; + | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; + | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; | subgraph 'Domain 'foo'' | direction TB | A((fa:fa-house
Context 'A')) @@ -68,8 +67,8 @@ class ContextMapDiagramTest extends RunPassTestBase { | |flowchart TB | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; - | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; + | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; + | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; | subgraph 'Domain 'foo'' | direction TB | B((fa:fa-house
Context 'B')) @@ -94,8 +93,8 @@ class ContextMapDiagramTest extends RunPassTestBase { | |flowchart TB | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; - | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; + | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; + | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; | subgraph 'Domain 'foo'' | direction TB | C((fa:fa-house
Context 'C')) @@ -119,7 +118,7 @@ class ContextMapDiagramTest extends RunPassTestBase { | |flowchart TB | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef D_class fill:white,stroke:#333,stroke-width:3px,color:red; + | classDef D_class fill:white,stroke:#333,stroke-width:3px,color:red; | subgraph 'Domain 'bar'' | direction TB | D((fa:fa-house
Context 'D')) @@ -132,13 +131,13 @@ class ContextMapDiagramTest extends RunPassTestBase { val failure = s"${context.id.value} failed " info(failure) info(lines.mkString("\n")) - failures = failures :+ failure - end if - // lines mustBe expected + failures = failures :+ failure + end if + // lines mustBe expected } - if failures.nonEmpty then + if failures.nonEmpty then fail(s"Failures detected in generator output: ${failures.mkString("\n ", "\n ", "\n")}") - else + else succeed case None => fail("no DiagramsPassOutput") end match diff --git a/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagramTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagramTest.scala new file mode 100644 index 0000000..1d6f3ad --- /dev/null +++ b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/DataFlowDiagramTest.scala @@ -0,0 +1,2 @@ +package com.ossuminc.riddl.hugo.diagrams.mermaid + diff --git a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagramTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagramTest.scala similarity index 92% rename from diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagramTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagramTest.scala index a20f3f9..1d376b8 100644 --- a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/RootOverviewDiagramTest.scala +++ b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/RootOverviewDiagramTest.scala @@ -1,6 +1,5 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput} import com.ossuminc.riddl.language.parsing.RiddlParserInput import com.ossuminc.riddl.testkit.RunPassTestBase @@ -30,9 +29,9 @@ class RootOverviewDiagramTest extends RunPassTestBase { | |flowchart TD | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; - | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; - | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; + | classDef A_class fill:white,stroke:#333,stroke-width:3px,color:blue; + | classDef B_class fill:white,stroke:#333,stroke-width:3px,color:green; + | classDef C_class fill:white,stroke:#333,stroke-width:3px,color:purple; | subgraph 'Domain 'foo'' | direction TB | foo((Domain 'foo')) @@ -47,7 +46,7 @@ class RootOverviewDiagramTest extends RunPassTestBase { | class B B_class | class C C_class | classDef default fill:#666,stroke:black,stroke-width:3px,color:white; - | classDef D_class fill:white,stroke:#333,stroke-width:3px,color:red; + | classDef D_class fill:white,stroke:#333,stroke-width:3px,color:red; | subgraph 'Domain 'bar'' | direction TB | bar((Domain 'bar')) diff --git a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramTest.scala similarity index 90% rename from diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramTest.scala index e8ee6ef..69f552e 100644 --- a/diagrams/src/test/scala/com/ossuminc/riddl/diagrams/mermaid/UseCaseDiagramTest.scala +++ b/src/test/scala/com/ossuminc/riddl/hugo/diagrams/mermaid/UseCaseDiagramTest.scala @@ -1,7 +1,5 @@ -package com.ossuminc.riddl.diagrams.mermaid +package com.ossuminc.riddl.hugo.diagrams.mermaid -import com.ossuminc.riddl.diagrams.{DiagramsPass, DiagramsPassOutput} -import com.ossuminc.riddl.diagrams.UseCaseDiagramData import com.ossuminc.riddl.language.AST.NamedValue import com.ossuminc.riddl.language.parsing.RiddlParserInput import com.ossuminc.riddl.testkit.RunPassTestBase diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/writers/AdaptorWriterTest.scala diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala similarity index 98% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala index 4cdba75..84277b7 100644 --- a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala +++ b/src/test/scala/com/ossuminc/riddl/hugo/writers/MarkdownWriterTest.scala @@ -6,7 +6,7 @@ package com.ossuminc.riddl.hugo.writers -import com.ossuminc.riddl.diagrams.mermaid.DomainMapDiagram +import com.ossuminc.riddl.hugo.diagrams.mermaid.DomainMapDiagram import com.ossuminc.riddl.hugo.writers.MarkdownWriter import com.ossuminc.riddl.hugo.{GlossaryEntry, HugoTestBase} import com.ossuminc.riddl.language.AST.Root diff --git a/hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala b/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala similarity index 100% rename from hugo/src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala rename to src/test/scala/com/ossuminc/riddl/hugo/writers/WriterTest.scala