Implement chapter.id may only contain 0-9a-zA-Z-_
Add unit test for chapter.id
Switch from coverage.py to nose