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 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
- * Support exporting to CC 1.2
94
- * Quiz conversion
95
- * Question Category conversion
96
- * LTI configurations?
97
- * Convert more Moodle features as requested
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,7 +3,7 @@ module Moodle2CC::Moodle2::Models::Quizzes
3
3
 
4
4
  @@subclasses = {}
5
5
 
6
- STANDARD_TYPES = ['description', 'essay', 'shortanswer']
6
+ STANDARD_TYPES = ['description', 'essay', 'random', 'shortanswer']
7
7
 
8
8
  def self.create(type)
9
9
  if c = @@subclasses[type]
@@ -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
@@ -20,6 +20,7 @@ module Moodle2CC::Moodle2
20
20
  # simple question types
21
21
  register_parser_type('description')
22
22
  register_parser_type('essay')
23
+ register_parser_type('random')
23
24
 
24
25
  def parse_question(node, question_type = nil)
25
26
  begin
@@ -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
- canvas_assignment.points_possible = moodle_assignment.grade
15
- canvas_assignment.grading_type = 'points'
16
- canvas_assignment.submission_types << 'online_text_entry' if moodle_assignment.online_text_submission == '1'
17
- canvas_assignment.submission_types << 'online_upload' if moodle_assignment.file_submission == '1'
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.each { |entry| html += "<dt>#{entry.concept}</dt><dd>#{entry.definition}</dd>" }
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
@@ -1,3 +1,3 @@
1
1
  module Moodle2CC
2
- VERSION = "0.2.6"
2
+ VERSION = "0.2.7"
3
3
  end
@@ -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 be_nil
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 '30'
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.6
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-04-28 00:00:00.000000000 Z
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: 2.0.3
849
+ rubygems_version: 1.8.23
820
850
  signing_key:
821
- specification_version: 4
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