canvas_shim 0.1.6rc → 0.1.6
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 +5 -5
- data/app/services/pipeline_service/commands/publish.rb +3 -1
- data/app/services/pipeline_service/endpoints/pipeline/message_builder.rb +3 -2
- data/app/services/pipeline_service/events/emitter.rb +16 -24
- data/app/services/pipeline_service/http_client.rb +1 -2
- data/app/services/pipeline_service/serializers/fetcher.rb +0 -2
- data/lib/canvas_shim/engine.rb +3 -2
- data/lib/canvas_shim/version.rb +1 -1
- metadata +68 -20
- data/app/services/pipeline_service/events/grade_changed_event.rb +0 -24
- data/app/services/pipeline_service/nouns/unit_grades.rb +0 -13
- data/app/services/pipeline_service/serializers/unit_grades.rb +0 -17
- data/app/services/units_service/commands/get_unit_grades.rb +0 -40
- data/app/services/units_service/grades_calculator.rb +0 -39
- data/app/services/units_service/queries/get_category_weights.rb +0 -13
- data/app/services/units_service/queries/get_items.rb +0 -24
- data/app/services/units_service/queries/get_submissions.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 609839eafaec6666e51e55d0cc8d6edbf03fe6b3
|
4
|
+
data.tar.gz: 3bbd30dc0a3a84a7b71b41d699dfea5d94368e94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 589f68146ae0b4b3cc2d087d3ae09de8174abc5af2619fd0cd736859001aaf0b09514be2a180dc8a1cab277cb25df15f11c5785a3ad83ef16b6de460e59c0a24
|
7
|
+
data.tar.gz: 9cec254fdf2b4050229c08839c29fd52bc579e30c0ed575c66849148011bef387db8ba699aaabc59f24df0617183bc6e7d758c745224d71add04d650432d8aa0
|
@@ -46,6 +46,7 @@ module PipelineService
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def configure_dependencies
|
49
|
+
@message_class = @args[:message_class] || PipelinePublisher::Message
|
49
50
|
@fetcher = @args[:fetcher] || Serializers::Fetcher
|
50
51
|
@logger = @args[:logger] || PipelineService::Logger
|
51
52
|
@canvas_domain = ENV['CANVAS_DOMAIN']
|
@@ -57,11 +58,11 @@ module PipelineService
|
|
57
58
|
end
|
58
59
|
|
59
60
|
def build
|
60
|
-
payload.to_hash
|
61
|
+
message_class.new(payload.to_hash)
|
61
62
|
end
|
62
63
|
|
63
64
|
def noun
|
64
|
-
object.class.to_s.
|
65
|
+
object.class.to_s.underscore
|
65
66
|
end
|
66
67
|
|
67
68
|
def id
|
@@ -1,13 +1,16 @@
|
|
1
1
|
module PipelineService
|
2
2
|
module Events
|
3
3
|
class Emitter
|
4
|
-
def initialize
|
4
|
+
def initialize(args={})
|
5
5
|
@object = args[:object]
|
6
6
|
@args = args
|
7
|
-
@responder
|
7
|
+
@responder = @args[:responder] || Events::Responders::SIS
|
8
|
+
@event = Events::GradedOutEvent
|
8
9
|
end
|
9
10
|
|
10
11
|
def call
|
12
|
+
return unless object.is_a?(Enrollment)
|
13
|
+
fetch_serializer
|
11
14
|
build_message
|
12
15
|
build_responder
|
13
16
|
build_subscriptions
|
@@ -16,19 +19,15 @@ module PipelineService
|
|
16
19
|
|
17
20
|
private
|
18
21
|
|
19
|
-
attr_reader :subscriptions, :object, :responder, :message
|
20
|
-
|
21
|
-
def events
|
22
|
-
{
|
23
|
-
graded_out: Events::GradedOutEvent,
|
24
|
-
grade_changed: Events::GradeChangedEvent
|
25
|
-
}
|
26
|
-
end
|
22
|
+
attr_reader :subscriptions, :object, :responder, :message, :serializer, :event
|
27
23
|
|
28
24
|
def build_subscriptions
|
29
|
-
@subscriptions = [
|
30
|
-
Events::Subscription.new(
|
31
|
-
|
25
|
+
@subscriptions = [
|
26
|
+
Events::Subscription.new(
|
27
|
+
event: :graded_out,
|
28
|
+
responder: responder
|
29
|
+
)
|
30
|
+
]
|
32
31
|
end
|
33
32
|
|
34
33
|
def build_responder
|
@@ -38,13 +37,8 @@ module PipelineService
|
|
38
37
|
)
|
39
38
|
end
|
40
39
|
|
41
|
-
def
|
42
|
-
|
43
|
-
when PipelineService::Nouns::UnitGrades
|
44
|
-
Serializers::UnitGrades
|
45
|
-
when Enrollment
|
46
|
-
Serializers::CanvasAPIEnrollment
|
47
|
-
end
|
40
|
+
def fetch_serializer
|
41
|
+
@serializer = Serializers::CanvasAPIEnrollment
|
48
42
|
end
|
49
43
|
|
50
44
|
def build_message
|
@@ -53,10 +47,8 @@ module PipelineService
|
|
53
47
|
|
54
48
|
def emit
|
55
49
|
subscriptions.each do |subscription|
|
56
|
-
next
|
57
|
-
|
58
|
-
@args.merge(subscription: subscription)
|
59
|
-
).emit
|
50
|
+
next if subscription.event != :graded_out
|
51
|
+
event.new(@args.merge(subscription: subscription)).emit
|
60
52
|
end
|
61
53
|
end
|
62
54
|
end
|
@@ -11,8 +11,7 @@ module PipelineService
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def post(args)
|
14
|
-
|
15
|
-
PipelinePublisher::MessagesApi.new.messages_post(message)
|
14
|
+
PipelinePublisher::MessagesApi.new.messages_post(*args)
|
16
15
|
end
|
17
16
|
|
18
17
|
def get(endpoint, args)
|
@@ -6,8 +6,6 @@ module PipelineService
|
|
6
6
|
# Maps any object with a class containing 'enrollment' to the enrollment serializer
|
7
7
|
def self.fetch(object:)
|
8
8
|
case object.class.to_s
|
9
|
-
when /PipelineService::Nouns::UnitGrades/
|
10
|
-
PipelineService::Serializers::UnitGrades
|
11
9
|
when /Enrollment/
|
12
10
|
PipelineService::Serializers::Enrollment
|
13
11
|
else
|
data/lib/canvas_shim/engine.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
require 'csv'
|
2
|
+
require "rails"
|
2
3
|
require 'grape'
|
3
4
|
require 'grape-swagger'
|
4
5
|
require 'grape-swagger-ui'
|
5
6
|
require 'aws-sdk-dynamodb'
|
7
|
+
require "pipeline_publisher_ruby"
|
6
8
|
require "business"
|
7
9
|
require 'httparty'
|
8
10
|
require 'aws-sdk-core'
|
9
11
|
require 'aws-sdk-s3'
|
12
|
+
require 'inst-jobs'
|
10
13
|
require 'pg'
|
11
|
-
require "pipeline_publisher_ruby"
|
12
|
-
|
13
14
|
|
14
15
|
module CanvasShim
|
15
16
|
class Engine < ::Rails::Engine
|
data/lib/canvas_shim/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_shim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.0.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.0.4
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: grape
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +70,16 @@ dependencies:
|
|
56
70
|
name: aws-sdk-dynamodb
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - '='
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
75
|
+
version: 1.15.0
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - '='
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
82
|
+
version: 1.15.0
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: pipeline_publisher_ruby
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,19 +123,61 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: aws-sdk-core
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - '='
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: 3.27.0
|
118
132
|
type: :runtime
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - '='
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
138
|
+
version: 3.27.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: aws-sdk-s3
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: inst-jobs
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: pg
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
125
181
|
description: A rails engine to be integrated with Canvas
|
126
182
|
email:
|
127
183
|
- ''
|
@@ -159,14 +215,12 @@ files:
|
|
159
215
|
- app/services/pipeline_service/endpoints/pipeline.rb
|
160
216
|
- app/services/pipeline_service/endpoints/pipeline/message_builder.rb
|
161
217
|
- app/services/pipeline_service/events/emitter.rb
|
162
|
-
- app/services/pipeline_service/events/grade_changed_event.rb
|
163
218
|
- app/services/pipeline_service/events/graded_out_event.rb
|
164
219
|
- app/services/pipeline_service/events/http_client.rb
|
165
220
|
- app/services/pipeline_service/events/responders/sis.rb
|
166
221
|
- app/services/pipeline_service/events/subscription.rb
|
167
222
|
- app/services/pipeline_service/http_client.rb
|
168
223
|
- app/services/pipeline_service/logger.rb
|
169
|
-
- app/services/pipeline_service/nouns/unit_grades.rb
|
170
224
|
- app/services/pipeline_service/pipeline_client.rb
|
171
225
|
- app/services/pipeline_service/serializers/assignment.rb
|
172
226
|
- app/services/pipeline_service/serializers/base_methods.rb
|
@@ -174,7 +228,6 @@ files:
|
|
174
228
|
- app/services/pipeline_service/serializers/enrollment.rb
|
175
229
|
- app/services/pipeline_service/serializers/fetcher.rb
|
176
230
|
- app/services/pipeline_service/serializers/submission.rb
|
177
|
-
- app/services/pipeline_service/serializers/unit_grades.rb
|
178
231
|
- app/services/pipeline_service/serializers/user.rb
|
179
232
|
- app/services/settings_service.rb
|
180
233
|
- app/services/settings_service/api_docs.yml
|
@@ -197,11 +250,6 @@ files:
|
|
197
250
|
- app/services/settings_service/student_assignment_repository.rb
|
198
251
|
- app/services/settings_service/submission.rb
|
199
252
|
- app/services/settings_service/user.rb
|
200
|
-
- app/services/units_service/commands/get_unit_grades.rb
|
201
|
-
- app/services/units_service/grades_calculator.rb
|
202
|
-
- app/services/units_service/queries/get_category_weights.rb
|
203
|
-
- app/services/units_service/queries/get_items.rb
|
204
|
-
- app/services/units_service/queries/get_submissions.rb
|
205
253
|
- app/views/layouts/canvas_shim/application.html.erb
|
206
254
|
- config/initializers/hash.rb
|
207
255
|
- config/initializers/string.rb
|
@@ -225,12 +273,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
273
|
version: '0'
|
226
274
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
275
|
requirements:
|
228
|
-
- - "
|
276
|
+
- - ">="
|
229
277
|
- !ruby/object:Gem::Version
|
230
|
-
version:
|
278
|
+
version: '0'
|
231
279
|
requirements: []
|
232
280
|
rubyforge_project:
|
233
|
-
rubygems_version: 2.
|
281
|
+
rubygems_version: 2.6.14
|
234
282
|
signing_key:
|
235
283
|
specification_version: 4
|
236
284
|
summary: A tool to make it easy to write code that plugs into canvas
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module PipelineService
|
2
|
-
module Events
|
3
|
-
class GradeChangedEvent
|
4
|
-
def initialize args
|
5
|
-
@args = args
|
6
|
-
@subscription = args[:subscription]
|
7
|
-
@object = args[:object]
|
8
|
-
@changes = args[:changes]
|
9
|
-
end
|
10
|
-
|
11
|
-
def emit
|
12
|
-
return unless should_trigger?
|
13
|
-
@subscription.responder.call
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def should_trigger?
|
19
|
-
return false unless @changes['score']
|
20
|
-
@object.is_a?(PipelineService::Nouns::UnitGrades)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module PipelineService
|
2
|
-
module Nouns
|
3
|
-
class UnitGrades
|
4
|
-
attr_reader :course, :student, :id, :changes
|
5
|
-
def initialize(submission)
|
6
|
-
@course = submission.assignment.course
|
7
|
-
@student = submission.user
|
8
|
-
@id = submission.id
|
9
|
-
@changes = submission.changes
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module PipelineService
|
2
|
-
module Serializers
|
3
|
-
class UnitGrades
|
4
|
-
def initialize(object:)
|
5
|
-
@course = object.course
|
6
|
-
@student = object.student
|
7
|
-
end
|
8
|
-
|
9
|
-
def call
|
10
|
-
UnitsService::Commands::GetUnitGrades.new(
|
11
|
-
course: @course,
|
12
|
-
student: @student
|
13
|
-
).call
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module UnitsService
|
2
|
-
module Commands
|
3
|
-
class GetUnitGrades
|
4
|
-
def initialize(course:, student:)
|
5
|
-
@course = course
|
6
|
-
@student = student
|
7
|
-
end
|
8
|
-
|
9
|
-
def call
|
10
|
-
get_submissions
|
11
|
-
calculate_grades
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def get_submissions
|
17
|
-
@unit_submissions = UnitsService::Queries::GetSubmissions.new(
|
18
|
-
course: @course,
|
19
|
-
student: @student
|
20
|
-
).query
|
21
|
-
end
|
22
|
-
|
23
|
-
# {
|
24
|
-
# course_id: 1,
|
25
|
-
# student_id: 13,
|
26
|
-
# units: {
|
27
|
-
# { id: 1, score: 80 },
|
28
|
-
# { id: 2, grade: 83 },
|
29
|
-
# { id: 3, grade: 74 },
|
30
|
-
# { id: 4, grade: 56 },
|
31
|
-
# { id: 5, grade: 99 },
|
32
|
-
# { id: 6, grade: 12 }
|
33
|
-
# }
|
34
|
-
# }
|
35
|
-
def calculate_grades
|
36
|
-
UnitsService::GradesCalculator.new(@unit_submissions, @course).call
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module UnitsService
|
2
|
-
class GradesCalculator
|
3
|
-
def initialize unit_submissions, course
|
4
|
-
@unit_submissions = unit_submissions
|
5
|
-
@course = course
|
6
|
-
end
|
7
|
-
|
8
|
-
def call
|
9
|
-
result = {}
|
10
|
-
|
11
|
-
@unit_submissions.each do |unit, submissions|
|
12
|
-
next if submissions.count == 0
|
13
|
-
result[unit.id] = weighted_average(submissions)
|
14
|
-
end
|
15
|
-
|
16
|
-
result
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def weighted_average(submissions)
|
22
|
-
result = {}
|
23
|
-
submissions.group_by do |submission|
|
24
|
-
submission.assignment.assignment_group
|
25
|
-
end.each do |group, submissions|
|
26
|
-
result[group.name] = [] unless result[group]
|
27
|
-
average = submissions.sum(&:score).to_f / submissions.count
|
28
|
-
weight = category_weights[group.name] / category_weights.values.sum
|
29
|
-
result[group.name] << average * weight
|
30
|
-
end
|
31
|
-
|
32
|
-
result.sum { |r, weighted| weighted.sum }
|
33
|
-
end
|
34
|
-
|
35
|
-
def category_weights
|
36
|
-
Queries::GetCategoryWeights.new(@course).query
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module UnitsService
|
2
|
-
module Queries
|
3
|
-
class GetItems
|
4
|
-
def initialize(course:)
|
5
|
-
@course = course
|
6
|
-
@context_modules = @course.context_modules
|
7
|
-
end
|
8
|
-
|
9
|
-
def query
|
10
|
-
result = {}
|
11
|
-
|
12
|
-
@context_modules.each do |context_module|
|
13
|
-
result[context_module] =
|
14
|
-
context_module.content_tags.select do |ct|
|
15
|
-
ct.content.present? &&
|
16
|
-
ct.content.respond_to?(:submissions) &&
|
17
|
-
ct.content.workflow_state == 'published'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
result
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module UnitsService
|
2
|
-
module Queries
|
3
|
-
class GetSubmissions
|
4
|
-
def initialize(course:, student:)
|
5
|
-
@student = student
|
6
|
-
@course = course
|
7
|
-
end
|
8
|
-
|
9
|
-
def query
|
10
|
-
result = {}
|
11
|
-
units.each do |unit, items|
|
12
|
-
items.each do |item|
|
13
|
-
result[unit] = item.content.submissions.where(user_id: @student.id).where("excused is not true")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
result
|
18
|
-
end
|
19
|
-
|
20
|
-
def units
|
21
|
-
GetItems.new(course: @course).query
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|