moodle2cc 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +0 -0
  3. data/Changelog +3 -0
  4. data/LICENSE +0 -0
  5. data/lib/moodle2cc/canvas/assessment.rb +0 -0
  6. data/lib/moodle2cc/canvas/assignment.rb +0 -0
  7. data/lib/moodle2cc/canvas/converter.rb +0 -0
  8. data/lib/moodle2cc/canvas/course.rb +0 -0
  9. data/lib/moodle2cc/canvas/discussion_topic.rb +0 -0
  10. data/lib/moodle2cc/canvas/label.rb +0 -0
  11. data/lib/moodle2cc/canvas/question_bank.rb +0 -0
  12. data/lib/moodle2cc/canvas/question_group.rb +0 -0
  13. data/lib/moodle2cc/canvas/resource.rb +0 -0
  14. data/lib/moodle2cc/canvas/templates/assignment.html.erb +0 -0
  15. data/lib/moodle2cc/canvas/templates/syllabus.html.erb +0 -0
  16. data/lib/moodle2cc/canvas/templates/wiki_content.html.erb +0 -0
  17. data/lib/moodle2cc/canvas/web_content.rb +0 -0
  18. data/lib/moodle2cc/canvas/web_link.rb +0 -0
  19. data/lib/moodle2cc/canvas/wiki.rb +0 -0
  20. data/lib/moodle2cc/cc/assessment.rb +0 -0
  21. data/lib/moodle2cc/cc/assignment.rb +0 -0
  22. data/lib/moodle2cc/cc/course.rb +0 -0
  23. data/lib/moodle2cc/cc/discussion_topic.rb +0 -0
  24. data/lib/moodle2cc/cc/label.rb +0 -0
  25. data/lib/moodle2cc/cc/question.rb +0 -0
  26. data/lib/moodle2cc/cc/resource.rb +0 -0
  27. data/lib/moodle2cc/cc/templates/assignment.html.erb +0 -0
  28. data/lib/moodle2cc/cc/templates/syllabus.html.erb +0 -0
  29. data/lib/moodle2cc/cc/templates/wiki_content.html.erb +0 -0
  30. data/lib/moodle2cc/cc/web_link.rb +0 -0
  31. data/lib/moodle2cc/cc/wiki.rb +0 -0
  32. data/lib/moodle2cc/error.rb +0 -0
  33. data/lib/moodle2cc/logger.rb +0 -0
  34. data/lib/moodle2cc/migrator.rb +4 -0
  35. data/lib/moodle2cc/moodle/course.rb +0 -0
  36. data/lib/moodle2cc/moodle/grade_item.rb +0 -0
  37. data/lib/moodle2cc/moodle/info.rb +0 -0
  38. data/lib/moodle2cc/moodle/question_category.rb +0 -0
  39. data/lib/moodle2cc/moodle/section.rb +0 -0
  40. data/lib/moodle2cc/moodle2/extractor.rb +34 -5
  41. data/lib/moodle2cc/moodle2/models/course.rb +2 -1
  42. data/lib/moodle2cc/moodle2/parsers/file_parser.rb +7 -2
  43. data/lib/moodle2cc/moodle2converter/section_converter.rb +1 -1
  44. data/lib/moodle2cc/version.rb +1 -1
  45. data/spec/moodle2cc/moodle2/extractor_spec.rb +1 -1
  46. data/spec/moodle2cc/moodle2/parsers/file_parser_spec.rb +1 -1
  47. data/test/fixtures/cc.imscc +0 -0
  48. data/test/fixtures/moodle_backup/course_files/folder/test.txt +0 -0
  49. data/test/fixtures/moodle_backup/course_files/test.txt +0 -0
  50. data/test/fixtures/moodle_backup_random_questions/course_files/folder/test.txt +0 -0
  51. data/test/fixtures/moodle_backup_random_questions/course_files/test.txt +0 -0
  52. data/test/fixtures/moodle_backup_random_questions/moodle.xml +0 -0
  53. data/test/unit/logger_test.rb +0 -0
  54. metadata +5 -35
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ N2Q2ZTc4YzA1YTkwZDA5Y2VlMmEyMDBlODFhZDMwOTM1YTc0ZGI0ZQ==
5
+ data.tar.gz: !binary |-
6
+ ODZkNTJlZGZkYjJkMzdiNGQzZGFhNmM2N2Y3YWE4MGE2NjU5NjdhOQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MDFkYWJhYjY2YWU1ZWE1MDVmN2I4YjI5ZWQ1YjhhM2E2Nzc2MDhiNjBhZTc5
10
+ YzhlYzk5YjUyZDI5YzY3ZWY2ZWRkM2U0M2IzNTAzYTY1MDBhY2QzYjY4MTgz
11
+ ODE4ZGQxZWJjYzIxNmY2N2VjY2Q0M2Y1MzM4NDVkMDg5MzViNTM=
12
+ data.tar.gz: !binary |-
13
+ YzFmYjIyYWNhNWY3OWM2NTJiMTAyNGViZjEzMTU3Mjg4OTBlMzVkYjRhNTRm
14
+ MWRiMjQxZWZiMTVjZTZlNTU5NDgzMjRlNzlhNjFhYWQ1M2ZmMzFlNzYwNWRi
15
+ NjA3MDNmOTRmYmE5MjE5YTU5YWU4NzVlYjYxMjE0YWVjODVlYTg=
data/.gitignore CHANGED
File without changes
data/Changelog CHANGED
@@ -1,3 +1,6 @@
1
+ 2014-05-27 Version 0.2.8
2
+ * Improve handling of missing and external file references
3
+
1
4
  2014-05-09 Version 0.2.7
2
5
  * Convert File path tokens in questions and answers
3
6
  * Improve assignment gradint_type conversion
data/LICENSE CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -3,6 +3,8 @@ require 'zip'
3
3
  module Moodle2CC
4
4
  class Migrator
5
5
 
6
+ attr_accessor :last_error
7
+
6
8
  MOODLE_1_9 = '1.9'
7
9
  MOODLE_2 = '2'
8
10
 
@@ -18,6 +20,7 @@ module Moodle2CC
18
20
  end
19
21
 
20
22
  def migrate
23
+ @last_error = nil
21
24
  case moodle_version
22
25
  when MOODLE_1_9
23
26
  migrate_moodle_1_9
@@ -25,6 +28,7 @@ module Moodle2CC
25
28
  migrate_moodle_2
26
29
  end
27
30
  rescue StandardError => error
31
+ @last_error = error
28
32
  Moodle2CC::Logger.add_warning 'error migrating content', error
29
33
  end
30
34
 
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -32,7 +32,7 @@ module Moodle2CC::Moodle2
32
32
  parse_labels(work_dir, course)
33
33
  parse_external_urls(work_dir, course)
34
34
  parse_resources(work_dir, course)
35
- collect_files_for_resources(course.files, course.resources)
35
+ collect_files_for_resources(course)
36
36
  collect_activities_for_sections(course.sections, course.activities)
37
37
  yield course
38
38
  end
@@ -57,8 +57,10 @@ module Moodle2CC::Moodle2
57
57
  end
58
58
 
59
59
  def parse_files(work_dir, course)
60
- if files = Moodle2CC::Moodle2::Parsers::FileParser.new(work_dir).parse
60
+ if result = Moodle2CC::Moodle2::Parsers::FileParser.new(work_dir).parse
61
+ files, missing_files = result
61
62
  course.files += files
63
+ course.missing_files += missing_files
62
64
  end
63
65
  end
64
66
 
@@ -153,12 +155,39 @@ module Moodle2CC::Moodle2
153
155
  end
154
156
  end
155
157
 
156
- def collect_files_for_resources(files, resources)
158
+ def collect_files_for_resources(course)
157
159
  files_hash = {}
158
- files.each{ |file| files_hash[file.id] = file }
159
- resources.each do |resource|
160
+ course.files.each{ |file| files_hash[file.id] = file }
161
+
162
+ translated_resources = []
163
+ course.resources.each do |resource|
160
164
  file_id = resource.file_ids.find{|id| files_hash.key?(id)}
161
165
  resource.file = files_hash[file_id]
166
+ if resource.file.nil? && translate_missing_file_reference(resource, course)
167
+ translated_resources << resource
168
+ end
169
+ end
170
+
171
+ translated_resources.each do |resource|
172
+ course.resources.delete(resource)
173
+ end
174
+ end
175
+
176
+ def translate_missing_file_reference(resource, course)
177
+ # turn missing external files to external urls
178
+ if missing_file = course.missing_files.detect{|f| resource.file_ids.include?(f.id)}
179
+ if missing_file.reference =~ /\"url\"[^\"]*\"([^\"]*)\"/
180
+ url = $1.to_s
181
+ if url.start_with?("http")
182
+ ext_url = Moodle2CC::Moodle2::Models::ExternalUrl.new
183
+ ext_url.id = resource.id
184
+ ext_url.module_id = resource.module_id
185
+ ext_url.name = resource.name
186
+ ext_url.external_url = url
187
+ course.external_urls << ext_url
188
+ return true
189
+ end
190
+ end
162
191
  end
163
192
  end
164
193
 
@@ -4,11 +4,12 @@ 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, :grading_scales
7
+ :feedbacks, :wikis, :grading_scales, :missing_files
8
8
 
9
9
  def initialize
10
10
  @sections = []
11
11
  @files = []
12
+ @missing_files = []
12
13
  @pages = []
13
14
  @forums = []
14
15
  @assignments = []
@@ -14,6 +14,7 @@ module Moodle2CC::Moodle2::Parsers
14
14
  xml = Nokogiri::XML(File.read(File.join(@work_dir, FILES_XML)))
15
15
  file_nodes = xml./('files/file')
16
16
  files = []
17
+ missing_files = []
17
18
  file_nodes.each do |node|
18
19
  file = Moodle2CC::Moodle2::Models::Moodle2File.new
19
20
  file.id = node.at_xpath('@id').value
@@ -38,9 +39,13 @@ module Moodle2CC::Moodle2::Parsers
38
39
  file.repository_id = parse_text(node, 'repositoryid')
39
40
  file.reference = parse_text(node, 'reference')
40
41
  file.file_location = File.join(@work_dir, FILES_DIR, file.content_hash[0..1], file.content_hash)
41
- files << file if file.file_size > 0
42
+ if file.file_size > 0 && File.exists?(file.file_location)
43
+ files << file
44
+ else
45
+ missing_files << file
46
+ end
42
47
  end
43
- files
48
+ [files, missing_files]
44
49
  end
45
50
 
46
51
  end
@@ -54,7 +54,7 @@ module Moodle2CC
54
54
  module_item.identifierref = module_item.identifier
55
55
  module_item.url = moodle_activity.external_url.gsub(/\s/, '%20')
56
56
  elsif moodle_activity.is_a? Moodle2::Models::Resource
57
- module_item.identifierref = moodle_activity.file.content_hash
57
+ module_item.identifierref = moodle_activity.file.content_hash if moodle_activity.file
58
58
  else
59
59
  module_item.identifierref = generate_unique_identifier_for_activity(moodle_activity)
60
60
  end
@@ -1,3 +1,3 @@
1
1
  module Moodle2CC
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  end
@@ -92,7 +92,7 @@ module Moodle2CC::Moodle2
92
92
 
93
93
  it 'parses files' do
94
94
  file = Models::Moodle2File.new
95
- Parsers::FileParser.any_instance.stub(:parse).and_return([file])
95
+ Parsers::FileParser.any_instance.stub(:parse).and_return([[file], []])
96
96
  extractor.extract {}
97
97
  expect(course.files).to eq [file]
98
98
  end
@@ -5,7 +5,7 @@ module Moodle2CC::Moodle2::Parsers
5
5
 
6
6
  it 'should parse files' do
7
7
  file_parser = FileParser.new(fixture_path(File.join('moodle2', 'backup')))
8
- files = file_parser.parse
8
+ files, missing_files = file_parser.parse
9
9
  file = files.find{|f| f.id == '29'}
10
10
  expect(file.id).to eq('29')
11
11
  expect(file.content_hash).to eq('a0f324310c8d8dd9c79458986c4322f5a060a1d9')
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moodle2cc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
5
- prerelease:
4
+ version: 0.2.8
6
5
  platform: ruby
7
6
  authors:
8
7
  - Christopher Durtschi
@@ -11,12 +10,11 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2014-05-09 00:00:00.000000000 Z
13
+ date: 2014-05-27 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rubyzip
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
19
  - - ! '>='
22
20
  - !ruby/object:Gem::Version
@@ -24,7 +22,6 @@ dependencies:
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
26
  - - ! '>='
30
27
  - !ruby/object:Gem::Version
@@ -32,7 +29,6 @@ dependencies:
32
29
  - !ruby/object:Gem::Dependency
33
30
  name: happymapper
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
33
  - - ! '>='
38
34
  - !ruby/object:Gem::Version
@@ -40,7 +36,6 @@ dependencies:
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
40
  - - ! '>='
46
41
  - !ruby/object:Gem::Version
@@ -48,7 +43,6 @@ dependencies:
48
43
  - !ruby/object:Gem::Dependency
49
44
  name: builder
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
47
  - - ! '>='
54
48
  - !ruby/object:Gem::Version
@@ -56,7 +50,6 @@ dependencies:
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
54
  - - ! '>='
62
55
  - !ruby/object:Gem::Version
@@ -64,7 +57,6 @@ dependencies:
64
57
  - !ruby/object:Gem::Dependency
65
58
  name: thor
66
59
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
61
  - - ! '>='
70
62
  - !ruby/object:Gem::Version
@@ -72,7 +64,6 @@ dependencies:
72
64
  type: :runtime
73
65
  prerelease: false
74
66
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
67
  requirements:
77
68
  - - ! '>='
78
69
  - !ruby/object:Gem::Version
@@ -80,7 +71,6 @@ dependencies:
80
71
  - !ruby/object:Gem::Dependency
81
72
  name: nokogiri
82
73
  requirement: !ruby/object:Gem::Requirement
83
- none: false
84
74
  requirements:
85
75
  - - ! '>='
86
76
  - !ruby/object:Gem::Version
@@ -88,7 +78,6 @@ dependencies:
88
78
  type: :runtime
89
79
  prerelease: false
90
80
  version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
81
  requirements:
93
82
  - - ! '>='
94
83
  - !ruby/object:Gem::Version
@@ -96,7 +85,6 @@ dependencies:
96
85
  - !ruby/object:Gem::Dependency
97
86
  name: rdiscount
98
87
  requirement: !ruby/object:Gem::Requirement
99
- none: false
100
88
  requirements:
101
89
  - - ! '>='
102
90
  - !ruby/object:Gem::Version
@@ -104,7 +92,6 @@ dependencies:
104
92
  type: :runtime
105
93
  prerelease: false
106
94
  version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
95
  requirements:
109
96
  - - ! '>='
110
97
  - !ruby/object:Gem::Version
@@ -112,7 +99,6 @@ dependencies:
112
99
  - !ruby/object:Gem::Dependency
113
100
  name: rake
114
101
  requirement: !ruby/object:Gem::Requirement
115
- none: false
116
102
  requirements:
117
103
  - - ! '>='
118
104
  - !ruby/object:Gem::Version
@@ -120,7 +106,6 @@ dependencies:
120
106
  type: :development
121
107
  prerelease: false
122
108
  version_requirements: !ruby/object:Gem::Requirement
123
- none: false
124
109
  requirements:
125
110
  - - ! '>='
126
111
  - !ruby/object:Gem::Version
@@ -128,7 +113,6 @@ dependencies:
128
113
  - !ruby/object:Gem::Dependency
129
114
  name: minitest
130
115
  requirement: !ruby/object:Gem::Requirement
131
- none: false
132
116
  requirements:
133
117
  - - ! '>='
134
118
  - !ruby/object:Gem::Version
@@ -136,7 +120,6 @@ dependencies:
136
120
  type: :development
137
121
  prerelease: false
138
122
  version_requirements: !ruby/object:Gem::Requirement
139
- none: false
140
123
  requirements:
141
124
  - - ! '>='
142
125
  - !ruby/object:Gem::Version
@@ -144,7 +127,6 @@ dependencies:
144
127
  - !ruby/object:Gem::Dependency
145
128
  name: rspec
146
129
  requirement: !ruby/object:Gem::Requirement
147
- none: false
148
130
  requirements:
149
131
  - - ! '>='
150
132
  - !ruby/object:Gem::Version
@@ -152,7 +134,6 @@ dependencies:
152
134
  type: :development
153
135
  prerelease: false
154
136
  version_requirements: !ruby/object:Gem::Requirement
155
- none: false
156
137
  requirements:
157
138
  - - ! '>='
158
139
  - !ruby/object:Gem::Version
@@ -160,7 +141,6 @@ dependencies:
160
141
  - !ruby/object:Gem::Dependency
161
142
  name: guard
162
143
  requirement: !ruby/object:Gem::Requirement
163
- none: false
164
144
  requirements:
165
145
  - - ! '>='
166
146
  - !ruby/object:Gem::Version
@@ -168,7 +148,6 @@ dependencies:
168
148
  type: :development
169
149
  prerelease: false
170
150
  version_requirements: !ruby/object:Gem::Requirement
171
- none: false
172
151
  requirements:
173
152
  - - ! '>='
174
153
  - !ruby/object:Gem::Version
@@ -176,7 +155,6 @@ dependencies:
176
155
  - !ruby/object:Gem::Dependency
177
156
  name: guard-bundler
178
157
  requirement: !ruby/object:Gem::Requirement
179
- none: false
180
158
  requirements:
181
159
  - - ! '>='
182
160
  - !ruby/object:Gem::Version
@@ -184,7 +162,6 @@ dependencies:
184
162
  type: :development
185
163
  prerelease: false
186
164
  version_requirements: !ruby/object:Gem::Requirement
187
- none: false
188
165
  requirements:
189
166
  - - ! '>='
190
167
  - !ruby/object:Gem::Version
@@ -192,7 +169,6 @@ dependencies:
192
169
  - !ruby/object:Gem::Dependency
193
170
  name: guard-minitest
194
171
  requirement: !ruby/object:Gem::Requirement
195
- none: false
196
172
  requirements:
197
173
  - - ! '>='
198
174
  - !ruby/object:Gem::Version
@@ -200,7 +176,6 @@ dependencies:
200
176
  type: :development
201
177
  prerelease: false
202
178
  version_requirements: !ruby/object:Gem::Requirement
203
- none: false
204
179
  requirements:
205
180
  - - ! '>='
206
181
  - !ruby/object:Gem::Version
@@ -208,7 +183,6 @@ dependencies:
208
183
  - !ruby/object:Gem::Dependency
209
184
  name: guard-rspec
210
185
  requirement: !ruby/object:Gem::Requirement
211
- none: false
212
186
  requirements:
213
187
  - - ! '>='
214
188
  - !ruby/object:Gem::Version
@@ -216,7 +190,6 @@ dependencies:
216
190
  type: :development
217
191
  prerelease: false
218
192
  version_requirements: !ruby/object:Gem::Requirement
219
- none: false
220
193
  requirements:
221
194
  - - ! '>='
222
195
  - !ruby/object:Gem::Version
@@ -224,7 +197,6 @@ dependencies:
224
197
  - !ruby/object:Gem::Dependency
225
198
  name: debugger
226
199
  requirement: !ruby/object:Gem::Requirement
227
- none: false
228
200
  requirements:
229
201
  - - ! '>='
230
202
  - !ruby/object:Gem::Version
@@ -232,7 +204,6 @@ dependencies:
232
204
  type: :development
233
205
  prerelease: false
234
206
  version_requirements: !ruby/object:Gem::Requirement
235
- none: false
236
207
  requirements:
237
208
  - - ! '>='
238
209
  - !ruby/object:Gem::Version
@@ -828,27 +799,26 @@ files:
828
799
  homepage: https://github.com/instructure/moodle2cc
829
800
  licenses:
830
801
  - AGPLv3
802
+ metadata: {}
831
803
  post_install_message:
832
804
  rdoc_options: []
833
805
  require_paths:
834
806
  - lib
835
807
  required_ruby_version: !ruby/object:Gem::Requirement
836
- none: false
837
808
  requirements:
838
809
  - - ! '>='
839
810
  - !ruby/object:Gem::Version
840
811
  version: '0'
841
812
  required_rubygems_version: !ruby/object:Gem::Requirement
842
- none: false
843
813
  requirements:
844
814
  - - ! '>='
845
815
  - !ruby/object:Gem::Version
846
816
  version: '0'
847
817
  requirements: []
848
818
  rubyforge_project:
849
- rubygems_version: 1.8.23
819
+ rubygems_version: 2.2.1
850
820
  signing_key:
851
- specification_version: 3
821
+ specification_version: 4
852
822
  summary: Migrates Moodle backup ZIP to IMS Common Cartridge package
853
823
  test_files:
854
824
  - spec/moodle2cc/canvas_cc/assessment_writer_spec.rb