1#!/usr/bin/env python3
2
3import os
4import sys
5try:
6    import __builtin__
7except ImportError:
8    import builtins as __builtin__
9
10
11# python puts the program's directory path in sys.path[0].  In other words, the user ordinarily has no way
12# to override python's choice of a module from its own dir.  We want to have that ability in our environment.
13# However, we don't want to break any established python modules that depend on this behavior.  So, we'll
14# save the value from sys.path[0], delete it, import our modules and then restore sys.path to its original
15# value.
16
17save_path_0 = sys.path[0]
18del sys.path[0]
19
20from gen_print import *     # NOQA
21from gen_arg import *       # NOQA
22from gen_plug_in import *   # NOQA
23
24# Restore sys.path[0].
25sys.path.insert(0, save_path_0)
26
27
28# Create parser object to process command line parameters and args.
29
30# Create parser object.
31parser = argparse.ArgumentParser(
32    usage='%(prog)s [OPTIONS] [PLUG_IN_DIR_PATHS]',
33    description="%(prog)s will validate the plug-in packages passed to it."
34                + "  It will also print a list of the absolute plug-in"
35                + " directory paths for use by the calling program.",
36    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
37    prefix_chars='-+')
38
39# Create arguments.
40parser.add_argument(
41    'plug_in_dir_paths',
42    nargs='?',
43    default="",
44    help=plug_in_dir_paths_help_text + default_string)
45
46parser.add_argument(
47    '--mch_class',
48    default="obmc",
49    help=mch_class_help_text + default_string)
50
51# The stock_list will be passed to gen_get_options.  We populate it with the names of stock parm options we
52# want.  These stock parms are pre-defined by gen_get_options.
53stock_list = [("test_mode", 0), ("quiet", 1), ("debug", 0)]
54
55
56def exit_function(signal_number=0,
57                  frame=None):
58    r"""
59    Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).
60    """
61
62    dprint_executing()
63    dprint_var(signal_number)
64
65    qprint_pgm_footer()
66
67
68def signal_handler(signal_number, frame):
69    r"""
70    Handle signals.  Without a function to catch a SIGTERM or SIGINT, our program would terminate immediately
71    with return code 143 and without calling our exit_function.
72    """
73
74    # Our convention is to set up exit_function with atexit.registr() so there is no need to explicitly call
75    # exit_function from here.
76
77    dprint_executing()
78
79    # Calling exit prevents us from returning to the code that was running when we received the signal.
80    exit(0)
81
82
83def validate_parms():
84    r"""
85    Validate program parameters, etc.  Return True or False accordingly.
86    """
87
88    gen_post_validation(exit_function, signal_handler)
89
90    return True
91
92
93def main():
94    r"""
95    This is the "main" function.  The advantage of having this function vs just doing this in the true
96    mainline is that you can:
97    - Declare local variables
98    - Use "return" instead of "exit".
99    - Indent 4 chars like you would in any function.
100    This makes coding more consistent, i.e. it's easy to move code from here into a function and vice versa.
101    """
102
103    if not gen_get_options(parser, stock_list):
104        return False
105
106    if not validate_parms():
107        return False
108
109    qprint_pgm_header()
110
111    # Access program parameter globals.
112    global plug_in_dir_paths
113    global mch_class
114
115    plug_in_packages_list = return_plug_in_packages_list(plug_in_dir_paths,
116                                                         mch_class)
117    qprint_var(plug_in_packages_list)
118
119    # As stated in the help text, this program must print the full paths of each selected plug in.
120    for plug_in_dir_path in plug_in_packages_list:
121        print(plug_in_dir_path)
122
123    return True
124
125
126# Main
127
128if not main():
129    exit(1)
130