ogma-cli 1.13.0 → 1.14.0
raw patch · 9 files changed
+238/−37 lines, 9 filesdep ~ogma-core
Dependency ranges changed: ogma-core
Files
- CHANGELOG.md +9/−0
- ogma-cli.cabal +4/−2
- src/CLI/CommandCFSApp.hs +5/−5
- src/CLI/CommandFPrimeApp.hs +5/−5
- src/CLI/CommandOverview.hs +31/−17
- src/CLI/CommandROSApp.hs +3/−3
- src/CLI/CommandReport.hs +162/−0
- src/CLI/CommandStandalone.hs +5/−5
- src/CLI/CommandTop.hs +14/−0
CHANGELOG.md view
@@ -1,5 +1,14 @@ # Revision history for ogma-cli +## [1.14.0] - 2026-05-21++* Version bump (1.14.0) (#425).+* Add support for reading diagrams to `overview` command (#386).+* Augment `overview` command to report determinism of state machines (#388).+* Adapt example to change in code generated by diagram backend (#411).+* Adjust `standalone`, app commands to support multiple input files (#421).+* Expose report command (#423).+ ## [1.13.0] - 2026-03-21 * Version bump (1.13.0) (#373).
ogma-cli.cabal view
@@ -19,7 +19,7 @@ build-type: Simple name: ogma-cli-version: 1.13.0+version: 1.14.0 homepage: https://github.com/nasa/ogma bug-reports: https://github.com/nasa/ogma/issues license: Apache-2.0@@ -85,6 +85,7 @@ > ros Generate a ROS 2 monitoring application > standalone Generate a Copilot file from an input specification > diagram Generate a monitor from a state machine diagram+ > report Generate a report of the input specification(s). . For further information, see: .@@ -131,6 +132,7 @@ CLI.CommandDiagram CLI.CommandFPrimeApp CLI.CommandOverview+ CLI.CommandReport CLI.CommandROSApp CLI.CommandStandalone CLI.CommandTop@@ -143,7 +145,7 @@ , microstache >= 1.0 && < 1.1 , text >= 1.2.3.1 && < 2.2 - , ogma-core >= 1.13.0 && < 1.14+ , ogma-core >= 1.14.0 && < 1.15 hs-source-dirs: src
src/CLI/CommandCFSApp.hs view
@@ -30,8 +30,8 @@ where -- External imports-import Options.Applicative ( Parser, help, long, metavar, optional, short,- showDefault, strOption, value )+import Options.Applicative ( Parser, help, long, many, metavar, optional,+ short, showDefault, strOption, value ) -- External imports: command results import Command.Result ( Result )@@ -45,7 +45,7 @@ -- | Options needed to generate the cFS application. data CommandOpts = CommandOpts { cFSAppConditionExpr :: Maybe String- , cFSAppInputFile :: Maybe String+ , cFSAppInputFiles :: [String] , cFSAppTarget :: String , cFSAppTemplateDir :: Maybe String , cFSAppVarNames :: Maybe String@@ -67,7 +67,7 @@ where options = Command.CFSApp.CommandOptions { Command.CFSApp.commandConditionExpr = cFSAppConditionExpr c- , Command.CFSApp.commandInputFile = cFSAppInputFile c+ , Command.CFSApp.commandInputFiles = cFSAppInputFiles c , Command.CFSApp.commandTargetDir = cFSAppTarget c , Command.CFSApp.commandTemplateDir = cFSAppTemplateDir c , Command.CFSApp.commandVariables = cFSAppVarNames c@@ -96,7 +96,7 @@ <> help strCFSAppConditionExprArgDesc ) )- <*> optional+ <*> many ( strOption ( long "input-file" <> metavar "FILENAME"
src/CLI/CommandFPrimeApp.hs view
@@ -30,8 +30,8 @@ where -- External imports-import Options.Applicative ( Parser, help, long, metavar, optional, short,- showDefault, strOption, value )+import Options.Applicative ( Parser, help, long, many, metavar, optional,+ short, showDefault, strOption, value ) -- External imports: command results import Command.Result ( Result )@@ -45,7 +45,7 @@ -- | Options needed to generate the FPrime component. data CommandOpts = CommandOpts { fprimeAppConditionExpr :: Maybe String- , fprimeAppInputFile :: Maybe String+ , fprimeAppInputFiles :: [String] , fprimeAppTarget :: String , fprimeAppTemplateDir :: Maybe String , fprimeAppVariables :: Maybe String@@ -68,7 +68,7 @@ options = Command.FPrimeApp.CommandOptions { Command.FPrimeApp.commandConditionExpr = fprimeAppConditionExpr c- , Command.FPrimeApp.commandInputFile = fprimeAppInputFile c+ , Command.FPrimeApp.commandInputFiles = fprimeAppInputFiles c , Command.FPrimeApp.commandTargetDir = fprimeAppTarget c , Command.FPrimeApp.commandTemplateDir = fprimeAppTemplateDir c , Command.FPrimeApp.commandVariables = fprimeAppVariables c@@ -97,7 +97,7 @@ <> help strFPrimeAppConditionExprArgDesc ) )- <*> optional+ <*> many ( strOption ( long "input-file" <> metavar "FILENAME"
src/CLI/CommandOverview.hs view
@@ -61,9 +61,11 @@ (mOutput, result) <- Command.Overview.command (overviewInputFile c) internalCommandOpts - case (mOutput, outputString) of- (Just output, Right template) ->- T.putStr $ renderMustache template (toJSON output)+ case mOutput of+ Just output ->+ case outputString output of+ Right template -> T.putStr $ renderMustache template (toJSON output)+ _ -> putStrLn "Error" _ -> putStrLn "Error" return result @@ -75,20 +77,32 @@ , Command.Overview.commandPropVia = overviewPropVia c } - outputString = compileMustacheText "output" $ T.unlines- [ "The file has:"- , " - {{commandExternalVariables}} external variables."- , " - {{commandInternalVariables}} internal variables."- , " - {{commandRequirements}} requirements."- , " - {{commandRequirementsTrue}} requirements are constantly or always true."- , " - {{commandRequirementsFalse}} requirements are constantly or always false."- , "{{#commandRequirementsConsistent}}"- , " - No inconsistencies detected in the requirements."- , "{{/commandRequirementsConsistent}}"- , "{{^commandRequirementsConsistent}}"- , " - The requirements are not mutually consistent."- , "{{/commandRequirementsConsistent}}"- ]+ outputString (Command.Overview.CommandSummaryRequirement {}) =+ compileMustacheText "output" $ T.unlines+ [ "The requirements file has:"+ , " - {{commandExternalVariables}} external variables."+ , " - {{commandInternalVariables}} internal variables."+ , " - {{commandRequirements}} requirements."+ , " - {{commandRequirementsTrue}} requirements are constantly or always true."+ , " - {{commandRequirementsFalse}} requirements are constantly or always false."+ , "{{#commandRequirementsConsistent}}"+ , " - No inconsistencies detected in the requirements."+ , "{{/commandRequirementsConsistent}}"+ , "{{^commandRequirementsConsistent}}"+ , " - The requirements are not mutually consistent."+ , "{{/commandRequirementsConsistent}}"+ ]+ outputString (Command.Overview.CommandSummaryDiagram {}) =+ compileMustacheText "output" $ T.unlines+ [ "The diagram file:"+ , " - Has {{commandNumStates}} states."+ , "{{#commandDeterministic}}"+ , " - Is deterministic."+ , "{{/commandDeterministic}}"+ , "{{^commandDeterministic}}"+ , " - Is not deterministic."+ , "{{/commandDeterministic}}"+ ] -- * CLI
src/CLI/CommandROSApp.hs view
@@ -45,7 +45,7 @@ -- | Options needed to generate the ROS application. data CommandOpts = CommandOpts { rosAppConditionExpr :: Maybe String- , rosAppInputFile :: Maybe String+ , rosAppInputFiles :: [String] , rosAppTarget :: String , rosAppTemplateDir :: Maybe String , rosAppVarNames :: Maybe String@@ -69,7 +69,7 @@ where options = Command.ROSApp.CommandOptions { Command.ROSApp.commandConditionExpr = rosAppConditionExpr c- , Command.ROSApp.commandInputFile = rosAppInputFile c+ , Command.ROSApp.commandInputFiles = rosAppInputFiles c , Command.ROSApp.commandTargetDir = rosAppTarget c , Command.ROSApp.commandTemplateDir = rosAppTemplateDir c , Command.ROSApp.commandVariables = rosAppVarNames c@@ -107,7 +107,7 @@ <> help strROSAppConditionExprArgDesc ) )- <*> optional+ <*> many ( strOption ( long "input-file" <> metavar "FILENAME"
+ src/CLI/CommandReport.hs view
@@ -0,0 +1,162 @@+-- Copyright 2020 United States Government as represented by the Administrator+-- of the National Aeronautics and Space Administration. All Rights Reserved.+--+-- Disclaimers+--+-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY+-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT+-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO+-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A+-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE+-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF+-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN+-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR+-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR+-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,+-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING+-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES+-- IT "AS IS."+--+-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST+-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS+-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN+-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,+-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S+-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE+-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY+-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY+-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS+-- AGREEMENT.+--+-- | CLI interface to the Report subcommand.+module CLI.CommandReport+ (+ -- * Direct command access+ command+ , CommandOpts+ , ErrorCode++ -- * CLI+ , commandDesc+ , commandOptsParser+ )+ where++-- External imports+import Options.Applicative (Parser, help, long, metavar, optional, short,+ showDefault, strOption, value)++-- External imports: command results+import Command.Result (Result (..))++-- External imports: actions or commands supported+import Command.Report (ErrorCode)+import qualified Command.Report++-- * Command++-- | Options to generate Copilot from specification.+data CommandOpts = CommandOpts+ { commandTargetDir :: FilePath -- ^ Target directory where the+ -- reoprt should be created.+ , commandTemplateDir :: Maybe FilePath -- ^ Directory where the template+ -- is to be found.+ , commandFileName :: FilePath+ , commandFormat :: String+ , commandPropFormat :: String+ , commandPropVia :: Maybe String+ }++-- | Generate a report of the input specification(s).+command :: CommandOpts -- ^ Customization options+ -> IO (Result ErrorCode)+command options = do+ Command.Report.command internalCommandOpts++ where+ internalCommandOpts :: Command.Report.CommandOptions+ internalCommandOpts = Command.Report.CommandOptions+ { Command.Report.commandTargetDir = commandTargetDir options+ , Command.Report.commandTemplateDir = commandTemplateDir options+ , Command.Report.commandInputFile = commandFileName options+ , Command.Report.commandFormat = commandFormat options+ , Command.Report.commandPropFormat = commandPropFormat options+ , Command.Report.commandPropVia = commandPropVia options+ }++-- * CLI++-- | Command description for CLI help.+commandDesc :: String+commandDesc = "Generate a report of the input specification(s)."++-- | Subparser for the @report@ command, used to generate a Copilot+-- specification from an input specification file.+commandOptsParser :: Parser CommandOpts+commandOptsParser = CommandOpts+ <$> strOption+ ( long "target-dir"+ <> metavar "DIR"+ <> showDefault+ <> value "report"+ <> help strReportTargetDirDesc+ )+ <*> optional+ ( strOption+ ( long "template-dir"+ <> metavar "DIR"+ <> help strReportTemplateDirArgDesc+ )+ )+ <*> strOption+ ( long "file-name"+ <> metavar "FILENAME"+ <> help strReportFilenameDesc+ )+ <*> strOption+ ( long "input-format"+ <> short 'f'+ <> metavar "FORMAT_NAME"+ <> help strReportFormatDesc+ <> showDefault+ <> value "fcs"+ )+ <*> strOption+ ( long "prop-format"+ <> short 'p'+ <> metavar "FORMAT_NAME"+ <> help strReportPropFormatDesc+ <> showDefault+ <> value "smv"+ )+ <*> optional+ ( strOption+ ( long "parse-prop-via"+ <> metavar "COMMAND"+ <> help strReportPropViaDesc+ )+ )++-- | Target dir flag description.+strReportTargetDirDesc :: String+strReportTargetDirDesc = "Target directory"++-- | Template dir flag description.+strReportTemplateDirArgDesc :: String+strReportTemplateDirArgDesc = "Directory holding report template"++-- | Filename flag description.+strReportFilenameDesc :: String+strReportFilenameDesc = "File with properties, requirements or a diagram"++-- | Format flag description.+strReportFormatDesc :: String+strReportFormatDesc = "Format of the input file"++-- | Property format flag description.+strReportPropFormatDesc :: String+strReportPropFormatDesc = "Format of temporal or boolean properties"++-- | External command to pre-process individual properties.+strReportPropViaDesc :: String+strReportPropViaDesc = "Command to pre-process individual properties"
src/CLI/CommandStandalone.hs view
@@ -48,7 +48,7 @@ { standaloneTargetDir :: FilePath , standaloneTemplateDir :: Maybe FilePath , standaloneConditionExpr :: Maybe String- , standaloneInputFile :: Maybe FilePath+ , standaloneInputFiles :: [FilePath] , standaloneFormat :: String , standalonePropFormat :: String , standaloneTypes :: [String]@@ -65,7 +65,7 @@ internalCommandOpts :: Command.Standalone.CommandOptions internalCommandOpts = Command.Standalone.CommandOptions { Command.Standalone.commandConditionExpr = standaloneConditionExpr c- , Command.Standalone.commandInputFile = standaloneInputFile c+ , Command.Standalone.commandInputFiles = standaloneInputFiles c , Command.Standalone.commandTargetDir = standaloneTargetDir c , Command.Standalone.commandTemplateDir = standaloneTemplateDir c , Command.Standalone.commandFormat = standaloneFormat c@@ -117,7 +117,7 @@ <> help strStandaloneConditionExprDesc ) )- <*> optional+ <*> many ( strOption ( long "input-file" <> metavar "FILENAME"@@ -182,9 +182,9 @@ strStandaloneConditionExprDesc = "Condition upon which the monitor will fire or notify" --- | Input file flag description.+-- | Input files flag description. strStandaloneInputFileDesc :: String-strStandaloneInputFileDesc = "File with properties or requirements"+strStandaloneInputFileDesc = "File(s) with properties or requirements" -- | Format flag description. strStandaloneFormatDesc :: String
src/CLI/CommandTop.hs view
@@ -79,6 +79,7 @@ import qualified CLI.CommandDiagram import qualified CLI.CommandFPrimeApp import qualified CLI.CommandOverview+import qualified CLI.CommandReport import qualified CLI.CommandROSApp import qualified CLI.CommandStandalone @@ -98,6 +99,7 @@ | CommandOptsOverview CLI.CommandOverview.CommandOpts | CommandOptsROSApp CLI.CommandROSApp.CommandOpts | CommandOptsStandalone CLI.CommandStandalone.CommandOpts+ | CommandOptsReport CLI.CommandReport.CommandOpts -- * CLI @@ -117,6 +119,7 @@ <> subcommandROSApp <> subcommandStandalone <> subcommandDiagram+ <> subcommandReport ) -- | Modifier for the overview subcommand, linking the subcommand options and@@ -194,6 +197,15 @@ (CommandOptsDiagram <$> CLI.CommandDiagram.commandOptsParser) CLI.CommandDiagram.commandDesc +-- | Modifier for the report subcommand, linking the subcommand options and+-- description to the command @report@ at top level.+subcommandReport :: Mod CommandFields CommandOpts+subcommandReport =+ subcommand+ "report"+ (CommandOptsReport <$> CLI.CommandReport.commandOptsParser)+ CLI.CommandReport.commandDesc+ -- * Command dispatcher -- | Command dispatcher that obtains the parameters from the command line and@@ -232,6 +244,8 @@ id <$> CLI.CommandStandalone.command c command (CommandOptsDiagram c) = id <$> CLI.CommandDiagram.command c+command (CommandOptsReport c) =+ id <$> CLI.CommandReport.command c -- We indicate to HLint that the use of (id <$>) above should not trigger a -- warning. Conceptually, there is a transformation taking place, but no change