canvas_shim 0.1.5 → 0.1.6rc

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: 56234ee394496d4b0430d19e6ba708a38d08790b2dacd2b584efbb1d0cd388f4
4
- data.tar.gz: '08de3a1c5a958a7b6e181c6b73c1410a41c9c53cfd2d613d9ee84c766e798d0a'
3
+ metadata.gz: 6e39a7f405530935baee9428f5dc11f644e0189002d4ea74948ca4dabe88f097
4
+ data.tar.gz: 86c9afa59179b660525df9865cfd616b54907be79cb3048a35e55eb4055d56d4
5
5
  SHA512:
6
- metadata.gz: 006c49ca5b5e8205681b57b6ebd7c047fcf2071939faf0a78c78379b36aa8ed71d16165c49e1d5f0664b2cdefae2cda481519b11ae8a8e30bca2ba4e936932eb
7
- data.tar.gz: 579759304ca6fe7662c92d927a514a47456964799531f2b209d52b2289551ce8f000103e4bf97ec600ec243c3d3b45802663666dcde320db91f2dc535d0e922a
6
+ metadata.gz: b1136da9362a036361b9b206ac94f851621f203682232bbb9a687b9b8051062828ecf16f0f6ec44b88ce6217295a351cf27242005e99b5acd242f7148e7e9cd8
7
+ data.tar.gz: 2b1237a669712bb4b8c0b323a8f6fca9dbccd4cd6bf9c91ac20b84aad14a08cd57384644e681d627d2b2bccb84e1c420e1603cd2e13bddff2124a74712d85857
@@ -35,9 +35,7 @@ module PipelineService
35
35
  end
36
36
 
37
37
  def post_to_pipeline
38
- client.new(
39
- @args.merge(object: object)
40
- ).call
38
+ client.new(@args.merge(object: object)).call
41
39
  end
42
40
  end
43
41
  end
@@ -46,7 +46,6 @@ module PipelineService
46
46
  end
47
47
 
48
48
  def configure_dependencies
49
- @message_class = @args[:message_class] || PipelinePublisher::Message
50
49
  @fetcher = @args[:fetcher] || Serializers::Fetcher
51
50
  @logger = @args[:logger] || PipelineService::Logger
52
51
  @canvas_domain = ENV['CANVAS_DOMAIN']
@@ -58,11 +57,11 @@ module PipelineService
58
57
  end
59
58
 
60
59
  def build
61
- message_class.new(payload.to_hash)
60
+ payload.to_hash
62
61
  end
63
62
 
64
63
  def noun
65
- object.class.to_s.underscore
64
+ object.class.to_s.split('::').last.underscore
66
65
  end
67
66
 
68
67
  def id
@@ -1,16 +1,13 @@
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
8
- @event = Events::GradedOutEvent
7
+ @responder = @args[:responder] || Events::Responders::SIS
9
8
  end
10
9
 
11
10
  def call
12
- return unless object.is_a?(Enrollment)
13
- fetch_serializer
14
11
  build_message
15
12
  build_responder
16
13
  build_subscriptions
@@ -19,15 +16,19 @@ module PipelineService
19
16
 
20
17
  private
21
18
 
22
- attr_reader :subscriptions, :object, :responder, :message, :serializer, :event
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
23
27
 
24
28
  def build_subscriptions
25
- @subscriptions = [
26
- Events::Subscription.new(
27
- event: :graded_out,
28
- responder: responder
29
- )
30
- ]
29
+ @subscriptions = [:graded_out, :grade_changed].map do |event_name|
30
+ Events::Subscription.new(event: event_name, responder: responder)
31
+ end
31
32
  end
32
33
 
33
34
  def build_responder
@@ -37,8 +38,13 @@ module PipelineService
37
38
  )
38
39
  end
39
40
 
40
- def fetch_serializer
41
- @serializer = Serializers::CanvasAPIEnrollment
41
+ def serializer
42
+ case object
43
+ when PipelineService::Nouns::UnitGrades
44
+ Serializers::UnitGrades
45
+ when Enrollment
46
+ Serializers::CanvasAPIEnrollment
47
+ end
42
48
  end
43
49
 
44
50
  def build_message
@@ -47,8 +53,10 @@ module PipelineService
47
53
 
48
54
  def emit
49
55
  subscriptions.each do |subscription|
50
- next if subscription.event != :graded_out
51
- event.new(@args.merge(subscription: subscription)).emit
56
+ next unless events[subscription.event]
57
+ events[subscription.event].new(
58
+ @args.merge(subscription: subscription)
59
+ ).emit
52
60
  end
53
61
  end
54
62
  end
@@ -0,0 +1,24 @@
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
@@ -11,7 +11,8 @@ module PipelineService
11
11
  end
12
12
 
13
13
  def post(args)
14
- PipelinePublisher::MessagesApi.new.messages_post(*args)
14
+ message = PipelinePublisher::Message.new(*args)
15
+ PipelinePublisher::MessagesApi.new.messages_post(message)
15
16
  end
16
17
 
17
18
  def get(endpoint, args)
@@ -0,0 +1,13 @@
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
@@ -6,6 +6,8 @@ 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
9
11
  when /Enrollment/
10
12
  PipelineService::Serializers::Enrollment
11
13
  else
@@ -0,0 +1,17 @@
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
@@ -0,0 +1,40 @@
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
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,13 @@
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
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,25 @@
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
@@ -1,16 +1,15 @@
1
1
  require 'csv'
2
- require "rails"
3
2
  require 'grape'
4
3
  require 'grape-swagger'
5
4
  require 'grape-swagger-ui'
6
5
  require 'aws-sdk-dynamodb'
7
- require "pipeline_publisher_ruby"
8
6
  require "business"
9
7
  require 'httparty'
10
8
  require 'aws-sdk-core'
11
9
  require 'aws-sdk-s3'
12
- require 'inst-jobs'
13
10
  require 'pg'
11
+ require "pipeline_publisher_ruby"
12
+
14
13
 
15
14
  module CanvasShim
16
15
  class Engine < ::Rails::Engine
@@ -1,3 +1,3 @@
1
1
  module CanvasShim
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6rc'
3
3
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas_shim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6rc
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-30 00:00:00.000000000 Z
11
+ date: 2018-11-15 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
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: grape
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -123,61 +109,19 @@ dependencies:
123
109
  - !ruby/object:Gem::Version
124
110
  version: '0'
125
111
  - !ruby/object:Gem::Dependency
126
- name: aws-sdk-core
112
+ name: loofah
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - '='
130
116
  - !ruby/object:Gem::Version
131
- version: 3.27.0
117
+ version: 2.2.3
132
118
  type: :runtime
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - '='
137
123
  - !ruby/object:Gem::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'
124
+ version: 2.2.3
181
125
  description: A rails engine to be integrated with Canvas
182
126
  email:
183
127
  - ''
@@ -215,12 +159,14 @@ files:
215
159
  - app/services/pipeline_service/endpoints/pipeline.rb
216
160
  - app/services/pipeline_service/endpoints/pipeline/message_builder.rb
217
161
  - app/services/pipeline_service/events/emitter.rb
162
+ - app/services/pipeline_service/events/grade_changed_event.rb
218
163
  - app/services/pipeline_service/events/graded_out_event.rb
219
164
  - app/services/pipeline_service/events/http_client.rb
220
165
  - app/services/pipeline_service/events/responders/sis.rb
221
166
  - app/services/pipeline_service/events/subscription.rb
222
167
  - app/services/pipeline_service/http_client.rb
223
168
  - app/services/pipeline_service/logger.rb
169
+ - app/services/pipeline_service/nouns/unit_grades.rb
224
170
  - app/services/pipeline_service/pipeline_client.rb
225
171
  - app/services/pipeline_service/serializers/assignment.rb
226
172
  - app/services/pipeline_service/serializers/base_methods.rb
@@ -228,6 +174,7 @@ files:
228
174
  - app/services/pipeline_service/serializers/enrollment.rb
229
175
  - app/services/pipeline_service/serializers/fetcher.rb
230
176
  - app/services/pipeline_service/serializers/submission.rb
177
+ - app/services/pipeline_service/serializers/unit_grades.rb
231
178
  - app/services/pipeline_service/serializers/user.rb
232
179
  - app/services/settings_service.rb
233
180
  - app/services/settings_service/api_docs.yml
@@ -250,6 +197,11 @@ files:
250
197
  - app/services/settings_service/student_assignment_repository.rb
251
198
  - app/services/settings_service/submission.rb
252
199
  - 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
253
205
  - app/views/layouts/canvas_shim/application.html.erb
254
206
  - config/initializers/hash.rb
255
207
  - config/initializers/string.rb
@@ -273,9 +225,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
273
225
  version: '0'
274
226
  required_rubygems_version: !ruby/object:Gem::Requirement
275
227
  requirements:
276
- - - ">="
228
+ - - ">"
277
229
  - !ruby/object:Gem::Version
278
- version: '0'
230
+ version: 1.3.1
279
231
  requirements: []
280
232
  rubyforge_project:
281
233
  rubygems_version: 2.7.7