coalescing_panda 5.0.9 → 5.1.3.beta.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b34aab2ab63066e86c9799e4e564129b1b30186
4
- data.tar.gz: b486b6be2efcf0807da76b573cd7212b1fdd5d8d
3
+ metadata.gz: c5c88b9fcd0222696f789cd64db4c782ea171d0f
4
+ data.tar.gz: e0dabfcd2034e3859875e073a035672d65dbdea5
5
5
  SHA512:
6
- metadata.gz: cba63bdaeb3f4255e354112f217fe80b134e5c28ed2ebffe931df625f1ff640960ae75510ee0b7018d697ae39ceaec246e63c6410409a43217f37753d956df02
7
- data.tar.gz: 74735105c7609b9524c40f1b5b0122f937a18036ccdaae32ff16324b0f19d3f90d98d309120afc80ea12b6cf6eb3ecb50b5f00fde6c14c68987a3035ec10cd08
6
+ metadata.gz: 1c3721812b472072ee61d2b8760890033975a40cf3dbd79e6c69b034718572a6e631fee1b1cd0b75beddc71b7fecc947cbe68bacdf1c88dbfe3aafa3ada24daa
7
+ data.tar.gz: 1348d332f2651e084f1e458b834c3de5a2c7eb69586343fe602488e008daa3b3d295c31cc5287744e5d2e1a765dbfa30630475aa87885125de11a9deff2b4eca
@@ -34,7 +34,7 @@ module CoalescingPanda
34
34
  private
35
35
 
36
36
  def oauth2_protocol
37
- ENV['OAUTH_PROTOCOL'] || 'https'
37
+ ENV['OAUTH_PROTOCOL'] || (Rails.env.development? ? 'http' : 'https')
38
38
  end
39
39
 
40
40
  def retrieve_oauth_state
@@ -1,51 +1,17 @@
1
1
  require 'browser'
2
+ require_relative 'session_replacement'
2
3
 
3
4
  module CoalescingPanda
4
5
  module ControllerHelpers
5
6
  extend ActiveSupport::Concern
6
-
7
- included do
8
- alias_method :rails_session, :session
9
-
10
- helper_method :encrypted_session_key, :current_session_data, :current_session
11
- append_after_action :save_session, if: -> { @current_session && session_changed? }
12
- end
13
-
14
- class_methods do
15
- def use_native_sessions
16
- after_action do
17
- rails_session['persistent_session_key'] = current_session.session_key if @current_session.present?
18
- end
19
- end
20
- end
21
-
22
- def current_session
23
- @current_session ||= (CoalescingPanda::PersistentSession.find_by(session_key: session_key) if session_key)
24
- @current_session ||= (CoalescingPanda::PersistentSession.create_from_launch(params, current_lti_account.id) if current_lti_account.present?)
25
- @current_session
26
- end
7
+ include SessionReplacement
27
8
 
28
9
  def current_lti_account
29
10
  @account ||= (CoalescingPanda::LtiAccount.find_by!(key: organization_key) if organization_key)
30
11
  @account ||= (CoalescingPanda::LtiAccount.find_by(id: organization_id) if organization_id)
31
12
  @account
32
13
  end
33
-
34
- def current_session_data
35
- current_session.data
36
- end
37
-
38
- def encrypted_session_key
39
- msg_encryptor.encrypt_and_sign(current_session.session_key)
40
- end
41
-
42
- def save_session
43
- current_session.try(:save)
44
- end
45
-
46
- def session_changed?
47
- current_session.changed? && current_session.changes[:data].present?
48
- end
14
+ def current_organization; current_lti_account; end
49
15
 
50
16
  def canvas_oauth2(*roles)
51
17
  return if have_session?
@@ -81,7 +47,7 @@ module CoalescingPanda
81
47
  client = Bearcat::Client.new(prefix: uri.prefix)
82
48
  state = SecureRandom.hex(32)
83
49
  OauthState.create! state_key: state, data: { key: params['oauth_consumer_key'], user_id: user_id, api_domain: uri.api_domain }
84
- @canvas_url = client.auth_redirect_url(client_id, coalescing_panda.oauth2_redirect_url, { state: state })
50
+ @canvas_url = client.auth_redirect_url(client_id, resolve_coalescing_panda_url(:oauth2_redirect_url), { state: state })
85
51
 
86
52
  #delete the added params so the original oauth sig still works
87
53
  @lti_params = params.to_hash
@@ -92,7 +58,7 @@ module CoalescingPanda
92
58
 
93
59
  def refresh_token(uri, api_auth)
94
60
  refresh_client = Bearcat::Client.new(prefix: uri.prefix)
95
- refresh_body = refresh_client.retrieve_token(@lti_account.oauth2_client_id, coalescing_panda.oauth2_redirect_url,
61
+ refresh_body = refresh_client.retrieve_token(@lti_account.oauth2_client_id, resolve_coalescing_panda_url(:oauth2_redirect_url),
96
62
  @lti_account.oauth2_client_key, api_auth.refresh_token, 'refresh_token')
97
63
  api_auth.update({ api_token: refresh_body['access_token'], expires_at: (Time.now + refresh_body['expires_in']) })
98
64
  end
@@ -191,14 +157,21 @@ module CoalescingPanda
191
157
  end
192
158
  end
193
159
 
194
- def session_check
195
- logger.warn 'session_check is deprecated. Functionality moved to lti_authorize.'
160
+ def valid_session?
161
+ return false unless current_session(create_missing: false)&.persisted?
162
+ true
163
+ rescue SessionNonceMismatch
164
+ false
196
165
  end
197
166
 
198
167
  private
199
168
 
200
- def msg_encryptor
201
- @crypt ||= ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31])
169
+ def find_or_create_session(key:)
170
+ if key == :create
171
+ CoalescingPanda::PersistentSession.create_from_launch(params, current_lti_account.id) if current_lti_account.present?
172
+ else
173
+ CoalescingPanda::PersistentSession.find_by(session_key: key)
174
+ end
202
175
  end
203
176
 
204
177
  def organization_key
@@ -209,51 +182,16 @@ module CoalescingPanda
209
182
  params[:organization_id] || (current_session_data[:launch_params][:organization_id] if @current_session)
210
183
  end
211
184
 
212
- def session_key
213
- if params[:encrypted_session_key]
214
- return msg_encryptor.decrypt_and_verify(params[:encrypted_session_key])
215
- end
216
- params[:session_key] || session_key_header || rails_session['persistent_session_key']
185
+ # This is necessitated by a bug in Rails Engines where it isn't resolving the URL correctly
186
+ # when using coalescing_panda.xyz_url (The Engine Prefix is not included)
187
+ # I believe https://github.com/rails/rails/issues/34452 is the same issue
188
+ def resolve_coalescing_panda_url(key)
189
+ key = key.to_s[0...-4] if key.to_s.ends_with?('_url')
190
+ resolved_path = coalescing_panda.send(:"#{key}_path")
191
+ cpurl = coalescing_panda_url
192
+ cppath = URI.parse(cpurl).path
193
+ resolved_path = cppath + resolved_path unless resolved_path.starts_with?(cppath)
194
+ URI.join(cpurl, resolved_path)
217
195
  end
218
-
219
- def session_key_header
220
- if (match = request.headers['Authorization'].try(:match, /crypted_token=(.+)/))
221
- msg_encryptor.decrypt_and_verify(match[1])
222
- elsif (match = request.headers['Authorization'].try(:match, /token=(.+)/))
223
- match[1]
224
- end
225
- end
226
-
227
- # Redirect with the session key intact. In production,
228
- # handle this by encrypting the session key. That way if the
229
- # url is logged anywhere, it will all be encrypted data. In dev,
230
- # just put it in the URL. Putting it in the URL
231
- # is insecure, but is fine in development.
232
- # Keeping it in the URL in development means that it plays
233
- # nicely with webpack-dev-server live reloading (otherwise
234
- # you get an access error every time it tries to live reload).
235
-
236
- def redirect_with_session_to(path, id_or_resource = nil, redirect_params = {})
237
- if Rails.env.development? || Rails.env.test?
238
- redirect_development_mode(path, id_or_resource, redirect_params)
239
- else
240
- redirect_production_mode(path, id_or_resource, redirect_params)
241
- end
242
- end
243
-
244
- def redirect_development_mode(path, id_or_resource = nil, redirect_params)
245
- redirect_to send(path, id_or_resource, {
246
- session_key: current_session.session_key,
247
- organization_id: current_lti_account.id
248
- }.merge(redirect_params))
249
- end
250
-
251
- def redirect_production_mode(path, id_or_resource = nil, redirect_params)
252
- redirect_to send(path, id_or_resource, {
253
- encrypted_session_key: encrypted_session_key,
254
- organization_id: current_lti_account.id
255
- }.merge(redirect_params))
256
- end
257
-
258
196
  end
259
197
  end
@@ -4,9 +4,9 @@ module CoalescingPanda
4
4
 
5
5
  def self.to_boolean(v)
6
6
  if Rails.version < '5.0'
7
- ActiveRecord::Type::Boolean.new.type_cast_from_user("0")
7
+ ActiveRecord::Type::Boolean.new.type_cast_from_user(v)
8
8
  else
9
- ActiveRecord::Type::Boolean.new.deserialize('0')
9
+ ActiveRecord::Type::Boolean.new.deserialize(v)
10
10
  end
11
11
  end
12
12
  end
@@ -48,11 +48,6 @@ module CoalescingPanda
48
48
  end
49
49
  end
50
50
 
51
- if CoalescingPanda.lti_options.has_key?(:allow_unsafe_eval) && CoalescingPanda.lti_options[:allow_unsafe_eval] == true
52
- # For when code is returned from server and injected into dom. Need to have unsafe-eval or it won't work.
53
- csp_entry(:script_src, "'unsafe-eval'")
54
- end
55
-
56
51
  # Detect and permit Sentry
57
52
  if defined?(Raven) && Raven.configuration.server.present?
58
53
  csp_entry(:connect_src, Raven.configuration.server)
@@ -0,0 +1,196 @@
1
+ module CoalescingPanda
2
+ class SessionNonceMismatch < StandardError; end
3
+
4
+ module SessionReplacement
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :link_nonce, :current_session, :current_session_data
9
+ helper_method :link_with_session_to, :url_with_session, :session_url_for
10
+
11
+ prepend_around_action :monkeypatch_flash
12
+ prepend_around_action :auto_save_session
13
+ end
14
+
15
+ class_methods do
16
+ def link_nonce_type(value = :not_given)
17
+ if value == :not_given
18
+ @link_nonce_type || superclass.try(:link_nonce_type) || :nonce
19
+ else
20
+ @link_nonce_type = value
21
+ end
22
+ end
23
+
24
+ def session_expiration_period_minutes
25
+ superclass.try(:session_expiration_period_minutes) || 15
26
+ end
27
+ end
28
+
29
+ def save_session
30
+ current_session.try(:save)
31
+ end
32
+
33
+ def current_session(create_missing: true)
34
+ return @current_session if @current_session.present?
35
+
36
+ if params[:session_token]
37
+ payload = JSON.parse(session_cryptor.decrypt_and_verify(params[:session_token])).with_indifferent_access
38
+ matched_session = find_or_create_session(key: payload[:session_key])
39
+ if matched_session.present?
40
+ if payload[:token_type] == 'nonce' && matched_session.data[:link_nonce] == payload[:nonce]
41
+ @current_session = matched_session
42
+ @current_session.data[:link_nonce] = nil
43
+ elsif payload[:token_type] == 'fixed_ip' && matched_session.data[:remote_ip] == request.remote_ip &&
44
+ DateTime.parse(matched_session.data[:last_ip_token_requested]) > session_expiration_period_minutes.minutes.ago
45
+ @current_session = matched_session
46
+ elsif payload[:token_type] == 'expiring' && DateTime.parse(matched_session.data[:last_token_requested]) > session_expiration_period_minutes.minutes.ago
47
+ @current_session = matched_session
48
+ end
49
+ end
50
+ raise SessionNonceMismatch, "Session Not Found" unless @current_session.present?
51
+ elsif (session_key = params[:session_key] || session_key_header || flash[:session_key] || session[:session_key]).present?
52
+ @current_session = find_or_create_session(key: session_key)
53
+ end
54
+
55
+ @current_session ||= find_or_create_session(key: :create) if create_missing
56
+
57
+ @current_session
58
+ end
59
+
60
+ def current_session_data
61
+ current_session.data
62
+ end
63
+
64
+ def session_changed?
65
+ current_session.changed? && current_session.changes[:data].present?
66
+ end
67
+
68
+ def forbid_access_if_lacking_session
69
+ render plain: 'You should do an LTI Tool Launch.', status: :unauthorized unless valid_session?
70
+ end
71
+
72
+ def verify_authenticity_token
73
+ # No need to check CSRF when no cookies were sent. This fixes CSRF failures in Browsers
74
+ # that restrict Cookie setting within an IFrame.
75
+ return unless request.cookies.keys.length > 0
76
+ super
77
+ end
78
+
79
+ # Redirect with the session key intact. In production,
80
+ # handle this by adding a one-time use encrypted token to the URL.
81
+ # Keeping it in the URL in development means that it plays
82
+ # nicely with webpack-dev-server live reloading (otherwise
83
+ # you get an access error everytime it tries to live reload).
84
+
85
+ def redirect_with_session_to(*args)
86
+ redirect_to url_with_session(*args)
87
+ end
88
+
89
+ def link_with_session_to(*args)
90
+ helpers.link_to url_with_session(*args)
91
+ end
92
+
93
+ def session_url_for(*args)
94
+ url_for(build_session_url_params(*args))
95
+ end
96
+
97
+ def url_with_session(location, *args, route_context: self, **kwargs)
98
+ route_context.send(location, *build_session_url_params(*args, **kwargs))
99
+ end
100
+
101
+ def link_nonce(type: link_nonce_type)
102
+ type = instance_exec(&type) if type.is_a?(Proc)
103
+ type = type.to_s
104
+
105
+ @cached_link_nonces ||= {}
106
+ @cached_link_nonces[type] ||= begin
107
+ payload = {
108
+ token_type: type,
109
+ session_key: current_session.session_key,
110
+ organization_id: current_organization.id,
111
+ }
112
+
113
+ if type == 'nonce'
114
+ current_session_data[:link_nonce] = SecureRandom.hex
115
+ payload.merge!(nonce: current_session_data[:link_nonce])
116
+ elsif type == 'fixed_ip'
117
+ current_session_data[:remote_ip] ||= request.remote_ip
118
+ current_session_data[:last_ip_token_requested] = DateTime.now.iso8601
119
+ elsif type == 'expiring'
120
+ current_session_data[:last_token_requested] = DateTime.now.iso8601
121
+ else
122
+ raise StandardError, "Unsupported link_nonce_type: '#{type}'"
123
+ end
124
+
125
+ session_cryptor.encrypt_and_sign(payload.to_json)
126
+ end
127
+ end
128
+
129
+ def link_nonce_type
130
+ self.class.link_nonce_type
131
+ end
132
+
133
+ def session_expiration_period_minutes
134
+ self.session_expiration_period_minutes
135
+ end
136
+
137
+ private
138
+
139
+ def session_cryptor
140
+ secret_key_base = Rails.application.try(:secret_key_base) || Rails.application.secrets.secret_key_base
141
+ @session_cryptor ||= ActiveSupport::MessageEncryptor.new(secret_key_base[0..31])
142
+ end
143
+
144
+ def session_key_header
145
+ if match = request.headers['Authorization'].try(:match, /token=(.+)/)
146
+ match[1]
147
+ end
148
+ end
149
+
150
+ def build_session_url_params(*args, nonce_type: link_nonce_type, **kwargs)
151
+ if args[-1].is_a?(Hash)
152
+ args[-1] = args[-1].dup
153
+ else
154
+ args.push({})
155
+ end
156
+
157
+ if Rails.env.development?
158
+ args[-1].merge!(
159
+ session_key: current_session.session_key,
160
+ organization_id: current_organization.id,
161
+ )
162
+ else
163
+ args[-1].merge!(
164
+ session_token: link_nonce(type: nonce_type),
165
+ organization_id: current_organization.id,
166
+ )
167
+ end
168
+
169
+ args[-1].merge!(kwargs)
170
+ args
171
+ end
172
+
173
+ def auto_save_session
174
+ yield if block_given?
175
+ save_session if @current_session && session_changed?
176
+ end
177
+
178
+ def monkeypatch_flash
179
+ if valid_session? && (value = current_session_data['flashes']).present?
180
+ flashes = value["flashes"]
181
+ if discard = value["discard"]
182
+ flashes.except!(*discard)
183
+ end
184
+ flash.replace(flashes)
185
+ flash.discard()
186
+ end
187
+
188
+ yield
189
+
190
+ if @current_session.present?
191
+ current_session_data['flashes'] = flash.to_session_value
192
+ flash.discard()
193
+ end
194
+ end
195
+ end
196
+ end
@@ -1,3 +1,3 @@
1
1
  module CoalescingPanda
2
- VERSION = '5.0.9'
2
+ VERSION = '5.1.3.beta.2'
3
3
  end
@@ -11,7 +11,7 @@ describe CoalescingPanda::Oauth2Controller, :type => :controller do
11
11
  Bearcat::Client.any_instance.stub(retrieve_token: { 'access_token' => 'token', 'refresh_token' => 'token', 'expires_in' => 3600 })
12
12
  session[:state] = 'test'
13
13
  CoalescingPanda::OauthState.create!(state_key: session[:state], data: { key: account.key, user_id: user.id, api_domain: 'foo.com' })
14
- get :redirect, {user_id: user.id, api_domain: 'foo.com', code: 'bar', key: account.key, state: 'test'}
14
+ get :redirect, params: {user_id: user.id, api_domain: 'foo.com', code: 'bar', key: account.key, state: 'test'}
15
15
  auth = CoalescingPanda::CanvasApiAuth.find_by_user_id_and_api_domain(user.id, 'foo.com')
16
16
  auth.should_not == nil
17
17
  expect(auth.api_token).to eql 'token'
@@ -20,7 +20,7 @@ describe CoalescingPanda::Oauth2Controller, :type => :controller do
20
20
  end
21
21
 
22
22
  it "doesn't create a token in the db" do
23
- get :redirect, {error: 'your face'}
23
+ get :redirect, params: {error: 'your face'}
24
24
  CoalescingPanda::CanvasApiAuth.all.count.should == 0
25
25
  end
26
26
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe CoalescingPanda::CanvasApiAuth do
3
+ describe CoalescingPanda::CanvasApiAuth, type: :model do
4
4
 
5
5
  it { should validate_uniqueness_of(:user_id).scoped_to(:api_domain)}
6
6
  it { should validate_presence_of(:user_id)}
7
- it {should validate_presence_of(:api_domain)}
7
+ it { should validate_presence_of(:api_domain)}
8
8
 
9
9
  describe '#expired?' do
10
10
  let(:auth) { FactoryGirl.create :canvas_api_auth }
@@ -24,6 +24,13 @@ SimpleCov.start
24
24
 
25
25
  ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
26
26
 
27
+ Shoulda::Matchers.configure do |config|
28
+ config.integrate do |with|
29
+ with.test_framework :rspec
30
+ with.library :rails
31
+ end
32
+ end
33
+
27
34
  # This file was generated by the `rails generate rspec:install` command. Conventionally, all
28
35
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
29
36
  # The generated `.rspec` file contains `--require spec_helper` which will cause this
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coalescing_panda
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.9
4
+ version: 5.1.3.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Mills
8
8
  - Cody Tanner
9
9
  - Jake Sorce
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-09-08 00:00:00.000000000 Z
13
+ date: 2020-10-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - '>='
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: 4.2.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - '>='
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: 4.2.1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bearcat
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ~>
33
+ - - "~>"
34
34
  - !ruby/object:Gem::Version
35
35
  version: 1.3.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ~>
40
+ - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: 1.3.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: browser
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - '>='
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - '>='
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
57
  - !ruby/object:Gem::Dependency
@@ -72,331 +72,331 @@ dependencies:
72
72
  name: ims-lti
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - ~>
75
+ - - "~>"
76
76
  - !ruby/object:Gem::Version
77
77
  version: 1.2.0
78
- - - <
78
+ - - "<"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '2.0'
81
81
  type: :runtime
82
82
  prerelease: false
83
83
  version_requirements: !ruby/object:Gem::Requirement
84
84
  requirements:
85
- - - ~>
85
+ - - "~>"
86
86
  - !ruby/object:Gem::Version
87
87
  version: 1.2.0
88
- - - <
88
+ - - "<"
89
89
  - !ruby/object:Gem::Version
90
90
  version: '2.0'
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: haml-rails
93
93
  requirement: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  type: :runtime
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: sass-rails
107
107
  requirement: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '3.2'
112
112
  type: :runtime
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '3.2'
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: jquery-rails
121
121
  requirement: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  type: :runtime
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: coffee-rails
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  type: :runtime
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - '>='
144
+ - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  - !ruby/object:Gem::Dependency
148
148
  name: p3p
149
149
  requirement: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - '>='
151
+ - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
154
  type: :runtime
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
- - - '>='
158
+ - - ">="
159
159
  - !ruby/object:Gem::Version
160
160
  version: '0'
161
161
  - !ruby/object:Gem::Dependency
162
162
  name: delayed_job_active_record
163
163
  requirement: !ruby/object:Gem::Requirement
164
164
  requirements:
165
- - - '>='
165
+ - - ">="
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  type: :runtime
169
169
  prerelease: false
170
170
  version_requirements: !ruby/object:Gem::Requirement
171
171
  requirements:
172
- - - '>='
172
+ - - ">="
173
173
  - !ruby/object:Gem::Version
174
174
  version: '0'
175
175
  - !ruby/object:Gem::Dependency
176
176
  name: open_uri_redirections
177
177
  requirement: !ruby/object:Gem::Requirement
178
178
  requirements:
179
- - - '>='
179
+ - - ">="
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
182
  type: :runtime
183
183
  prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
185
  requirements:
186
- - - '>='
186
+ - - ">="
187
187
  - !ruby/object:Gem::Version
188
188
  version: '0'
189
189
  - !ruby/object:Gem::Dependency
190
190
  name: oauth
191
191
  requirement: !ruby/object:Gem::Requirement
192
192
  requirements:
193
- - - ~>
193
+ - - "~>"
194
194
  - !ruby/object:Gem::Version
195
195
  version: 0.5.4
196
196
  type: :runtime
197
197
  prerelease: false
198
198
  version_requirements: !ruby/object:Gem::Requirement
199
199
  requirements:
200
- - - ~>
200
+ - - "~>"
201
201
  - !ruby/object:Gem::Version
202
202
  version: 0.5.4
203
203
  - !ruby/object:Gem::Dependency
204
204
  name: rubyzip
205
205
  requirement: !ruby/object:Gem::Requirement
206
206
  requirements:
207
- - - '>='
207
+ - - ">="
208
208
  - !ruby/object:Gem::Version
209
209
  version: 1.0.0
210
210
  type: :runtime
211
211
  prerelease: false
212
212
  version_requirements: !ruby/object:Gem::Requirement
213
213
  requirements:
214
- - - '>='
214
+ - - ">="
215
215
  - !ruby/object:Gem::Version
216
216
  version: 1.0.0
217
217
  - !ruby/object:Gem::Dependency
218
218
  name: secure_headers
219
219
  requirement: !ruby/object:Gem::Requirement
220
220
  requirements:
221
- - - ~>
221
+ - - "~>"
222
222
  - !ruby/object:Gem::Version
223
223
  version: '6.3'
224
224
  type: :runtime
225
225
  prerelease: false
226
226
  version_requirements: !ruby/object:Gem::Requirement
227
227
  requirements:
228
- - - ~>
228
+ - - "~>"
229
229
  - !ruby/object:Gem::Version
230
230
  version: '6.3'
231
231
  - !ruby/object:Gem::Dependency
232
232
  name: zip-zip
233
233
  requirement: !ruby/object:Gem::Requirement
234
234
  requirements:
235
- - - '>='
235
+ - - ">="
236
236
  - !ruby/object:Gem::Version
237
237
  version: '0'
238
238
  type: :runtime
239
239
  prerelease: false
240
240
  version_requirements: !ruby/object:Gem::Requirement
241
241
  requirements:
242
- - - '>='
242
+ - - ">="
243
243
  - !ruby/object:Gem::Version
244
244
  version: '0'
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: sqlite3
247
247
  requirement: !ruby/object:Gem::Requirement
248
248
  requirements:
249
- - - '>='
249
+ - - ">="
250
250
  - !ruby/object:Gem::Version
251
251
  version: '0'
252
252
  type: :development
253
253
  prerelease: false
254
254
  version_requirements: !ruby/object:Gem::Requirement
255
255
  requirements:
256
- - - '>='
256
+ - - ">="
257
257
  - !ruby/object:Gem::Version
258
258
  version: '0'
259
259
  - !ruby/object:Gem::Dependency
260
260
  name: rspec-rails
261
261
  requirement: !ruby/object:Gem::Requirement
262
262
  requirements:
263
- - - '>='
263
+ - - ">="
264
264
  - !ruby/object:Gem::Version
265
265
  version: '0'
266
266
  type: :development
267
267
  prerelease: false
268
268
  version_requirements: !ruby/object:Gem::Requirement
269
269
  requirements:
270
- - - '>='
270
+ - - ">="
271
271
  - !ruby/object:Gem::Version
272
272
  version: '0'
273
273
  - !ruby/object:Gem::Dependency
274
274
  name: factory_girl_rails
275
275
  requirement: !ruby/object:Gem::Requirement
276
276
  requirements:
277
- - - '>='
277
+ - - ">="
278
278
  - !ruby/object:Gem::Version
279
279
  version: '0'
280
280
  type: :development
281
281
  prerelease: false
282
282
  version_requirements: !ruby/object:Gem::Requirement
283
283
  requirements:
284
- - - '>='
284
+ - - ">="
285
285
  - !ruby/object:Gem::Version
286
286
  version: '0'
287
287
  - !ruby/object:Gem::Dependency
288
288
  name: shoulda-matchers
289
289
  requirement: !ruby/object:Gem::Requirement
290
290
  requirements:
291
- - - '>='
291
+ - - ">="
292
292
  - !ruby/object:Gem::Version
293
293
  version: '0'
294
294
  type: :development
295
295
  prerelease: false
296
296
  version_requirements: !ruby/object:Gem::Requirement
297
297
  requirements:
298
- - - '>='
298
+ - - ">="
299
299
  - !ruby/object:Gem::Version
300
300
  version: '0'
301
301
  - !ruby/object:Gem::Dependency
302
302
  name: nokogiri
303
303
  requirement: !ruby/object:Gem::Requirement
304
304
  requirements:
305
- - - '>='
305
+ - - ">="
306
306
  - !ruby/object:Gem::Version
307
307
  version: '0'
308
308
  type: :development
309
309
  prerelease: false
310
310
  version_requirements: !ruby/object:Gem::Requirement
311
311
  requirements:
312
- - - '>='
312
+ - - ">="
313
313
  - !ruby/object:Gem::Version
314
314
  version: '0'
315
315
  - !ruby/object:Gem::Dependency
316
316
  name: simplecov
317
317
  requirement: !ruby/object:Gem::Requirement
318
318
  requirements:
319
- - - '>='
319
+ - - ">="
320
320
  - !ruby/object:Gem::Version
321
321
  version: '0'
322
322
  type: :development
323
323
  prerelease: false
324
324
  version_requirements: !ruby/object:Gem::Requirement
325
325
  requirements:
326
- - - '>='
326
+ - - ">="
327
327
  - !ruby/object:Gem::Version
328
328
  version: '0'
329
329
  - !ruby/object:Gem::Dependency
330
330
  name: byebug
331
331
  requirement: !ruby/object:Gem::Requirement
332
332
  requirements:
333
- - - '>='
333
+ - - ">="
334
334
  - !ruby/object:Gem::Version
335
335
  version: '0'
336
336
  type: :development
337
337
  prerelease: false
338
338
  version_requirements: !ruby/object:Gem::Requirement
339
339
  requirements:
340
- - - '>='
340
+ - - ">="
341
341
  - !ruby/object:Gem::Version
342
342
  version: '0'
343
343
  - !ruby/object:Gem::Dependency
344
344
  name: pry
345
345
  requirement: !ruby/object:Gem::Requirement
346
346
  requirements:
347
- - - '>='
347
+ - - ">="
348
348
  - !ruby/object:Gem::Version
349
349
  version: '0'
350
350
  type: :development
351
351
  prerelease: false
352
352
  version_requirements: !ruby/object:Gem::Requirement
353
353
  requirements:
354
- - - '>='
354
+ - - ">="
355
355
  - !ruby/object:Gem::Version
356
356
  version: '0'
357
357
  - !ruby/object:Gem::Dependency
358
358
  name: webmock
359
359
  requirement: !ruby/object:Gem::Requirement
360
360
  requirements:
361
- - - '>='
361
+ - - ">="
362
362
  - !ruby/object:Gem::Version
363
363
  version: '0'
364
364
  type: :development
365
365
  prerelease: false
366
366
  version_requirements: !ruby/object:Gem::Requirement
367
367
  requirements:
368
- - - '>='
368
+ - - ">="
369
369
  - !ruby/object:Gem::Version
370
370
  version: '0'
371
371
  - !ruby/object:Gem::Dependency
372
372
  name: lol_dba
373
373
  requirement: !ruby/object:Gem::Requirement
374
374
  requirements:
375
- - - '>='
375
+ - - ">="
376
376
  - !ruby/object:Gem::Version
377
377
  version: '0'
378
378
  type: :development
379
379
  prerelease: false
380
380
  version_requirements: !ruby/object:Gem::Requirement
381
381
  requirements:
382
- - - '>='
382
+ - - ">="
383
383
  - !ruby/object:Gem::Version
384
384
  version: '0'
385
385
  - !ruby/object:Gem::Dependency
386
386
  name: database_cleaner
387
387
  requirement: !ruby/object:Gem::Requirement
388
388
  requirements:
389
- - - '>='
389
+ - - ">="
390
390
  - !ruby/object:Gem::Version
391
391
  version: '0'
392
392
  type: :development
393
393
  prerelease: false
394
394
  version_requirements: !ruby/object:Gem::Requirement
395
395
  requirements:
396
- - - '>='
396
+ - - ">="
397
397
  - !ruby/object:Gem::Version
398
398
  version: '0'
399
- description:
399
+ description:
400
400
  email:
401
401
  - nathanm@instructure.com
402
402
  - ctanner@instructure.com
@@ -405,181 +405,182 @@ executables: []
405
405
  extensions: []
406
406
  extra_rdoc_files: []
407
407
  files:
408
+ - Rakefile
409
+ - app/assets/config/coalescing_panda/manifest.js
410
+ - app/assets/images/bootstrap/glyphicons-halflings-white.png
411
+ - app/assets/images/bootstrap/glyphicons-halflings.png
412
+ - app/assets/javascripts/coalescing_panda/application.js
413
+ - app/assets/javascripts/coalescing_panda/canvas_batch.js.coffee
414
+ - app/assets/javascripts/coalescing_panda/oauth2.js.coffee
415
+ - app/assets/stylesheets/coalescing_panda/application.css.scss
416
+ - app/assets/stylesheets/coalescing_panda/launch.css.scss
417
+ - app/assets/stylesheets/coalescing_panda/progress.css.scss
418
+ - app/controllers/coalescing_panda/application_controller.rb
419
+ - app/controllers/coalescing_panda/canvas_batches_controller.rb
420
+ - app/controllers/coalescing_panda/lti_controller.rb
421
+ - app/controllers/coalescing_panda/oauth2_controller.rb
422
+ - app/helpers/coalescing_panda/canvas_batches_helper.rb
423
+ - app/models/coalescing_panda/assignment.rb
408
424
  - app/models/coalescing_panda/assignment_group.rb
409
- - app/models/coalescing_panda/group_membership.rb
410
- - app/models/coalescing_panda/enrollment.rb
425
+ - app/models/coalescing_panda/canvas_api_auth.rb
411
426
  - app/models/coalescing_panda/canvas_batch.rb
412
- - app/models/coalescing_panda/assignment.rb
427
+ - app/models/coalescing_panda/course.rb
428
+ - app/models/coalescing_panda/enrollment.rb
413
429
  - app/models/coalescing_panda/group.rb
414
- - app/models/coalescing_panda/session.rb
415
- - app/models/coalescing_panda/section.rb
416
- - app/models/coalescing_panda/term.rb
430
+ - app/models/coalescing_panda/group_category.rb
431
+ - app/models/coalescing_panda/group_membership.rb
432
+ - app/models/coalescing_panda/json_with_indifferent_access.rb
433
+ - app/models/coalescing_panda/lti_account.rb
434
+ - app/models/coalescing_panda/lti_nonce.rb
417
435
  - app/models/coalescing_panda/oauth_state.rb
436
+ - app/models/coalescing_panda/persistent_session.rb
437
+ - app/models/coalescing_panda/section.rb
438
+ - app/models/coalescing_panda/session.rb
418
439
  - app/models/coalescing_panda/submission.rb
419
- - app/models/coalescing_panda/canvas_api_auth.rb
440
+ - app/models/coalescing_panda/term.rb
441
+ - app/models/coalescing_panda/user.rb
420
442
  - app/models/coalescing_panda/workers/account_miner.rb
421
- - app/models/coalescing_panda/workers/provisioning_miner.rb
422
443
  - app/models/coalescing_panda/workers/course_miner.rb
423
- - app/models/coalescing_panda/lti_nonce.rb
424
- - app/models/coalescing_panda/course.rb
425
- - app/models/coalescing_panda/persistent_session.rb
426
- - app/models/coalescing_panda/lti_account.rb
427
- - app/models/coalescing_panda/json_with_indifferent_access.rb
428
- - app/models/coalescing_panda/user.rb
429
- - app/models/coalescing_panda/group_category.rb
444
+ - app/models/coalescing_panda/workers/provisioning_miner.rb
430
445
  - app/models/concerns/single_table_polymorphic.rb
431
- - app/controllers/coalescing_panda/oauth2_controller.rb
432
- - app/controllers/coalescing_panda/application_controller.rb
433
- - app/controllers/coalescing_panda/lti_controller.rb
434
- - app/controllers/coalescing_panda/canvas_batches_controller.rb
446
+ - app/views/coalescing_panda/canvas_batches/_canvas_batch.html.haml
447
+ - app/views/coalescing_panda/canvas_batches/_canvas_batch_flash.html.haml
448
+ - app/views/coalescing_panda/launch.html.haml
449
+ - app/views/coalescing_panda/lti/iframe_cookie_fix.html.erb
435
450
  - app/views/coalescing_panda/oauth2/oauth2.html.haml
436
451
  - app/views/coalescing_panda/oauth2/redirect.html.haml
437
- - app/views/coalescing_panda/launch.html.haml
438
452
  - app/views/coalescing_panda/styleguide/styleguide.html
439
- - app/views/coalescing_panda/lti/iframe_cookie_fix.html.erb
440
- - app/views/coalescing_panda/canvas_batches/_canvas_batch.html.haml
441
- - app/views/coalescing_panda/canvas_batches/_canvas_batch_flash.html.haml
442
453
  - app/views/layouts/coalescing_panda/application.html.erb
443
- - app/assets/config/coalescing_panda/manifest.js
444
- - app/assets/images/bootstrap/glyphicons-halflings.png
445
- - app/assets/images/bootstrap/glyphicons-halflings-white.png
446
- - app/assets/javascripts/coalescing_panda/oauth2.js.coffee
447
- - app/assets/javascripts/coalescing_panda/application.js
448
- - app/assets/javascripts/coalescing_panda/canvas_batch.js.coffee
449
- - app/assets/stylesheets/coalescing_panda/progress.css.scss
450
- - app/assets/stylesheets/coalescing_panda/application.css.scss
451
- - app/assets/stylesheets/coalescing_panda/launch.css.scss
452
- - app/helpers/coalescing_panda/canvas_batches_helper.rb
453
454
  - config/routes.rb
454
455
  - config/styleguide.yml
455
- - db/migrate/20141120151432_create_coalescing_panda_sections.rb
456
- - db/migrate/20150602205257_add_option_to_canvas_batches.rb
457
- - db/migrate/20150811140030_add_fields_to_users.rb
456
+ - db/migrate/20131114150001_create_coalescing_panda_canvas_api_auths.rb
458
457
  - db/migrate/20131118211442_create_coalescing_panda_lti_accounts.rb
459
- - db/migrate/20150506192717_add_assignment_group_id_to_assignments.rb
460
- - db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb
458
+ - db/migrate/20131119165343_create_coalescing_panda_lti_nonces.rb
459
+ - db/migrate/20140904223159_create_coalescing_panda_sessions.rb
460
+ - db/migrate/20141119225319_create_coalescing_panda_terms.rb
461
+ - db/migrate/20141119225721_create_coalescing_panda_courses.rb
462
+ - db/migrate/20141120151432_create_coalescing_panda_sections.rb
463
+ - db/migrate/20141120151940_create_coalescing_panda_assignments.rb
464
+ - db/migrate/20141120152458_create_coalescing_panda_users.rb
461
465
  - db/migrate/20141120152546_create_coalescing_panda_submissions.rb
466
+ - db/migrate/20141120153135_create_coalescing_panda_enrollments.rb
467
+ - db/migrate/20141121174846_create_coalescing_panda_canvas_batches.rb
468
+ - db/migrate/20141124160857_create_delayed_jobs.rb
462
469
  - db/migrate/20141208221740_add_submission_types_to_assignments.rb
463
- - db/migrate/20150709192717_add_leader_id_to_groups.rb
470
+ - db/migrate/20150106175418_add_group_category_id_to_assignment.rb
471
+ - db/migrate/20150106180131_add_published_to_assignments.rb
472
+ - db/migrate/20150107205405_create_coalescing_panda_groups.rb
464
473
  - db/migrate/20150107205413_create_coalescing_panda_group_memberships.rb
465
- - db/migrate/20141120152458_create_coalescing_panda_users.rb
466
- - db/migrate/20141121174846_create_coalescing_panda_canvas_batches.rb
467
- - db/migrate/20150708192717_add_group_moderator_to_group_memberships.rb
468
474
  - db/migrate/20150210180516_add_context_to_canvas_batch.rb
469
- - db/migrate/20141120151940_create_coalescing_panda_assignments.rb
470
- - db/migrate/20140904223159_create_coalescing_panda_sessions.rb
471
475
  - db/migrate/20150506183335_create_coalescing_panda_assignment_groups.rb
472
- - db/migrate/20141120153135_create_coalescing_panda_enrollments.rb
473
- - db/migrate/20150107205405_create_coalescing_panda_groups.rb
474
- - db/migrate/20141119225721_create_coalescing_panda_courses.rb
475
- - db/migrate/20200528224505_create_coalescing_panda_persistent_session.rb
476
- - db/migrate/20141124160857_create_delayed_jobs.rb
477
- - db/migrate/20131119165343_create_coalescing_panda_lti_nonces.rb
478
- - db/migrate/20150106180131_add_published_to_assignments.rb
476
+ - db/migrate/20150506192717_add_assignment_group_id_to_assignments.rb
479
477
  - db/migrate/20150526144713_add_account_to_canvas_batches.rb
480
- - db/migrate/20150106175418_add_group_category_id_to_assignment.rb
478
+ - db/migrate/20150602205257_add_option_to_canvas_batches.rb
479
+ - db/migrate/20150708192717_add_group_moderator_to_group_memberships.rb
480
+ - db/migrate/20150709192717_add_leader_id_to_groups.rb
481
481
  - db/migrate/20150714205405_create_coalescing_panda_group_categories.rb
482
+ - db/migrate/20150811140030_add_fields_to_users.rb
482
483
  - db/migrate/20151209155923_add_refresh_settings_to_canvas_api_auth.rb
483
- - db/migrate/20131114150001_create_coalescing_panda_canvas_api_auths.rb
484
- - db/migrate/20141119225319_create_coalescing_panda_terms.rb
485
- - lib/tasks/coalescing_panda_tasks.rake
484
+ - db/migrate/20160830183155_create_coalescing_panda_oauth_states.rb
485
+ - db/migrate/20200528224505_create_coalescing_panda_persistent_session.rb
486
486
  - lib/coalescing_panda.rb
487
- - lib/coalescing_panda/controller_helpers.rb
488
487
  - lib/coalescing_panda/bearcat_uri.rb
489
- - lib/coalescing_panda/misc_helper.rb
488
+ - lib/coalescing_panda/controller_helpers.rb
490
489
  - lib/coalescing_panda/engine.rb
490
+ - lib/coalescing_panda/misc_helper.rb
491
+ - lib/coalescing_panda/route_helpers.rb
491
492
  - lib/coalescing_panda/secure_headers.rb
493
+ - lib/coalescing_panda/session_replacement.rb
492
494
  - lib/coalescing_panda/version.rb
493
- - lib/coalescing_panda/route_helpers.rb
494
- - Rakefile
495
- - spec/spec_helper.rb
496
- - spec/dummy/app/models/account.rb
497
- - spec/dummy/app/models/course.rb
498
- - spec/dummy/app/controllers/application_controller.rb
499
- - spec/dummy/app/views/layouts/application.html.erb
495
+ - lib/tasks/coalescing_panda_tasks.rake
496
+ - spec/controllers/coalescing_panda/canvas_batches_controller_spec.rb
497
+ - spec/controllers/coalescing_panda/lti_controller_spec.rb
498
+ - spec/controllers/coalescing_panda/oauth2_controller_spec.rb
499
+ - spec/dummy/README.rdoc
500
+ - spec/dummy/Rakefile
500
501
  - spec/dummy/app/assets/javascripts/application.js
501
502
  - spec/dummy/app/assets/stylesheets/application.css
503
+ - spec/dummy/app/controllers/application_controller.rb
502
504
  - spec/dummy/app/helpers/application_helper.rb
503
- - spec/dummy/bin/rake
505
+ - spec/dummy/app/models/account.rb
506
+ - spec/dummy/app/models/course.rb
507
+ - spec/dummy/app/views/layouts/application.html.erb
504
508
  - spec/dummy/bin/bundle
505
509
  - spec/dummy/bin/rails
506
- - spec/dummy/config/routes.rb
507
- - spec/dummy/config/locales/en.yml
508
- - spec/dummy/config/environments/production.rb
509
- - spec/dummy/config/environments/development.rb
510
- - spec/dummy/config/environments/test.rb
511
- - spec/dummy/config/environment.rb
510
+ - spec/dummy/bin/rake
511
+ - spec/dummy/config.ru
512
512
  - spec/dummy/config/application.rb
513
- - spec/dummy/config/database.yml
514
513
  - spec/dummy/config/boot.rb
515
- - spec/dummy/config/initializers/lti_initializer.rb
514
+ - spec/dummy/config/database.yml
515
+ - spec/dummy/config/environment.rb
516
+ - spec/dummy/config/environments/development.rb
517
+ - spec/dummy/config/environments/production.rb
518
+ - spec/dummy/config/environments/test.rb
516
519
  - spec/dummy/config/initializers/backtrace_silencers.rb
517
- - spec/dummy/config/initializers/mime_types.rb
518
520
  - spec/dummy/config/initializers/filter_parameter_logging.rb
521
+ - spec/dummy/config/initializers/inflections.rb
522
+ - spec/dummy/config/initializers/lti_initializer.rb
523
+ - spec/dummy/config/initializers/mime_types.rb
524
+ - spec/dummy/config/initializers/secret_token.rb
519
525
  - spec/dummy/config/initializers/session_store.rb
520
526
  - spec/dummy/config/initializers/wrap_parameters.rb
521
- - spec/dummy/config/initializers/secret_token.rb
522
- - spec/dummy/config/initializers/inflections.rb
523
- - spec/dummy/config.ru
524
- - spec/dummy/Rakefile
525
- - spec/dummy/public/favicon.ico
527
+ - spec/dummy/config/locales/en.yml
528
+ - spec/dummy/config/routes.rb
529
+ - spec/dummy/db/schema.rb
530
+ - spec/dummy/public/404.html
526
531
  - spec/dummy/public/422.html
527
532
  - spec/dummy/public/500.html
528
- - spec/dummy/public/404.html
529
- - spec/dummy/db/schema.rb
530
- - spec/dummy/README.rdoc
531
- - spec/models/coalescing_panda/enrollment_spec.rb
532
- - spec/models/coalescing_panda/section_spec.rb
533
- - spec/models/coalescing_panda/lti_nonce_spec.rb
534
- - spec/models/coalescing_panda/lti_account_spec.rb
535
- - spec/models/coalescing_panda/canvas_batch_spec.rb
536
- - spec/models/coalescing_panda/term_spec.rb
537
- - spec/models/coalescing_panda/assignment_spec.rb
538
- - spec/models/coalescing_panda/submission_spec.rb
539
- - spec/models/coalescing_panda/assignment_group_spec.rb
540
- - spec/models/coalescing_panda/group_spec.rb
541
- - spec/models/coalescing_panda/workers/account_miner_spec.rb
542
- - spec/models/coalescing_panda/workers/course_miner_spec.rb
543
- - spec/models/coalescing_panda/canvas_api_auth_spec.rb
544
- - spec/models/coalescing_panda/group_membership_spec.rb
545
- - spec/models/coalescing_panda/user_spec.rb
546
- - spec/models/coalescing_panda/course_spec.rb
547
- - spec/factories/courses.rb
548
- - spec/factories/submissions.rb
533
+ - spec/dummy/public/favicon.ico
534
+ - spec/factories/accounts.rb
549
535
  - spec/factories/assignment_groups.rb
550
536
  - spec/factories/assignments.rb
551
537
  - spec/factories/canvas_api_auths.rb
552
- - spec/factories/enrollments.rb
553
538
  - spec/factories/canvas_batches.rb
539
+ - spec/factories/courses.rb
540
+ - spec/factories/enrollments.rb
554
541
  - spec/factories/sections.rb
555
- - spec/factories/accounts.rb
556
- - spec/factories/users.rb
542
+ - spec/factories/submissions.rb
557
543
  - spec/factories/terms.rb
558
- - spec/controllers/coalescing_panda/canvas_batches_controller_spec.rb
559
- - spec/controllers/coalescing_panda/oauth2_controller_spec.rb
560
- - spec/controllers/coalescing_panda/lti_controller_spec.rb
544
+ - spec/factories/users.rb
545
+ - spec/models/coalescing_panda/assignment_group_spec.rb
546
+ - spec/models/coalescing_panda/assignment_spec.rb
547
+ - spec/models/coalescing_panda/canvas_api_auth_spec.rb
548
+ - spec/models/coalescing_panda/canvas_batch_spec.rb
549
+ - spec/models/coalescing_panda/course_spec.rb
550
+ - spec/models/coalescing_panda/enrollment_spec.rb
551
+ - spec/models/coalescing_panda/group_membership_spec.rb
552
+ - spec/models/coalescing_panda/group_spec.rb
553
+ - spec/models/coalescing_panda/lti_account_spec.rb
554
+ - spec/models/coalescing_panda/lti_nonce_spec.rb
555
+ - spec/models/coalescing_panda/section_spec.rb
556
+ - spec/models/coalescing_panda/submission_spec.rb
557
+ - spec/models/coalescing_panda/term_spec.rb
558
+ - spec/models/coalescing_panda/user_spec.rb
559
+ - spec/models/coalescing_panda/workers/account_miner_spec.rb
560
+ - spec/models/coalescing_panda/workers/course_miner_spec.rb
561
561
  - spec/rails_helper.rb
562
+ - spec/spec_helper.rb
562
563
  homepage: http://www.instructure.com
563
564
  licenses: []
564
565
  metadata: {}
565
- post_install_message:
566
+ post_install_message:
566
567
  rdoc_options: []
567
568
  require_paths:
568
569
  - lib
569
570
  required_ruby_version: !ruby/object:Gem::Requirement
570
571
  requirements:
571
- - - '>='
572
+ - - ">="
572
573
  - !ruby/object:Gem::Version
573
574
  version: '0'
574
575
  required_rubygems_version: !ruby/object:Gem::Requirement
575
576
  requirements:
576
- - - '>='
577
+ - - ">"
577
578
  - !ruby/object:Gem::Version
578
- version: '0'
579
+ version: 1.3.1
579
580
  requirements: []
580
- rubyforge_project:
581
- rubygems_version: 2.0.14
582
- signing_key:
581
+ rubyforge_project:
582
+ rubygems_version: 2.6.14.4
583
+ signing_key:
583
584
  specification_version: 4
584
585
  summary: Canvas LTI and OAUTH2 mountable engine
585
586
  test_files: