common_cartridge_parser 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/lib/common_cartridge.rb +40 -0
  3. data/lib/common_cartridge/elements/lom.rb +77 -0
  4. data/lib/common_cartridge/elements/manifest.rb +30 -0
  5. data/lib/common_cartridge/elements/metadata.rb +12 -0
  6. data/lib/common_cartridge/elements/organizations.rb +40 -0
  7. data/lib/common_cartridge/elements/outcomes.rb +10 -0
  8. data/lib/common_cartridge/elements/outcomes/outcome.rb +15 -0
  9. data/lib/common_cartridge/elements/outcomes/outcome_group.rb +12 -0
  10. data/lib/common_cartridge/elements/outcomes/outcome_root.rb +11 -0
  11. data/lib/common_cartridge/elements/resources.rb +119 -0
  12. data/lib/common_cartridge/elements/resources/assessment.rb +21 -0
  13. data/lib/common_cartridge/elements/resources/assignment.rb +59 -0
  14. data/lib/common_cartridge/elements/resources/attachments.rb +20 -0
  15. data/lib/common_cartridge/elements/resources/basic_lti_link.rb +66 -0
  16. data/lib/common_cartridge/elements/resources/page.rb +22 -0
  17. data/lib/common_cartridge/elements/resources/topic.rb +28 -0
  18. data/lib/common_cartridge/elements/resources/web_link.rb +25 -0
  19. data/lib/common_cartridge/package.rb +87 -0
  20. data/lib/common_cartridge/parsers/dependencies.rb +23 -0
  21. data/lib/common_cartridge/parsers/files.rb +34 -0
  22. data/lib/common_cartridge/parsers/items.rb +58 -0
  23. data/lib/common_cartridge/parsers/outcomes.rb +17 -0
  24. data/lib/common_cartridge/parsers/parser.rb +84 -0
  25. data/lib/common_cartridge/parsers/questions.rb +34 -0
  26. data/lib/common_cartridge/version.rb +3 -0
  27. data/spec/elements/lom_spec.rb +66 -0
  28. data/spec/elements/manifest_spec.rb +31 -0
  29. data/spec/elements/metadata_spec.rb +40 -0
  30. data/spec/elements/organizations_spec.rb +51 -0
  31. data/spec/elements/outcomes/outcome_group_spec.rb +29 -0
  32. data/spec/elements/outcomes/outcome_spec.rb +37 -0
  33. data/spec/elements/resources/assignment_spec.rb +53 -0
  34. data/spec/elements/resources/attachments_spec.rb +24 -0
  35. data/spec/elements/resources/basic_lti_link_spec.rb +29 -0
  36. data/spec/elements/resources/resources_spec.rb +73 -0
  37. data/spec/elements/resources/topic_spec.rb +39 -0
  38. data/spec/elements/resources/web_link_spec.rb +31 -0
  39. data/spec/files/canvas_large_1.3.imscc +0 -0
  40. data/spec/files/canvas_small_1.1.corrupt.imscc +0 -0
  41. data/spec/files/canvas_small_1.1.imscc +0 -0
  42. data/spec/package_spec.rb +110 -0
  43. data/spec/parser_spec.rb +13 -0
  44. data/spec/spec_helper.rb +13 -0
  45. metadata +190 -0
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe Topic do
7
+ before(:all) do
8
+ manifest = CommonCartridge.parse_from_zip('canvas_small_1.1.imscc').manifest
9
+ @resource = manifest.resources.detect { |r| r.identifier =~ /I_00006_R/ }
10
+ end
11
+
12
+ it "is parsed correctly" do
13
+ expect(@resource.files.first.content).to be_kind_of(CommonCartridge::Elements::Resources::Topic)
14
+ end
15
+
16
+ it "has a title" do
17
+ expect(@resource.files.first.content.title).to eq("The Psychology of Faces")
18
+ end
19
+
20
+ it "has text" do
21
+ expect(@resource.files.first.content.text).to match(/Your face is ugly\./)
22
+ end
23
+
24
+ it "has a text_type" do
25
+ expect(@resource.files.first.content.text_type).to eq("text/html")
26
+ end
27
+
28
+ it "has attachments" do
29
+ expect(@resource.files.first.content.attachments).not_to be_empty
30
+
31
+ @resource.files.first.content.attachments.each do |a|
32
+ expect(a.href).not_to be_empty
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe WebLink do
7
+ before(:all) do
8
+ manifest = CommonCartridge.parse_from_zip('canvas_small_1.1.imscc').manifest
9
+ @resource = manifest.resources.detect { |r| r.identifier =~ /I_00005_R/ }
10
+ end
11
+
12
+ it "is parsed correctly" do
13
+ expect(@resource.files.first.content).to be_kind_of(CommonCartridge::Elements::Resources::WebLink)
14
+ end
15
+
16
+ it "has a title" do
17
+ expect(@resource.files.first.content.title).to eq("Wikipedia - Your Mom")
18
+ end
19
+
20
+ it "has a href" do
21
+ expect(@resource.files.first.content.href).to eq("http://en.wikipedia.org/wiki/Maternal_insult")
22
+ end
23
+
24
+ it "has a target" do
25
+ expect(@resource.files.first.content.target).to eq("_self")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
Binary file
Binary file
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ describe Package do
5
+ before(:all) do
6
+ @package = CommonCartridge.parse_from_zip('canvas_large_1.3.imscc')
7
+ end
8
+
9
+ describe "#find_resource" do
10
+ it "finds a resource by identifier" do
11
+ resource = @package.find_resource('i4874e552ee3da37b383af53dd9429827_syllabus')
12
+ expect(resource).to be_kind_of(CommonCartridge::Elements::Resources::Resource)
13
+ expect(resource.identifier).to eq('i4874e552ee3da37b383af53dd9429827_syllabus')
14
+ expect(resource.files.size).to be(1)
15
+ end
16
+
17
+ it "returns nil if no resource is found" do
18
+ resource = @package.find_resource('NONEXISTENT')
19
+ expect(resource).to be_nil
20
+ end
21
+
22
+ context "#modules" do
23
+ it "returns all modules in the course" do
24
+ modules = {'i224aa0e52b019dbf9aeece014df883c7' => 'Example Course Module', 'ibbc4f845ea3211abdd01b7d296a1e835' => 'Example, Locked Module'}
25
+
26
+ expect(@package.modules.size).to be(2)
27
+ @package.modules.each do |mod|
28
+ expect(modules).to have_key(mod.identifier)
29
+ expect(modules[mod.identifier]).to eq(mod.title)
30
+ end
31
+ end
32
+ end
33
+
34
+ context "#announcements" do
35
+ it "returns all announcements in a course" do
36
+ announcements = {"i528c2ce0186a758d13a9bd193bd88611"=>"Include Replies in Podcast Feed Announcement Example",
37
+ "ic5879f637e17f2e475484297bc1b843d"=>"Enable Podcast Feed Example Announcements",
38
+ "i1686b8be7bc843860fa51754ce47164a"=>"Basic Announcement",
39
+ "i852220027877f9c75a980885d566e950"=>"Users Must Post Before Seeing Replies Announcement"}
40
+
41
+ expect(@package.announcements.size).to be(4)
42
+ @package.announcements.each do |announcement|
43
+ expect(announcements).to have_key(announcement.identifier)
44
+ expect(announcements[announcement.identifier]).to eq(announcement.title)
45
+ end
46
+ end
47
+ end
48
+
49
+ context "#discussions" do
50
+ it "returns all discussions in the course" do
51
+ discussions = {"idf59303d98482bfce1042d7960b0dd08"=>"unpublished discussion",
52
+ "ic7f740de8643c0d8bdbb099edddf5c3b"=>"Closed for Comment Discussion",
53
+ "i45f927e81657f719963b4d5182ce7b87"=>"Graded Discussion",
54
+ "i049a4e1050a9ae9112d552c4bb1d927d"=>"Enable Podcast Feed Discussion",
55
+ "ia4977b4ba7e0b86ddbd48ce8808a108b"=>"Users Must Post Before Seeing Replies",
56
+ "i8f219f74f06e31465d76b8d53f1c15ce"=>"Include Replies in Podcast Feed Discussion",
57
+ "i658f87ccf2a665a190f7b684ba8a5d17"=>"Graded Group Discussion Example",
58
+ "i1a45b26146cf73c8530c039f1c5a6576"=>"Graded Group Discussion, Assign Grades to Each Student Individually",
59
+ "id82f5aee12aac6c03677da3baac04590"=>"Graded Discussion with Manually Assigned Peer Reviews",
60
+ "ifac8262aac5c07e2fd1425c21c2ec4db"=>"Graded Discussion with Automatically Assigned Peer Reviews",
61
+ "ib6df2d84b4dd1cdf6cec87fc54678b37"=>"Threaded Discussion",
62
+ "ie896adbc712bb119c4e9a1a673f8a673"=>"Non-Threaded Discussion",
63
+ "i9a5d38abe47ccfaf18da6727564f0d28"=>"Pinned Discussion"}
64
+
65
+ expect(@package.discussions.size).to be(13)
66
+ @package.discussions.each do |discussion|
67
+ expect(discussions).to have_key(discussion.identifier)
68
+ expect(discussions[discussion.identifier]).to eq(discussion.title)
69
+ end
70
+ end
71
+ end
72
+
73
+ context "#pages" do
74
+ it "returns all pages in the course" do
75
+ expect(@package.pages.size).to be(2)
76
+ expect(@package.pages.first.title).to eq("Front Page")
77
+ expect(@package.pages.last.title).to eq("Page hidden from Students")
78
+ end
79
+ end
80
+
81
+ context "#quizzes" do
82
+ it "returns all quizzes in the course" do
83
+ quizzes = {"i7d40ddafe1510b13e094faf1d8aede61"=>"50 Q's straight up tf and mc",
84
+ "iae800568e436f2368f690a2a87aa92e8"=>"Access code is \"Canvas\" Access Code Example",
85
+ "i92556d03cef1a20c975b43115011059f"=>"All Question Types with text only (should be 11)",
86
+ "ib9091a8b64585d919f2397719bf860c3"=>"Graded Anonymous Survey Example",
87
+ "i86bbc04ca52991f32dc0f9f041b147e9"=>"Graded Survey Example",
88
+ "iddbfdaac01dadef8fc889dc39ecb9830"=>"Hide Quiz Answers Quiz Example",
89
+ "i1dee4ce6a2ea508cbad5bca6bb9cdb8f"=>"MC, TF, MA, Essay, FITB 5 q's",
90
+ "i581ee685674f4a8c9231bd228a92976a"=>"Multiple Attempt Quiz",
91
+ "i3876e257310e19864b49172a2544bf56"=>"One Question At A Time, Can't Go Back Example",
92
+ "iad7e264143b9f2ec9dbc71a9d166f6f2"=>"One Question at a time Quiz Example",
93
+ "i18ee2ad283ef16acf172480ad0e3e514"=>"Practice Quiz Example",
94
+ "i13b04e02dbb103ae804043c7139d925f"=>"Shuffled Answers Quiz Example",
95
+ "iec0216ba5240b3b895d1f707dc03be0b"=>"Time Limit Quiz Example",
96
+ "i569b45ac1ff7388a1416381bc670488b"=>"Ungraded Anonymous Survey Example",
97
+ "i7a94069ff8e623310830263a426aed7f"=>"Ungraded Survey Example",
98
+ "i4a339a8425a8a073409188ac7ef5a097"=>"Unnamed Quiz",
99
+ "ie970b28994395e4ae82d86c22633708d"=>"Unpublished Quiz Example"}
100
+
101
+ expect(@package.quizzes.size).to be(17)
102
+ @package.quizzes.each do |quiz|
103
+ expect(quizzes).to have_key(quiz.identifier)
104
+ expect(quizzes[quiz.identifier]).to eq(quiz.title)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ describe Parsers::Parser do
5
+ describe ".parse_from_zip" do
6
+ it "parses a Common CommonCartridge zip successfully" do
7
+ package = CommonCartridge.parse_from_zip("canvas_small_1.1.imscc")
8
+ expect(package).to be_kind_of(CommonCartridge::Package)
9
+ expect(package.manifest).to be_kind_of(CommonCartridge::Elements::Manifest)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'common_cartridge'
5
+
6
+ CommonCartridge.configure do |c|
7
+ c.import_directory = File.join(Dir.pwd, 'spec', 'files')
8
+ end
9
+
10
+ RSpec.configure do |config|
11
+ config.order = :random
12
+ Kernel.srand config.seed
13
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: common_cartridge_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Josh Simpson
8
+ - Remy Obein
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2019-08-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sax-machine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 1.3.2
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 1.3.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 1.8.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 1.8.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: rubyzip
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 1.2.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 1.2.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '3.0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.0'
98
+ description: Parse IMS Common Cartridge packages
99
+ email:
100
+ - jsimpson@instructure.com
101
+ - remy@cassia.tech
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - lib/common_cartridge.rb
107
+ - lib/common_cartridge/elements/lom.rb
108
+ - lib/common_cartridge/elements/manifest.rb
109
+ - lib/common_cartridge/elements/metadata.rb
110
+ - lib/common_cartridge/elements/organizations.rb
111
+ - lib/common_cartridge/elements/outcomes.rb
112
+ - lib/common_cartridge/elements/outcomes/outcome.rb
113
+ - lib/common_cartridge/elements/outcomes/outcome_group.rb
114
+ - lib/common_cartridge/elements/outcomes/outcome_root.rb
115
+ - lib/common_cartridge/elements/resources.rb
116
+ - lib/common_cartridge/elements/resources/assessment.rb
117
+ - lib/common_cartridge/elements/resources/assignment.rb
118
+ - lib/common_cartridge/elements/resources/attachments.rb
119
+ - lib/common_cartridge/elements/resources/basic_lti_link.rb
120
+ - lib/common_cartridge/elements/resources/page.rb
121
+ - lib/common_cartridge/elements/resources/topic.rb
122
+ - lib/common_cartridge/elements/resources/web_link.rb
123
+ - lib/common_cartridge/package.rb
124
+ - lib/common_cartridge/parsers/dependencies.rb
125
+ - lib/common_cartridge/parsers/files.rb
126
+ - lib/common_cartridge/parsers/items.rb
127
+ - lib/common_cartridge/parsers/outcomes.rb
128
+ - lib/common_cartridge/parsers/parser.rb
129
+ - lib/common_cartridge/parsers/questions.rb
130
+ - lib/common_cartridge/version.rb
131
+ - spec/elements/lom_spec.rb
132
+ - spec/elements/manifest_spec.rb
133
+ - spec/elements/metadata_spec.rb
134
+ - spec/elements/organizations_spec.rb
135
+ - spec/elements/outcomes/outcome_group_spec.rb
136
+ - spec/elements/outcomes/outcome_spec.rb
137
+ - spec/elements/resources/assignment_spec.rb
138
+ - spec/elements/resources/attachments_spec.rb
139
+ - spec/elements/resources/basic_lti_link_spec.rb
140
+ - spec/elements/resources/resources_spec.rb
141
+ - spec/elements/resources/topic_spec.rb
142
+ - spec/elements/resources/web_link_spec.rb
143
+ - spec/files/canvas_large_1.3.imscc
144
+ - spec/files/canvas_small_1.1.corrupt.imscc
145
+ - spec/files/canvas_small_1.1.imscc
146
+ - spec/package_spec.rb
147
+ - spec/parser_spec.rb
148
+ - spec/spec_helper.rb
149
+ homepage: https://github.com/vhl/common_cartridge_parser/
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubygems_version: 3.0.4
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: CommonCartridgeParser
172
+ test_files:
173
+ - spec/elements/lom_spec.rb
174
+ - spec/elements/manifest_spec.rb
175
+ - spec/elements/metadata_spec.rb
176
+ - spec/elements/organizations_spec.rb
177
+ - spec/elements/outcomes/outcome_group_spec.rb
178
+ - spec/elements/outcomes/outcome_spec.rb
179
+ - spec/elements/resources/assignment_spec.rb
180
+ - spec/elements/resources/attachments_spec.rb
181
+ - spec/elements/resources/basic_lti_link_spec.rb
182
+ - spec/elements/resources/resources_spec.rb
183
+ - spec/elements/resources/topic_spec.rb
184
+ - spec/elements/resources/web_link_spec.rb
185
+ - spec/files/canvas_large_1.3.imscc
186
+ - spec/files/canvas_small_1.1.corrupt.imscc
187
+ - spec/files/canvas_small_1.1.imscc
188
+ - spec/package_spec.rb
189
+ - spec/parser_spec.rb
190
+ - spec/spec_helper.rb