moodle2cc 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog +6 -0
- data/README.md +8 -5
- data/lib/moodle2cc/canvas/question.rb +6 -0
- data/lib/moodle2cc/canvas_cc/models/assessment.rb +24 -0
- data/lib/moodle2cc/canvas_cc/models/assignment.rb +1 -1
- data/lib/moodle2cc/canvas_cc/models/question_bank.rb +16 -1
- data/lib/moodle2cc/moodle2/models/course.rb +2 -1
- data/lib/moodle2cc/moodle2/models/quizzes/question.rb +1 -1
- data/lib/moodle2cc/moodle2/models/section.rb +2 -0
- data/lib/moodle2cc/moodle2/parsers/course_parser.rb +9 -0
- data/lib/moodle2cc/moodle2/parsers/question_parsers/question_parser.rb +1 -0
- data/lib/moodle2cc/moodle2/parsers/section_parser.rb +7 -0
- data/lib/moodle2cc/moodle2converter/assignment_converter.rb +16 -6
- data/lib/moodle2cc/moodle2converter/glossary_converter.rb +2 -1
- data/lib/moodle2cc/moodle2converter/migrator.rb +3 -3
- data/lib/moodle2cc/moodle2converter/question_bank_converter.rb +9 -0
- data/lib/moodle2cc/version.rb +1 -1
- data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +46 -0
- data/spec/moodle2cc/moodle2/parsers/section_parser_spec.rb +1 -1
- data/spec/moodle2cc/moodle2converter/assignment_converter_spec.rb +15 -2
- data/spec/moodle2cc/moodle2converter/question_bank_converter_spec.rb +17 -0
- metadata +66 -35
- checksums.yaml +0 -7
data/Changelog
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
2014-05-09 Version 0.2.7
|
2
|
+
* Convert File path tokens in questions and answers
|
3
|
+
* Improve assignment gradint_type conversion
|
4
|
+
* Use section summary as title if none exists
|
5
|
+
* Convert random question types into quiz groups
|
6
|
+
|
1
7
|
2014-04-16 Version 0.2.6
|
2
8
|
* Substituting more variables in urls/file paths
|
3
9
|
* Many quiz settings fixes and quiz question improvements
|
data/README.md
CHANGED
@@ -90,11 +90,14 @@ made about these things:
|
|
90
90
|
|
91
91
|
## Todo
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
- [ ] Support exporting to CC 1.3
|
94
|
+
- [ ] Support converting to multiple versions of CC?
|
95
|
+
- [ ] Quiz conversion
|
96
|
+
- [ ] Question Category conversion
|
97
|
+
- [ ] LTI configurations?
|
98
|
+
- [ ] Convert more Moodle features as requested
|
99
|
+
- [ ] Moodle 2 support for standard CC
|
100
|
+
- [x] Moodle 2 support for canvas-flavored CC
|
98
101
|
|
99
102
|
## Contributing
|
100
103
|
|
@@ -118,6 +118,12 @@ module Moodle2CC::Canvas
|
|
118
118
|
material = material.gsub(/\{(.*?)\}/, '[\1]')
|
119
119
|
material = material + image_html(question.image) unless question.image.nil? || question.image.strip == ''
|
120
120
|
material = RDiscount.new(material).to_html if question.format == 4 # markdown
|
121
|
+
material = convert_file_path_tokens(material)
|
122
|
+
if @answers
|
123
|
+
@answers.each do |answer|
|
124
|
+
answer.text = convert_file_path_tokens(answer.text) if answer.text
|
125
|
+
end
|
126
|
+
end
|
121
127
|
@material = material
|
122
128
|
|
123
129
|
if @question_type == 'multiple_dropdowns_question' && !@answers.empty? && @length
|
@@ -46,12 +46,22 @@ module Moodle2CC::CanvasCC::Models
|
|
46
46
|
|
47
47
|
def resolve_question_references!(question_banks)
|
48
48
|
@items ||= []
|
49
|
+
|
50
|
+
# keep track of each time a bank is referenced through a random question reference
|
51
|
+
random_bank_counts = {}
|
52
|
+
|
49
53
|
@question_references.each do |ref|
|
50
54
|
question = nil
|
51
55
|
group = nil
|
52
56
|
question_banks.each do |bank|
|
53
57
|
break if (question = bank.questions.detect{|q| q.original_identifier.to_s == ref[:question]}) ||
|
54
58
|
(group = bank.question_groups.detect{|g| g.identifier.to_s == ref[:question]})
|
59
|
+
|
60
|
+
if bank.random_question_references.any?{|r| r.to_s == ref[:question]}
|
61
|
+
random_bank_counts[bank] ||= 0
|
62
|
+
random_bank_counts[bank] += 1
|
63
|
+
break
|
64
|
+
end
|
55
65
|
end
|
56
66
|
|
57
67
|
if question
|
@@ -68,6 +78,20 @@ module Moodle2CC::CanvasCC::Models
|
|
68
78
|
end
|
69
79
|
end
|
70
80
|
|
81
|
+
random_bank_counts.each do |bank, count|
|
82
|
+
new_group = Moodle2CC::CanvasCC::Models::QuestionGroup.new
|
83
|
+
new_group.identifier = "#{@identifier}#{bank.identifier}_random_group"
|
84
|
+
new_group.selection_number = count
|
85
|
+
|
86
|
+
new_group.questions = bank.questions.map(&:dup)
|
87
|
+
child_banks = bank.find_children_banks(question_banks)
|
88
|
+
child_banks.each do |child|
|
89
|
+
new_group.questions += child.questions.map(&:dup)
|
90
|
+
end
|
91
|
+
|
92
|
+
@items << new_group
|
93
|
+
end
|
94
|
+
|
71
95
|
@items.select{|i| i.is_a?(Moodle2CC::CanvasCC::Models::QuestionGroup)}.each do |group|
|
72
96
|
group.questions.each do |q|
|
73
97
|
@items.delete_if{|i| i.respond_to?(:original_identifier) && i.original_identifier == q.original_identifier}
|
@@ -19,7 +19,7 @@ module Moodle2CC::CanvasCC::Models
|
|
19
19
|
def assignment_resource
|
20
20
|
resource = Moodle2CC::CanvasCC::Models::Resource.new
|
21
21
|
resource.identifier = @identifier
|
22
|
-
resource.href = "#{resource.identifier}/assignment-#{title.downcase.gsub(/\s/, '-')}.html"
|
22
|
+
resource.href = "#{resource.identifier}/assignment-#{CGI::escape(title.downcase.gsub(/\s/, '-'))}.html"
|
23
23
|
resource.type = LAR_TYPE
|
24
24
|
resource.files = [resource.href, "#{resource.identifier}/#{ASSIGNMENT_SETTINGS_FILE}"]
|
25
25
|
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Moodle2CC::CanvasCC::Models
|
2
2
|
class QuestionBank
|
3
3
|
|
4
|
-
attr_accessor :identifier, :title, :questions, :question_groups
|
4
|
+
attr_accessor :identifier, :title, :questions, :question_groups, :random_question_references, :original_id, :parent_id
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
@questions = []
|
8
8
|
@question_groups = []
|
9
|
+
@random_question_references = []
|
9
10
|
end
|
10
11
|
|
11
12
|
LAR_TYPE = 'associatedcontent/imscc_xmlv1p1/learning-application-resource'
|
@@ -23,5 +24,19 @@ module Moodle2CC::CanvasCC::Models
|
|
23
24
|
resource.files = [resource.href]
|
24
25
|
resource
|
25
26
|
end
|
27
|
+
|
28
|
+
# recursively find all banks that belong to this one
|
29
|
+
def find_children_banks(all_banks, visited_banks=[])
|
30
|
+
visited_banks << self
|
31
|
+
children = []
|
32
|
+
sub_children = []
|
33
|
+
all_banks.each do |bank|
|
34
|
+
children << bank if bank.parent_id && bank.parent_id == self.original_id && !visited_banks.include?(bank)
|
35
|
+
end
|
36
|
+
children.each do |child|
|
37
|
+
sub_children += child.find_children_banks(all_banks, visited_banks)
|
38
|
+
end
|
39
|
+
return children + sub_children
|
40
|
+
end
|
26
41
|
end
|
27
42
|
end
|
@@ -4,7 +4,7 @@ module Moodle2CC::Moodle2::Models
|
|
4
4
|
:course_id, :show_grades, :sections, :files, :pages, :forums, :assignments,
|
5
5
|
:books, :folders, :question_categories, :quizzes, :glossaries,
|
6
6
|
:labels, :resources, :external_urls, :choices, :questionnaires,
|
7
|
-
:feedbacks, :wikis
|
7
|
+
:feedbacks, :wikis, :grading_scales
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@sections = []
|
@@ -24,6 +24,7 @@ module Moodle2CC::Moodle2::Models
|
|
24
24
|
@resources = []
|
25
25
|
@external_urls = []
|
26
26
|
@wikis = []
|
27
|
+
@grading_scales = {}
|
27
28
|
end
|
28
29
|
|
29
30
|
def activities
|
@@ -3,6 +3,8 @@ module Moodle2CC::Moodle2::Models
|
|
3
3
|
attr_accessor :id, :number, :name, :summary, :summary_format, :sequence, :visible, :available_from, :available_until,
|
4
4
|
:release_code, :show_availability, :grouping_id, :position, :activities
|
5
5
|
|
6
|
+
DEFAULT_NAME = 'Untitled Module'
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@sequence = []
|
8
10
|
@activities = []
|
@@ -3,6 +3,7 @@ module Moodle2CC::Moodle2::Parsers
|
|
3
3
|
include ParserHelper
|
4
4
|
|
5
5
|
COURSE_XML_PATH = 'course/course.xml'
|
6
|
+
SCALES_XML_PATH = 'scales.xml'
|
6
7
|
|
7
8
|
def initialize(backup_folder)
|
8
9
|
@backup_folder = backup_folder
|
@@ -21,10 +22,18 @@ module Moodle2CC::Moodle2::Parsers
|
|
21
22
|
if unix_start_date = parse_text(course_doc, '/course/startdate')
|
22
23
|
course.startdate = Time.at(unix_start_date.to_i)
|
23
24
|
end
|
25
|
+
end
|
24
26
|
|
27
|
+
File.open(File.join(@backup_folder, SCALES_XML_PATH)) do |f|
|
28
|
+
scales_doc = Nokogiri::XML(f)
|
29
|
+
scales_doc.search('scales_definition/scale').each do |node|
|
30
|
+
course.grading_scales[node.attributes['id'].value.to_i] = parse_text(node, 'scale').split(',')
|
31
|
+
end
|
25
32
|
end
|
33
|
+
|
26
34
|
course
|
27
35
|
end
|
28
36
|
|
37
|
+
|
29
38
|
end
|
30
39
|
end
|
@@ -36,6 +36,13 @@ module Moodle2CC::Moodle2::Parsers
|
|
36
36
|
section.show_availability = parse_text(section_xml, 'section/showavailability')
|
37
37
|
section.grouping_id = parse_text(section_xml, 'section/groupingid')
|
38
38
|
end
|
39
|
+
if section.name.to_s.strip.length == 0
|
40
|
+
section.name = Nokogiri::HTML(section.summary.to_s).text rescue ''
|
41
|
+
if section.name.to_s.strip.length == 0
|
42
|
+
section.name = Moodle2CC::Moodle2::Models::Section::DEFAULT_NAME
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
39
46
|
section
|
40
47
|
end
|
41
48
|
|
@@ -2,7 +2,7 @@ module Moodle2CC::Moodle2Converter
|
|
2
2
|
class AssignmentConverter
|
3
3
|
include ConverterHelper
|
4
4
|
|
5
|
-
def convert(moodle_assignment)
|
5
|
+
def convert(moodle_assignment, moodle_grading_scales)
|
6
6
|
canvas_assignment = Moodle2CC::CanvasCC::Models::Assignment.new
|
7
7
|
canvas_assignment.identifier = generate_unique_identifier_for(moodle_assignment.id, ASSIGNMENT_SUFFIX)
|
8
8
|
canvas_assignment.title = truncate_text(moodle_assignment.name)
|
@@ -11,13 +11,23 @@ module Moodle2CC::Moodle2Converter
|
|
11
11
|
canvas_assignment.lock_at = Time.at(Integer(moodle_assignment.cut_off_date)) if moodle_assignment.cut_off_date
|
12
12
|
canvas_assignment.unlock_at = Time.at(Integer(moodle_assignment.allow_submissions_from_date)) if moodle_assignment.allow_submissions_from_date
|
13
13
|
canvas_assignment.workflow_state = workflow_state(moodle_assignment.visible)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
points = Integer(moodle_assignment.grade)
|
15
|
+
if points > 0 || scale = moodle_grading_scales[-1 * points] # moodle uses negative numbers for grading scale ids
|
16
|
+
if scale && scale.count == 2
|
17
|
+
# I'm asssuming that if there's only two choices, that the best way to convert it will probably be pass/fail
|
18
|
+
canvas_assignment.grading_type = 'pass_fail'
|
19
|
+
else
|
20
|
+
canvas_assignment.grading_type = 'points'
|
21
|
+
canvas_assignment.points_possible = points
|
22
|
+
end
|
23
|
+
canvas_assignment.submission_types << 'online_text_entry' if moodle_assignment.online_text_submission == '1'
|
24
|
+
canvas_assignment.submission_types << 'online_upload' if moodle_assignment.file_submission == '1'
|
25
|
+
else
|
26
|
+
canvas_assignment.grading_type = 'not_graded'
|
27
|
+
canvas_assignment.submission_types << 'not_graded'
|
28
|
+
end
|
18
29
|
|
19
30
|
canvas_assignment
|
20
31
|
end
|
21
|
-
|
22
32
|
end
|
23
33
|
end
|
@@ -26,7 +26,8 @@ module Moodle2CC::Moodle2Converter
|
|
26
26
|
def generate_body(moodle_glossary)
|
27
27
|
html = "<h2>#{moodle_glossary.name}</h2>"
|
28
28
|
html += '<dl>'
|
29
|
-
moodle_glossary.entries.
|
29
|
+
entries = moodle_glossary.entries.sort_by{|entry| entry.concept.to_s.downcase}
|
30
|
+
entries.each { |entry| html += "<dt>#{entry.concept}</dt><dd>#{entry.definition}</dd>" }
|
30
31
|
html += '</dl>'
|
31
32
|
html
|
32
33
|
end
|
@@ -15,7 +15,7 @@ module Moodle2CC::Moodle2Converter
|
|
15
15
|
cc_course.pages += convert_pages(moodle_course.pages)
|
16
16
|
cc_course.pages += convert_wikis(moodle_course.wikis)
|
17
17
|
cc_course.discussions += convert_discussions(moodle_course.forums)
|
18
|
-
cc_course.assignments += convert_assignments(moodle_course.assignments)
|
18
|
+
cc_course.assignments += convert_assignments(moodle_course.assignments, moodle_course.grading_scales)
|
19
19
|
|
20
20
|
cc_course.mute_assignments! unless moodle_course.show_grades
|
21
21
|
|
@@ -75,9 +75,9 @@ module Moodle2CC::Moodle2Converter
|
|
75
75
|
discussions.map { |discussion| discussion_converter.convert(discussion) }
|
76
76
|
end
|
77
77
|
|
78
|
-
def convert_assignments(assignments)
|
78
|
+
def convert_assignments(assignments, grading_scales)
|
79
79
|
assignment_converter = Moodle2CC::Moodle2Converter::AssignmentConverter.new
|
80
|
-
assignments.map { |assignment| assignment_converter.convert(assignment) }
|
80
|
+
assignments.map { |assignment| assignment_converter.convert(assignment, grading_scales) }
|
81
81
|
end
|
82
82
|
|
83
83
|
def convert_sections_to_pages(sections)
|
@@ -8,8 +8,17 @@ module Moodle2CC::Moodle2Converter
|
|
8
8
|
canvas_bank.identifier = generate_unique_identifier_for(moodle_category.id, QUESTION_BANK_SUFFIX)
|
9
9
|
canvas_bank.title = truncate_text(moodle_category.name)
|
10
10
|
|
11
|
+
canvas_bank.original_id = moodle_category.id
|
12
|
+
canvas_bank.parent_id = moodle_category.parent
|
13
|
+
|
11
14
|
question_converter = Moodle2CC::Moodle2Converter::QuestionConverters::QuestionConverter.new
|
12
15
|
moodle_category.questions.each do |moodle_question|
|
16
|
+
if moodle_question.type == 'random'
|
17
|
+
# collect the question ids of random questions that belong to this bank
|
18
|
+
canvas_bank.random_question_references << moodle_question.id
|
19
|
+
next
|
20
|
+
end
|
21
|
+
|
13
22
|
item = question_converter.convert(moodle_question)
|
14
23
|
case item
|
15
24
|
when Moodle2CC::CanvasCC::Models::Question
|
data/lib/moodle2cc/version.rb
CHANGED
@@ -82,4 +82,50 @@ describe Moodle2CC::CanvasCC::Models::Assessment do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
|
85
|
+
it 'resolves random quesiton references' do
|
86
|
+
subject.question_references = [
|
87
|
+
{:question => 'random1', :grade => '2'},
|
88
|
+
{:question => 'random2', :grade => '3'},
|
89
|
+
{:question => 'random3', :grade => '3'},
|
90
|
+
{:question => 'nonexistent', :grade => '4'}
|
91
|
+
]
|
92
|
+
|
93
|
+
qb1 = Moodle2CC::CanvasCC::Models::QuestionBank.new
|
94
|
+
q1 = Moodle2CC::CanvasCC::Models::Question.new
|
95
|
+
q1.identifier = '1'
|
96
|
+
q2 = Moodle2CC::CanvasCC::Models::Question.new
|
97
|
+
q2.identifier = '2'
|
98
|
+
|
99
|
+
qb1.questions = [q1, q2]
|
100
|
+
qb1.original_id = 'parent'
|
101
|
+
qb1.random_question_references = ['random1', 'random2']
|
102
|
+
|
103
|
+
qb2 = Moodle2CC::CanvasCC::Models::QuestionBank.new
|
104
|
+
q3 = Moodle2CC::CanvasCC::Models::Question.new
|
105
|
+
q3.identifier = '3'
|
106
|
+
qb2.parent_id = 'parent'
|
107
|
+
qb2.questions = [q3]
|
108
|
+
|
109
|
+
qb3 = Moodle2CC::CanvasCC::Models::QuestionBank.new
|
110
|
+
q4 = Moodle2CC::CanvasCC::Models::Question.new
|
111
|
+
q4.identifier = '4'
|
112
|
+
q5 = Moodle2CC::CanvasCC::Models::Question.new
|
113
|
+
q5.identifier = '5'
|
114
|
+
qb3.questions = [q4, q5]
|
115
|
+
qb3.random_question_references = ['random3']
|
116
|
+
|
117
|
+
subject.resolve_question_references!([qb1, qb2, qb3])
|
118
|
+
|
119
|
+
expect(subject.items.count).to eq 2
|
120
|
+
group1 = subject.items[0]
|
121
|
+
expect(group1.class).to eq Moodle2CC::CanvasCC::Models::QuestionGroup
|
122
|
+
expect(group1.selection_number).to eq 2
|
123
|
+
expect(group1.questions.map(&:identifier)).to eq [q1, q2, q3].map(&:identifier)
|
124
|
+
|
125
|
+
group2 = subject.items[1]
|
126
|
+
expect(group2.class).to eq Moodle2CC::CanvasCC::Models::QuestionGroup
|
127
|
+
expect(group2.selection_number).to eq 1
|
128
|
+
expect(group2.questions.map(&:identifier)).to eq qb3.questions.map(&:identifier)
|
129
|
+
end
|
130
|
+
|
85
131
|
end
|
@@ -10,7 +10,7 @@ module Moodle2CC::Moodle2::Parsers
|
|
10
10
|
|
11
11
|
expect(section.position).to eq(0)
|
12
12
|
expect(section.number).to eq('0')
|
13
|
-
expect(section.name).to
|
13
|
+
expect(section.name).to eq('This is the General Summary')
|
14
14
|
expect(section.summary).to eq('<p>This is the General Summary</p>')
|
15
15
|
expect(section.summary_format).to eq('1')
|
16
16
|
expect(section.sequence).to eq(['1', '11'])
|
@@ -15,7 +15,7 @@ describe Moodle2CC::Moodle2Converter::AssignmentConverter do
|
|
15
15
|
moodle_assign.file_submission = '1'
|
16
16
|
moodle_assign.visible = 1
|
17
17
|
|
18
|
-
canvas_assign = subject.convert(moodle_assign)
|
18
|
+
canvas_assign = subject.convert(moodle_assign, {})
|
19
19
|
|
20
20
|
expect(canvas_assign.identifier).to eq 'm2d12c3b616363d9f3088155447732972b_assignment'
|
21
21
|
expect(canvas_assign.title).to eq 'Assignment Name'
|
@@ -24,11 +24,24 @@ describe Moodle2CC::Moodle2Converter::AssignmentConverter do
|
|
24
24
|
expect(canvas_assign.lock_at).to eq Time.parse('Sat, 08 Feb 2014 18:00:00 GMT')
|
25
25
|
expect(canvas_assign.unlock_at).to eq Time.parse('Sat, 08 Feb 2014 01:00:00 GMT')
|
26
26
|
expect(canvas_assign.workflow_state).to eq 'active'
|
27
|
-
expect(canvas_assign.points_possible).to eq
|
27
|
+
expect(canvas_assign.points_possible).to eq 30
|
28
28
|
expect(canvas_assign.grading_type).to eq 'points'
|
29
|
+
end
|
29
30
|
|
31
|
+
it 'converts a not graded moodle2 assignment' do
|
32
|
+
moodle_assign.grade = '0'
|
30
33
|
|
34
|
+
canvas_assign = subject.convert(moodle_assign, {})
|
31
35
|
|
36
|
+
expect(canvas_assign.submission_types).to eq ['not_graded']
|
37
|
+
expect(canvas_assign.grading_type).to eq 'not_graded'
|
32
38
|
end
|
33
39
|
|
40
|
+
it 'converts a moodle2 assignment with a two part grading scale to pass/fail' do
|
41
|
+
moodle_assign.grade = '-500'
|
42
|
+
|
43
|
+
canvas_assign = subject.convert(moodle_assign, {500 => ['complete', 'not complete']})
|
44
|
+
|
45
|
+
expect(canvas_assign.grading_type).to eq 'pass_fail'
|
46
|
+
end
|
34
47
|
end
|
@@ -41,4 +41,21 @@ describe Moodle2CC::Moodle2Converter::QuestionBankConverter do
|
|
41
41
|
expect(canvas_group.questions.detect{|q| q.original_identifier == question1.id}).not_to be_nil
|
42
42
|
expect(canvas_group.questions.detect{|q| q.original_identifier == question2.id}).not_to be_nil
|
43
43
|
end
|
44
|
+
|
45
|
+
it 'retains references to random questions but does not convert them' do
|
46
|
+
question1 = Moodle2CC::Moodle2::Models::Quizzes::Question.create('random')
|
47
|
+
question2 = Moodle2CC::Moodle2::Models::Quizzes::Question.create('random')
|
48
|
+
question1.id = 'blah'
|
49
|
+
question2.id = 'bloo'
|
50
|
+
question3 = Moodle2CC::Moodle2::Models::Quizzes::Question.create('truefalse')
|
51
|
+
question4 = Moodle2CC::Moodle2::Models::Quizzes::Question.create('truefalse')
|
52
|
+
moodle_category.questions = [question1, question2, question3, question4]
|
53
|
+
|
54
|
+
canvas_bank = subject.convert(moodle_category)
|
55
|
+
|
56
|
+
expect(canvas_bank.questions.count).to eq 2
|
57
|
+
expect(canvas_bank.random_question_references.count).to eq 2
|
58
|
+
expect(canvas_bank.random_question_references.detect{|q| q == question1.id}).not_to be_nil
|
59
|
+
expect(canvas_bank.random_question_references.detect{|q| q == question2.id}).not_to be_nil
|
60
|
+
end
|
44
61
|
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moodle2cc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Christopher Durtschi
|
@@ -10,202 +11,230 @@ authors:
|
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date: 2014-
|
14
|
+
date: 2014-05-09 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: rubyzip
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
18
20
|
requirements:
|
19
|
-
- - '>='
|
21
|
+
- - ! '>='
|
20
22
|
- !ruby/object:Gem::Version
|
21
23
|
version: 1.0.0
|
22
24
|
type: :runtime
|
23
25
|
prerelease: false
|
24
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
25
28
|
requirements:
|
26
|
-
- - '>='
|
29
|
+
- - ! '>='
|
27
30
|
- !ruby/object:Gem::Version
|
28
31
|
version: 1.0.0
|
29
32
|
- !ruby/object:Gem::Dependency
|
30
33
|
name: happymapper
|
31
34
|
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
32
36
|
requirements:
|
33
|
-
- - '>='
|
37
|
+
- - ! '>='
|
34
38
|
- !ruby/object:Gem::Version
|
35
39
|
version: '0'
|
36
40
|
type: :runtime
|
37
41
|
prerelease: false
|
38
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
39
44
|
requirements:
|
40
|
-
- - '>='
|
45
|
+
- - ! '>='
|
41
46
|
- !ruby/object:Gem::Version
|
42
47
|
version: '0'
|
43
48
|
- !ruby/object:Gem::Dependency
|
44
49
|
name: builder
|
45
50
|
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
46
52
|
requirements:
|
47
|
-
- - '>='
|
53
|
+
- - ! '>='
|
48
54
|
- !ruby/object:Gem::Version
|
49
55
|
version: '0'
|
50
56
|
type: :runtime
|
51
57
|
prerelease: false
|
52
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
53
60
|
requirements:
|
54
|
-
- - '>='
|
61
|
+
- - ! '>='
|
55
62
|
- !ruby/object:Gem::Version
|
56
63
|
version: '0'
|
57
64
|
- !ruby/object:Gem::Dependency
|
58
65
|
name: thor
|
59
66
|
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
60
68
|
requirements:
|
61
|
-
- - '>='
|
69
|
+
- - ! '>='
|
62
70
|
- !ruby/object:Gem::Version
|
63
71
|
version: '0'
|
64
72
|
type: :runtime
|
65
73
|
prerelease: false
|
66
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
67
76
|
requirements:
|
68
|
-
- - '>='
|
77
|
+
- - ! '>='
|
69
78
|
- !ruby/object:Gem::Version
|
70
79
|
version: '0'
|
71
80
|
- !ruby/object:Gem::Dependency
|
72
81
|
name: nokogiri
|
73
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
74
84
|
requirements:
|
75
|
-
- - '>='
|
85
|
+
- - ! '>='
|
76
86
|
- !ruby/object:Gem::Version
|
77
87
|
version: '0'
|
78
88
|
type: :runtime
|
79
89
|
prerelease: false
|
80
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
81
92
|
requirements:
|
82
|
-
- - '>='
|
93
|
+
- - ! '>='
|
83
94
|
- !ruby/object:Gem::Version
|
84
95
|
version: '0'
|
85
96
|
- !ruby/object:Gem::Dependency
|
86
97
|
name: rdiscount
|
87
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
88
100
|
requirements:
|
89
|
-
- - '>='
|
101
|
+
- - ! '>='
|
90
102
|
- !ruby/object:Gem::Version
|
91
103
|
version: '0'
|
92
104
|
type: :runtime
|
93
105
|
prerelease: false
|
94
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
95
108
|
requirements:
|
96
|
-
- - '>='
|
109
|
+
- - ! '>='
|
97
110
|
- !ruby/object:Gem::Version
|
98
111
|
version: '0'
|
99
112
|
- !ruby/object:Gem::Dependency
|
100
113
|
name: rake
|
101
114
|
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
|
-
- - '>='
|
117
|
+
- - ! '>='
|
104
118
|
- !ruby/object:Gem::Version
|
105
119
|
version: '0'
|
106
120
|
type: :development
|
107
121
|
prerelease: false
|
108
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
109
124
|
requirements:
|
110
|
-
- - '>='
|
125
|
+
- - ! '>='
|
111
126
|
- !ruby/object:Gem::Version
|
112
127
|
version: '0'
|
113
128
|
- !ruby/object:Gem::Dependency
|
114
129
|
name: minitest
|
115
130
|
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
116
132
|
requirements:
|
117
|
-
- - '>='
|
133
|
+
- - ! '>='
|
118
134
|
- !ruby/object:Gem::Version
|
119
135
|
version: '0'
|
120
136
|
type: :development
|
121
137
|
prerelease: false
|
122
138
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
123
140
|
requirements:
|
124
|
-
- - '>='
|
141
|
+
- - ! '>='
|
125
142
|
- !ruby/object:Gem::Version
|
126
143
|
version: '0'
|
127
144
|
- !ruby/object:Gem::Dependency
|
128
145
|
name: rspec
|
129
146
|
requirement: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
130
148
|
requirements:
|
131
|
-
- - '>='
|
149
|
+
- - ! '>='
|
132
150
|
- !ruby/object:Gem::Version
|
133
151
|
version: '0'
|
134
152
|
type: :development
|
135
153
|
prerelease: false
|
136
154
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
137
156
|
requirements:
|
138
|
-
- - '>='
|
157
|
+
- - ! '>='
|
139
158
|
- !ruby/object:Gem::Version
|
140
159
|
version: '0'
|
141
160
|
- !ruby/object:Gem::Dependency
|
142
161
|
name: guard
|
143
162
|
requirement: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
144
164
|
requirements:
|
145
|
-
- - '>='
|
165
|
+
- - ! '>='
|
146
166
|
- !ruby/object:Gem::Version
|
147
167
|
version: '0'
|
148
168
|
type: :development
|
149
169
|
prerelease: false
|
150
170
|
version_requirements: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
151
172
|
requirements:
|
152
|
-
- - '>='
|
173
|
+
- - ! '>='
|
153
174
|
- !ruby/object:Gem::Version
|
154
175
|
version: '0'
|
155
176
|
- !ruby/object:Gem::Dependency
|
156
177
|
name: guard-bundler
|
157
178
|
requirement: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
158
180
|
requirements:
|
159
|
-
- - '>='
|
181
|
+
- - ! '>='
|
160
182
|
- !ruby/object:Gem::Version
|
161
183
|
version: '0'
|
162
184
|
type: :development
|
163
185
|
prerelease: false
|
164
186
|
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
none: false
|
165
188
|
requirements:
|
166
|
-
- - '>='
|
189
|
+
- - ! '>='
|
167
190
|
- !ruby/object:Gem::Version
|
168
191
|
version: '0'
|
169
192
|
- !ruby/object:Gem::Dependency
|
170
193
|
name: guard-minitest
|
171
194
|
requirement: !ruby/object:Gem::Requirement
|
195
|
+
none: false
|
172
196
|
requirements:
|
173
|
-
- - '>='
|
197
|
+
- - ! '>='
|
174
198
|
- !ruby/object:Gem::Version
|
175
199
|
version: '0'
|
176
200
|
type: :development
|
177
201
|
prerelease: false
|
178
202
|
version_requirements: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
179
204
|
requirements:
|
180
|
-
- - '>='
|
205
|
+
- - ! '>='
|
181
206
|
- !ruby/object:Gem::Version
|
182
207
|
version: '0'
|
183
208
|
- !ruby/object:Gem::Dependency
|
184
209
|
name: guard-rspec
|
185
210
|
requirement: !ruby/object:Gem::Requirement
|
211
|
+
none: false
|
186
212
|
requirements:
|
187
|
-
- - '>='
|
213
|
+
- - ! '>='
|
188
214
|
- !ruby/object:Gem::Version
|
189
215
|
version: '0'
|
190
216
|
type: :development
|
191
217
|
prerelease: false
|
192
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
none: false
|
193
220
|
requirements:
|
194
|
-
- - '>='
|
221
|
+
- - ! '>='
|
195
222
|
- !ruby/object:Gem::Version
|
196
223
|
version: '0'
|
197
224
|
- !ruby/object:Gem::Dependency
|
198
225
|
name: debugger
|
199
226
|
requirement: !ruby/object:Gem::Requirement
|
227
|
+
none: false
|
200
228
|
requirements:
|
201
|
-
- - '>='
|
229
|
+
- - ! '>='
|
202
230
|
- !ruby/object:Gem::Version
|
203
231
|
version: '0'
|
204
232
|
type: :development
|
205
233
|
prerelease: false
|
206
234
|
version_requirements: !ruby/object:Gem::Requirement
|
235
|
+
none: false
|
207
236
|
requirements:
|
208
|
-
- - '>='
|
237
|
+
- - ! '>='
|
209
238
|
- !ruby/object:Gem::Version
|
210
239
|
version: '0'
|
211
240
|
description: Migrates Moodle backup ZIP to IMS Common Cartridge package
|
@@ -799,26 +828,27 @@ files:
|
|
799
828
|
homepage: https://github.com/instructure/moodle2cc
|
800
829
|
licenses:
|
801
830
|
- AGPLv3
|
802
|
-
metadata: {}
|
803
831
|
post_install_message:
|
804
832
|
rdoc_options: []
|
805
833
|
require_paths:
|
806
834
|
- lib
|
807
835
|
required_ruby_version: !ruby/object:Gem::Requirement
|
836
|
+
none: false
|
808
837
|
requirements:
|
809
|
-
- - '>='
|
838
|
+
- - ! '>='
|
810
839
|
- !ruby/object:Gem::Version
|
811
840
|
version: '0'
|
812
841
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
842
|
+
none: false
|
813
843
|
requirements:
|
814
|
-
- - '>='
|
844
|
+
- - ! '>='
|
815
845
|
- !ruby/object:Gem::Version
|
816
846
|
version: '0'
|
817
847
|
requirements: []
|
818
848
|
rubyforge_project:
|
819
|
-
rubygems_version:
|
849
|
+
rubygems_version: 1.8.23
|
820
850
|
signing_key:
|
821
|
-
specification_version:
|
851
|
+
specification_version: 3
|
822
852
|
summary: Migrates Moodle backup ZIP to IMS Common Cartridge package
|
823
853
|
test_files:
|
824
854
|
- spec/moodle2cc/canvas_cc/assessment_writer_spec.rb
|
@@ -1207,3 +1237,4 @@ test_files:
|
|
1207
1237
|
- test/unit/moodle/question_test.rb
|
1208
1238
|
- test/unit/moodle/section_test.rb
|
1209
1239
|
- test/unit/resource_factory_test.rb
|
1240
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 822f9cffd3b238adb3b971d6bf64a300c520a1fd
|
4
|
-
data.tar.gz: 9da80263ebae391337993e9163650ea8b373a754
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: e9047f2fab33dd05f09cdaa47681f03cedb883f544c355431a0c900ead6f343a7209bbf24c4d74e7d45a1b5d20be7f0d4827e7d7c78ab81d046e8b4351c5400d
|
7
|
-
data.tar.gz: 292b07a59bb7c6bc515039799a5bb37a7b5929c8f9af19d914dcaeccc4493adb6aaa5b50bbbd5e711f9050a6612f954b0de8db22eebc8f502c2252bac276f677
|