diff --git a/base/src/main/scala/co/uproot/abandon/Config.scala b/base/src/main/scala/co/uproot/abandon/Config.scala index 700c2610..f1a81f5d 100644 --- a/base/src/main/scala/co/uproot/abandon/Config.scala +++ b/base/src/main/scala/co/uproot/abandon/Config.scala @@ -18,7 +18,7 @@ class AbandonCLIConf(arguments: Seq[String]) extends ScallopConf(arguments) { val filters = propsLong[String]("filter", descr="Transaction filters", keyName=" name") val unversioned = opt[Boolean]("unversioned", short = 'X') val quiet = opt[Boolean]("quiet", short = 'q') - // val trail = trailArg[String]() + val version = opt[Boolean]("version", noshort = true) } object SettingsHelper { @@ -62,9 +62,7 @@ object SettingsHelper { } } - def getCompleteSettings(args: Seq[String], version: String): Either[String, Settings] = { - val cliConf = new AbandonCLIConf(args) - cliConf.verify() + def getCompleteSettings(cliConf: AbandonCLIConf, version: String): Either[String, Settings] = { val configOpt = cliConf.config.toOption val versionId = if (cliConf.unversioned.getOrElse(false)) { None @@ -329,6 +327,8 @@ case class DateRangeConstraint(dateFromOpt: Option[DateBound], dateToOpt: Option } } +class SettingsError(msg: String) extends RuntimeException(msg) + case class Settings( inputs: Seq[String], constraints: Seq[Constraint], diff --git a/cli/src/main/scala/co/uproot/abandon/App.scala b/cli/src/main/scala/co/uproot/abandon/App.scala index 1e1a9f29..b3f881ff 100644 --- a/cli/src/main/scala/co/uproot/abandon/App.scala +++ b/cli/src/main/scala/co/uproot/abandon/App.scala @@ -65,7 +65,7 @@ final class ReportWriter(settings: Settings, outFiles: Seq[String]) { } } -object CLIMain { +object CLIMain { def printBalReport(reportWriter: ReportWriter, balanceReport: BalanceReport) = { val left = balanceReport.leftEntries.map(_.render) val right = balanceReport.rightEntries.map(_.render) @@ -149,15 +149,16 @@ object CLIMain { } reportWriter.endCodeBlock() } + def buildId: String = { "Base: " + BaseBuildInfo.version + " [" + BaseBuildInfo.builtAtString + "];" + "CLI: " + CliBuildInfo.version + " [" + CliBuildInfo.builtAtString + "];" } - def runAppThrows(args: Array[String]) { - val settingsResult = SettingsHelper.getCompleteSettings(args, buildId) + private def runApp(cliConf: AbandonCLIConf) { + val settingsResult = SettingsHelper.getCompleteSettings(cliConf, buildId) settingsResult match { - case Left(errorMsg) => printErrAndExit(errorMsg) + case Left(errorMsg) => throw new SettingsError(errorMsg) case Right(settings) => val (parseError, astEntries, processedFiles) = Processor.parseAll(settings.inputs, settings.quiet) if (!parseError) { @@ -225,19 +226,31 @@ object CLIMain { } } - def runApp(args: Array[String]) { + def run(args: Array[String]) { + val cliConf = new AbandonCLIConf(args) + cliConf.verify() + + if (cliConf.version.supplied) { + println("Version: " + CliBuildInfo.version + " [" + CliBuildInfo.builtAtString + "]") + } else { + runApp(cliConf) + } + } + + def main(args: Array[String]): Unit = { try { - runAppThrows(args) + run(args) } catch { case a: AssertionError => printErrAndExit("Internal Assertion Error (please report a bug):" + a.getMessage) case i: InputError => printErrAndExit("Input error: " + i.getMessage) case i: ConstraintError => printErrAndExit("Constraint Failed: " + i.getMessage) case e: NotImplementedError => printErrAndExit("Some functionality has not yet been implemented. We intend to implement it eventually. More details:\n" + e.getMessage) + case e: SettingsError => printErrAndExit("Configuration error: " + e.getMessage) case e: Error => printErrAndExit("Unexpected error", e) } } - def printErrAndExit(msg: String, err:Error = null) = { + private def printErrAndExit(msg: String, err: Error = null) = { println(Console.RED + Console.BOLD + msg + Console.RESET) if (err != null) { err.printStackTrace(Console.out) @@ -245,7 +258,3 @@ object CLIMain { System.exit(1) } } - -object CLIApp extends App { - co.uproot.abandon.CLIMain.runApp(args) -} diff --git a/cli/src/test/scala/co/uproot/abandon/CLIMainTest.scala b/cli/src/test/scala/co/uproot/abandon/CLIMainTest.scala new file mode 100644 index 00000000..703de2ab --- /dev/null +++ b/cli/src/test/scala/co/uproot/abandon/CLIMainTest.scala @@ -0,0 +1,11 @@ +package co.uproot.abandon + +import org.scalatest.FlatSpec + +class CLIMainTest extends FlatSpec { + + behavior of "Abandon CLI with no-op args" + it should "handle version" in { + co.uproot.abandon.CLIMain.run(Array("--version")) + } +} diff --git a/cli/src/test/scala/co/uproot/abandon/CliTestRunner.scala b/cli/src/test/scala/co/uproot/abandon/CliTestRunner.scala index 55a1f3d4..aa445ff5 100644 --- a/cli/src/test/scala/co/uproot/abandon/CliTestRunner.scala +++ b/cli/src/test/scala/co/uproot/abandon/CliTestRunner.scala @@ -55,7 +55,7 @@ class CliTestSuite extends FunSuite { def runTest(tc: TestCase) { try { - co.uproot.abandon.CLIMain.runAppThrows(Array("-c", tc.conf) ++ tc.args ++ Array("-X", "-q")) + co.uproot.abandon.CLIMain.run(Array("-c", tc.conf) ++ tc.args ++ Array("-X", "-q")) } catch { case x: Exception => println("error: " + x); assert(false) } diff --git a/gui/src/main/scala/co/uproot/abandon/UI.scala b/gui/src/main/scala/co/uproot/abandon/UI.scala index 3a08129b..91ae3750 100644 --- a/gui/src/main/scala/co/uproot/abandon/UI.scala +++ b/gui/src/main/scala/co/uproot/abandon/UI.scala @@ -154,7 +154,15 @@ object AbandonUI extends JFXApp { } try { - val settingsResult = SettingsHelper.getCompleteSettings(parameters.raw, buildId) + val cliConf = new AbandonCLIConf(parameters.raw) + cliConf.verify() + + if (cliConf.version.supplied) { + val msg = "Version: " + GuiBuildInfo.version + " [" + GuiBuildInfo.builtAtString + "]" + System.err.println(msg) + } + + val settingsResult = SettingsHelper.getCompleteSettings(cliConf, buildId) settingsResult match { case Left(errorMsg) => handleError("Error: " + errorMsg) case Right(settings) => diff --git a/src/main/scala/co/uproot/abandon/Main.scala b/src/main/scala/co/uproot/abandon/Main.scala index 57ef55f5..a89311c3 100644 --- a/src/main/scala/co/uproot/abandon/Main.scala +++ b/src/main/scala/co/uproot/abandon/Main.scala @@ -8,7 +8,7 @@ object Main extends App { // ensureJFXIsAvailable() AbandonUI.main(args.tail) } else { - CLIMain.runApp(args) + CLIMain.main(args) } private def ensureJFXIsAvailable(): Unit = {