Skip to content
Snippets Groups Projects
Commit d0b9a5d6 authored by Nathan Hertz's avatar Nathan Hertz
Browse files

Merge pull request #22 in SSA/data from SSA-6319-implement-null-executable to main

* commit '7737a04e':
  Added type hinting to functions and methods. PEP8-ified things.
parents db664100 7737a04e
No related branches found
No related tags found
No related merge requests found
......@@ -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'
],
......
......@@ -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()
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment