panda_pal 5.4.0.beta7 → 5.4.1

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
  SHA256:
3
- metadata.gz: ac49d577cb992331095d1b740e3fb93cf2db47f84cbce2c31a06f9693a8e310f
4
- data.tar.gz: baa5c0e8ce65e510badbc1fbdb11488fd1d642a3d062ef4d6516e52e473fdd64
3
+ metadata.gz: 682c93cece4f79d9c12499c2ef13e31ac9492d1f96640717915c07f1944318de
4
+ data.tar.gz: 782c6bac9411aaa23d0a6d34ac0914e5a241b8b872582acff995bec51f8abfb9
5
5
  SHA512:
6
- metadata.gz: ff14fe4000b3045cda74165143a546b0f1eef774bb04392ad1c1b23913bf31bcee169cd05e9924fe96cd026198399d00c5a83b1badfac7ecf1b50baa5853181a
7
- data.tar.gz: d9bc76487caae1258dc4825345c35fb846d96da1c0d966b375d63c3e964bbe128b1f1ad56cfdca22c9bca1d27b9be58495039b5997f32c4fb5816e78ae1a5b8a
6
+ metadata.gz: '0454692740709dc1be385443d5928631b87a9420a5a7666d7ef97ce18c55ff3776e3c3062ba1dfa2a236b69346b41c6139fa066a852faeb2aa667d0181c37317'
7
+ data.tar.gz: 699eff3766812c8bd3482df79e44a9f198865b2f556a92164496c22bfbfb4fb6e331c061e62467098e1c5ea7a495c591e54c37512944048e9226b3b9af30d083
@@ -4,10 +4,10 @@ module PandaPal::Jobs
4
4
  class GradePassbackFailure < StandardError; end
5
5
 
6
6
  class GradePassbackJob < ActiveJob::Base
7
- sidekiq_options retry: 5
8
-
9
7
  attr_accessor :organization, :opts
10
8
 
9
+ sidekiq_options(retry: 5) if respond_to?(:sidekiq_options)
10
+
11
11
  # Required values for opts: passback_guid, passback_url, score AND/OR total_score.
12
12
  # Possible values for opts: cdata_text, text, url, submitted_at, lti_launch_url.
13
13
  # passback_guid is sent in launch params as 'lis_result_sourcedid'.
@@ -49,6 +49,10 @@ module PandaPal
49
49
  end
50
50
  end
51
51
 
52
+ PandaPal.resolved_extensions_for(self).each do |ext|
53
+ include ext
54
+ end
55
+
52
56
  private
53
57
 
54
58
  def create_schema
data/lib/panda_pal.rb CHANGED
@@ -13,6 +13,7 @@ module PandaPal
13
13
  @@lti_properties = {}
14
14
  @@lti_environments = {}
15
15
  @@lti_custom_params = {}
16
+ @@extensions = {}
16
17
  @@lti_private_key = nil
17
18
 
18
19
  def self.lti_options= lti_options
@@ -70,8 +71,30 @@ module PandaPal
70
71
  @@lti_private_key = k
71
72
  end
72
73
 
74
+ def self.register_extension(type, modul)
75
+ type = normalize_ext_type(type)
76
+ @@extensions[type] ||= []
77
+ @@extensions[type] << modul.to_s
78
+ end
79
+
80
+ def self.extensions_for(type)
81
+ (@@extensions[normalize_ext_type(type)] || []).uniq
82
+ end
83
+
84
+ def self.resolved_extensions_for(type)
85
+ extensions_for(type).map do |ext|
86
+ ext.safe_constantize
87
+ end.compact
88
+ end
89
+
73
90
  private
74
91
 
92
+ def self.normalize_ext_type(type)
93
+ type = type.to_s
94
+ type = "#{self.to_s}::#{type}" unless type.starts_with?('::') || type.starts_with?(self.to_s)
95
+ type
96
+ end
97
+
75
98
  def self.validate_pandapal_config!
76
99
  errors = []
77
100
  validate_lti_navigation(errors)
@@ -89,3 +112,5 @@ module PandaPal
89
112
  errors
90
113
  end
91
114
  end
115
+
116
+ PandaPal.register_extension 'Organization', '::OrganizationExtension'
@@ -43,6 +43,10 @@ module PandaPal
43
43
  ActiveSupport.on_load(:active_record) do
44
44
  if defined?(Sidekiq) && Sidekiq.server? && PandaPal::Organization.respond_to?(:sync_schedules)
45
45
  PandaPal::Organization.sync_schedules
46
+
47
+ ActiveSupport::Reloader.to_prepare do
48
+ PandaPal::Organization.sync_schedules
49
+ end
46
50
  end
47
51
  end
48
52
  end
@@ -5,8 +5,11 @@ module PandaPal::Helpers
5
5
  extend ActiveSupport::Concern
6
6
 
7
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
8
+ # ActionController::API does not use views, so helper_method would not be defined
9
+ unless name == "ActionController::API"
10
+ helper_method :link_nonce, :current_session, :current_session_data
11
+ helper_method :link_with_session_to, :url_with_session, :session_url_for
12
+ end
10
13
 
11
14
  prepend_around_action :monkeypatch_flash
12
15
  prepend_around_action :auto_save_session
@@ -1,3 +1,3 @@
1
1
  module PandaPal
2
- VERSION = "5.4.0.beta7"
2
+ VERSION = "5.4.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: panda_pal
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0.beta7
4
+ version: 5.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure ProServe
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-14 00:00:00.000000000 Z
11
+ date: 2021-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -198,7 +198,7 @@ dependencies:
198
198
  - - ">="
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0'
201
- description:
201
+ description:
202
202
  email:
203
203
  - pseng@instructure.com
204
204
  executables: []
@@ -218,10 +218,10 @@ files:
218
218
  - app/controllers/panda_pal/lti_v1_p0_controller.rb
219
219
  - app/controllers/panda_pal/lti_v1_p3_controller.rb
220
220
  - app/helpers/panda_pal/application_helper.rb
221
+ - app/jobs/panda_pal/jobs/grade_passback_job.rb
221
222
  - app/lib/lti_xml/base_platform.rb
222
223
  - app/lib/lti_xml/bridge_platform.rb
223
224
  - app/lib/lti_xml/canvas_platform.rb
224
- - app/lib/panda_pal/batch_processor.rb
225
225
  - app/lib/panda_pal/launch_url_helpers.rb
226
226
  - app/lib/panda_pal/lti_jwt_validator.rb
227
227
  - app/lib/panda_pal/misc_helper.rb
@@ -244,14 +244,12 @@ files:
244
244
  - db/migrate/20171205183457_encrypt_organization_settings.rb
245
245
  - db/migrate/20171205194657_remove_old_organization_settings.rb
246
246
  - lib/panda_pal.rb
247
- - lib/panda_pal/ability_mixin.rb
248
247
  - lib/panda_pal/engine.rb
249
248
  - lib/panda_pal/helpers.rb
250
249
  - lib/panda_pal/helpers/controller_helper.rb
251
250
  - lib/panda_pal/helpers/route_helper.rb
252
251
  - lib/panda_pal/helpers/secure_headers.rb
253
252
  - lib/panda_pal/helpers/session_replacement.rb
254
- - lib/panda_pal/jobs/grade_passback_job.rb
255
253
  - lib/panda_pal/plugins.rb
256
254
  - lib/panda_pal/version.rb
257
255
  - lib/tasks/panda_pal_tasks.rake
@@ -286,8 +284,6 @@ files:
286
284
  - spec/dummy/config/routes.rb
287
285
  - spec/dummy/config/secrets.yml
288
286
  - spec/dummy/db/schema.rb
289
- - spec/dummy/log/development.log
290
- - spec/dummy/log/test.log
291
287
  - spec/dummy/public/404.html
292
288
  - spec/dummy/public/422.html
293
289
  - spec/dummy/public/500.html
@@ -304,7 +300,7 @@ homepage: http://instructure.com
304
300
  licenses:
305
301
  - MIT
306
302
  metadata: {}
307
- post_install_message:
303
+ post_install_message:
308
304
  rdoc_options: []
309
305
  require_paths:
310
306
  - lib
@@ -315,56 +311,54 @@ required_ruby_version: !ruby/object:Gem::Requirement
315
311
  version: '0'
316
312
  required_rubygems_version: !ruby/object:Gem::Requirement
317
313
  requirements:
318
- - - ">"
314
+ - - ">="
319
315
  - !ruby/object:Gem::Version
320
- version: 1.3.1
316
+ version: '0'
321
317
  requirements: []
322
- rubygems_version: 3.0.3
323
- signing_key:
318
+ rubygems_version: 3.2.15
319
+ signing_key:
324
320
  specification_version: 4
325
321
  summary: LTI mountable engine
326
322
  test_files:
327
- - spec/spec_helper.rb
328
- - spec/dummy/app/controllers/application_controller.rb
329
- - spec/dummy/app/views/layouts/application.html.erb
323
+ - spec/dummy/README.rdoc
324
+ - spec/dummy/Rakefile
330
325
  - spec/dummy/app/assets/javascripts/application.js
331
326
  - spec/dummy/app/assets/stylesheets/application.css
327
+ - spec/dummy/app/controllers/application_controller.rb
332
328
  - spec/dummy/app/helpers/application_helper.rb
333
- - spec/dummy/bin/rake
334
- - spec/dummy/bin/setup
329
+ - spec/dummy/app/views/layouts/application.html.erb
335
330
  - spec/dummy/bin/bundle
336
331
  - spec/dummy/bin/rails
337
- - spec/dummy/config/secrets.yml
338
- - spec/dummy/config/routes.rb
339
- - spec/dummy/config/locales/en.yml
340
- - spec/dummy/config/environments/production.rb
341
- - spec/dummy/config/environments/development.rb
342
- - spec/dummy/config/environments/test.rb
343
- - spec/dummy/config/environment.rb
332
+ - spec/dummy/bin/rake
333
+ - spec/dummy/bin/setup
344
334
  - spec/dummy/config/application.rb
345
- - spec/dummy/config/database.yml
346
335
  - spec/dummy/config/boot.rb
336
+ - spec/dummy/config/database.yml
337
+ - spec/dummy/config/environment.rb
338
+ - spec/dummy/config/environments/development.rb
339
+ - spec/dummy/config/environments/production.rb
340
+ - spec/dummy/config/environments/test.rb
347
341
  - spec/dummy/config/initializers/backtrace_silencers.rb
348
- - spec/dummy/config/initializers/mime_types.rb
342
+ - spec/dummy/config/initializers/cookies_serializer.rb
349
343
  - spec/dummy/config/initializers/filter_parameter_logging.rb
344
+ - spec/dummy/config/initializers/inflections.rb
345
+ - spec/dummy/config/initializers/mime_types.rb
350
346
  - spec/dummy/config/initializers/session_store.rb
351
347
  - spec/dummy/config/initializers/wrap_parameters.rb
352
- - spec/dummy/config/initializers/cookies_serializer.rb
353
- - spec/dummy/config/initializers/inflections.rb
348
+ - spec/dummy/config/locales/en.yml
349
+ - spec/dummy/config/routes.rb
350
+ - spec/dummy/config/secrets.yml
354
351
  - spec/dummy/config.ru
355
- - spec/dummy/Rakefile
356
- - spec/dummy/public/favicon.ico
352
+ - spec/dummy/db/schema.rb
353
+ - spec/dummy/public/404.html
357
354
  - spec/dummy/public/422.html
358
355
  - spec/dummy/public/500.html
359
- - spec/dummy/public/404.html
360
- - spec/dummy/db/schema.rb
361
- - spec/dummy/log/test.log
362
- - spec/dummy/log/development.log
363
- - spec/dummy/README.rdoc
356
+ - spec/dummy/public/favicon.ico
357
+ - spec/factories/panda_pal_organizations.rb
358
+ - spec/factories/panda_pal_sessions.rb
364
359
  - spec/models/panda_pal/organization/settings_validation_spec.rb
365
360
  - spec/models/panda_pal/organization/task_scheduling_spec.rb
366
- - spec/models/panda_pal/session_spec.rb
367
361
  - spec/models/panda_pal/organization_spec.rb
368
- - spec/factories/panda_pal_sessions.rb
369
- - spec/factories/panda_pal_organizations.rb
362
+ - spec/models/panda_pal/session_spec.rb
370
363
  - spec/rails_helper.rb
364
+ - spec/spec_helper.rb
@@ -1,41 +0,0 @@
1
- module PandaPal
2
- # An array that "processes" after so many items are added.
3
- #
4
- # Example Usage:
5
- # batches = BatchProcessor.new(of: 1000) do |batch|
6
- # # Process the batch somehow
7
- # end
8
- # enumerator_of_some_kind.each { |item| batches << item }
9
- # batches.flush
10
- class BatchProcessor
11
- attr_reader :batch_size
12
-
13
- def initialize(of: 1000, &blk)
14
- @batch_size = of
15
- @block = blk
16
- @current_batch = []
17
- end
18
-
19
- def <<(item)
20
- @current_batch << item
21
- process_batch if @current_batch.count >= batch_size
22
- end
23
-
24
- def add_all(items)
25
- items.each do |i|
26
- self << i
27
- end
28
- end
29
-
30
- def flush
31
- process_batch if @current_batch.present?
32
- end
33
-
34
- protected
35
-
36
- def process_batch
37
- @block.call(@current_batch)
38
- @current_batch = []
39
- end
40
- end
41
- end
@@ -1,85 +0,0 @@
1
- module PandaPal
2
- module AbilityMixin
3
- extend ActiveSupport::Concern
4
-
5
- class_methods do
6
- def self.role_permissions(labels)
7
- roles = find_roles_by_label(labels)
8
-
9
- if Rails.env.test? && roles.count == 0 && (labels || []).include?('Administrator')
10
- return Hash.new(true)
11
- end
12
-
13
- final = {}
14
- roles.find_each do |role|
15
- role.permissions.each do |perm_name, perm|
16
- final[perm_name] = false if final[perm_name].nil?
17
- final[perm_name] = true if perm['enabled'] == true
18
- end
19
- end
20
- final
21
- end
22
-
23
- def self.find_roles_by_label(labels)
24
- raise "PandaPal AbilityMixin's support for Roles and Permissions requires that Roles be synced by CanvasSync" unless defined?(Role)
25
-
26
- built_ins = []
27
- labels = labels.split(',') if labels.is_a?(String)
28
- custom_labels = Array(labels).reject do |l|
29
- if role_is_default?(l)
30
- built_ins << l
31
- elsif l == 'Account Admin'
32
- built_ins << 'AccountMembership'
33
- else
34
- next
35
- end
36
- true
37
- end
38
- Role.where(workflow_state: 'built_in', base_role_type: built_ins)
39
- .or(Role.where.not(workflow_state: 'built_in').where(label: custom_labels))
40
- end
41
-
42
- def self.role_is_default?(role)
43
- %w[TeacherEnrollment TaEnrollment StudentEnrollment DesignerEnrollment ObserverEnrollment].include? role
44
- end
45
- end
46
-
47
- def is_lti_launch?
48
- @controller.current_session.present?
49
- end
50
-
51
- def panda_pal_session
52
- @panda_pal_session ||= @controller.current_session&.data || {}
53
- end
54
-
55
- def rails_session
56
- @rails_session ||= @controller.session
57
- end
58
-
59
- def launch_params
60
- @launch_params ||= panda_pal_session[:launch_params] || {}
61
- end
62
-
63
- # Roles and Permissions
64
- def lti_roles
65
- @lti_roles ||= LTIRoles::RoleManager.new(launch_params['ext_roles'] || '')
66
- end
67
-
68
- def canvas_permissions
69
- panda_pal_session[:canvas_permissions] ||= self.class.role_permissions(launch_params['custom_canvas_role'])
70
- end
71
-
72
- def canvas_role_labels
73
- labels = launch_params['custom_canvas_role']
74
- labels.is_a?(String) ? labels.split(',') : []
75
- end
76
-
77
- def canvas_roles
78
- self.class.find_roles_by_label(canvas_role_labels)
79
- end
80
-
81
- def launch_role_ids
82
- panda_pal_session[:launch_role_ids] ||= canvas_roles.map(&:canvas_id)
83
- end
84
- end
85
- end
@@ -1,56 +0,0 @@
1
-  (1.2ms) DROP DATABASE IF EXISTS "panda_pal_development"
2
-  (0.2ms) DROP DATABASE IF EXISTS "panda_pal_test"
3
-  (82.9ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
4
-  (11.8ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
5
-  (0.3ms) SELECT pg_try_advisory_lock(7878782013693407355);
6
-  (2.8ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
7
- ActiveRecord::InternalMetadata Load (2.2ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]]
8
-  (0.2ms) BEGIN
9
- SQL (3.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "key" [["key", "environment"], ["value", "development"], ["created_at", "2020-04-30 16:44:35.134620"], ["updated_at", "2020-04-30 16:44:35.134620"]]
10
-  (0.6ms) COMMIT
11
-  (0.3ms) SELECT pg_advisory_unlock(7878782013693407355)
12
-  (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
13
-  (0.5ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
14
-  (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
15
-  (211.6ms) DROP DATABASE IF EXISTS "panda_pal_development"
16
-  (247.6ms) DROP DATABASE IF EXISTS "panda_pal_test"
17
- SQL (0.4ms) CREATE EXTENSION IF NOT EXISTS "plpgsql"
18
-  (8.5ms) DROP TABLE IF EXISTS "panda_pal_organizations" CASCADE
19
-  (14.4ms) CREATE TABLE "panda_pal_organizations" ("id" bigserial primary key, "name" character varying, "key" character varying, "secret" character varying, "canvas_account_id" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, "salesforce_id" character varying, "encrypted_settings" text, "encrypted_settings_iv" character varying)
20
-  (2.5ms) CREATE UNIQUE INDEX "index_panda_pal_organizations_on_key" ON "panda_pal_organizations" ("key")
21
-  (2.6ms) CREATE UNIQUE INDEX "index_panda_pal_organizations_on_name" ON "panda_pal_organizations" ("name")
22
-  (0.2ms) DROP TABLE IF EXISTS "panda_pal_sessions" CASCADE
23
-  (6.5ms) CREATE TABLE "panda_pal_sessions" ("id" bigserial primary key, "session_key" character varying, "data" text, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, "panda_pal_organization_id" integer)
24
-  (1.9ms) CREATE INDEX "index_panda_pal_sessions_on_panda_pal_organization_id" ON "panda_pal_sessions" ("panda_pal_organization_id")
25
-  (2.5ms) CREATE UNIQUE INDEX "index_panda_pal_sessions_on_session_key" ON "panda_pal_sessions" ("session_key")
26
-  (3.5ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
27
-  (1.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
28
-  (0.6ms) INSERT INTO "schema_migrations" (version) VALUES (20171205194657)
29
-  (47.2ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
30
- ActiveRecord::InternalMetadata Load (1.0ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]]
31
-  (0.4ms) BEGIN
32
- SQL (0.4ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "key" [["key", "environment"], ["value", "development"], ["created_at", "2020-04-30 17:00:14.956327"], ["updated_at", "2020-04-30 17:00:14.956327"]]
33
-  (0.5ms) COMMIT
34
- ActiveRecord::InternalMetadata Load (0.2ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]]
35
-  (0.1ms) BEGIN
36
-  (0.2ms) COMMIT
37
- SQL (0.4ms) CREATE EXTENSION IF NOT EXISTS "plpgsql"
38
-  (0.3ms) DROP TABLE IF EXISTS "panda_pal_organizations" CASCADE
39
-  (52.5ms) CREATE TABLE "panda_pal_organizations" ("id" bigserial primary key, "name" character varying, "key" character varying, "secret" character varying, "canvas_account_id" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, "salesforce_id" character varying, "encrypted_settings" text, "encrypted_settings_iv" character varying)
40
-  (2.4ms) CREATE UNIQUE INDEX "index_panda_pal_organizations_on_key" ON "panda_pal_organizations" ("key")
41
-  (1.9ms) CREATE UNIQUE INDEX "index_panda_pal_organizations_on_name" ON "panda_pal_organizations" ("name")
42
-  (0.2ms) DROP TABLE IF EXISTS "panda_pal_sessions" CASCADE
43
-  (6.0ms) CREATE TABLE "panda_pal_sessions" ("id" bigserial primary key, "session_key" character varying, "data" text, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, "panda_pal_organization_id" integer)
44
-  (1.8ms) CREATE INDEX "index_panda_pal_sessions_on_panda_pal_organization_id" ON "panda_pal_sessions" ("panda_pal_organization_id")
45
-  (1.8ms) CREATE UNIQUE INDEX "index_panda_pal_sessions_on_session_key" ON "panda_pal_sessions" ("session_key")
46
-  (4.8ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
47
-  (0.9ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
48
-  (4.0ms) INSERT INTO "schema_migrations" (version) VALUES (20171205194657)
49
-  (6.5ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)
50
- ActiveRecord::InternalMetadata Load (2.5ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]]
51
-  (0.1ms) BEGIN
52
- SQL (5.0ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "key" [["key", "environment"], ["value", "development"], ["created_at", "2020-04-30 17:00:15.126316"], ["updated_at", "2020-04-30 17:00:15.126316"]]
53
-  (0.4ms) COMMIT
54
- ActiveRecord::InternalMetadata Load (0.2ms) SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2 [["key", "environment"], ["LIMIT", 1]]
55
-  (0.2ms) BEGIN
56
-  (0.1ms) COMMIT