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