pupilfirst_xapi 0.2.0 → 0.3.3
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.
- checksums.yaml +4 -4
- data/lib/pupilfirst_xapi/objects.rb +4 -4
- data/lib/pupilfirst_xapi/objects/course.rb +4 -1
- data/lib/pupilfirst_xapi/objects/target.rb +9 -3
- data/lib/pupilfirst_xapi/statements/course_completed.rb +1 -1
- data/lib/pupilfirst_xapi/statements/course_registered.rb +1 -1
- data/lib/pupilfirst_xapi/statements/target_completed.rb +1 -1
- data/lib/pupilfirst_xapi/version.rb +1 -1
- data/spec/integration_spec.rb +11 -3
- data/spec/outbox_spec.rb +2 -2
- data/spec/statements/course_completed_spec.rb +5 -1
- data/spec/statements/{course_redistered_spec.rb → course_registered_spec.rb} +17 -4
- data/spec/statements/target_completed_spec.rb +9 -3
- metadata +6 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0f3740bcc9e9972d6c1e34d9128dc2e57c04251e3205c6303c64e8b159bded6
|
4
|
+
data.tar.gz: ead50ce21e470ebece32da9b2b84a0fe0da2e2134f880baad68789cf7530aa75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b207f1ea01071c3552aefff851f96a22dd9df5e4d87338efe3d35b541db3ed4a67f06a388ee9108f5e66bc6c8f9239639b74bea5d6dce517bf1de22321d84ee3
|
7
|
+
data.tar.gz: '0552814f55f835c3332924704cdb6c09ed8568a4096246d953ba349435bae03741f796e7dc31d392d34b90479b37375c2e2269b1452969cbe0c511dfc4b72357'
|
@@ -4,12 +4,12 @@ require_relative 'objects/target'
|
|
4
4
|
|
5
5
|
module PupilfirstXapi
|
6
6
|
module Objects
|
7
|
-
def self.course(course,
|
8
|
-
Course.new.call(course,
|
7
|
+
def self.course(course, uri_for)
|
8
|
+
Course.new.call(course, uri_for)
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.target(target,
|
12
|
-
Target.new.call(target,
|
11
|
+
def self.target(target, uri_for)
|
12
|
+
Target.new.call(target, uri_for)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,13 +1,16 @@
|
|
1
1
|
module PupilfirstXapi
|
2
2
|
module Objects
|
3
3
|
class Course
|
4
|
-
def call(course,
|
4
|
+
def call(course, uri_for)
|
5
|
+
uri = uri_for.call(course)
|
6
|
+
|
5
7
|
Builder.new(
|
6
8
|
id: uri,
|
7
9
|
type: 'http://adlnet.gov/expapi/activities/product',
|
8
10
|
name: course.name,
|
9
11
|
description: course.description
|
10
12
|
).tap do |obj|
|
13
|
+
obj.with_extension('http://id.tincanapi.com/extension/ending-position', course.targets.count)
|
11
14
|
if course.ends_at.present?
|
12
15
|
duration = ActiveSupport::Duration.build(course.ends_at - course.created_at).iso8601
|
13
16
|
obj.with_extension("http://id.tincanapi.com/extension/planned-duration", duration)
|
@@ -1,13 +1,19 @@
|
|
1
1
|
module PupilfirstXapi
|
2
2
|
module Objects
|
3
3
|
class Target
|
4
|
-
def call(target,
|
4
|
+
def call(target, uri_for)
|
5
|
+
course = target.course
|
6
|
+
target_uri = uri_for.call(target)
|
7
|
+
|
5
8
|
Builder.new(
|
6
|
-
id:
|
9
|
+
id: target_uri,
|
7
10
|
type: "http://activitystrea.ms/schema/1.0/task",
|
8
11
|
name: target.title,
|
9
12
|
description: target.description
|
10
|
-
).
|
13
|
+
).tap do |obj|
|
14
|
+
obj.with_extension('http://id.tincanapi.com/extension/host', Objects.course(course, uri_for).as_json)
|
15
|
+
obj.with_extension('http://id.tincanapi.com/extension/position', target.sort_index)
|
16
|
+
end.call
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -15,13 +15,20 @@ RSpec.describe "#xapi", type: :job, perform_jobs: true do
|
|
15
15
|
description: 'These guides are designed to make you immediately productive with Rails',
|
16
16
|
created_at: Time.new(2021,01,01),
|
17
17
|
ends_at: nil,
|
18
|
-
uri: 'https://guides.rubyonrails.org/'
|
18
|
+
uri: 'https://guides.rubyonrails.org/',
|
19
|
+
targets: [
|
20
|
+
double(:target, title: '1st target', description: 'Seems easy'),
|
21
|
+
double(:target, title: '2nd target', description: 'Seems not easy')
|
22
|
+
]
|
23
|
+
)
|
19
24
|
}
|
20
25
|
let(:getting_started) {
|
21
26
|
double(:target,
|
22
27
|
title: 'Getting Started with Rails',
|
23
28
|
description: 'This guide covers getting up and running with Ruby on Rails.',
|
24
|
-
uri: 'https://guides.rubyonrails.org/getting_started.html'
|
29
|
+
uri: 'https://guides.rubyonrails.org/getting_started.html',
|
30
|
+
course: ror_guides
|
31
|
+
)
|
25
32
|
}
|
26
33
|
let(:good_one) { double(:timeline_event, target: getting_started, passed?: true) }
|
27
34
|
let(:bad_one) { double(:timeline_event, target: getting_started, passed?: false) }
|
@@ -75,6 +82,7 @@ RSpec.describe "#xapi", type: :job, perform_jobs: true do
|
|
75
82
|
name: {'en-US' => 'Ruby on Rails Guides'},
|
76
83
|
description: {'en-US' => 'These guides are designed to make you immediately productive with Rails'},
|
77
84
|
type: 'http://adlnet.gov/expapi/activities/product',
|
85
|
+
extensions: {"http://id.tincanapi.com/extension/ending-position"=>2}
|
78
86
|
},
|
79
87
|
},
|
80
88
|
timestamp: timestamp.iso8601,
|
@@ -88,7 +96,7 @@ RSpec.describe "#xapi", type: :job, perform_jobs: true do
|
|
88
96
|
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
89
97
|
'Authorization'=>'Basic a2V5OnNlY3JldA==',
|
90
98
|
'Content-Type'=>'application/json',
|
91
|
-
'User-Agent'=>'Faraday v1.3.
|
99
|
+
'User-Agent'=>'Faraday v1.3.1',
|
92
100
|
'X-Experience-Api-Version'=>'1.0.1'
|
93
101
|
}
|
94
102
|
).to_return(status: 204, body: "", headers: {})
|
data/spec/outbox_spec.rb
CHANGED
@@ -4,8 +4,8 @@ module PupilfirstXapi
|
|
4
4
|
RSpec.describe Outbox do
|
5
5
|
let(:timestamp) { Time.now }
|
6
6
|
let(:john) { double(:john, name: 'John Doe', email: 'john@doe.com') }
|
7
|
-
let(:course) { double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil) }
|
8
|
-
let(:target) { double(:target, title: '1st target', description: 'Seems easy') }
|
7
|
+
let(:course) { double(:course, id: 32, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil, targets: []) }
|
8
|
+
let(:target) { double(:target, title: '1st target', description: 'Seems easy', course: course, sort_index: 7) }
|
9
9
|
let(:good_one) { double(:timeline_event, target: target, passed?: true) }
|
10
10
|
let(:bad_one) { double(:timeline_event, target: target, passed?: false) }
|
11
11
|
|
@@ -5,7 +5,11 @@ module PupilfirstXapi
|
|
5
5
|
RSpec.describe CourseCompleted do
|
6
6
|
it do
|
7
7
|
john = double(:john, name: 'John Doe', email: 'john@doe.com')
|
8
|
-
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil
|
8
|
+
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil,
|
9
|
+
targets: [
|
10
|
+
double(:target, title: '1st target', description: 'Seems easy'),
|
11
|
+
double(:target, title: '2nd target', description: 'Seems not easy')
|
12
|
+
])
|
9
13
|
data = {
|
10
14
|
course: { 456 => course },
|
11
15
|
user: { 123 => john },
|
@@ -5,7 +5,11 @@ module PupilfirstXapi
|
|
5
5
|
RSpec.describe CourseRegistered do
|
6
6
|
it do
|
7
7
|
john = double(:john, name: 'John Doe', email: 'john@doe.com')
|
8
|
-
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil
|
8
|
+
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil,
|
9
|
+
targets: [
|
10
|
+
double(:target, title: '1st target', description: 'Seems easy'),
|
11
|
+
double(:target, title: '2nd target', description: 'Seems not easy')
|
12
|
+
])
|
9
13
|
data = {
|
10
14
|
course: { 456 => course },
|
11
15
|
user: { 123 => john },
|
@@ -25,7 +29,9 @@ module PupilfirstXapi
|
|
25
29
|
expect(xapi.object.definition.type).to eq 'http://adlnet.gov/expapi/activities/product'
|
26
30
|
expect(xapi.object.definition.name).to eq({'en-US' => 'Rails for Begginers'})
|
27
31
|
expect(xapi.object.definition.description).to eq({'en-US' => 'Seems easy'})
|
28
|
-
expect(xapi.object.definition.extensions).to eq
|
32
|
+
expect(xapi.object.definition.extensions).to eq ({
|
33
|
+
"http://id.tincanapi.com/extension/ending-position" => 2
|
34
|
+
})
|
29
35
|
end
|
30
36
|
|
31
37
|
it do
|
@@ -34,7 +40,11 @@ module PupilfirstXapi
|
|
34
40
|
duration = ActiveSupport::Duration.build(ends_at - starts_at).iso8601
|
35
41
|
|
36
42
|
john = double(:john, name: 'John Doe', email: 'john@doe.com')
|
37
|
-
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: starts_at, ends_at: ends_at
|
43
|
+
course = double(:course, name: 'Rails for Begginers', description: 'Seems easy', created_at: starts_at, ends_at: ends_at,
|
44
|
+
targets: [
|
45
|
+
double(:target, title: '1st target', description: 'Seems easy'),
|
46
|
+
double(:target, title: '2nd target', description: 'Seems not easy')
|
47
|
+
])
|
38
48
|
data = {
|
39
49
|
course: { 456 => course },
|
40
50
|
user: { 123 => john },
|
@@ -54,7 +64,10 @@ module PupilfirstXapi
|
|
54
64
|
expect(xapi.object.definition.type).to eq 'http://adlnet.gov/expapi/activities/product'
|
55
65
|
expect(xapi.object.definition.name).to eq({'en-US' => 'Rails for Begginers'})
|
56
66
|
expect(xapi.object.definition.description).to eq({'en-US' => 'Seems easy'})
|
57
|
-
expect(xapi.object.definition.extensions).to eq({
|
67
|
+
expect(xapi.object.definition.extensions).to eq({
|
68
|
+
"http://id.tincanapi.com/extension/planned-duration" => duration,
|
69
|
+
"http://id.tincanapi.com/extension/ending-position" => 2
|
70
|
+
})
|
58
71
|
end
|
59
72
|
end
|
60
73
|
end
|
@@ -4,7 +4,12 @@ module PupilfirstXapi
|
|
4
4
|
module Statements
|
5
5
|
RSpec.describe TargetCompleted do
|
6
6
|
it do
|
7
|
-
|
7
|
+
course = double(:course, id: 17, name: 'Rails for Begginers', description: 'Seems easy', created_at: 1.week.ago, ends_at: nil,
|
8
|
+
targets: [
|
9
|
+
double(:target, title: '1st target', description: 'Seems easy'),
|
10
|
+
double(:target, title: '2nd target', description: 'Seems not easy')
|
11
|
+
])
|
12
|
+
target = double(:target, title: '1st target', course: course, description: 'Seems easy', sort_index: 5)
|
8
13
|
submission = double(:timeline_event, target: target, passed?: true)
|
9
14
|
john = double(:john, name: 'John Doe', email: 'john@doe.com')
|
10
15
|
data = {
|
@@ -12,7 +17,7 @@ module PupilfirstXapi
|
|
12
17
|
user: { 123 => john },
|
13
18
|
}
|
14
19
|
repository = ->(klass, resource_id) { data.dig(klass, resource_id) }
|
15
|
-
uri_for = ->(obj) { obj == target ? 'target-1' : nil }
|
20
|
+
uri_for = ->(obj) { obj == target ? 'target-1' : obj == course ? 'course-1' : nil }
|
16
21
|
|
17
22
|
xapi = TargetCompleted.new(repository, uri_for).call(actor_id: 123, resource_id: 456)
|
18
23
|
|
@@ -26,10 +31,11 @@ module PupilfirstXapi
|
|
26
31
|
expect(xapi.object.definition.type).to eq 'http://activitystrea.ms/schema/1.0/task'
|
27
32
|
expect(xapi.object.definition.name).to eq({'en-US' => '1st target'})
|
28
33
|
expect(xapi.object.definition.description).to eq({'en-US' => 'Seems easy'})
|
34
|
+
expect(xapi.object.definition.extensions['http://id.tincanapi.com/extension/host']['id']).to eq 'course-1'
|
29
35
|
end
|
30
36
|
|
31
37
|
it 'no-op when submission is not passed' do
|
32
|
-
target = double(:target, title: '1st target', description: 'Seems easy')
|
38
|
+
target = double(:target, title: '1st target', description: 'Seems easy', sort_index: 3)
|
33
39
|
submission = double(:timeline_event, target: target, passed?: false)
|
34
40
|
john = double(:john, name: 'John Doe', email: 'john@doe.com')
|
35
41
|
data = {
|
metadata
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pupilfirst_xapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GrowthTribe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 6.0.3
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 6.0.3.4
|
@@ -24,9 +21,6 @@ dependencies:
|
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 6.0.3
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: 6.0.3.4
|
@@ -36,14 +30,14 @@ dependencies:
|
|
36
30
|
requirements:
|
37
31
|
- - "~>"
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.0.
|
33
|
+
version: 0.0.2
|
40
34
|
type: :runtime
|
41
35
|
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
38
|
- - "~>"
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.0.
|
40
|
+
version: 0.0.2
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: rspec-rails
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,7 +111,7 @@ files:
|
|
117
111
|
- spec/rails_helper.rb
|
118
112
|
- spec/spec_helper.rb
|
119
113
|
- spec/statements/course_completed_spec.rb
|
120
|
-
- spec/statements/
|
114
|
+
- spec/statements/course_registered_spec.rb
|
121
115
|
- spec/statements/target_completed_spec.rb
|
122
116
|
homepage: https://github.com/growthtribeacademy/pupilfirst-xapi
|
123
117
|
licenses:
|
@@ -153,5 +147,5 @@ test_files:
|
|
153
147
|
- spec/rails_helper.rb
|
154
148
|
- spec/spec_helper.rb
|
155
149
|
- spec/statements/course_completed_spec.rb
|
156
|
-
- spec/statements/
|
150
|
+
- spec/statements/course_registered_spec.rb
|
157
151
|
- spec/statements/target_completed_spec.rb
|