From 7737a04e742ed81366b1ea752878b6ae0cdb1331 Mon Sep 17 00:00:00 2001 From: nhertz <nhertz@nrao.edu> Date: Thu, 3 Sep 2020 15:06:46 -0600 Subject: [PATCH] Added type hinting to functions and methods. PEP8-ified things. --- apps/cli/executables/null/setup.py | 6 +- apps/cli/executables/null/src/null/null.py | 105 +++++++++++++------- apps/cli/executables/null/test/test_null.py | 8 +- 3 files changed, 76 insertions(+), 43 deletions(-) diff --git a/apps/cli/executables/null/setup.py b/apps/cli/executables/null/setup.py index 91b6b575c..c7a5dcaf9 100644 --- a/apps/cli/executables/null/setup.py +++ b/apps/cli/executables/null/setup.py @@ -7,9 +7,6 @@ from setuptools import setup VERSION = open('src/null/_version.py').readlines()[-1].split()[-1].strip("\"'") README = Path('README.md').read_text() -# requires = [ -# ] - tests_require = [ 'pytest>=5.4,<6.0' ] @@ -22,11 +19,10 @@ setup( author_email='dms-ssa@nrao.edu', url='TBD', license="GPL", - # install_requires=requires, tests_require=tests_require, keywords=[], packages=['null'], - package_dir={'':'src'}, + package_dir={'': 'src'}, classifiers=[ 'Programming Language :: Python :: 3.8' ], diff --git a/apps/cli/executables/null/src/null/null.py b/apps/cli/executables/null/src/null/null.py index 6f806ae60..1cdacad80 100644 --- a/apps/cli/executables/null/src/null/null.py +++ b/apps/cli/executables/null/src/null/null.py @@ -16,47 +16,75 @@ logger = logging.getLogger("null") logger.setLevel(logging.INFO) handler = logging.StreamHandler(stream=sys.stdout) -class Null: - def __init__(self, args, verbose): - self.args = args - if verbose: - logger.setLevel(logging.DEBUG) - self.args_to_funcs = { - 'print-error': self.print_error, - 'greeting': self.print_greeting, - 'exit-fail': self.exit_with_failure, - 'exit-random': self.exit_randomly, - 'nap': self.take_nap, - 'dump': self.dump_core - } - def print_error(self): - logger.removeHandler(handler) - err_handler = logging.StreamHandler(stream=sys.stderr) - logger.addHandler(err_handler) - logger.error("ERROR: This is an error.") +def print_error(): + """ + Logs an error message to stderr. + """ + logger.removeHandler(handler) + err_handler = logging.StreamHandler(stream=sys.stderr) + logger.addHandler(err_handler) + logger.error("ERROR: This is an error.") + + +def print_greeting(): + """ + Prints a friendly greeting to stdout + """ + logger.info("Hello, world!") + logger.debug("And goodbye, world...") + + +def exit_with_failure(): + """ + Exits with status code -1 + """ + logger.error("Error purposefully induced. Exiting with status code -1...") + sys.exit(-1) + + +def exit_randomly(): + """ + Exits with a random status code between -50 and 50 + """ + status_code = random.randint(-50, 50) + logger.debug("Exiting with status code {}".format(status_code)) + sys.exit(status_code) - def print_greeting(self): - logger.info("Hello, world!") - logger.debug("And goodbye, world...") - def exit_with_failure(self): - logger.error("Error purposefully induced. Exiting with status code -1...") - sys.exit(-1) +def take_nap(): + """ + Sleeps for 5 seconds + """ + logger.debug("Going to sleep...") + time.sleep(5) + logger.debug("Waking up.") - def exit_randomly(self): - status_code = random.randint(-50, 50) - logger.debug("Exiting with status code {}".format(status_code)) - sys.exit(status_code) - def take_nap(self): - logger.debug("Going to sleep...") - time.sleep(5) - logger.debug("Waking up.") +def dump_core(): + """ + Makes a call to os.abort() which dumps the core + """ + logger.debug("Aborting and dumping core...", stack_info=True) + os.abort() + - def dump_core(self): - logger.debug("Aborting and dumping core...", stack_info=True) - os.abort() +class Null: + """ + Null executable that executes null functionality based on arguments given + """ + def __init__(self, args: argparse.Namespace, verbose: bool): + self.args = args + if verbose: + logger.setLevel(logging.DEBUG) + self.args_to_funcs = { + 'print-error': print_error, + 'greeting': print_greeting, + 'exit-fail': exit_with_failure, + 'exit-random': exit_randomly, + 'nap': take_nap, + 'dump': dump_core + } def execute(self): """ @@ -66,7 +94,8 @@ class Null: if val and arg in self.args_to_funcs: self.args_to_funcs[arg]() -def make_arg_parser(): + +def make_arg_parser() -> argparse.ArgumentParser: """ Creates an argparse arguments parser with appropriate options :return: Said argument parser @@ -99,6 +128,7 @@ def make_arg_parser(): help='abort program and dump core') return parser + def main(): arg_parser = make_arg_parser() args = arg_parser.parse_args() @@ -107,5 +137,6 @@ def main(): executable = Null(args, args.verbose) executable.execute() + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/apps/cli/executables/null/test/test_null.py b/apps/cli/executables/null/test/test_null.py index ae8acdf8f..83f6b5fc4 100644 --- a/apps/cli/executables/null/test/test_null.py +++ b/apps/cli/executables/null/test/test_null.py @@ -3,33 +3,39 @@ import argparse from null.null import Null + @pytest.fixture() def null(): null = Null(argparse.Namespace(), True) return null + def test_print_error(null, caplog): null.print_error() assert 'ERROR: This is an error.' in caplog.text + def test_print_greeting(null, caplog): null.print_greeting() assert 'Hello, world!' in caplog.text assert 'And goodbye, world...' in caplog.text + def test_exit_with_failure(null, caplog): with pytest.raises(SystemExit) as e: null.exit_with_failure() assert 'Error purposefully induced. Exiting with status code -1...' in caplog.text assert e.value.code == -1 + def test_exit_randomly(null, caplog): with pytest.raises(SystemExit) as e: null.exit_randomly() assert 'Exiting with status code' in caplog.text assert -50 <= e.value.code <= 50 + def test_take_nap(null, caplog): null.take_nap() assert 'Going to sleep...' in caplog.text - assert 'Waking up.' in caplog.text \ No newline at end of file + assert 'Waking up.' in caplog.text -- GitLab