Commit 9ee09ec9 by Bridger Maxwell

Put graders into their own file. Incorporated other feedback from pull request.

parent e780e4d8
...@@ -15,15 +15,15 @@ from courseware.course_settings import GRADER # This won't work. ...@@ -15,15 +15,15 @@ from courseware.course_settings import GRADER # This won't work.
""" """
import courseware
import imp import imp
import logging import logging
import sys import sys
import types import types
from django.conf import settings from django.conf import settings
from django.utils.functional import SimpleLazyObject
from courseware import global_course_settings from courseware import global_course_settings
from courseware import graders
_log = logging.getLogger("mitx.courseware") _log = logging.getLogger("mitx.courseware")
...@@ -50,4 +50,7 @@ class Settings(object): ...@@ -50,4 +50,7 @@ class Settings(object):
setting_value = getattr(mod, setting) setting_value = getattr(mod, setting)
setattr(self, setting, setting_value) setattr(self, setting, setting_value)
# Here is where we should parse any configurations, so that we can fail early
self.GRADER = graders.grader_from_conf(self.GRADER)
course_settings = Settings() course_settings = Settings()
\ No newline at end of file
GRADER = [ GRADER = [
{ {
'course_format' : "Homework", 'type' : "Homework",
'min_count' : 12, 'min_count' : 12,
'drop_count' : 2, 'drop_count' : 2,
'short_label' : "HW", 'short_label' : "HW",
'weight' : 0.15, 'weight' : 0.15,
}, },
{ {
'course_format' : "Lab", 'type' : "Lab",
'min_count' : 12, 'min_count' : 12,
'drop_count' : 2, 'drop_count' : 2,
'category' : "Labs", 'category' : "Labs",
'weight' : 0.15 'weight' : 0.15
}, },
{ {
'section_format' : "Examination", 'type' : "Midterm",
'section_name' : "Midterm Exam", 'name' : "Midterm Exam",
'short_label' : "Midterm", 'short_label' : "Midterm",
'weight' : 0.3, 'weight' : 0.3,
}, },
{ {
'section_format' : "Examination", 'type' : "Final",
'section_name' : "Final Exam", 'name' : "Final Exam",
'short_label' : "Final", 'short_label' : "Final",
'weight' : 0.4, 'weight' : 0.4,
} }
......
...@@ -4,7 +4,9 @@ import numpy ...@@ -4,7 +4,9 @@ import numpy
import courseware.modules import courseware.modules
import courseware.capa.calc as calc import courseware.capa.calc as calc
from grades import Score, aggregate_scores, CourseGrader, WeightedSubsectionsGrader, SingleSectionGrader, AssignmentFormatGrader import courseware.graders as graders
from courseware.graders import Score, CourseGrader, WeightedSubsectionsGrader, SingleSectionGrader, AssignmentFormatGrader
from courseware.grades import aggregate_scores
class ModelsTest(unittest.TestCase): class ModelsTest(unittest.TestCase):
def setUp(self): def setUp(self):
...@@ -107,9 +109,9 @@ class GraderTest(unittest.TestCase): ...@@ -107,9 +109,9 @@ class GraderTest(unittest.TestCase):
} }
def test_SingleSectionGrader(self): def test_SingleSectionGrader(self):
midtermGrader = SingleSectionGrader("Midterm", "Midterm Exam") midtermGrader = graders.SingleSectionGrader("Midterm", "Midterm Exam")
lab4Grader = SingleSectionGrader("Lab", "lab4") lab4Grader = graders.SingleSectionGrader("Lab", "lab4")
badLabGrader = SingleSectionGrader("Lab", "lab42") badLabGrader = graders.SingleSectionGrader("Lab", "lab42")
for graded in [midtermGrader.grade(self.empty_gradesheet), for graded in [midtermGrader.grade(self.empty_gradesheet),
midtermGrader.grade(self.incomplete_gradesheet), midtermGrader.grade(self.incomplete_gradesheet),
...@@ -125,12 +127,12 @@ class GraderTest(unittest.TestCase): ...@@ -125,12 +127,12 @@ class GraderTest(unittest.TestCase):
self.assertAlmostEqual( graded['percent'], 0.2 ) self.assertAlmostEqual( graded['percent'], 0.2 )
self.assertEqual( len(graded['section_breakdown']), 1 ) self.assertEqual( len(graded['section_breakdown']), 1 )
def test_assignmentFormatGrader(self): def test_AssignmentFormatGrader(self):
homeworkGrader = AssignmentFormatGrader("Homework", 12, 2) homeworkGrader = graders.AssignmentFormatGrader("Homework", 12, 2)
noDropGrader = AssignmentFormatGrader("Homework", 12, 0) noDropGrader = graders.AssignmentFormatGrader("Homework", 12, 0)
#Even though the minimum number is 3, this should grade correctly when 7 assignments are found #Even though the minimum number is 3, this should grade correctly when 7 assignments are found
overflowGrader = AssignmentFormatGrader("Lab", 3, 2) overflowGrader = graders.AssignmentFormatGrader("Lab", 3, 2)
labGrader = AssignmentFormatGrader("Lab", 7, 3) labGrader = graders.AssignmentFormatGrader("Lab", 7, 3)
#Test the grading of an empty gradesheet #Test the grading of an empty gradesheet
...@@ -162,25 +164,25 @@ class GraderTest(unittest.TestCase): ...@@ -162,25 +164,25 @@ class GraderTest(unittest.TestCase):
def test_WeightedSubsectionsGrader(self): def test_WeightedSubsectionsGrader(self):
#First, a few sub graders #First, a few sub graders
homeworkGrader = AssignmentFormatGrader("Homework", 12, 2) homeworkGrader = graders.AssignmentFormatGrader("Homework", 12, 2)
labGrader = AssignmentFormatGrader("Lab", 7, 3) labGrader = graders.AssignmentFormatGrader("Lab", 7, 3)
midtermGrader = SingleSectionGrader("Midterm", "Midterm Exam") midtermGrader = graders.SingleSectionGrader("Midterm", "Midterm Exam")
weightedGrader = WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.25), (labGrader, labGrader.category, 0.25), weightedGrader = graders.WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.25), (labGrader, labGrader.category, 0.25),
(midtermGrader, midtermGrader.category, 0.5)] ) (midtermGrader, midtermGrader.category, 0.5)] )
overOneWeightsGrader = WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.5), (labGrader, labGrader.category, 0.5), overOneWeightsGrader = graders.WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.5), (labGrader, labGrader.category, 0.5),
(midtermGrader, midtermGrader.category, 0.5)] ) (midtermGrader, midtermGrader.category, 0.5)] )
#The midterm should have all weight on this one #The midterm should have all weight on this one
zeroWeightsGrader = WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.0), (labGrader, labGrader.category, 0.0), zeroWeightsGrader = graders.WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.0), (labGrader, labGrader.category, 0.0),
(midtermGrader, midtermGrader.category, 0.5)] ) (midtermGrader, midtermGrader.category, 0.5)] )
#This should always have a final percent of zero #This should always have a final percent of zero
allZeroWeightsGrader = WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.0), (labGrader, labGrader.category, 0.0), allZeroWeightsGrader = graders.WeightedSubsectionsGrader( [(homeworkGrader, homeworkGrader.category, 0.0), (labGrader, labGrader.category, 0.0),
(midtermGrader, midtermGrader.category, 0.0)] ) (midtermGrader, midtermGrader.category, 0.0)] )
emptyGrader = WeightedSubsectionsGrader( [] ) emptyGrader = graders.WeightedSubsectionsGrader( [] )
graded = weightedGrader.grade(self.test_gradesheet) graded = weightedGrader.grade(self.test_gradesheet)
self.assertAlmostEqual( graded['percent'], 0.5106547619047619 ) self.assertAlmostEqual( graded['percent'], 0.5106547619047619 )
...@@ -221,33 +223,33 @@ class GraderTest(unittest.TestCase): ...@@ -221,33 +223,33 @@ class GraderTest(unittest.TestCase):
def test_graderFromConf(self): def test_graderFromConf(self):
#Confs always produce a WeightedSubsectionsGrader, so we test this by repeating the test #Confs always produce a graders.WeightedSubsectionsGrader, so we test this by repeating the test
#in test_WeightedSubsectionsGrader, but generate the graders with confs. #in test_graders.WeightedSubsectionsGrader, but generate the graders with confs.
weightedGrader = CourseGrader.graderFromConf([ weightedGrader = graders.grader_from_conf([
{ {
'course_format' : "Homework", 'type' : "Homework",
'min_count' : 12, 'min_count' : 12,
'drop_count' : 2, 'drop_count' : 2,
'short_label' : "HW", 'short_label' : "HW",
'weight' : 0.25, 'weight' : 0.25,
}, },
{ {
'course_format' : "Lab", 'type' : "Lab",
'min_count' : 7, 'min_count' : 7,
'drop_count' : 3, 'drop_count' : 3,
'category' : "Labs", 'category' : "Labs",
'weight' : 0.25 'weight' : 0.25
}, },
{ {
'section_format' : "Midterm", 'type' : "Midterm",
'section_name' : "Midterm Exam", 'name' : "Midterm Exam",
'short_label' : "Midterm", 'short_label' : "Midterm",
'weight' : 0.5, 'weight' : 0.5,
}, },
]) ])
emptyGrader = CourseGrader.graderFromConf([]) emptyGrader = graders.grader_from_conf([])
graded = weightedGrader.grade(self.test_gradesheet) graded = weightedGrader.grade(self.test_gradesheet)
self.assertAlmostEqual( graded['percent'], 0.5106547619047619 ) self.assertAlmostEqual( graded['percent'], 0.5106547619047619 )
...@@ -260,8 +262,8 @@ class GraderTest(unittest.TestCase): ...@@ -260,8 +262,8 @@ class GraderTest(unittest.TestCase):
self.assertEqual( len(graded['grade_breakdown']), 0 ) self.assertEqual( len(graded['grade_breakdown']), 0 )
#Test that graders can also be used instead of lists of dictionaries #Test that graders can also be used instead of lists of dictionaries
homeworkGrader = AssignmentFormatGrader("Homework", 12, 2) homeworkGrader = graders.AssignmentFormatGrader("Homework", 12, 2)
homeworkGrader2 = CourseGrader.graderFromConf(homeworkGrader) homeworkGrader2 = graders.grader_from_conf(homeworkGrader)
graded = homeworkGrader2.grade(self.test_gradesheet) graded = homeworkGrader2.grade(self.test_gradesheet)
self.assertAlmostEqual( graded['percent'], 0.11 ) self.assertAlmostEqual( graded['percent'], 0.11 )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment