quizzer.git
11 years agoquizzes/git: Fix JSON indentation for GIT_AUTHOR_EMAIL
W. Trevor King [Thu, 14 Feb 2013 15:38:51 +0000 (10:38 -0500)]
quizzes/git: Fix JSON indentation for GIT_AUTHOR_EMAIL

11 years agoui.cli: Avoid divide-by-zero errors if no questions were answered
W. Trevor King [Thu, 14 Feb 2013 14:17:08 +0000 (09:17 -0500)]
ui.cli: Avoid divide-by-zero errors if no questions were answered

11 years agoquiz: Add Quiz.introduction for an optional intro message
W. Trevor King [Thu, 14 Feb 2013 14:16:18 +0000 (09:16 -0500)]
quiz: Add Quiz.introduction for an optional intro message

11 years agoui.cli: `skip` shifts the current question to the back of the stack
W. Trevor King [Fri, 8 Feb 2013 03:41:40 +0000 (22:41 -0500)]
ui.cli: `skip` shifts the current question to the back of the stack

Rather than dropping skipped questions, just save them for later.
This gives you another stab at them without having to restart the
quiz.  If you still can't answer the questions once you reach them
again, you can always `quit` ;).

11 years agoui.cli: Add a `skip` command to the quizzer shell
W. Trevor King [Fri, 8 Feb 2013 03:39:18 +0000 (22:39 -0500)]
ui.cli: Add a `skip` command to the quizzer shell

This lets you bypass a difficult question on the stack and continue
with the rest of the quiz.

11 years agoui.cli: Unwrap multiline answers in display_result
W. Trevor King [Thu, 7 Feb 2013 21:11:41 +0000 (16:11 -0500)]
ui.cli: Unwrap multiline answers in display_result

No need to surprise the user with the internal list representation.

11 years agoui.cli: Use pygments to colorize command line output
W. Trevor King [Thu, 7 Feb 2013 21:10:05 +0000 (16:10 -0500)]
ui.cli: Use pygments to colorize command line output

11 years agoquizzes/git: Don't timeout during the 'gitignore' question v0.1
W. Trevor King [Thu, 7 Feb 2013 01:20:44 +0000 (20:20 -0500)]
quizzes/git: Don't timeout during the 'gitignore' question

In case the user decides to spawn an editor to tweak .gitignore.

11 years agoquizzes/git: Add remote-related questions
W. Trevor King [Thu, 7 Feb 2013 01:09:58 +0000 (20:09 -0500)]
quizzes/git: Add remote-related questions

New questions:
* git remote add
* git remote -v
* git fetch REPOSITORY
* git push REPOSITORY BRANCH

11 years agoquizzer/git: Add 'git merge' question
W. Trevor King [Thu, 7 Feb 2013 00:43:45 +0000 (19:43 -0500)]
quizzer/git: Add 'git merge' question

11 years agoquizzes/git: Add 'git checkout *' questions
W. Trevor King [Thu, 7 Feb 2013 00:40:23 +0000 (19:40 -0500)]
quizzes/git: Add 'git checkout *' questions

New questions:
* git checkout
* git checkout -b
* git checkout -b NEW_BRANCH START_POINT

11 years agoquizzes/git: Add 'git branch *' questions
W. Trevor King [Thu, 7 Feb 2013 00:22:58 +0000 (19:22 -0500)]
quizzes/git: Add 'git branch *' questions

New questions:
* git branch
* git branch -a
* git branch -r
* git branch -d

11 years agoquizzes/git: Fix 'in repository' -> 'in your repository'
W. Trevor King [Thu, 7 Feb 2013 00:20:03 +0000 (19:20 -0500)]
quizzes/git: Fix 'in repository' -> 'in your repository'

For the 'git rm / commit' question.

11 years agoquizzes/git: Add 'git rm / commit' question
W. Trevor King [Wed, 6 Feb 2013 22:50:04 +0000 (17:50 -0500)]
quizzes/git: Add 'git rm / commit' question

11 years agoquizzes/git: Add 'git log *' questions
W. Trevor King [Wed, 6 Feb 2013 22:39:26 +0000 (17:39 -0500)]
quizzes/git: Add 'git log *' questions

New questions:
* git log
* git log -p
* git log --stat
* git log --all
* git log --oneline
* git log --oneline --graph
* git log --oneline --decorate

11 years agoquizzes/git: Add 'git diff *' questions
W. Trevor King [Wed, 6 Feb 2013 22:08:03 +0000 (17:08 -0500)]
quizzes/git: Add 'git diff *' questions

New questions:
* git diff
* git diff HEAD --
* git diff HEAD -- README
* git diff --cached

11 years agoquizzes/git: Avoid escaped double-quotes when single-quotes will do
W. Trevor King [Wed, 6 Feb 2013 22:03:23 +0000 (17:03 -0500)]
quizzes/git: Avoid escaped double-quotes when single-quotes will do

11 years agoquizzes/git: Add 'git commit -a' question
W. Trevor King [Wed, 6 Feb 2013 22:03:05 +0000 (17:03 -0500)]
quizzes/git: Add 'git commit -a' question

11 years agoui.cli: Don't start the QuestionCommandLine with an empty stack
W. Trevor King [Wed, 6 Feb 2013 21:55:15 +0000 (16:55 -0500)]
ui.cli: Don't start the QuestionCommandLine with an empty stack

There's not much point in a question-answering shell if there are no
questions to be answered.

11 years agoquizzes/git: Add 'git status' question
W. Trevor King [Wed, 6 Feb 2013 21:54:36 +0000 (16:54 -0500)]
quizzes/git: Add 'git status' question

11 years agoquizzes/git: Add 'gitignore' question
W. Trevor King [Wed, 6 Feb 2013 21:37:59 +0000 (16:37 -0500)]
quizzes/git: Add 'gitignore' question

11 years agoui.cli: Quit after the last question
W. Trevor King [Wed, 6 Feb 2013 21:35:57 +0000 (16:35 -0500)]
ui.cli: Quit after the last question

Oops, should have tested that when I transitioned to Cmd ;).

11 years agoui.cli: Fix ._set_ps1 when .question is None
W. Trevor King [Wed, 6 Feb 2013 21:38:40 +0000 (16:38 -0500)]
ui.cli: Fix ._set_ps1 when .question is None

Otherwise QuestionCommandLine will crash if its launched with an empty
stack (not that this should happen, but we should still avoid the
crash).

11 years agoquizzes/git: Add 'git help config' question
W. Trevor King [Wed, 6 Feb 2013 21:14:45 +0000 (16:14 -0500)]
quizzes/git: Add 'git help config' question

11 years agoui.cli: Fix single-line answer extraction
W. Trevor King [Wed, 6 Feb 2013 21:13:10 +0000 (16:13 -0500)]
ui.cli: Fix single-line answer extraction

`var.get(key, default)` only works for dicts.  I don't think there is
an equivalent that works for lists.

11 years agocli: Add --select to filter the stack by index
W. Trevor King [Wed, 6 Feb 2013 21:02:12 +0000 (16:02 -0500)]
cli: Add --select to filter the stack by index

For example, you can show the questions in a quiz with either the
`config` tag or the `checkout` tag:

  $ ./pq.py --all --tag config --tag checkout --questions quizzes/git.json
  Question 0:
  Configure your user-wide name to be `A U Thor`.

  Question 1:
  Configure your user-wide email to be `author@example.com`.

  Question 2:
  You've messed up your README file.
  Restore it to the last committed version.

Say questions 0 and 2 look interesting, and you'd like to try question
2 first.  Run:

  $ ./pq.py --all --tag config --tag checkout -s 2 -s 0 quizzes/git.json

11 years agoui.cli: Add an `answer` command to QuestionCommandLine
W. Trevor King [Wed, 6 Feb 2013 20:09:20 +0000 (15:09 -0500)]
ui.cli: Add an `answer` command to QuestionCommandLine

This allows you to bypass quizzer-shell command handling when your
answer line starts with a quizzer-shell command.

11 years agoui.cli: Repeat the basic help when the user calls `help`
W. Trevor King [Wed, 6 Feb 2013 20:01:17 +0000 (15:01 -0500)]
ui.cli: Repeat the basic help when the user calls `help`

11 years agoui.cli: Transition to a CLI based on cmd.Cmd
W. Trevor King [Wed, 6 Feb 2013 19:57:27 +0000 (14:57 -0500)]
ui.cli: Transition to a CLI based on cmd.Cmd

This makes command handling more robust, and makes adding additional
non-answer commands more organized.

11 years agoquizzes: Convert multi-line help to lists
W. Trevor King [Wed, 6 Feb 2013 18:02:40 +0000 (13:02 -0500)]
quizzes: Convert multi-line help to lists

11 years agoquestion: Add support for list-of-lines help
W. Trevor King [Wed, 6 Feb 2013 17:59:39 +0000 (12:59 -0500)]
question: Add support for list-of-lines help

We use lists of lines for other question attributes (e.g. setup,
teardown, answer, prompt).  Be consistent with multi-line help.

11 years agoquizzes/git: Convert multi-line prompts to lists
W. Trevor King [Wed, 6 Feb 2013 17:53:31 +0000 (12:53 -0500)]
quizzes/git: Convert multi-line prompts to lists

11 years agoquestion: Add support for list-of-lines prompts
W. Trevor King [Wed, 6 Feb 2013 17:47:06 +0000 (12:47 -0500)]
question: Add support for list-of-lines prompts

We use lists of lines for other question attributes (e.g. setup,
teardown, answer).  Be consistent with multi-line prompts.

The handling is in Question.format_prompt() for easy access by any
consumer.  The `newline` option will make it easy to support
non-terminal output formats (e.g. `newline='<br/>'` for HTML).

11 years agoquizzes: Use complete sentences with punctation for prompts
W. Trevor King [Wed, 6 Feb 2013 17:45:51 +0000 (12:45 -0500)]
quizzes: Use complete sentences with punctation for prompts

This makes multi-sentence prompts less awkward.

11 years agocli: Add the --questions option to list questions on the stack
W. Trevor King [Wed, 6 Feb 2013 17:41:23 +0000 (12:41 -0500)]
cli: Add the --questions option to list questions on the stack

This lets you see what a quiz will ask without actually taking the
quiz.  In the future, it may be useful for jumping to a specific
question.

11 years agocli: Add the --tags option to list tags on the stack
W. Trevor King [Wed, 6 Feb 2013 14:59:11 +0000 (09:59 -0500)]
cli: Add the --tags option to list tags on the stack

11 years agoquizzes/git: Tag existing questions
W. Trevor King [Wed, 6 Feb 2013 14:57:16 +0000 (09:57 -0500)]
quizzes/git: Tag existing questions

11 years agoAdd --tag option and Question.tags sets for filtering large quizzes
W. Trevor King [Wed, 6 Feb 2013 14:56:47 +0000 (09:56 -0500)]
Add --tag option and Question.tags sets for filtering large quizzes

11 years agocli: Add --all for easy review of previously-answered questions
W. Trevor King [Wed, 6 Feb 2013 14:47:26 +0000 (09:47 -0500)]
cli: Add --all for easy review of previously-answered questions

11 years agoanswerdb: Timestamp answers
W. Trevor King [Wed, 6 Feb 2013 14:39:59 +0000 (09:39 -0500)]
answerdb: Timestamp answers

This may provide insight into the learning process (e.g. after I
reviewed the Git index, everyone started doing better).

11 years agoquizzes/git: Add 'git commit --amend' question
W. Trevor King [Wed, 6 Feb 2013 14:27:43 +0000 (09:27 -0500)]
quizzes/git: Add 'git commit --amend' question

11 years agoREADME.rst: Add a symlink for GitHub's README renderer
W. Trevor King [Wed, 6 Feb 2013 03:17:11 +0000 (22:17 -0500)]
README.rst: Add a symlink for GitHub's README renderer

11 years agoquizzes/git: Add 'git config --global user.{name,email}' questions
W. Trevor King [Wed, 6 Feb 2013 02:58:48 +0000 (21:58 -0500)]
quizzes/git: Add 'git config --global user.{name,email}' questions

11 years agoquizzes/git: Add 'git checkout HEAD -- FILE' question
W. Trevor King [Wed, 6 Feb 2013 02:43:06 +0000 (21:43 -0500)]
quizzes/git: Add 'git checkout HEAD -- FILE' question

11 years agoquestion: Add a trailing newline to ScriptQuestion scripts
W. Trevor King [Wed, 6 Feb 2013 02:31:01 +0000 (21:31 -0500)]
question: Add a trailing newline to ScriptQuestion scripts

11 years agoquestion: Pass stdin through to the ScriptQuestion-invoked script
W. Trevor King [Wed, 6 Feb 2013 02:21:07 +0000 (21:21 -0500)]
question: Pass stdin through to the ScriptQuestion-invoked script

Use a temporary script to hold the answer script, to leave stdin open.
This allows users to use commands that need stdin (e.g. `git commit`,
which spawns an `$EDITOR`).

11 years agoquizzes/git: Add 'git add / commit' question
W. Trevor King [Wed, 6 Feb 2013 01:56:06 +0000 (20:56 -0500)]
quizzes/git: Add 'git add / commit' question

Remove the default timeout, to give users who spawn `$EDITOR` via `git
commit` time to write and save their message.

11 years agoRun update-copyright.py
W. Trevor King [Tue, 5 Feb 2013 20:41:01 +0000 (15:41 -0500)]
Run update-copyright.py

11 years ago.update-copyright.conf: Configure update-copyright.py
W. Trevor King [Tue, 5 Feb 2013 20:38:11 +0000 (15:38 -0500)]
.update-copyright.conf: Configure update-copyright.py

http://blog.tremily.us/posts/update-copyright/
http://pypi.python.org/pypi/update-copyright/

11 years agoAdd `# Copyright` tags to Python files
W. Trevor King [Tue, 5 Feb 2013 20:37:04 +0000 (15:37 -0500)]
Add `# Copyright` tags to Python files

11 years ago.gitignore: Ignore MANIFEST and dist/ packaging side effects
W. Trevor King [Tue, 5 Feb 2013 20:33:32 +0000 (15:33 -0500)]
.gitignore: Ignore MANIFEST and dist/ packaging side effects

11 years agoMANIFEST.in: Distribute COPYING and quizzes/*.json
W. Trevor King [Tue, 5 Feb 2013 20:33:13 +0000 (15:33 -0500)]
MANIFEST.in: Distribute COPYING and quizzes/*.json

11 years agosetup.py: Package with distutils
W. Trevor King [Tue, 5 Feb 2013 20:31:03 +0000 (15:31 -0500)]
setup.py: Package with distutils

11 years agoREADME: Flesh out description and add example typescript
W. Trevor King [Tue, 5 Feb 2013 20:30:27 +0000 (15:30 -0500)]
README: Flesh out description and add example typescript

11 years agoREADME: Mention Python 3.3 dependency
W. Trevor King [Tue, 5 Feb 2013 20:11:44 +0000 (15:11 -0500)]
README: Mention Python 3.3 dependency

11 years agoCOPYING: Distribute quizzer under the GPLv3+
W. Trevor King [Tue, 5 Feb 2013 20:10:42 +0000 (15:10 -0500)]
COPYING: Distribute quizzer under the GPLv3+

11 years agoquizzes/git: Add preliminary Git quiz (repository creation)
W. Trevor King [Tue, 5 Feb 2013 20:09:41 +0000 (15:09 -0500)]
quizzes/git: Add preliminary Git quiz (repository creation)

11 years agoAdd Question.multiline and associated handling
W. Trevor King [Tue, 5 Feb 2013 20:07:32 +0000 (15:07 -0500)]
Add Question.multiline and associated handling

Some questions can't be answered in a single line without reqiring
more shell knowledge than we need (e.g. `&&`).

11 years agoui.cli: Import `readline` for more comfortable input() editing
W. Trevor King [Tue, 5 Feb 2013 19:39:02 +0000 (14:39 -0500)]
ui.cli: Import `readline` for more comfortable input() editing

11 years agoquizzes/posix-shell: Add a preliminary POSIX shell language quiz
W. Trevor King [Tue, 5 Feb 2013 19:37:21 +0000 (14:37 -0500)]
quizzes/posix-shell: Add a preliminary POSIX shell language quiz

11 years agoquizzes/posix-utilities: Rename from posix-shell.json and flesh out
W. Trevor King [Tue, 5 Feb 2013 19:10:03 +0000 (14:10 -0500)]
quizzes/posix-utilities: Rename from posix-shell.json and flesh out

Added few more questions:
* print the current directory to stdout
* change to your home directory
* change to the parent of your current working directory
* print the contents of README file to the terminal

The renaming is because the tests are testing knowledge of POSIX
utilities, not knowledge of the shell syntax itself.

11 years agoquestion: Normalize tempdir paths in stdout/stderr
W. Trevor King [Tue, 5 Feb 2013 19:09:05 +0000 (14:09 -0500)]
question: Normalize tempdir paths in stdout/stderr

Otherwise it's hard to test `pwd`, since tempdir will change between
the expected and user-supplied answer runs.

11 years agoquestion: Add ChoiceQuestion for one-of-several correct answers
W. Trevor King [Tue, 5 Feb 2013 18:54:18 +0000 (13:54 -0500)]
question: Add ChoiceQuestion for one-of-several correct answers

11 years agoquizzes: Move quizzes into a subdirectory
W. Trevor King [Tue, 5 Feb 2013 18:51:04 +0000 (13:51 -0500)]
quizzes: Move quizzes into a subdirectory

11 years agoAdd script invocation to ScriptQuestion
W. Trevor King [Tue, 5 Feb 2013 18:46:31 +0000 (13:46 -0500)]
Add script invocation to ScriptQuestion

We need Python >= 3.3 for the `timeout` argument to
Popen.communicate().

11 years agoRemove debugging print(self.stack) from UserInterface.get_question()
W. Trevor King [Tue, 5 Feb 2013 17:19:18 +0000 (12:19 -0500)]
Remove debugging print(self.stack) from UserInterface.get_question()

11 years agoInitial ScriptQuestion framework
W. Trevor King [Tue, 5 Feb 2013 17:18:21 +0000 (12:18 -0500)]
Initial ScriptQuestion framework

11 years agoFix 'hint' -> 'help' typos
W. Trevor King [Tue, 5 Feb 2013 16:52:30 +0000 (11:52 -0500)]
Fix 'hint' -> 'help' typos

11 years agoquestion: Use Question._state_attributes in __init__ and __setstate__
W. Trevor King [Tue, 5 Feb 2013 16:39:43 +0000 (11:39 -0500)]
question: Use Question._state_attributes in __init__ and __setstate__

11 years agoquestion: Add Question._state_attributes for easier subclassing
W. Trevor King [Tue, 5 Feb 2013 16:05:15 +0000 (11:05 -0500)]
question: Add Question._state_attributes for easier subclassing

This way subclasses can extend the list instead of overriding
__getstate__.

11 years agoAdd question class storage (lookups in QUESTION_CLASS)
W. Trevor King [Tue, 5 Feb 2013 15:58:40 +0000 (10:58 -0500)]
Add question class storage (lookups in QUESTION_CLASS)

This allows us to specify questions with alternate processing classes.
As a simple example, I've added NormalizedStringQuestion, which
softens the string comparison used in the basic Question.  The next
step is to add a command-line question ;).

11 years agoui.cli: Rework display_result() for multiple answers per question
W. Trevor King [Tue, 5 Feb 2013 15:45:11 +0000 (10:45 -0500)]
ui.cli: Rework display_result() for multiple answers per question

11 years agoui: Add dependency handling to UserInterface.get_question
W. Trevor King [Tue, 5 Feb 2013 15:37:41 +0000 (10:37 -0500)]
ui: Add dependency handling to UserInterface.get_question

We start the stack with all the leaf questions (i.e. questions that
are not dependencies of other question).  If the user gets one wrong,
we push the question back on the stack (so they can try again later),
and also push all of that questions direct dependencies onto the stack
(so they can get the background they need to answer the question they
got wrong).

11 years agoquestion: Add Question.__str__() and __repr__()
W. Trevor King [Tue, 5 Feb 2013 15:27:16 +0000 (10:27 -0500)]
question: Add Question.__str__() and __repr__()

For easily viewing questions in lists.

11 years agoCatch EOFError (control-d) in CommandLineInterface input() call
W. Trevor King [Tue, 5 Feb 2013 15:16:26 +0000 (10:16 -0500)]
Catch EOFError (control-d) in CommandLineInterface input() call

11 years agoAdd dependency storage (list of question IDs)
W. Trevor King [Tue, 5 Feb 2013 15:15:16 +0000 (10:15 -0500)]
Add dependency storage (list of question IDs)

11 years agoUse question.id instead of question.prompt for answer indexing
W. Trevor King [Tue, 5 Feb 2013 15:08:52 +0000 (10:08 -0500)]
Use question.id instead of question.prompt for answer indexing

This decouples the keying from the prompt, which is useful if you want
to use another value for the `id` (e.g. a question number).

If `id` is not specified, it defaults to `prompt`.

11 years agoAdd trailing newlines to saved JSON files
W. Trevor King [Tue, 5 Feb 2013 15:01:49 +0000 (10:01 -0500)]
Add trailing newlines to saved JSON files

11 years agoAdd a persistent answers database
W. Trevor King [Tue, 5 Feb 2013 15:01:25 +0000 (10:01 -0500)]
Add a persistent answers database

11 years agoVisually separate the results from the questions
W. Trevor King [Tue, 5 Feb 2013 14:34:03 +0000 (09:34 -0500)]
Visually separate the results from the questions

11 years agoAdd .display_results() for showing users their results and scores
W. Trevor King [Tue, 5 Feb 2013 14:29:58 +0000 (09:29 -0500)]
Add .display_results() for showing users their results and scores

11 years agoDisplay results (but not the correct answers)
W. Trevor King [Tue, 5 Feb 2013 14:19:36 +0000 (09:19 -0500)]
Display results (but not the correct answers)

11 years agoDon't crash with IndexError when we run out of questions
W. Trevor King [Tue, 5 Feb 2013 14:09:50 +0000 (09:09 -0500)]
Don't crash with IndexError when we run out of questions

11 years agoMake get_question() a bit more interesting
W. Trevor King [Tue, 5 Feb 2013 14:07:18 +0000 (09:07 -0500)]
Make get_question() a bit more interesting

11 years agoAdd a simple command line interface
W. Trevor King [Tue, 5 Feb 2013 14:06:44 +0000 (09:06 -0500)]
Add a simple command line interface

11 years agoAdded saving, loading, and a test quiz
W. Trevor King [Tue, 5 Feb 2013 13:49:54 +0000 (08:49 -0500)]
Added saving, loading, and a test quiz

11 years agoStubbing out the initial framework
W. Trevor King [Mon, 4 Feb 2013 23:05:32 +0000 (18:05 -0500)]
Stubbing out the initial framework