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 expaca(course, exercise, action, submission_dir): ''' Executes third party expaca testing application. ''' r = invoke_script(settings.EXPACA_SCRIPT, _collect_args(("rule_file", "model_dir", "user_dir"), action), submission_dir) # Expaca should always return 0. if r["code"] != 0: raise ConfigError("Expaca return code not zero!\nMore information: %s" % (str(r))) out = r["out"] points = 0 max_points = 0 # Find points in the XML. b = out.find("<TotalPoints>") if b >= 0: e = out.find("</TotalPoints>", b + 13) points = int(out[b + 13 : e]) b = out.find("<TotalMaxpoints>") if b >= 0: e = out.find("</TotalMaxpoints>", b + 16) max_points = int(out[b + 16 : e]) # Transform the feedback if configured. if "xslt_transform" in action: out = transform(out, "%s/%s" % (settings.BASE_DIR, action["xslt_transform"])) return { "points": points, "max_points": max_points, "out": out, "err": r["err"], "stop": False }
def prepare(course, exercise, action, submission_dir, user_ids='', submission_number=1): ''' Runs the preparation script for the submitted files. @type user_ids: C{str} @param user_ids: user ID(s) of the submitter(s) as string (format "1", "1-2-3") @type submission_number: C{int} @param submission_number: ordinal number of the submission ''' args = { "course_key": course["key"], "exercise_key": exercise["key"], } cp_personal_error = None if "personalized" in exercise and exercise["personalized"]: args["userid"] = user_ids args["gen_instance_path"] = select_generated_exercise_instance(course, exercise, user_ids, submission_number) if not settings.ENABLE_PERSONAL_DIRECTORIES and "cp_personal" in action: cp_personal_error = 'settings.ENABLE_PERSONAL_DIRECTORIES is False but action grader.actions.prepare has "cp_personal" field' LOGGER.error(cp_personal_error) result = _boolean(invoke_script(settings.PREPARE_SCRIPT, _collect_args(("attachment_pull", "attachment_unzip", "unzip", "charset", "cp_exercises", "cp", "mv", "cp_personal", "cp_generated"), action, args), submission_dir)) if cp_personal_error: # add the error to the feedback too result["err"] += "\n" + cp_personal_error return result
def prepare(course, exercise, action, submission_dir): ''' Runs the preparation script for the submitted files. ''' return _boolean(invoke_script(settings.PREPARE_SCRIPT, _collect_args(("attachment_pull", "attachment_unzip", "unzip", "charset", "cp_exercises", "cp", "mv"), action, { "course_key": course["key"] }), submission_dir))
def gitclone(course, exercise, action, submission_dir): ''' Runs a git clone script. ''' return _appendix( _boolean( invoke_script(settings.GITCLONE_SCRIPT, _collect_args(("repo_dir", "read", "files"), action), submission_dir)))
def store_user_files(course, exercise, action, submission_dir, user_ids, submission_number=1): ''' Stores files from the submission directory to the personal directory of the user(s). ''' if not (settings.ENABLE_PERSONAL_DIRECTORIES and \ "personalized" in exercise and exercise["personalized"]): msg = 'Action "grader.actions.store_user_files" can only be used in personalized exercises. ' \ 'Check project settings.ENABLE_PERSONAL_DIRECTORIES value and exercise-specific personalization configuration.' LOGGER.error(msg) raise ConfigError(msg) args = { "target": user_personal_directory_path(course, exercise, user_ids), } return _boolean(invoke_script(settings.STORE_USER_FILES_SCRIPT, _collect_args(("cp",), action, args), submission_dir))
def store_user_files(course, exercise, action, submission_dir, user_ids, submission_number=1): ''' Stores files from the submission directory to the personal directory of the user(s). ''' if not (settings.ENABLE_PERSONAL_DIRECTORIES and \ "personalized" in exercise and exercise["personalized"]): msg = 'Action "grader.actions.store_user_files" can only be used in personalized exercises. ' \ 'Check project settings.ENABLE_PERSONAL_DIRECTORIES value and exercise-specific personalization configuration.' LOGGER.error(msg) raise ConfigError(msg) args = { "target": user_personal_directory_path(course, exercise, user_ids), } return _boolean( invoke_script(settings.STORE_USER_FILES_SCRIPT, _collect_args(("cp", ), action, args), submission_dir))
def expaca(course, exercise, action, submission_dir): ''' Executes third party expaca testing application. ''' r = invoke_script( settings.EXPACA_SCRIPT, _collect_args(("rule_file", "model_dir", "user_dir"), action), submission_dir) # Expaca should always return 0. if r["code"] != 0: raise ConfigError( "Expaca return code not zero!\nMore information: %s" % (str(r))) out = r["out"] points = 0 max_points = 0 # Find points in the XML. b = out.find("<TotalPoints>") if b >= 0: e = out.find("</TotalPoints>", b + 13) points = int(out[b + 13:e]) b = out.find("<TotalMaxpoints>") if b >= 0: e = out.find("</TotalMaxpoints>", b + 16) max_points = int(out[b + 16:e]) # Transform the feedback if configured. if "xslt_transform" in action: out = transform( out, "%s/%s" % (settings.BASE_DIR, action["xslt_transform"])) return { "points": points, "max_points": max_points, "out": out, "err": r["err"], "stop": False }
def prepare(course, exercise, action, submission_dir, user_ids='', submission_number=1): ''' Runs the preparation script for the submitted files. @type user_ids: C{str} @param user_ids: user ID(s) of the submitter(s) as string (format "1", "1-2-3") @type submission_number: C{int} @param submission_number: ordinal number of the submission ''' args = { "course_key": course["key"], "exercise_key": exercise["key"], } cp_personal_error = None if "personalized" in exercise and exercise["personalized"]: args["userid"] = user_ids args["gen_instance_path"] = select_generated_exercise_instance( course, exercise, user_ids, submission_number) if not settings.ENABLE_PERSONAL_DIRECTORIES and "cp_personal" in action: cp_personal_error = 'settings.ENABLE_PERSONAL_DIRECTORIES is False but action grader.actions.prepare has "cp_personal" field' LOGGER.error(cp_personal_error) result = _boolean( invoke_script( settings.PREPARE_SCRIPT, _collect_args( ("attachment_pull", "attachment_unzip", "unzip", "charset", "cp_exercises", "cp", "mv", "cp_personal", "cp_generated"), action, args), submission_dir)) if cp_personal_error: # add the error to the feedback too result["err"] += "\n" + cp_personal_error return result
def gitclone(course, exercise, action, submission_dir): ''' Runs a git clone script. ''' return _appendix(_boolean(invoke_script(settings.GITCLONE_SCRIPT, _collect_args(("repo_dir", "read", "files"), action), submission_dir)))