Skip to content

Commit

Permalink
Regularized syntax (#649)
Browse files Browse the repository at this point in the history
* Install MiMA Support via sbt-ossuminc
* First attempt at syntax changes
* No more brief & description after a definition
* They must appear within the definition
* All may have  a "with" clause suffix of "Descriptives" (term, brief, description, authorRef)
* Move PrettifyCommand to commands module
* Move PrettifyPass & etc. to passes module
* Remove the prettify module
* Make PrettifyCommand actually write files now with or without --single-file option
* Fix a documentation DRI
* Use sbt-ossuminc 0.13.4 for MiMA support
* Install Snyk badge
* Reuse first build's artifacts to test sbt-riddl, for efficiency
* Get sbt-riddl working/testing again.
  • Loading branch information
reid-spencer authored Sep 7, 2024
1 parent f22e001 commit 8a1aafe
Show file tree
Hide file tree
Showing 130 changed files with 2,342 additions and 2,103 deletions.
19 changes: 9 additions & 10 deletions .github/workflows/scala.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,19 @@ jobs:
run: |
sbt -v clean Test/compile test
- name: Test sbt-riddl plugin
env:
RIDDLC_PATH: riddlc/target/universal/stage/bin/riddlc
run: |
sbt -v publishLocal riddlc/stage sbt-riddl/scripted
- name: Coverage For JVM projects only
run: |
sbt -v clean coverage \
utils/Test/compile language/Test/compile passes/Test/compile diagrams/Test/compile \
command/Test/compile prettify/Test/compile hugo/Test/compile commands/Test/compile \
riddlc/Test/compile \
utils/test language/test passes/test diagrams/test command/test prettify/test hugo/test \
commands/test riddlc/test coverageAggregate coveralls
command/Test/compile hugo/Test/compile commands/Test/compile riddlc/Test/compile \
utils/test language/test passes/test diagrams/test command/test hugo/test commands/test riddlc/test \
coverageAggregate coveralls
- name: Coverage Results Collection
uses: actions/upload-artifact@v4
Expand All @@ -59,12 +64,6 @@ jobs:
- target/scala-3.4.2/scoverage-report/scoverage.xml
- sbt-riddl/target/scala-2.12/scoverage-report/scoverage.xml
- name: Test sbt-riddl plugin
env:
RIDDLC_PATH: riddlc/target/universal/stage/bin/riddlc
run: |
sbt -v clean compile publishLocal riddlc/stage sbt-riddl/scripted
- name: Cleanup Before Caching
shell: bash
run: |
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
[![Scala Steward badge](https://img.shields.io/badge/Scala_Steward-helping-blue.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAMAAAARSr4IAAAAVFBMVEUAAACHjojlOy5NWlrKzcYRKjGFjIbp293YycuLa3pYY2LSqql4f3pCUFTgSjNodYRmcXUsPD/NTTbjRS+2jomhgnzNc223cGvZS0HaSD0XLjbaSjElhIr+AAAAAXRSTlMAQObYZgAAAHlJREFUCNdNyosOwyAIhWHAQS1Vt7a77/3fcxxdmv0xwmckutAR1nkm4ggbyEcg/wWmlGLDAA3oL50xi6fk5ffZ3E2E3QfZDCcCN2YtbEWZt+Drc6u6rlqv7Uk0LdKqqr5rk2UCRXOk0vmQKGfc94nOJyQjouF9H/wCc9gECEYfONoAAAAASUVORK5CYII=)](https://scala-steward.org)
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/ossuminc/riddl/master/LICENSE)

[![Known Vulnerabilities](https://snyk.io/test/github/ossuminc/riddl/badge.svg)](https://snyk.io/test/github/ossuminc/riddl)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=ossuminc_riddl&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=ossuminc_riddl)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=ossuminc_riddl&metric=bugs)](https://sonarcloud.io/summary/new_code?id=ossuminc_riddl)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=ossuminc_riddl&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=ossuminc_riddl)
Expand All @@ -18,6 +19,7 @@
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=ossuminc_riddl&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=ossuminc_riddl)
[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=ossuminc_riddl&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=ossuminc_riddl)


# RIDDL

## Full Documentation
Expand Down
34 changes: 4 additions & 30 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import org.scoverage.coveralls.Imports.CoverallsKeys.coverallsTokenFile
import com.ossuminc.sbt.{CrossModule, DocSite, OssumIncPlugin, Plugin}
import com.typesafe.tools.mima.plugin.MimaPlugin.autoImport.mimaPreviousArtifacts
import sbt.Keys.{description, libraryDependencies}
import sbtbuildinfo.BuildInfoPlugin.autoImport.buildInfoPackage
import sbtcrossproject.{CrossClasspathDependency, CrossProject}

import scala.collection.immutable.Set

Global / onChangedBuildSource := ReloadOnSourceChanges
(Global / excludeLintKeys) ++= Set(mainClass)

Expand All @@ -29,7 +26,6 @@ lazy val riddl: Project = Root("riddl", startYr = startYear)
diagrams,
diagramsJS,
command,
prettify,
hugo,
commands,
riddlc,
Expand All @@ -42,7 +38,6 @@ lazy val utils_cp: CrossProject = CrossModule("utils", "riddl-utils")(JVM, JS)
.configure(With.typical)
.configure(With.build_info)
.settings(
scalaVersion := "3.4.2",
scalacOptions += "-explain-cyclic",
buildInfoPackage := "com.ossuminc.riddl.utils",
buildInfoObject := "RiddlBuildInfo",
Expand Down Expand Up @@ -148,22 +143,6 @@ lazy val command = Module("command", "riddl-command")

def testDep(project: Project): ClasspathDependency = project % "compile->compile;compile->test;test->test"

val Prettify = config("prettify")
lazy val prettify = Module("prettify", "riddl-prettify")
.configure(With.typical)
.configure(With.coverage(65))
.configure(With.MiMa("0.50.0"))
.configure(With.publishing)
.settings(
coverageExcludedFiles := """<empty>;$anon""",
scalaVersion := "3.4.2",
description := "Implementation for the RIDDL prettify command, a code reformatter",
libraryDependencies ++= Dep.testing ++ Seq(
"org.scala-js" %% "scalajs-stubs" % "1.1.0" % "provided"
)
)
.dependsOn(utils, language, pDep(passes), command)

val Hugo = config("hugo")
lazy val hugo = Module("hugo", "riddl-hugo")
.configure(With.typical)
Expand All @@ -172,14 +151,13 @@ lazy val hugo = Module("hugo", "riddl-hugo")
.configure(With.MiMa("0.50.0"))
.settings(
coverageExcludedFiles := """<empty>;$anon""",
scalaVersion := "3.4.2",
scalacOptions += "-explain-cyclic",
description := "Implementation for the RIDDL prettify command, a code reformatter",
description := "Implementation for the RIDDL hugo command, a website generator",
libraryDependencies ++= Dep.testing ++ Seq(
"org.scala-js" %% "scalajs-stubs" % "1.1.0" % "provided"
)
)
.dependsOn(utils, pDep(language), pDep(passes), diagrams, pDep(command), prettify)
.dependsOn(utils, pDep(language), pDep(passes), diagrams, pDep(command))

val Commands = config("commands")
lazy val commands: Project = Module("commands", "riddl-commands")
Expand All @@ -200,7 +178,6 @@ lazy val commands: Project = Module("commands", "riddl-commands")
pDep(language),
pDep(passes),
command,
prettify,
hugo
)

Expand All @@ -214,7 +191,6 @@ lazy val riddlc: Project = Program("riddlc", "riddlc")
utils,
language,
testDep(passes),
prettify,
testDep(commands)
)
.settings(
Expand All @@ -239,7 +215,6 @@ lazy val docProjects = List(
(passes, Passes),
(diagrams, Diagrams),
(command, Command),
(prettify, Prettify),
(hugo, Hugo),
(commands, Commands),
(riddlc, Riddlc)
Expand All @@ -256,17 +231,16 @@ lazy val docsite = DocSite(
dirName = "doc",
apiOutput = file("src") / "main" / "hugo" / "static" / "apidoc",
baseURL = Some("https://riddl.tech/apidoc"),
inclusions = Seq(utils, language, passes, diagrams, command, prettify, hugo, commands),
inclusions = Seq(utils, language, passes, diagrams, command, hugo, commands),
logoPath = Some("doc/src/main/hugo/static/images/RIDDL-Logo-128x128.png")
)
.settings(
name := "riddl-doc",
scalaVersion := "3.4.2",
description := "Generation of the documentation web site",
libraryDependencies ++= Dep.testing
)
.configure(With.noMiMa)
.dependsOn(utils, language, passes, diagrams, command, prettify, hugo, commands)
.dependsOn(utils, language, passes, diagrams, command, hugo, commands)

lazy val plugin = Plugin("sbt-riddl")
.configure(With.build_info, With.scala2, With.noMiMa, With.publishing)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,46 @@

package com.ossuminc.riddl.commands

import com.ossuminc.riddl.language.CommonOptions
import com.ossuminc.riddl.language.{At, CommonOptions, Messages}
import com.ossuminc.riddl.language.Messages.Messages
import com.ossuminc.riddl.passes.Pass.standardPasses
import com.ossuminc.riddl.passes.{PassInput, PassesCreator, PassesOutput}
import com.ossuminc.riddl.utils.Logger
import com.ossuminc.riddl.prettify.{PrettifyPass, PrettifyState, *}
import com.ossuminc.riddl.command.TranslationCommand
import com.ossuminc.riddl.command.CommandOptions
import com.ossuminc.riddl.passes.{PassInput, PassOptions, PassesCreator, PassesOutput, PassesResult}
import com.ossuminc.riddl.utils.{ExceptionUtils, Logger}
import com.ossuminc.riddl.command.{CommandOptions, PassCommandOptions, TranslationCommand}
import com.ossuminc.riddl.command.CommandOptions.optional
import com.ossuminc.riddl.commands.Commands
import com.ossuminc.riddl.passes.prettify.{PrettifyOutput, PrettifyPass, RiddlFileEmitter}
import pureconfig.ConfigCursor
import pureconfig.ConfigReader
import scopt.OParser

import java.nio.file.Path
import java.nio.charset.Charset
import java.nio.file.{Files, Path, StandardOpenOption}

object PrettifyCommand {
val cmdName = "prettify"

case class Options(
inputFile: Option[Path] = None,
outputDir: Option[Path] = Some(Path.of(System.getProperty("java.io.tmpdir"))),
projectName: Option[String] = None,
singleFile: Boolean = true
) extends TranslationCommand.Options
with PassOptions
with PassCommandOptions:
def command: String = cmdName
}

/** A command to Prettify RIDDL Source */
class PrettifyCommand extends TranslationCommand[PrettifyPass.Options](PrettifyCommand.cmdName) {
class PrettifyCommand extends TranslationCommand[PrettifyCommand.Options](PrettifyCommand.cmdName) {

import PrettifyPass.Options
import PrettifyCommand.Options

def overrideOptions(options: PrettifyPass.Options, newOutputDir: Path): PrettifyPass.Options = {
def overrideOptions(options: PrettifyCommand.Options, newOutputDir: Path): PrettifyCommand.Options = {
options.copy(outputDir = Some(newOutputDir))
}

override def getOptionsParser: (OParser[Unit, PrettifyPass.Options], PrettifyPass.Options) = {
val builder = OParser.builder[PrettifyPass.Options]
override def getOptionsParser: (OParser[Unit, PrettifyCommand.Options], PrettifyCommand.Options) = {
val builder = OParser.builder[PrettifyCommand.Options]
import builder.*
cmd(PrettifyCommand.cmdName)
.children(
Expand All @@ -53,10 +63,10 @@ class PrettifyCommand extends TranslationCommand[PrettifyPass.Options](PrettifyC
)
.text("""Parse and validate the input-file and then reformat it to a
|standard layout written to the output-dir. """.stripMargin) ->
PrettifyPass.Options()
PrettifyCommand.Options()
}

override def getConfigReader: ConfigReader[PrettifyPass.Options] = { (cur: ConfigCursor) =>
override def getConfigReader: ConfigReader[PrettifyCommand.Options] = { (cur: ConfigCursor) =>
for
topCur <- cur.asObjectCursor
cmdCur <- topCur.atKey(PrettifyCommand.cmdName)
Expand All @@ -69,7 +79,7 @@ class PrettifyCommand extends TranslationCommand[PrettifyPass.Options](PrettifyC
projectName <- optional(content, "project-name", "No Project Name Specified") { cur => cur.asString }
singleFileRes <- objCur.atKey("single-file")
singleFile <- singleFileRes.asBoolean
yield PrettifyPass.Options(
yield PrettifyCommand.Options(
Option(Path.of(inputPath)),
Option(Path.of(outputPath)),
Option(projectName),
Expand All @@ -78,14 +88,73 @@ class PrettifyCommand extends TranslationCommand[PrettifyPass.Options](PrettifyC
}

override def getPasses(
log: Logger,
commonOptions: CommonOptions,
options: PrettifyPass.Options
log: Logger,
commonOptions: CommonOptions,
options: PrettifyCommand.Options
): PassesCreator = {
standardPasses ++ Seq(
{ (input: PassInput, outputs: PassesOutput) =>
PrettifyPass(input, outputs, options)
PrettifyPass(input, outputs, PrettifyPass.Options(flatten = options.singleFile))
}
)
}

override def run(
originalOptions: PrettifyCommand.Options,
commonOptions: CommonOptions,
log: Logger,
outputDirOverride: Option[Path]
): Either[Messages, PassesResult] =
super.run(originalOptions, commonOptions, log, outputDirOverride) match
case Left(messages) => Left(messages)
case result @ Right(passesResult: PassesResult) =>
passesResult.outputOf[PrettifyOutput](PrettifyPass.name) match
case Some(output: PrettifyOutput) =>
writeOutput(output, originalOptions, outputDirOverride)
result
case None =>
// shouldn't happen
Left(List(Messages.error("No output from Prettify Pass", At.empty)))
end match
end match
end run

private def writeOutput(
output: PrettifyOutput,
originalOptions: Options,
dirOverrides: Option[Path]
): Unit =
try {
val dir = originalOptions.outputDir
.getOrElse(dirOverrides
.getOrElse(Path.of(Option(System.getProperty("user.dir")).getOrElse("."))))
Files.createDirectories(dir)
if output.state.flatten then
val path = dir.resolve("prettify-output.riddl")
Files.writeString(
path,
output.state.filesAsString,
Charset.forName("UTF-8"),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE
)
else
val base = dirOverrides.getOrElse(Path.of("."))
output.state.withFiles { (file: RiddlFileEmitter) =>
val content = file.toString
val path = base.resolve(file.url.path)
Files.writeString(path, content,
Charset.forName("UTF-8"),
StandardOpenOption.CREATE_NEW,
StandardOpenOption.WRITE
)
}
end if
} catch {
case e: java.io.IOException =>
println(s"Exception while writing: ${e.getClass.getName}: ${e.getMessage}")
val stackTrace = ExceptionUtils.getRootCauseStackTrace(e).mkString("\n")
println(stackTrace)
}
end writeOutput
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
prettify {
input-file = "nada.riddl"
output-dir = "prettify/target/prettify/"
output-dir = "commands/target/prettify/"
project-name = "Nada"
single-file = true
}
}
Loading

0 comments on commit 8a1aafe

Please sign in to comment.