diff options
Diffstat (limited to 'scripts/utilsArgsParse.py')
| -rw-r--r-- | scripts/utilsArgsParse.py | 139 | 
1 files changed, 139 insertions, 0 deletions
| diff --git a/scripts/utilsArgsParse.py b/scripts/utilsArgsParse.py new file mode 100644 index 000000000000..e762edccc30d --- /dev/null +++ b/scripts/utilsArgsParse.py @@ -0,0 +1,139 @@ +""" Utility module handle program args and give help + +    -------------------------------------------------------------------------- +    File:     utilsArgsParse.py + +    Overview:  Python module to parse and validate program parameters +               against those required by the program whether mandatory +               or optional. +               Also give help information on arguments required by the +               program. + +    Gotchas:   None. + +    Copyright: None. +    -------------------------------------------------------------------------- + +""" + +# Python modules: +import getopt # Parse command line arguments + +# Third party modules: + +# In-house modules: + +# Instantiations: + +# User facing text: +strMsgErrorInvalidParameters = "Invalid parameters entered, -h for help. \nYou entered:\n" +strMsgErrorInvalidNoParams = "No parameters entered, -h for help\n" +strMsgErrorNumberParameters = "Number of parameters entered incorrect, %d parameters required. You entered:\n" +strMsgArgFileNotImplemented = "Sorry the --argFile is not implemented" + +#++--------------------------------------------------------------------------- +# Details: Validate the arguments passed in against the mandatory and +#          optional arguments specified. The argument format for the parameters +#          is required to work with the module getopt function getopt(). +#          Parameter vDictArgReq specifies which parameters are mandatory and +#          which are optional. The format is for example: +#            dictArgReq = {"-h": "o", # o = optional, m = mandatory +#                          "-m": "m", +#                          "--targetDir": "m", +#                          "--cfgBldDir": "o" } +# Args:    vArgv - (R) List of arguments and values. +#          vstrListArgs - (R) List of small arguments. +#          vListLongArgs - (R) List of long arguments. +#          vDictArgReq - (R) Map of arguments required. +#          vstrHelpInfo - (R) Formatted help text. +# Returns: Int - 0 success. +#                1 success display information, do nothing else. +#                -1 error invalid parameters. +#                -2 error incorrect number of mandatory parameters. +#          Dict - Map of arguments names to argument values +#          Str - Error message. +# Throws:  None. +#-- +def parse(vArgv, vstrListArgs, vListLongArgs, vDictArgReq, vstrHelpInfo): +    dictArgs = {} +    dictDummy = {} +    strDummy = "" + +    # Validate parameters above and error on not recognised +    try: +        dictOptsNeeded, dictArgsLeftOver = getopt.getopt(vArgv, +                                                         vstrListArgs, +                                                         vListLongArgs) +    except getopt.GetoptError: +        strMsg = strMsgErrorInvalidParameters +        strMsg += str(vArgv) +        return (-1, dictDummy, strMsg) + +    if len(dictOptsNeeded) == 0: +        strMsg = strMsgErrorInvalidNoParams +        return (-1, dictDummy, strMsg) + +    # Look for help -h before anything else +    for opt, arg in dictOptsNeeded: +        if opt == '-h': +            return (1, dictDummy, vstrHelpInfo) + +    # Look for the --argFile if found ignore other command line arguments +    for opt, arg in dictOptsNeeded: +        if opt == '--argsFile': +            return (1, dictDummy, strMsgArgFileNotImplemented) + +    # Count the number of mandatory args required (if any one found) +    countMandatory = 0 +    for opt, man in list(vDictArgReq.items()): +        if man == "m": +            countMandatory = countMandatory + 1 + +    # Extract short args +    listArgs = [] +    for arg in vstrListArgs: +        if (arg == '-h') or (arg == ':'): +            continue +        listArgs.append(arg) + +    # Append to arg dictionary the option and its value +    bFoundNoInputValue = False +    countMandatoryOpts = 0 +    for opt, val in dictOptsNeeded: +        match = 0 +        for arg in listArgs: +            argg = "-" + arg +            if opt == argg: +                if "m" == vDictArgReq[opt]: +                    countMandatoryOpts = countMandatoryOpts + 1 +                dictArgs[opt] = val +                match = 1 +                break +        if match == 0: +            for arg in vListLongArgs: +                argg = "--" + arg[:arg.__len__() - 1] +                if opt == argg: +                    if "m" == vDictArgReq[opt]: +                        countMandatoryOpts = countMandatoryOpts + 1 +                    dictArgs[opt] = val +                    if val.__len__() == 0: +                        bFoundNoInputValue = True +                    break + +    # Do any of the long arguments not have a value attached +    if bFoundNoInputValue: +        strMsg = strMsgErrorInvalidParameters +        strMsg += str(vArgv) +        return (-1, dictDummy, strMsg) + +    # Debug only +    #print countMandatoryOpts +    #print countMandatory + +    # Do we have the exact number of mandatory arguments +    if (countMandatoryOpts > 0) and (countMandatory != countMandatoryOpts): +        strMsg = strMsgErrorNumberParameters % countMandatory +        strMsg += str(vArgv) +        return (-2, dictDummy, strMsg) + +    return (0, dictArgs, strDummy) | 
