canvas_shim 0.1.6rc → 0.1.6

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
- SHA256:
3
- metadata.gz: 6e39a7f405530935baee9428f5dc11f644e0189002d4ea74948ca4dabe88f097
4
- data.tar.gz: 86c9afa59179b660525df9865cfd616b54907be79cb3048a35e55eb4055d56d4
2
+ SHA1:
3
+ metadata.gz: 609839eafaec6666e51e55d0cc8d6edbf03fe6b3
4
+ data.tar.gz: 3bbd30dc0a3a84a7b71b41d699dfea5d94368e94
5
5
  SHA512:
6
- metadata.gz: b1136da9362a036361b9b206ac94f851621f203682232bbb9a687b9b8051062828ecf16f0f6ec44b88ce6217295a351cf27242005e99b5acd242f7148e7e9cd8
7
- data.tar.gz: 2b1237a669712bb4b8c0b323a8f6fca9dbccd4cd6bf9c91ac20b84aad14a08cd57384644e681d627d2b2bccb84e1c420e1603cd2e13bddff2124a74712d85857
6
+ metadata.gz: 589f68146ae0b4b3cc2d087d3ae09de8174abc5af2619fd0cd736859001aaf0b09514be2a180dc8a1cab277cb25df15f11c5785a3ad83ef16b6de460e59c0a24
7
+ data.tar.gz: 9cec254fdf2b4050229c08839c29fd52bc579e30c0ed575c66849148011bef387db8ba699aaabc59f24df0617183bc6e7d758c745224d71add04d650432d8aa0
@@ -35,7 +35,9 @@ module PipelineService
35
35
  end
36
36
 
37
37
  def post_to_pipeline
38
- client.new(@args.merge(object: object)).call
38
+ client.new(
39
+ @args.merge(object: object)
40
+ ).call
39
41
  end
40
42
  end
41
43
  end
@@ -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.split('::').last.underscore
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 args={}
4
+ def initialize(args={})
5
5
  @object = args[:object]
6
6
  @args = args
7
- @responder = @args[:responder] || Events::Responders::SIS
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 = [:graded_out, :grade_changed].map do |event_name|
30
- Events::Subscription.new(event: event_name, responder: responder)
31
- end
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 serializer
42
- case object
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 unless events[subscription.event]
57
- events[subscription.event].new(
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
- message = PipelinePublisher::Message.new(*args)
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module CanvasShim
2
- VERSION = '0.1.6rc'
2
+ VERSION = '0.1.6'
3
3
  end
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.6rc
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-15 00:00:00.000000000 Z
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: '1.6'
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: '1.6'
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: loofah
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: 2.2.3
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: 2.2.3
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: 1.3.1
278
+ version: '0'
231
279
  requirements: []
232
280
  rubyforge_project:
233
- rubygems_version: 2.7.7
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,13 +0,0 @@
1
- module UnitsService
2
- module Queries
3
- class GetCategoryWeights
4
- def initialize(course)
5
- @course = course
6
- end
7
-
8
- def query
9
- @course.assignment_groups.map{|ag| [ag.name, ag.group_weight]}.to_h
10
- end
11
- end
12
- end
13
- 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