From 98386cf63e6f574b38477564b96a5bcab25f2f8f Mon Sep 17 00:00:00 2001 From: mahesh Date: Thu, 17 Aug 2017 18:52:55 +0530 Subject: Adds yaml file containing all types of questions --- yaksh/demo_templates/yaml_question_template | 429 ++++++++++++++++++++++------ yaksh/fixtures/demo_questions.zip | Bin 4089 -> 8587 bytes yaksh/models.py | 25 +- 3 files changed, 362 insertions(+), 92 deletions(-) (limited to 'yaksh') diff --git a/yaksh/demo_templates/yaml_question_template b/yaksh/demo_templates/yaml_question_template index 4de9274..065072c 100644 --- a/yaksh/demo_templates/yaml_question_template +++ b/yaksh/demo_templates/yaml_question_template @@ -1,90 +1,357 @@ --- -# Yaml Template for writing questions -# Always keep the name of this file as questions_dump.yaml -# Zip this file with necessary dependent files. - +active: true # question status = true or false +language: |- # bash, scilab, python, c/c++, java + python +partial_grading: false +snippet: '' +summary: |- + Roots of quadratic equation +type: |- + integer +grade_assignment_upload: false +description: |- # Entire question description. + Type in the box below, one of the roots to the following quadratic equation? +
+ + + x + 2 + + + + x + - + 6 + = + 0 + +points: 1.0 +testcase: +- test_case_type: |- + integertestcase + correct: 2 +- test_case_type: |- + integertestcase + correct: -3 +files: [] +--- active: true -# question status = true or false - -description: "Write a function product(a,b) which will take - two integers and return the product of it.
- " -# Entire question description. - +language: |- + python +partial_grading: false +snippet: '' +summary: |- + Print Output +type: |- + string +grade_assignment_upload: false +description: |- + What is the output for the following code in Python 2.x: +
+ + print(2, "Hello"*2, ":" ,"Bye") + +points: 1.0 +testcase: +- string_check: |- #exact or lower + exact + test_case_type: |- + stringtestcase + correct: |- + (2, 'HelloHello', ':', 'Bye') files: [] -# [[file name, zip_extract_status=true or false]] - -language: python -# bash, scilab, python, c/c++, java - +--- +active: true +language: |- + python +partial_grading: false +snippet: '' +summary: |- + Adding decimals +type: |- + float +grade_assignment_upload: false +description: |- + Write down the resultant value of the following - +
3.4566+2.122
+  

points: 1.0 -# marks in float - -snippet: "def sum(a,b):" -# adds in the student's code area - -summary: Product of two numbers -# one line short Summary testcase: -- test_case_type: standardtestcase - test_case: assert sum(3,5) == 15 - test_case_args: "" +- test_case_type: |- + floattestcase + correct: 5.5786 + error_margin: 0.0 +files: [] +--- +active: true +language: |- + bash +partial_grading: false +snippet: |- + #!/bin/bash +summary: |- + Extract columns from files +type: |- + code +grade_assignment_upload: false +description: |- + Write a bash script that takes exactly three file arguments. + + The first argument (file1.csv) would have 3 columns, the second argument (file2.csv) would have 2 columns. The third argument (file3.csv) would have 2 columns. +

+ All files have columns delimited by : (colon). +

+ We need the 2nd column from file1.csv to be removed and concatenated BEFORE file2.csv and this concatenated file should come BESIDE file3.csv. + + Left is file3.csv, and the LATER columns come from file1.csv and file2.csv. +

+ The delimiter while putting the files BESIDE each other should again be : (colon) +

+
+  Note: - Do not hard-code the filenames. They will be passed in as arguments.
+  Assume no headers (to avoid header-non-repetition issues).
+  
+points: 2.0 +testcase: +- test_case: |- + #!/bin/bash + cat $1 | cut -d: -f2 | paste -d: $3 - $2 weight: 1.0 -#testcase 1 - -- test_case_type: standardtestcase - test_case: assert sum(10,10) == 100 - test_case_args: "" + test_case_type: |- + standardtestcase + test_case_args: |- + file1.csv file2.csv file3.csv +files: +- - file1.csv + - false +- - file2.csv + - false +- - file3.csv + - false +--- +active: true +language: |- + python +partial_grading: false +snippet: |- + def is_palindrome(s): +summary: |- + Check Palindrome +type: |- + code +grade_assignment_upload: false +description: |- + Write a function is_palindrome(arg) which will take one string argument. +
+ Return True if the argument is palindrome & False otherwise. +
+ The function should be case sensitive. +

+ For Example:
is_palindrome("Hello") should return False
+points: 2.0 +testcase: +- test_case: |- + assert is_palindrome("hello") == False + weight: 1.0 + test_case_type: |- + standardtestcase + test_case_args: '' +- test_case: |- + assert is_palindrome("nitin") == True + weight: 1.0 + test_case_type: |- + standardtestcase + test_case_args: '' +- test_case: |- + assert is_palindrome("madaM") == False weight: 1.0 -#testcase 2 - -# for standard testcase: - # - test_case_type: standardtestcase - # test_case: test case in the selected language - # test_case_args: command line args (only for bash) - # weight: weightage for each course - -# for stdIO testcase: - # - test_case_type: stdiobasedtestcase - # expected_input: Standard input given to the students' code. (Optional) - # expected_input: Standard output expected from the students' code. - # weight: weightage for each course - -# for MCQ/MCC testcase: - # - test_case_type: mcqtestcase - # options: MCQ/MCC option. - # correct: true or false. - -# for Hook testcase: - # - test_case_type: hooktestcase - # hook_code: Selected language code written by moderator (Optional) - # weight: weightage for each course - -# for Integer testcase: - # - test_case_type: integertestcase - # correct: Correct integer value - -# for Float testcase: - # - test_case_type: floattestcase - # correct: Correct float value - # error_margin: Margin of error allowed - -# for String testcase: - # - test_case_type: stringtestcase - # correct: Exact string to be compared - # string_check: lower or exact.(case insensitive or sensitive) - -type: code -# mcq, Single Correct Choice, -# mcc, Multiple Correct Choices, -# code, Code Question, -# upload, Assignment Upload, -# integer, Answer in Integer, -# string, Answer in String, -# float, Answer in Float - + test_case_type: |- + standardtestcase + test_case_args: '' +files: [] +--- +active: true +language: |- + python +partial_grading: true +snippet: '' +summary: |- + For Loop over String +type: |- + code grade_assignment_upload: false -# Grade uploaded assignment (works with hook)true or false - +description: |- + Write a python script that accepts a string as input +
+ The script must print each character of the string using a for loop. + + For example; +
+  Input:
+  box
+  Output
+  b
+  o
+  x
+  
+points: 1.0 +testcase: +- expected_output: |- + s + t + r + i + n + g + weight: 1 + test_case_type: |- + stdiobasedtestcase + expected_input: |- + string +- expected_output: |- + s + + t + + o + + p + + s + + i + + g + + n + weight: 1 + test_case_type: |- + stdiobasedtestcase + expected_input: |- + s t o p s i g n +- hook_code: |- + def check_answer(user_answer): + ''' Evaluates user answer to return - + success - Boolean, indicating if code was executed correctly + mark_fraction - Float, indicating fraction of the + weight to a test case + error - String, error message if success is false + + In case of assignment upload there will be no user answer ''' + + success = False + err = "You are using while in your code." + mark_fraction = 0.0 + + if not 'while' in user_answer: + success=True + err = "Correct Answer" + mark_fraction = 1.0 + return success, err, mark_fraction + test_case_type: |- + hooktestcase + weight: 1.0 +files: [] +--- +active: true +language: |- + c partial_grading: false -# partial grading with respect to each testcase. +snippet: '' +summary: |- + Add 3 numbers +type: |- + code +grade_assignment_upload: false +description: |- + Write a program to add 3 numbers. +
+ Function Name is to be called add +
+

+
+  Note: You do not have to print anything, neither you have to make the function call. 
+  Just define the function to perform the required operation, return the output & click on check answer.
+  Also, note that the function name should exactly be as mentioned above.
+  
+points: 2.0 +testcase: +- test_case: |- + #include + #include + + extern int add(int, int, int); + + template + void check(T expect,T result) + { + if (expect == result) + { + printf("\nCorrect:\n Expected %d got %d \n",expect,result); + } + else + { + printf("\nIncorrect:\n Expected %d got %d \n",expect,result); + exit (1); + } + } + + int main(void) + { + int result; + result = add(0,0,0); + printf("Input submitted to the function: 0, 0, 0"); + check(0, result); + result = add(2,3,3); + printf("Input submitted to the function: 2, 3, 3"); + check(8,result); + printf("All Correct\n"); + } + weight: 1.0 + test_case_type: |- + standardtestcase + test_case_args: '' +files: [] +--- +active: true +language: |- + python +partial_grading: false +snippet: '' +summary: |- + Hello World in File +type: |- + upload +grade_assignment_upload: true +description: |- + Upload a file called new.txt which contains the string Hello, World! in it. +points: 1.0 +testcase: +- hook_code: |- + def check_answer(user_answer): + ''' Evaluates user answer to return - + success - Boolean, indicating if code was executed correctly + mark_fraction - Float, indicating fraction of the + weight to a test case + error - String, error message if success is false + + In case of assignment upload there will be no user answer ''' + + success = False + err = "Incorrect Answer" # Please make this more specific + mark_fraction = 0.0 + + try: + with open('new.txt', 'r') as f: + if "Hello, World!" in f.read(): + success = True + err = "Correct Answer" + mark_fraction = 1.0 + else: + err = "Did not found string Hello, World! in file." + except IOError: + err = "File new.txt not found." + return success, err, mark_fraction + test_case_type: |- + hooktestcase + weight: 1.0 +files: [] diff --git a/yaksh/fixtures/demo_questions.zip b/yaksh/fixtures/demo_questions.zip index 577cb86..08b06c4 100644 Binary files a/yaksh/fixtures/demo_questions.zip and b/yaksh/fixtures/demo_questions.zip differ diff --git a/yaksh/models.py b/yaksh/models.py index 7169d37..dfffb53 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -407,25 +407,28 @@ class Question(models.Model): files_list=None): try: questions = ruamel.yaml.safe_load_all(questions_list) + msg = "Questions Uploaded Successfully" for question in questions: question['user'] = user file_names = question.pop('files') test_cases = question.pop('testcase') que, result = Question.objects.get_or_create(**question) - if file_names!="[]": + if file_names: que._add_files_to_db(file_names, file_path) for test_case in test_cases: - test_case_type = test_case.pop('test_case_type') - model_class = get_model_class(test_case_type) - new_test_case, obj_create_status = \ - model_class.objects.get_or_create( - question=que, **test_case - ) - new_test_case.type = test_case_type - new_test_case.save() - msg = "Questions Uploaded Successfully" - except ruamel.yaml.scanner.ScannerError as exc_msg: + try: + test_case_type = test_case.pop('test_case_type') + model_class = get_model_class(test_case_type) + new_test_case, obj_create_status = \ + model_class.objects.get_or_create( + question=que, **test_case + ) + new_test_case.type = test_case_type + new_test_case.save() + except: + msg = "File not correct." + except Exception as exc_msg: msg = "Error Parsing Yaml: {0}".format(exc_msg) return msg -- cgit