Purple Pile Driver Image
Removed hard coded path.
Added bootstrap library (v2.2.2), and began using it for some simple error message pages.
Fixed defect in opening_cards() that was returning an empty list.

Also added tests. This probably has a beneficial effect on #31, but
may not be a sufficient fix in and of itself.
Resolves issues with the `/openings` URL.

Obtain the card costs from the appropriate property in the
`dominioncards` module. This was probably broken by 3384b90e.

On the openings page, handle the change to the openings IDs due to the
change to `__repr__()`.

When generating the card names in the dropdown list on `/openings`,
use the `singular` version instead of `str()`, which implicitly calls
`__repr__()`  (e.g., `Card(Chapel)`).

Enables lookup of cards by their `__repr__()` string.

Eliminate a pylint warning about reusing the `c` variable name in
`dominioncards`.

Closes #31.
Merge branch 'master' of https://github.com/DLu/dominionstats into DLu-master
Clean up pylint warning and whitepace.
Clean up the goals.py module and its caller.

Use module-level logging and standard command-line argument parsing in
goals.py.

Use the utils function to obtain the reference to the MongoDB database
so this script will respect the conf.ini file.

Clean up some pylint warnings and whitespace.
Elaborate on the TODO comment. No functional change.
Worked over the game_stats.py module.

Use module-level logging, initialized by the standard function when
invoked from the command line. Avoid passing the log objects around as
it makes it harder to figure out where the messages came from.

Take player names on the command line.

Avoided the wildcard import of keys to comply with best practices.
Initial commit of game_stats population logic using Celery tasks and the update script.
Fix typo.
Use larger chunk size, since this goes so quick.
Keep track of how many game_stats docs are inserted, and do it safely.
Make it easier to control the chunk size of various background tasks.
Added timeout to watch_and_log().

We were encountering problems where a worker would lose connection to
redis, it would complain that it couldn't ack a task, and then Kombu
(used by Celery) would restore it. But the original task seemed to be
left in Pending status forever. To try and handle this situation, the
watch_and_log() function now tries to make sure task statuses are
updating. If they don't, it will resurn after the timeout period. This
is relatively little tested, as no connections were lost in subsequent
runs.

Also tweaked logging a bit.
Merge remote-tracking branch 'upstream-dlu/purple'

Closes #30.
Add logging for when update.py finishes.
Handle stats with no occurrences without throwing exceptions.

Previously, would throw a ZeroDivisionError and/or would return a
really big number. Instead, use float('inf'), as would be suggested by
IEEE 754 floating point standard.

This fixes the symptom for #38, but that issue is bigger than this fix
alone.
Minimal testing of front-end functionality.