integration_pal 0.1.0 → 0.1.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 +4 -4
- data/config/initializers/jobs.rb +6 -4
- data/lib/canvas/client.rb +24 -0
- data/lib/canvas/models/account.rb +11 -0
- data/lib/canvas/models/base_model.rb +22 -0
- data/lib/canvas/models/course.rb +11 -0
- data/lib/canvas/models/enrollment.rb +17 -0
- data/lib/canvas/models/file.rb +7 -0
- data/lib/canvas/models/folder.rb +7 -0
- data/lib/canvas/models/group.rb +11 -0
- data/lib/canvas/models/group_membership.rb +11 -0
- data/lib/canvas/models/section.rb +11 -0
- data/lib/canvas/models/term.rb +11 -0
- data/lib/canvas/models/user.rb +11 -0
- data/lib/canvas/models/user_observer.rb +11 -0
- data/lib/canvas/models/x_list.rb +11 -0
- data/lib/canvas/utils/csv.rb +38 -0
- data/lib/canvas/utils/sis.rb +71 -0
- data/lib/integration_pal/engine.rb +1 -0
- data/lib/integration_pal/version.rb +1 -1
- metadata +32 -6
- data/spec/dummy/log/development.log +0 -38
- data/spec/dummy/log/test.log +0 -7232
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 280b4edff89cc46a952f3f285598cd653e30302e
|
4
|
+
data.tar.gz: b901792e8bd9b9c4b0a15f00ed417b63f37ef22c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0af7e88b02c0ff73a2b14bf00b49613a056d600e95d9e0c574e5657685f62b7d30a4f5526c2abd0a5c6b7e563534bfaf4d1a9330b71a251cf95320272542c4ce
|
7
|
+
data.tar.gz: 8ba3b65e035a8b837c8280a39fa3fe12037d79a92468e5ec4e5c3af15b1755e4f6c24bd7cc2389b3d1a14ef909388af68240caf0f1dc16ab93c0cd1b73704aa7
|
data/config/initializers/jobs.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
jobs = Dir.glob("#{Rails.root}/app/jobs
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
jobs = Dir.glob("#{Rails.root}/app/jobs/**/*.rb")
|
2
|
+
jobs = jobs.map{ |job| job.gsub("#{Rails.root}/app/jobs/", '') }
|
3
|
+
jobs = jobs.map{ |job| job.gsub(".rb", '') }
|
4
|
+
jobs = jobs.map{ |job| job.split("/").map{ |j| j.camelcase }.join('::') }
|
5
|
+
jobs.delete('ApplicationJob')
|
6
|
+
JOB_TYPES = jobs
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'httmultiparty'
|
2
|
+
|
3
|
+
module Canvas
|
4
|
+
class Client
|
5
|
+
include ::HTTMultiParty
|
6
|
+
|
7
|
+
attr_accessor :token, :canvas_url
|
8
|
+
|
9
|
+
def initialize(canvas_url, token)
|
10
|
+
self.class.base_uri(canvas_url)
|
11
|
+
@canvas_url = canvas_url
|
12
|
+
@token = token
|
13
|
+
end
|
14
|
+
|
15
|
+
def post_sis_zip_to_canvas(account_id, *params)
|
16
|
+
path = "/api/v1/accounts/#{account_id}/sis_imports"
|
17
|
+
params_hash = params.first
|
18
|
+
query = {attachment: File.open(params_hash.delete(:attachment))}
|
19
|
+
query.merge!(params_hash)
|
20
|
+
self.class.post(path, query: query, headers: {'Authorization' => "Bearer #{token}", 'Content-Type' => 'application/zip'})
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Account < BaseModel
|
3
|
+
validates :sis_id, :name, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :sis_id, :parent_sis_id, :name, :status
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class BaseModel
|
3
|
+
include ::ActiveModel::Validations
|
4
|
+
include ::ActiveModel::Serialization
|
5
|
+
|
6
|
+
def initialize(attributes = {})
|
7
|
+
attributes.each do |name, value|
|
8
|
+
send("#{name}=", value)
|
9
|
+
end
|
10
|
+
|
11
|
+
after_initialize
|
12
|
+
end
|
13
|
+
|
14
|
+
def after_initialize
|
15
|
+
# this method should be overwritten in subclass
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
to_json == other.to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Course < BaseModel
|
3
|
+
validates :sis_id, :short_name, :long_name, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted completed)}
|
5
|
+
attr_accessor :sis_id, :account_sis_id, :term_sis_id, :short_name, :long_name, :status, :start_date, :end_date
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Enrollment < BaseModel
|
3
|
+
validates :user_sis_id, :role, presence: true
|
4
|
+
validates :role, inclusion: {in: ['student', 'teacher', 'ta', 'observer', 'designer', 'Pending Orientation']}
|
5
|
+
validates :status, inclusion: {in: %w(active deleted completed)}
|
6
|
+
validate :course_or_section
|
7
|
+
attr_accessor :course_sis_id, :user_sis_id, :role, :section_sis_id, :status, :associated_user_sis_id
|
8
|
+
|
9
|
+
def course_or_section
|
10
|
+
errors.add(:id, 'An enrollment must have either a course_id or a section_id') unless @course_sis_id || @section_sis_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def after_initialize
|
14
|
+
self.status ||= 'active'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Folder < BaseModel
|
3
|
+
attr_accessor :context_type, :context_id, :files_count, :position, :updated_at, :folders_url, :files_url,
|
4
|
+
:full_name, :lock_at, :id, :folders_count, :name, :parent_folder_id, :created_at, :unlock_at,
|
5
|
+
:hidden, :hidden_for_user, :locked, :locked_for_user
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Group < BaseModel
|
3
|
+
validates :sis_id, :name, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(available closed completed deleted)}
|
5
|
+
attr_accessor :sis_id, :account_sis_id, :name, :status
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'available'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class GroupMembership < BaseModel
|
3
|
+
validates :user_sis_id, :group_sis_id, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(accepted deleted)}
|
5
|
+
attr_accessor :group_sis_id, :user_sis_id, :status
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'accepted'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Section < BaseModel
|
3
|
+
validates :sis_id, :course_sis_id, :name, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :sis_id, :course_sis_id, :account_sis_id, :name, :status, :start_date, :end_date
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class Term < BaseModel
|
3
|
+
validates :sis_id, :name, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :sis_id, :name, :status, :start_date, :end_date
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class User < BaseModel
|
3
|
+
validates :sis_id, :login_id, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :sis_id, :login_id, :password, :first_name, :last_name, :email, :status, :avatar_url
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class UserObserver < BaseModel
|
3
|
+
validates :observer_id, :student_id, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :observer_id, :student_id, :status
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Canvas::Models
|
2
|
+
class XList < BaseModel
|
3
|
+
validates :section_sis_id, :xlist_course_sis_id, presence: true
|
4
|
+
validates :status, inclusion: {in: %w(active deleted)}
|
5
|
+
attr_accessor :xlist_course_sis_id, :section_sis_id, :status
|
6
|
+
|
7
|
+
def after_initialize
|
8
|
+
self.status ||= 'active'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
module Canvas::Utils
|
4
|
+
class Csv
|
5
|
+
|
6
|
+
def self.hash_csv(csv_string)
|
7
|
+
CSV.parse(csv_string, {:headers => true, :return_headers => false, :header_converters => :symbol} )
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.hash_csv_file(file_path)
|
11
|
+
CSV.read(file_path, {:headers => true, :return_headers => false, :header_converters => :symbol} )
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create_csv(models, headers)
|
15
|
+
CSV.generate do |csv|
|
16
|
+
csv << headers.map do |header|
|
17
|
+
header.instance_of?(Hash) ? header.values.first.to_s : header.to_s
|
18
|
+
end
|
19
|
+
models.each do |model|
|
20
|
+
csv << headers.map do |header|
|
21
|
+
const = header.instance_of?(Hash) ? header.keys.first : header
|
22
|
+
model.respond_to?(const) ? model.send(const) : nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.unzip_csv(zip)
|
29
|
+
{}.tap do |h|
|
30
|
+
Zip::InputStream.open(StringIO.new(zip)) do |archive|
|
31
|
+
while entry = archive.get_next_entry
|
32
|
+
h[entry.name] = self.hash_csv(archive.read)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'zip'
|
2
|
+
|
3
|
+
module Canvas::Utils
|
4
|
+
class Sis
|
5
|
+
class << self
|
6
|
+
Headers = {
|
7
|
+
user: [{sis_id: 'user_id'}, :login_id, :password, :first_name, :last_name, :email, :status],
|
8
|
+
account: [{sis_id: 'account_id'}, {parent_sis_id: 'parent_account_id'}, :name, :status],
|
9
|
+
term: [{sis_id: 'term_id'}, :name, :status, :start_date, :end_date],
|
10
|
+
course: [{sis_id: 'course_id'}, :short_name, :long_name, {account_sis_id: 'account_id'}, {term_sis_id: 'term_id'}, :status, :start_date, :end_date],
|
11
|
+
section: [{sis_id: 'section_id'}, {course_sis_id: 'course_id'}, :name, :status, :start_date, :end_date, {account_sis_id: 'account_id'}],
|
12
|
+
enrollment: [{course_sis_id: 'course_id'}, {user_sis_id: 'user_id'}, :role, {section_sis_id: 'section_id'}, :status, {associated_user_sis_id: 'associated_user_id'}],
|
13
|
+
group: [{sis_id: 'group_id'}, {account_sis_id: 'account_id'}, :name, :status],
|
14
|
+
group_membership: [{group_sis_id: 'group_id'}, {user_sis_id: 'user_id'}, :status],
|
15
|
+
xlist: [{xlist_course_sis_id: 'xlist_course_id'}, {section_sis_id: 'section_id'}, :status],
|
16
|
+
user_observer: [:observer_id, :student_id, :status]
|
17
|
+
}
|
18
|
+
|
19
|
+
def create_csv(type, models)
|
20
|
+
Canvas::Utils::Csv.create_csv(models, Headers[type.to_sym])
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_zip(filename, *models)
|
24
|
+
Zip::OutputStream.open(filename) {|zip| generate_zip_data zip, models }
|
25
|
+
end
|
26
|
+
|
27
|
+
def zip_string(*models)
|
28
|
+
stringIO = Zip::ZipOutputStream::write_buffer {|zip| generate_zip_data zip, models }
|
29
|
+
stringIO.rewind
|
30
|
+
stringIO.string.bytes.to_a.pack("C*")
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_zip_data(zip, models)
|
34
|
+
map_data(models).each do |key, value|
|
35
|
+
zip.put_next_entry("#{key}s.csv")
|
36
|
+
zip.write create_csv(key, value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def map_data(data)
|
41
|
+
models = {}
|
42
|
+
data.flatten.each do |model|
|
43
|
+
case model
|
44
|
+
when Canvas::Models::Account
|
45
|
+
(models[:account] ||= []) << model
|
46
|
+
when Canvas::Models::Course
|
47
|
+
(models[:course] ||= []) << model
|
48
|
+
when Canvas::Models::Enrollment
|
49
|
+
(models[:enrollment] ||= []) << model
|
50
|
+
when Canvas::Models::Group
|
51
|
+
(models[:group] ||= []) << model
|
52
|
+
when Canvas::Models::GroupMembership
|
53
|
+
(models[:group_membership] ||= []) << model
|
54
|
+
when Canvas::Models::Section
|
55
|
+
(models[:section] ||= []) << model
|
56
|
+
when Canvas::Models::Term
|
57
|
+
(models[:term] ||= []) << model
|
58
|
+
when Canvas::Models::User
|
59
|
+
(models[:user] ||= []) << model
|
60
|
+
when Canvas::Models::XList
|
61
|
+
(models[:xlist] ||= []) << model
|
62
|
+
when Canvas::Models::UserObserver
|
63
|
+
(models[:user_observer] ||= []) << model
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return models
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: integration_pal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Tanner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 2.5.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: httmultiparty
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.16
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.3.16
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: pg
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +206,22 @@ files:
|
|
192
206
|
- config/routes.rb
|
193
207
|
- db/migrate/20170524203831_create_integration_pal_workers.rb
|
194
208
|
- db/migrate/20170525153603_create_integration_pal_jobs.rb
|
209
|
+
- lib/canvas/client.rb
|
210
|
+
- lib/canvas/models/account.rb
|
211
|
+
- lib/canvas/models/base_model.rb
|
212
|
+
- lib/canvas/models/course.rb
|
213
|
+
- lib/canvas/models/enrollment.rb
|
214
|
+
- lib/canvas/models/file.rb
|
215
|
+
- lib/canvas/models/folder.rb
|
216
|
+
- lib/canvas/models/group.rb
|
217
|
+
- lib/canvas/models/group_membership.rb
|
218
|
+
- lib/canvas/models/section.rb
|
219
|
+
- lib/canvas/models/term.rb
|
220
|
+
- lib/canvas/models/user.rb
|
221
|
+
- lib/canvas/models/user_observer.rb
|
222
|
+
- lib/canvas/models/x_list.rb
|
223
|
+
- lib/canvas/utils/csv.rb
|
224
|
+
- lib/canvas/utils/sis.rb
|
195
225
|
- lib/integration_pal.rb
|
196
226
|
- lib/integration_pal/engine.rb
|
197
227
|
- lib/integration_pal/version.rb
|
@@ -244,8 +274,6 @@ files:
|
|
244
274
|
- spec/dummy/config/secrets.yml
|
245
275
|
- spec/dummy/config/spring.rb
|
246
276
|
- spec/dummy/db/schema.rb
|
247
|
-
- spec/dummy/log/development.log
|
248
|
-
- spec/dummy/log/test.log
|
249
277
|
- spec/dummy/package.json
|
250
278
|
- spec/dummy/public/404.html
|
251
279
|
- spec/dummy/public/422.html
|
@@ -331,8 +359,6 @@ test_files:
|
|
331
359
|
- spec/dummy/config/spring.rb
|
332
360
|
- spec/dummy/config.ru
|
333
361
|
- spec/dummy/db/schema.rb
|
334
|
-
- spec/dummy/log/development.log
|
335
|
-
- spec/dummy/log/test.log
|
336
362
|
- spec/dummy/package.json
|
337
363
|
- spec/dummy/public/404.html
|
338
364
|
- spec/dummy/public/422.html
|
@@ -1,38 +0,0 @@
|
|
1
|
-
[1m[35m (21.9ms)[0m [1m[35mCREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)[0m
|
2
|
-
[1m[35m (4.3ms)[0m [1m[35mCREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)[0m
|
3
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_try_advisory_lock(3791006887383934680);[0m
|
4
|
-
[1m[35m (1.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
5
|
-
Migrating to CreateIntegrationPalWorkers (20170524203831)
|
6
|
-
[1m[35m (0.1ms)[0m [1m[35mBEGIN[0m
|
7
|
-
[1m[35m (5.0ms)[0m [1m[35mCREATE TABLE "integration_pal_workers" ("id" bigserial primary key, "name" character varying, "access_id" character varying, "secret_key" character varying, "job_type" character varying, "encrypted_settings" text, "encrypted_settings_iv" character varying, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)[0m
|
8
|
-
[1m[35mSQL (0.3ms)[0m [1m[32mINSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "version"[0m [["version", "20170524203831"]]
|
9
|
-
[1m[35m (0.4ms)[0m [1m[35mCOMMIT[0m
|
10
|
-
Migrating to CreateIntegrationPalJobs (20170525153603)
|
11
|
-
[1m[35m (0.2ms)[0m [1m[35mBEGIN[0m
|
12
|
-
[1m[35m (6.3ms)[0m [1m[35mCREATE TABLE "integration_pal_jobs" ("id" bigserial primary key, "job_params" text, "status" character varying, "started_at" timestamp, "finished_at" timestamp, "progress" character varying, "worker_id" integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL)[0m
|
13
|
-
[1m[35mSQL (0.4ms)[0m [1m[32mINSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "version"[0m [["version", "20170525153603"]]
|
14
|
-
[1m[35m (0.5ms)[0m [1m[35mCOMMIT[0m
|
15
|
-
[1m[36mActiveRecord::InternalMetadata Load (1.9ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2[0m [["key", "environment"], ["LIMIT", 1]]
|
16
|
-
[1m[35m (0.2ms)[0m [1m[35mBEGIN[0m
|
17
|
-
[1m[35mSQL (0.5ms)[0m [1m[32mINSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "key"[0m [["key", "environment"], ["value", "development"], ["created_at", "2017-05-25 21:27:34.579475"], ["updated_at", "2017-05-25 21:27:34.579475"]]
|
18
|
-
[1m[35m (0.4ms)[0m [1m[35mCOMMIT[0m
|
19
|
-
[1m[35m (0.3ms)[0m [1m[34mSELECT pg_advisory_unlock(3791006887383934680)[0m
|
20
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_try_advisory_lock(3791006887383934680);[0m
|
21
|
-
[1m[35m (1.4ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
22
|
-
[1m[36mActiveRecord::InternalMetadata Load (1.2ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2[0m [["key", "environment"], ["LIMIT", 1]]
|
23
|
-
[1m[35m (0.2ms)[0m [1m[35mBEGIN[0m
|
24
|
-
[1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m
|
25
|
-
[1m[35m (0.3ms)[0m [1m[34mSELECT pg_advisory_unlock(3791006887383934680)[0m
|
26
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_try_advisory_lock(3791006887383934680);[0m
|
27
|
-
[1m[35m (0.8ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
28
|
-
[1m[36mActiveRecord::InternalMetadata Load (0.6ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2[0m [["key", "environment"], ["LIMIT", 1]]
|
29
|
-
[1m[35m (0.1ms)[0m [1m[35mBEGIN[0m
|
30
|
-
[1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m
|
31
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_advisory_unlock(3791006887383934680)[0m
|
32
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_try_advisory_lock(3791006887383934680);[0m
|
33
|
-
[1m[35m (1.3ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
34
|
-
[1m[36mActiveRecord::InternalMetadata Load (1.2ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2[0m [["key", "environment"], ["LIMIT", 1]]
|
35
|
-
[1m[35m (0.1ms)[0m [1m[35mBEGIN[0m
|
36
|
-
[1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m
|
37
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT pg_advisory_unlock(3791006887383934680)[0m
|
38
|
-
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|