Revisions subject to comments on PR #100

Additionally, reverted FakeSystemExit subclassing Exception, but added
an explicit __init__ so that we can emulate the SystemExit.code
functionality without having to change the superclass.
main
Bill Flynn 7 years ago
parent 66c90c5d43
commit 0c7ba85af9

@ -69,7 +69,6 @@ def execute(raw_args=sys.argv):
prog="pubs", add_help=True) prog="pubs", add_help=True)
parser.add_argument('--version', action='version', version=__version__) parser.add_argument('--version', action='version', version=__version__)
subparsers = parser.add_subparsers(title="valid commands", dest="command") subparsers = parser.add_subparsers(title="valid commands", dest="command")
#subparsers.required = True
# Populate the parser with core commands # Populate the parser with core commands
for cmd_name, cmd_mod in CORE_CMDS.items(): for cmd_name, cmd_mod in CORE_CMDS.items():
@ -86,11 +85,11 @@ def execute(raw_args=sys.argv):
# Parse and run appropriate command # Parse and run appropriate command
# if no command, print help and exit peacefully (as '--help' does) # if no command, print help and exit peacefully (as '--help' does)
args = parser.parse_args(remaining_args) args = parser.parse_args(remaining_args)
if not args.command: if not args.command:
parser.print_help() ui.error("Too few arguments!\n")
sys.exit(0) parser.print_help(file=sys.stderr)
sys.exit(2)
args.prog = "pubs" # FIXME? args.prog = "pubs" # FIXME?
args.func(conf, args) args.func(conf, args)

@ -29,14 +29,21 @@ PRINT_OUTPUT = False
CAPTURE_OUTPUT = True CAPTURE_OUTPUT = True
class FakeSystemExit(SystemExit): class FakeSystemExit(Exception):
"""\ """\
SystemExit exceptions are replaced by FakeSystemExit in the execute_cmds() SystemExit exceptions are replaced by FakeSystemExit in the execute_cmds()
function, so they can be catched by ExpectedFailure tests in Python 2.x. function, so they can be catched by ExpectedFailure tests in Python 2.x.
If a code is expected to raise SystemExit, catch FakeSystemExit instead. If a code is expected to raise SystemExit, catch FakeSystemExit instead.
Added explicit __init__ so SystemExit.code functionality could be emulated.
Taking form from https://stackoverflow.com/a/26938914/1634191
""" """
pass def __init__(self, message, code=None, *args):
self.message = message
self.code = code
super(FakeSystemExit, self).__init__(message, *args)
# code for fake fs # code for fake fs
@ -131,7 +138,7 @@ class CommandTestCase(fake_env.TestFakeFs):
exc_class, exc, tb = sys.exc_info() exc_class, exc, tb = sys.exc_info()
if sys.version_info.major == 2: if sys.version_info.major == 2:
# using six to avoid a SyntaxError in Python 3.x # using six to avoid a SyntaxError in Python 3.x
six.reraise(FakeSystemExit, *exc.args, exc_traceback=tb) six.reraise(FakeSystemExit, FakeSystemExit(*exc.args), tb)
else: else:
raise FakeSystemExit(*exc.args).with_traceback(tb) raise FakeSystemExit(*exc.args).with_traceback(tb)
@ -189,6 +196,13 @@ class URLContentTestCase(DataCommandTestCase):
class TestAlone(CommandTestCase): class TestAlone(CommandTestCase):
def test_alone_misses_command(self):
with self.assertRaises(FakeSystemExit) as cm:
self.execute_cmds(['pubs'])
self.assertEqual(cm.exception.code, 2)
@unittest.skipIf(sys.version_info.major == 2, "not supported for Python2")
def test_alone_prints_help(self): def test_alone_prints_help(self):
# capturing the output of `pubs --help` is difficult because argparse # capturing the output of `pubs --help` is difficult because argparse
# raises as SystemExit(0) after calling `print_help`, and this gets # raises as SystemExit(0) after calling `print_help`, and this gets
@ -196,15 +210,14 @@ class TestAlone(CommandTestCase):
# `pubs --help` isn't too easy unless substantially reorganization of # `pubs --help` isn't too easy unless substantially reorganization of
# the parser and testing context is made. instead, the exit codes of # the parser and testing context is made. instead, the exit codes of
# the two usecases are compared. # the two usecases are compared.
self.execute_cmds(['pubs init'])
with self.assertRaises(FakeSystemExit) as cm1: with self.assertRaises(FakeSystemExit) as cm1:
self.execute_cmds(['pubs']) self.execute_cmds(['pubs'])
with self.assertRaises(FakeSystemExit) as cm2: with self.assertRaises(FakeSystemExit) as cm2:
self.execute_cmds(['pubs --help']) self.execute_cmds(['pubs', '--help'])
self.assertEqual(cm1.exception.code, cm2.exception.code, 0) self.assertEqual(cm1.exception.code, cm2.exception.code, 2)
class TestInit(CommandTestCase): class TestInit(CommandTestCase):

Loading…
Cancel
Save