quizzer 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/quizzer.rb +145 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 41dfa99e11985d3c6ef27fd19421d32ce4bb7680
|
4
|
+
data.tar.gz: 0f4f5d4bb207072dfb9206a4b2c562b55df8d7a3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 718351a41f2dc5a19396c615896235f9fd291ba856205f3bf88e21610549b97bd74d72fe25b11e26b5531de7d1081c391eb8b287fa1bd5b5110ffd74b9e1225c
|
7
|
+
data.tar.gz: b3f462b0cb055d861453f6f6da68f7ffde5a960afb5cc2a1d8eec7b9ff6214e2e6e08a55bde17dc593bdd62c34961e49c7fcb0d5c0589768a3dcf86172f492f0
|
data/lib/quizzer.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class Quizz
|
4
|
+
attr_accessor :questions
|
5
|
+
|
6
|
+
def initialize(questions = Hash.new)
|
7
|
+
@questions = questions
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.parse(quiz)
|
11
|
+
quiz = JSON.parse(IO.read(quiz))
|
12
|
+
questions = Hash.new
|
13
|
+
quiz["questions"].each do |q|
|
14
|
+
case q["type"]
|
15
|
+
when 'truefalse' then
|
16
|
+
questions[q["id"]] = TrueFalse.new(q["type"], q["id"], q["questionText"], q["correct"],
|
17
|
+
{ value_ok: q["valueOK"],
|
18
|
+
value_failed: q["valueFailed"],
|
19
|
+
feedback: q["feedback"] })
|
20
|
+
when 'multichoice' then
|
21
|
+
alt = Hash.new
|
22
|
+
q["alternatives"].each { |a| alt[a["code"]] = Alternative.new(a["text"], a["code"], a["value"]) }
|
23
|
+
questions[q["id"]] = Multichoice.new(q["type"], q["id"], q["questionText"], alt)
|
24
|
+
else
|
25
|
+
raise "Incomplete question"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
return Quizz.new(questions)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Question
|
33
|
+
attr_accessor :type, :id, :question_text
|
34
|
+
def initialize(type, id, question_text)
|
35
|
+
@type = type
|
36
|
+
@id = id
|
37
|
+
@question_text = question_text
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class TrueFalse < Question
|
42
|
+
attr_accessor :correct, :value_ok, :value_failed, :feedback
|
43
|
+
def initialize(type, id, question_text, correct, prop = Hash.new)
|
44
|
+
super(type, id, question_text)
|
45
|
+
@correct = correct
|
46
|
+
@value_ok = prop["value_ok"] || 1
|
47
|
+
@value_failed = prop["value_failed"] || -0.25
|
48
|
+
@feedback = prop["feedback"] || String.new
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Multichoice < Question
|
53
|
+
attr_accessor :alternatives
|
54
|
+
def initialize(type, id, question_text, alternatives = Hash.new)
|
55
|
+
super(type, id, question_text)
|
56
|
+
@alternatives = alternatives
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Alternative
|
61
|
+
attr_accessor :text, :code, :value
|
62
|
+
def initialize(text, code, value)
|
63
|
+
@text = text
|
64
|
+
@code = code
|
65
|
+
@value = value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Assessment
|
70
|
+
attr_accessor :items
|
71
|
+
def initialize(items = Hash.new)
|
72
|
+
@items = items
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.parse(assessment)
|
76
|
+
assessment = JSON.parse(IO.read(assessment))
|
77
|
+
items = Hash.new
|
78
|
+
assessment["items"].each do |i|
|
79
|
+
answers = Hash.new
|
80
|
+
i["answers"].each { |a| answers[a["question"]] = Answer.new(a["question"], a["value"]) }
|
81
|
+
items[i["studentId"]] = Item.new(i["studentId"], answers)
|
82
|
+
end
|
83
|
+
return Assessment.new(items)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Item
|
88
|
+
attr_accessor :student_id, :answers
|
89
|
+
def initialize(student_id, answers = Hash.new)
|
90
|
+
@student_id = student_id
|
91
|
+
@answers = answers
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class Answer
|
96
|
+
attr_accessor :question, :value
|
97
|
+
def initialize(question, value)
|
98
|
+
@question = question
|
99
|
+
@value = value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class Scores
|
104
|
+
attr_accessor :scores
|
105
|
+
def initialize(quiz, assesment)
|
106
|
+
@scores = Hash.new
|
107
|
+
assesment.items.each do |i_id, i|
|
108
|
+
s = Score.new(i_id)
|
109
|
+
quiz.questions.each do |q_id, q|
|
110
|
+
case q.type
|
111
|
+
when 'truefalse' then
|
112
|
+
if q.correct == i.answers[q_id].value
|
113
|
+
s.value += q.value_ok
|
114
|
+
else
|
115
|
+
s.value += q.value_failed
|
116
|
+
end
|
117
|
+
when 'multichoice' then
|
118
|
+
s.value += q.alternatives[i.answers[q_id].value].value
|
119
|
+
else
|
120
|
+
raise 'Incomplete question'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
@scores[i_id] = s
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def serialize()
|
128
|
+
output = { "scores" => Array.new }
|
129
|
+
@scores.each do |s_id, s|
|
130
|
+
output["scores"].push({ "studentId" => s_id, "value" => s.value })
|
131
|
+
end
|
132
|
+
File.open("test/scores.json","w") do |f|
|
133
|
+
f.write(JSON.pretty_generate(output))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class Score
|
139
|
+
attr_accessor :student_id, :value
|
140
|
+
def initialize(student_id, value = 0)
|
141
|
+
@student_id = student_id
|
142
|
+
@value = value
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: quizzer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adrian Cepillo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Write a longer description. Optional.
|
42
|
+
email:
|
43
|
+
- adrian.cepillo@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- lib/quizzer.rb
|
49
|
+
homepage: http://github.com/adriancm/quizzer-ruby
|
50
|
+
licenses:
|
51
|
+
- MIT
|
52
|
+
metadata: {}
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 2.2.2
|
70
|
+
signing_key:
|
71
|
+
specification_version: 4
|
72
|
+
summary: Write a short summary. Required.
|
73
|
+
test_files: []
|