def read_static_dir(course_key): ''' Reads static_dir from course configuration. ''' sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grader.settings") from access.config import ConfigParser config = ConfigParser() course = config.course_entry(course_key) if 'static_dir' in course: return course['static_dir'] return ''
def read_static_dir(course_key): ''' Reads static_dir from course configuration. ''' sys.path.append(os.path.dirname(os.path.dirname( os.path.abspath(__file__)))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grader.settings") from access.config import ConfigParser config = ConfigParser() course = config.course_entry(course_key) if 'static_dir' in course: return course['static_dir'] return ''
def handle(self, *args, **options): config = ConfigParser() # Check arguments. if len(args) < 1 or "/" not in args[0]: raise CommandError("Required arguments missing: course_key/exercise_key") course_key, exercise_key = args[0].split("/", 1) # Get exercise configuration. (course, exercise) = config.exercise_entry(course_key, exercise_key) if course is None: raise CommandError("Course not found for key: %s" % (course_key)) if exercise is None: raise CommandError("Exercise not found for key: %s/%s" % (course_key, exercise_key)) self.stdout.write('Exercise configuration retrieved.') # Check exercise type. if not "actions" in exercise: raise CommandError("Cannot grade: exercise does not configure asynchronous actions") # Create submission. sdir = create_submission_dir(course, exercise) if len(args) == 1: os.makedirs(sdir + "/user") for n in range(1, len(args)): name = args[n] # Copy individual files. if os.path.isfile(name): submit_path = submission_file_path(sdir, os.path.basename(name)) shutil.copy2(name, submit_path) # Copy a directory. elif os.path.isdir(name): if len(args) != 2: raise CommandError("Can only submit one directory or multiple files.") shutil.copytree(name, sdir + "/user", True) else: raise CommandError("Submit file not found: %s" % (name)) # Run actions. r = runactions(course, exercise, sdir) self.stdout.write("Response body:") self.stdout.write(template_to_str(course, exercise, "", r["template"], r["result"]))
class ConfigTestCase(TestCase): def setUp(self): self.config = ConfigParser() def test_parsing(self): from access.config import get_rst_as_html self.assertEqual(get_rst_as_html('A **foobar**.'), '<p>A <strong>foobar</strong>.</p>\n') import re from access.config import iterate_kvp_with_dfs data = { 'title|i18n': { 'en': 'A Title', 'fi': 'Eräs otsikko' }, 'text|rst': 'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.' } self.config._process_exercise_data({"lang": "en"}, data) self.assertEqual(data["en"]["text"], data["fi"]["text"]) self.assertEqual(data["en"]["title"], "A Title") self.assertEqual(data["fi"]["title"], "Eräs otsikko") def test_loading(self): courses = self.config.courses() self.assertGreater(len(courses), 0, "No courses configured") course_key = courses[0]["key"] root = self.config._course_root(course_key) ptime = root["ptime"] # Ptime changes if cache is missed. root = self.config._course_root(course_key) self.assertEqual(ptime, root["ptime"]) def test_shell_invoke(self): r = invoke_script(settings.PREPARE_SCRIPT, {}) self.assertEqual(1, r["code"]) r = invoke_script(settings.PREPARE_SCRIPT, { "course_key": "foo", "dir": settings.SUBMISSION_PATH }) self.assertEqual(0, r["code"])
class ConfigTestCase(TestCase): TEST_DATA = { 'key': 'value', 'title|i18n': {'en': 'A Title', 'fi': 'Eräs otsikko'}, 'text|rst': 'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.', 'nested': { 'number|i18n': {'en': 1, 'fi': 2}, 'another': 10 } } def setUp(self): self.config = ConfigParser() def get_course_key(self): courses = self.config.courses() self.assertGreater(len(courses), 0, "No courses configured") return courses[0]['key'] def test_rst_parsing(self): from access.config import get_rst_as_html self.assertEqual(get_rst_as_html('A **foobar**.'), '<p>A <strong>foobar</strong>.</p>\n') def test_parsing(self): course = { "lang": "en" } data = self.config._process_exercise_data(course, self.TEST_DATA) self.assertEqual(data["en"]["text"], data["fi"]["text"]) self.assertEqual(data["en"]["title"], "A Title") self.assertEqual(data["en"]["nested"]["number"], 1) self.assertEqual(data["fi"]["title"], "Eräs otsikko") self.assertEqual(data["fi"]["nested"]["number"], 2) def test_cache(self): course_key = self.get_course_key() root = self.config._course_root(course_key) mtime = root["mtime"] ptime = root["ptime"] self.assertGreater(ptime, mtime) # Ptime changes if cache is missed. root = self.config._course_root(course_key) self.assertEqual(root["mtime"], mtime) self.assertEqual(root["ptime"], ptime) def test_cache_reload(self): course_key = self.get_course_key() root = self.config._course_root(course_key) mtime = root["mtime"] ptime = root["ptime"] self.assertGreater(ptime, mtime) time.sleep(1.5) os.utime(root["file"]) root = self.config._course_root(course_key) self.assertGreater(root["ptime"], root["mtime"]) self.assertGreater(root["mtime"], mtime) self.assertGreater(root["ptime"], ptime)
class ConfigTestCase(TestCase): def setUp(self): self.config = ConfigParser() def test_parsing(self): from access.config import get_rst_as_html self.assertEqual(get_rst_as_html('A **foobar**.'), '<p>A <strong>foobar</strong>.</p>\n') import re from access.config import iterate_kvp_with_dfs data = { 'title|i18n': {'en': 'A Title', 'fi': 'Eräs otsikko'}, 'text|rst': 'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.' } self.config._process_exercise_data({ "lang": "en" }, data) self.assertEqual(data["en"]["text"], data["fi"]["text"]) self.assertEqual(data["en"]["title"], "A Title") self.assertEqual(data["fi"]["title"], "Eräs otsikko") def test_loading(self): courses = self.config.courses() self.assertGreater(len(courses), 0, "No courses configured") course_key = courses[0]["key"] root = self.config._course_root(course_key) ptime = root["ptime"] # Ptime changes if cache is missed. root = self.config._course_root(course_key) self.assertEqual(ptime, root["ptime"]) def test_shell_invoke(self): r = invoke_script(settings.PREPARE_SCRIPT, {}) self.assertEqual(1, r["code"]) r = invoke_script(settings.PREPARE_SCRIPT, { "course_key": "foo", "dir": settings.SUBMISSION_PATH }) self.assertEqual(0, r["code"])
def setUp(self): import access settings.COURSES_PATH = os.path.join(os.path.dirname(__file__), 'test_data') self.config = ConfigParser()
def setUp(self): self.config = ConfigParser()
def setUp(self): import access access.config.DIR = os.path.join(os.path.dirname(__file__), 'test_data') self.config = ConfigParser()