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?
+
+
+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 +
+ 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.
+ is_palindrome("Hello")
should return False
+ 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. +
+ 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
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