| #!/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) |
| |
| ############################################################################### |