Source code for simulator.utils.DtnArgumentParser
from argparse import ArgumentParser, HelpFormatter
import itertools
import sys
from pathlib import Path
# ============================================================================================================
# === DTN ARGUMENT PARSER CLASSES
# ============================================================================================================
[docs]class DtnArgumentParser(ArgumentParser):
''' Subclass of Python's native ArgumentParser that incorporates a function to display warning messages related
to the arguments.
'''
def __init__(self, *args, **kwargs):
''' Constructor simply calls ArgumentParser constructor '''
super().__init__(*args, **kwargs)
[docs] def warning(self, message):
''' Display a warning message related to one of the arguments. The format is consistent with that of errors
:param str message: Warning message to display
'''
print('{}: WARNING: {}\n'.format(self.prog, message))
[docs] def error(self, message):
print('{}: ERROR: {}\n'.format(self.prog, message))
self.print_help()
sys.exit(-1)
# ============================================================================================================
# === DTN ARGUMENT PARSE FUNCTIONS
# ============================================================================================================
[docs]def get_argument_parser():
''' Parse the command-line arguments for this program
:return ArchNetArgumentParser: The argument parser
'''
formatter = lambda prog: HelpFormatter(prog, max_help_position=50, width=200)
parser = DtnArgumentParser(prog='Dtn Simulator', formatter_class=formatter, description='DTN Network Simulator')
# Add required arguments for running in config file mode
parser.add_argument('-cf', '--configfile', help='configuration file path',
type=str, default=None, nargs='?')
# Add optional arguments
parser.add_argument('-v', '--validate', help='run unit tests',
action='store_true')
return parser
def dict_to_args_list(args):
argnames, argvals = zip(*args.items())
argnames = ['--' + name for name in argnames]
return itertools.chain.from_iterable(zip(argnames, argvals))
[docs]def process_arguments(args=None):
''' Process the arguments of the application and run ArchNet in batch or GUI mode depending on what is specified
:param None or dict:
'''
# Get argument parser
parser = get_argument_parser()
# If no arguments provided, use argument parser
if not args:
args = parser.parse_args()
elif isinstance(args, dict):
args = parser.parse_args(dict_to_args_list(args))
elif args != None:
raise RuntimeError('process_arguments: args can only be None or a dictionary')
if not args.configfile: return args
# Check the validity of the configuration file
configfile = Path(args.configfile)
if not configfile.exists():
raise FileExistsError(f'Configuration file {configfile} does not exist')
if configfile.suffix not in ['.yaml', '.yml']:
raise ValueError(f'The configuration file {configfile} is not a YAML file')
return args