pupilfirst_xapi 0.2.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6435e3040cef3863e99115b8a474bf193c05484c7c9048701425827b27353188
4
- data.tar.gz: 412e2b47cc25daa790d214d111d8a7bf4645050dd2294c110859129b695bbee1
3
+ metadata.gz: a0f3740bcc9e9972d6c1e34d9128dc2e57c04251e3205c6303c64e8b159bded6
4
+ data.tar.gz: ead50ce21e470ebece32da9b2b84a0fe0da2e2134f880baad68789cf7530aa75
5
5
  SHA512:
6
- metadata.gz: 2c44119ab5421640425e20e55629d7281e68d284f72c9ccceaa5ee66c1e50f35776aad758a8f5a7f39d5b72215ba5f00185ad64385f23617cecc70d0aea66476
7
- data.tar.gz: 776ae2649f8d242ad26a32b798373186df902855079a75668d50a3e9c6af25536abfc9e827e2ca5af0a4e429fbfb5309edcb7ac5910bbce624da641350b6d950
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, uri)
8
- Course.new.call(course, uri)
7
+ def self.course(course, uri_for)
8
+ Course.new.call(course, uri_for)
9
9
  end
10
10
 
11
- def self.target(target, uri)
12
- Target.new.call(target, uri)
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, uri)
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, uri)
4
+ def call(target, uri_for)
5
+ course = target.course
6
+ target_uri = uri_for.call(target)
7
+
5
8
  Builder.new(
6
- id: uri,
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
- ).call
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
@@ -13,7 +13,7 @@ module PupilfirstXapi
13
13
  Xapi.create_statement(
14
14
  actor: Actors.agent(actor),
15
15
  verb: Verbs::COMPLETED,
16
- object: Objects.course(course, @uri_for.call(course))
16
+ object: Objects.course(course, @uri_for)
17
17
  )
18
18
  end
19
19
  end
@@ -13,7 +13,7 @@ module PupilfirstXapi
13
13
  Xapi.create_statement(
14
14
  actor: Actors.agent(actor),
15
15
  verb: Verbs::REGISTERED,
16
- object: Objects.course(course, @uri_for.call(course))
16
+ object: Objects.course(course, @uri_for)
17
17
  )
18
18
  end
19
19
  end
@@ -16,7 +16,7 @@ module PupilfirstXapi
16
16
  Xapi.create_statement(
17
17
  actor: Actors.agent(actor),
18
18
  verb: Verbs::COMPLETED_ASSIGNMENT,
19
- object: Objects.target(target, @uri_for.call(target))
19
+ object: Objects.target(target, @uri_for)
20
20
  )
21
21
  end
22
22
  end
@@ -1,3 +1,3 @@
1
1
  module PupilfirstXapi
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.3'
3
3
  end
@@ -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.0',
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 nil
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({"http://id.tincanapi.com/extension/planned-duration" => duration})
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
- target = double(:target, title: '1st target', description: 'Seems easy')
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.2.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-03-02 00:00:00.000000000 Z
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.1
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.1
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/course_redistered_spec.rb
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/course_redistered_spec.rb
150
+ - spec/statements/course_registered_spec.rb
157
151
  - spec/statements/target_completed_spec.rb