| #!/usr/bin/env python | 
 |  | 
 | r""" | 
 | This module provides valuable argument processing functions like | 
 | gen_get_options and sprint_args. | 
 | """ | 
 |  | 
 | import sys | 
 | import __builtin__ | 
 | import atexit | 
 | import signal | 
 | import argparse | 
 |  | 
 | import gen_print as gp | 
 |  | 
 | default_string = '  The default value is "%(default)s".' | 
 |  | 
 |  | 
 | ############################################################################### | 
 | def gen_get_options(parser, | 
 |                     stock_list=[]): | 
 |  | 
 |     r""" | 
 |     Parse the command line arguments using the parser object passed and return | 
 |     True/False (i.e. pass/fail).  Also set the following built in values: | 
 |  | 
 |     __builtin__.quiet      This value is used by the qprint functions. | 
 |     __builtin__.test_mode  This value is used by command processing functions. | 
 |     __builtin__.debug      This value is used by the dprint functions. | 
 |     __builtin__.arg_obj    This value is used by print_program_header, etc. | 
 |     __builtin__.parser     This value is used by print_program_header, etc. | 
 |  | 
 |     Description of arguments: | 
 |     parser                          A parser object.  See argparse module | 
 |                                     documentation for details. | 
 |     stock_list                      The caller can use this parameter to | 
 |                                     request certain stock parameters offered | 
 |                                     by this function.  For example, this | 
 |                                     function will define a "quiet" option upon | 
 |                                     request.  This includes stop help text and | 
 |                                     parm checking.  The stock_list is a list | 
 |                                     of tuples each of which consists of an | 
 |                                     arg_name and a default value.  Example: | 
 |                                     stock_list = [("test_mode", 0), ("quiet", | 
 |                                     1), ("debug", 0)] | 
 |     """ | 
 |  | 
 |     # This is a list of stock parms that we support. | 
 |     master_stock_list = ["quiet", "test_mode", "debug", "loglevel"] | 
 |  | 
 |     # Process stock_list. | 
 |     for ix in range(0, len(stock_list)): | 
 |         if len(stock_list[ix]) < 1: | 
 |             gp.print_error_report("Programmer error - stock_list[" + str(ix) + | 
 |                                   "] is supposed to be a tuple containing at" + | 
 |                                   " least one element which is the name of" + | 
 |                                   " the desired stock parameter:\n" + | 
 |                                   gp.sprint_var(stock_list)) | 
 |             return False | 
 |         if type(stock_list[ix]) is tuple: | 
 |             arg_name = stock_list[ix][0] | 
 |             default = stock_list[ix][1] | 
 |         else: | 
 |             arg_name = stock_list[ix] | 
 |             default = None | 
 |  | 
 |         if arg_name not in master_stock_list: | 
 |             gp.pvar(arg_name) | 
 |             gp.print_error_report("Programmer error - \"" + arg_name + | 
 |                                   "\" not found found in stock list:\n" + | 
 |                                   gp.sprint_var(master_stock_list)) | 
 |             return False | 
 |  | 
 |         if arg_name == "quiet": | 
 |             if default is None: | 
 |                 default = 0 | 
 |             parser.add_argument( | 
 |                 '--quiet', | 
 |                 default=default, | 
 |                 type=int, | 
 |                 choices=[1, 0], | 
 |                 help='If this parameter is set to "1", %(prog)s' + | 
 |                      ' will print only essential information, i.e. it will' + | 
 |                      ' not echo parameters, echo commands, print the total' + | 
 |                      ' run time, etc.' + default_string) | 
 |         elif arg_name == "test_mode": | 
 |             if default is None: | 
 |                 default = 0 | 
 |             parser.add_argument( | 
 |                 '--test_mode', | 
 |                 default=default, | 
 |                 type=int, | 
 |                 choices=[1, 0], | 
 |                 help='This means that %(prog)s should go through all the' + | 
 |                      ' motions but not actually do anything substantial.' + | 
 |                      '  This is mainly to be used by the developer of' + | 
 |                      ' %(prog)s.' + default_string) | 
 |         elif arg_name == "debug": | 
 |             if default is None: | 
 |                 default = 0 | 
 |             parser.add_argument( | 
 |                 '--debug', | 
 |                 default=default, | 
 |                 type=int, | 
 |                 choices=[1, 0], | 
 |                 help='If this parameter is set to "1", %(prog)s will print' + | 
 |                      ' additional debug information.  This is mainly to be' + | 
 |                      ' used by the developer of %(prog)s.' + default_string) | 
 |         elif arg_name == "loglevel": | 
 |             if default is None: | 
 |                 default = "info" | 
 |             parser.add_argument( | 
 |                 '--loglevel', | 
 |                 default=default, | 
 |                 type=str, | 
 |                 choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL', | 
 |                          'debug', 'info', 'warning', 'error', 'critical'], | 
 |                 help='If this parameter is set to "1", %(prog)s will print' + | 
 |                      ' additional debug information.  This is mainly to be' + | 
 |                      ' used by the developer of %(prog)s.' + default_string) | 
 |  | 
 |     arg_obj = parser.parse_args() | 
 |  | 
 |     __builtin__.quiet = 0 | 
 |     __builtin__.test_mode = 0 | 
 |     __builtin__.debug = 0 | 
 |     __builtin__.loglevel = 'WARNING' | 
 |     for ix in range(0, len(stock_list)): | 
 |         if type(stock_list[ix]) is tuple: | 
 |             arg_name = stock_list[ix][0] | 
 |             default = stock_list[ix][1] | 
 |         else: | 
 |             arg_name = stock_list[ix] | 
 |             default = None | 
 |         if arg_name == "quiet": | 
 |             __builtin__.quiet = arg_obj.quiet | 
 |         elif arg_name == "test_mode": | 
 |             __builtin__.test_mode = arg_obj.test_mode | 
 |         elif arg_name == "debug": | 
 |             __builtin__.debug = arg_obj.debug | 
 |         elif arg_name == "loglevel": | 
 |             __builtin__.loglevel = arg_obj.loglevel | 
 |  | 
 |     __builtin__.arg_obj = arg_obj | 
 |     __builtin__.parser = parser | 
 |  | 
 |     # For each command line parameter, create a corresponding global variable | 
 |     # and assign it the appropriate value.  For example, if the command line | 
 |     # contained "--last_name='Smith', we'll create a global variable named | 
 |     # "last_name" with the value "Smith". | 
 |     module = sys.modules['__main__'] | 
 |     for key in arg_obj.__dict__: | 
 |         setattr(module, key, getattr(__builtin__.arg_obj, key)) | 
 |  | 
 |     return True | 
 |  | 
 | ############################################################################### | 
 |  | 
 |  | 
 | ############################################################################### | 
 | def set_pgm_arg(var_value, | 
 |                 var_name=None): | 
 |  | 
 |     r""" | 
 |     Set the value of the arg_obj.__dict__ entry named in var_name with the | 
 |     var_value provided.  Also, set corresponding global variable. | 
 |  | 
 |     Description of arguments: | 
 |     var_value                       The value to set in the variable. | 
 |     var_name                        The name of the variable to set.  This | 
 |                                     defaults to the name of the variable used | 
 |                                     for var_value when calling this function. | 
 |     """ | 
 |  | 
 |     if var_name is None: | 
 |         var_name = gp.get_arg_name(None, 1, 2) | 
 |  | 
 |     arg_obj.__dict__[var_name] = var_value | 
 |     module = sys.modules['__main__'] | 
 |     setattr(module, var_name, var_value) | 
 |     if var_name == "quiet": | 
 |         __builtin__.quiet = var_value | 
 |     elif var_name == "debug": | 
 |         __builtin__.debug = var_value | 
 |     elif var_name == "test_mode": | 
 |         __builtin__.test_mode = var_value | 
 |  | 
 | ############################################################################### | 
 |  | 
 |  | 
 | # Put this in gen_opt.py or gen_parm.py or gen_arg.py. | 
 | ############################################################################### | 
 | def sprint_args(arg_obj, | 
 |                 indent=0): | 
 |  | 
 |     r""" | 
 |     sprint_var all of the arguments found in arg_obj and return the result as | 
 |     a string. | 
 |  | 
 |     Description of arguments: | 
 |     arg_obj                         An argument object such as is returned by | 
 |                                     the argparse parse_args() method. | 
 |     indent                          The number of spaces to indent each line | 
 |                                     of output. | 
 |     """ | 
 |  | 
 |     loc_col1_width = gp.col1_width + indent | 
 |  | 
 |     buffer = "" | 
 |  | 
 |     for key in arg_obj.__dict__: | 
 |         buffer += gp.sprint_varx(key, getattr(arg_obj, key), 0, indent, | 
 |                                  loc_col1_width) | 
 |  | 
 |     return buffer | 
 |  | 
 | ############################################################################### | 
 |  | 
 |  | 
 | ############################################################################### | 
 | def gen_post_validation(exit_function=None, | 
 |                         signal_handler=None): | 
 |  | 
 |     r""" | 
 |     Do generic post-validation processing.  By "post", we mean that this is to | 
 |     be called from a validation function after the caller has done any | 
 |     validation desired.  If the calling program passes exit_function and | 
 |     signal_handler parms, this function will register them.  In other words, | 
 |     it will make the signal_handler functions get called for SIGINT and | 
 |     SIGTERM and will make the exit_function function run prior to the | 
 |     termination of the program. | 
 |  | 
 |     Description of arguments: | 
 |     exit_function                   A function object pointing to the caller's | 
 |                                     exit function. | 
 |     signal_handler                  A function object pointing to the caller's | 
 |                                     signal_handler function. | 
 |     """ | 
 |  | 
 |     if exit_function is not None: | 
 |         atexit.register(exit_function) | 
 |     if signal_handler is not None: | 
 |         signal.signal(signal.SIGINT, signal_handler) | 
 |         signal.signal(signal.SIGTERM, signal_handler) | 
 |  | 
 | ############################################################################### |