packages feed

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 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