ui.cli: Add do_shell() and associated framework
authorW. Trevor King <wking@tremily.us>
Fri, 15 Feb 2013 03:03:24 +0000 (22:03 -0500)
committerW. Trevor King <wking@tremily.us>
Fri, 15 Feb 2013 03:18:20 +0000 (22:18 -0500)
commit6e70a3327ade3bd87ab54be2e7843f161d876eee
treeedb4f830922058637a7c6a5bf94b5b69296ae0ec
parent9e840075448d56f8dcef8e2f6d935d7a4b6c7de0
ui.cli: Add do_shell() and associated framework

For more open ended questions, users may need an interactive shell to
develop the answer, and we won't be able to bundle their answer with
setup and teardown instructions in a single script.  This commit
breaks setup and teardown into separate scripts, and moves the
TemporaryDirectory stuff over to quizzer.util.  If it's enabled via
allow_interactive, users can now drop into an interactive command
using !$COMMAND (e.g. !bash) from the cli user interface.

If you want to tweak environment variables for the answer script and
interactive commands, use the new environment dictionary.

For situations where you *do* need setup/teardown stuff in the answer
script (e.g. to check the current working directory or variables that
should have been altered by the user's answer action), you can use
the new pre_answer and post_answer.

Previous versions of ScriptQuestion compared the output of the single
setup/answer/teardown script to check for matches.  With this commit
we only compare the output of the teardown script, unless
compare_answers is set, in which case we compare both the answer
output and teardown output.  When we're not comparing the answer
output, we still plot nonempty user-answer standard errors, because
without seeing stderr, it can be difficult to determine where your
attempted command went wrong.

Existing quizzes were updated accordingly, with a few additional
tweaks and cleanups that I discovered while debugging.
quizzer/cli.py
quizzer/question.py
quizzer/ui/__init__.py
quizzer/ui/cli.py
quizzer/util.py
quizzes/git.json
quizzes/posix-shell.json
quizzes/posix-utilities.json