common_cartridge_parser 1.0.0

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.
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,34 @@
1
+ module CommonCartridge
2
+ module Parsers
3
+ class Questions
4
+ def initialize(zipfile, quiz)
5
+ @zipfile = zipfile
6
+ @quiz = quiz
7
+ end
8
+
9
+ def parse!
10
+ @quiz.file_locations.each do |location|
11
+ Parser.use_file(@zipfile, location) do |xml|
12
+ doc = Nokogiri::XML(xml)
13
+ doc.remove_namespaces!
14
+ unless @quiz.question_count && !canvas?(location)
15
+ # We need all questions that aren't a text only question. Re-usable, important sibling XML elements *sigh*.
16
+ @quiz.question_count = doc.xpath("//item//fieldlabel[text()='question_type' or text()='cc_profile']/following-sibling::fieldentry[1][text() != 'text_only_question']").length
17
+ end
18
+
19
+ unless @quiz.points_possible
20
+ if points = doc.xpath("//fieldlabel[text()='points_possible']/following-sibling::fieldentry[1]")
21
+ @quiz.points_possible = points.text
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+ def canvas?(location)
30
+ location =~ /non_cc_assessments/
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module CommonCartridge
2
+ VERSION = '1.0.0'.freeze
3
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Lom
6
+ describe General do
7
+ before(:all) do
8
+ manifest = CommonCartridge.parse_from_zip('canvas_small_1.1.imscc').manifest
9
+ @lom = manifest.metadata.lom
10
+ end
11
+
12
+ subject(:general) { @lom.general }
13
+
14
+ it "parses correctly" do
15
+ expect(general).to be_kind_of(CommonCartridge::Elements::Lom::General)
16
+ end
17
+
18
+ context "title element" do
19
+ it "parses correctly" do
20
+ expect(general.title).to be_kind_of(CommonCartridge::Elements::Lom::Title)
21
+ end
22
+
23
+ it "has a value attribute" do
24
+ expect(general.title.value).to eq("Common Cartridge Test Data Set - Validation Cartridge 1")
25
+ end
26
+
27
+ it "has a language attribute" do
28
+ expect(general.title.language).to eq("en-US")
29
+ end
30
+ end
31
+
32
+ context "description element" do
33
+ it "parses correctly" do
34
+ expect(general.description).to be_kind_of(CommonCartridge::Elements::Lom::Description)
35
+ end
36
+
37
+ it "has a value attribute" do
38
+ expect(general.description.value).to eq("Sample materials to test a variety of Common Cartridge content types")
39
+ end
40
+
41
+ it "has a language attribute" do
42
+ expect(general.description.language).to eq("en-US")
43
+ end
44
+ end
45
+
46
+ context "keywords elements" do
47
+ it "is a collection" do
48
+ expect(general.keywords).to be_kind_of(Array)
49
+ end
50
+
51
+ it "parses correctly" do
52
+ expect(general.keywords.first).to be_kind_of(CommonCartridge::Elements::Lom::Keyword)
53
+ end
54
+
55
+ it "has a value attribute" do
56
+ expect(general.keywords.first.value).to eq("Sample")
57
+ end
58
+
59
+ it "has a language attribute" do
60
+ expect(general.keywords.first.language).to eq("en-US")
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ describe Manifest do
6
+ before(:all) do
7
+ @manifest = CommonCartridge.parse_from_zip("canvas_large_1.3.imscc").manifest
8
+ end
9
+
10
+ it "recognizes the manifest file and parses it correctly" do
11
+ expect(@manifest).to be_kind_of(CommonCartridge::Elements::Manifest)
12
+ end
13
+
14
+ it "has metadata" do
15
+ expect(@manifest.metadata).to be_kind_of(CommonCartridge::Elements::Metadata)
16
+ end
17
+
18
+ it "has organizations" do
19
+ expect(@manifest.root_organization).to be_kind_of(CommonCartridge::Elements::Organizations::RootOrganization)
20
+ end
21
+
22
+ it "has resources" do
23
+ expect(@manifest.root_resource).to be_kind_of(CommonCartridge::Elements::Resources::RootResource)
24
+ end
25
+
26
+ it "has identifier" do
27
+ expect(@manifest.identifier).to eq('if33b9cbc13c56657b05bec722d30b84f')
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ describe Metadata do
6
+ context "Common Cartridge 1.1" do
7
+ before(:all) { @metadata = CommonCartridge.parse_from_zip("canvas_small_1.1.imscc").manifest.metadata }
8
+
9
+ it "has a schema" do
10
+ expect(@metadata.schema).to eq("IMS Common Cartridge")
11
+ end
12
+
13
+ it "has a schemaversion" do
14
+ expect(@metadata.schemaversion).to eq("1.1.0")
15
+ end
16
+
17
+ it "has a lom" do
18
+ expect(@metadata.lom).to be_kind_of(CommonCartridge::Elements::Lom::Lom)
19
+ end
20
+ end
21
+
22
+ context "Common Cartridge 1.3" do
23
+ before(:all) { @metadata = CommonCartridge.parse_from_zip("canvas_large_1.3.imscc").manifest.metadata }
24
+
25
+ it "has a schema" do
26
+ expect(@metadata.schema).to eq("IMS Common Cartridge")
27
+ end
28
+
29
+ it "has a schemaversion" do
30
+ expect(@metadata.schemaversion).to eq("1.3.0")
31
+ end
32
+
33
+ it "has a lom" do
34
+ expect(@metadata.lom).to be_kind_of(CommonCartridge::Elements::Lom::Lom)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ describe Organizations do
6
+ before(:all) do
7
+ @manifest = CommonCartridge.parse_from_zip("canvas_large_1.3.imscc").manifest
8
+ end
9
+
10
+ let(:organizations) { @manifest.organizations }
11
+
12
+ it "has a root organization" do
13
+ expect(@manifest.root_organization).to be_kind_of(CommonCartridge::Elements::Organizations::RootOrganization)
14
+ end
15
+
16
+ it "has a root item" do
17
+ expect(organizations.first.root_item).to be_kind_of(CommonCartridge::Elements::Organizations::RootItem)
18
+ end
19
+
20
+ describe Organizations::RootItem do
21
+ let(:root_item) { organizations.first.root_item }
22
+
23
+ it "has an identifier" do
24
+ expect(root_item.identifier).to eq("LearningModules")
25
+ end
26
+
27
+ it "has a collection of items" do
28
+ expect(root_item.items).to be_kind_of(Array)
29
+
30
+ root_item.items.each do |item|
31
+ expect(item).to be_kind_of(CommonCartridge::Elements::Organizations::Item)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe Organizations::Item do
37
+ # todo: use find_by method here when implemented
38
+ let(:item) { organizations.first.root_item.items.first }
39
+
40
+ it "has an identifier" do
41
+ expect(item.identifier).to eq("i224aa0e52b019dbf9aeece014df883c7")
42
+ end
43
+
44
+ it "has a title" do
45
+ expect(item.title).to eq("Example Course Module")
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Outcomes
6
+ describe OutcomeGroup do
7
+ before(:all) do
8
+ @package = CommonCartridge.parse_from_zip('canvas_small_1.1.imscc')
9
+ end
10
+
11
+ let(:outcome_groups) { @package.outcomes.outcome_groups }
12
+ let(:outcome_group) { outcome_groups.first }
13
+
14
+ it "is parsed correctly" do
15
+ expect(outcome_groups.size).to eq(1)
16
+ end
17
+
18
+ it "has an identifier attribute" do
19
+ expect(outcome_group.identifier).to eq("i5c10922a7fdce7cb710733108d3a26dc")
20
+ end
21
+
22
+ it "has a collection of outcomes" do
23
+ expect(outcome_group.outcomes.size).to eq(9)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Outcomes
6
+ describe Outcome do
7
+ before(:all) do
8
+ @package = CommonCartridge.parse_from_zip('canvas_small_1.1.imscc')
9
+ end
10
+
11
+ let(:outcomes) { @package.all_outcomes }
12
+ let(:outcome) { @package.all_outcomes.first }
13
+
14
+ it "is parsed correctly" do
15
+ expect(outcomes.size).to eq(9)
16
+ end
17
+
18
+ it "has an identifier attribute" do
19
+ expect(outcome.identifier).to eq "i63a00efe444e7edfc75e3051a4f8edac"
20
+ end
21
+
22
+ it "has a title element" do
23
+ expect(outcome.title).to match(/You can speak the 'HigherEd-K12-Education' speak/)
24
+ end
25
+
26
+ it "has a points_possible element" do
27
+ expect(outcome.points_possible).to eq "5"
28
+ end
29
+
30
+ it "has a mastery_points element" do
31
+ expect(outcome.mastery_points).to eq "3"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe Assignment do
7
+ before(:all) do
8
+ package = CommonCartridge.parse_from_zip('canvas_large_1.3.imscc')
9
+ @assignment = package.assignments.first
10
+ end
11
+
12
+ it "parses correctly" do
13
+ expect(@assignment).to be_kind_of(CommonCartridge::Elements::Resources::Assignment)
14
+ end
15
+
16
+ it "has a title" do
17
+ expect(@assignment.title).to eq("Online Submission Assignment")
18
+ end
19
+
20
+ it "has a 'gradable' element" do
21
+ expect(@assignment.gradable).to eq("true")
22
+ end
23
+
24
+ context "text element" do
25
+ let(:text) { @assignment.text }
26
+
27
+ it "parses correctly" do
28
+ expect(text).to be_kind_of(CommonCartridge::Elements::Resources::Text)
29
+ end
30
+
31
+ it "has a value" do
32
+ expect(text.value).to match(/Lorem ipsum dolor sit amet, consectetur adipiscing elit/)
33
+ end
34
+ end
35
+
36
+ context "submission_formats" do
37
+ let(:submission_formats) { @assignment.submission_formats }
38
+
39
+ it "parses correctly" do
40
+ expect(submission_formats).to be_kind_of(CommonCartridge::Elements::Resources::SubmissionFormats)
41
+ end
42
+
43
+ it "has formats" do
44
+ expect(submission_formats.formats).to be_kind_of(Array)
45
+ expect(submission_formats.formats).not_to be_empty
46
+ expect(submission_formats.formats.first.type).to eq("html")
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe Attachments 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
+ @attachment = resource.files.first.content.attachments.first
11
+ end
12
+
13
+ it "is parsed correctly" do
14
+ expect(@attachment).to be_kind_of(CommonCartridge::Elements::Resources::Attachments::Attachment)
15
+ end
16
+
17
+ it "has a href" do
18
+ expect(@attachment.href).to match(/angry_person\.jpg/)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe BasicLtiLink 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_00015_R/ }
10
+ end
11
+
12
+ it 'is parsed correctly' do
13
+ expect(@resource.files.first.content).to be_kind_of(
14
+ CommonCartridge::Elements::Resources::BasicLtiLink::BasicLtiLink
15
+ )
16
+ end
17
+
18
+ it 'has a title' do
19
+ expect(@resource.files.first.content.title).to eq('Semester 1 Overview')
20
+ end
21
+
22
+ it 'has a secure_launch_url' do
23
+ expect(@resource.files.first.content.secure_launch_url).to eq('https://fakecollege.com/activity_lists/student-resources--122/activities/semester-1-overview--17?custom_course_id=275')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ module CommonCartridge
4
+ module Elements
5
+ module Resources
6
+ describe Resources do
7
+ before(:all) do
8
+ @package = CommonCartridge.parse_from_zip("canvas_small_1.1.imscc")
9
+ @resources = @package.manifest.resources
10
+ end
11
+
12
+ it "has a root resource" do
13
+ expect(@package.manifest.root_resource).to be_kind_of(CommonCartridge::Elements::Resources::RootResource)
14
+ end
15
+
16
+ it "has a collection of resources" do
17
+ expect(@resources).to be_kind_of(Array)
18
+
19
+ @resources.each do |resource|
20
+ expect(resource).to be_kind_of(CommonCartridge::Elements::Resources::Resource)
21
+ end
22
+ end
23
+
24
+
25
+ describe Resources::Resource do
26
+ # todo: implement 'find_by' method to use here
27
+ let(:resource) { @resources.first }
28
+
29
+ it "has an identifier" do
30
+ expect(resource.identifier).to eq('I_00001_R')
31
+ end
32
+
33
+ it "has a type" do
34
+ expect(resource.type).to eq('webcontent')
35
+ end
36
+
37
+ it "has a href" do
38
+ expect(resource.href).to eq('I_00001_R/Learning_Objectives.html')
39
+ end
40
+
41
+ it "has files" do
42
+ resource.files.each do |f|
43
+ expect(f).to be_kind_of(CommonCartridge::Elements::Resources::File)
44
+ end
45
+ end
46
+
47
+ context "when a quiz" do
48
+ let(:quiz) { @package.quizzes.first }
49
+ it "has question count" do
50
+ expect(quiz.question_count).to eq(11)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe Resources::File do
56
+ let(:file) { @resources.first.files.first }
57
+
58
+ it "has a href" do
59
+ expect(file.href).to eq("I_00001_R/Learning_Objectives.html")
60
+ end
61
+ end
62
+
63
+ describe Resources::Dependency do
64
+ let(:dependency) { @resources[1].dependencies.first }
65
+
66
+ it "has an identifierref" do
67
+ expect(dependency.identifierref).to eq("I_00003_R_IMAGERESOURCE")
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end