panda_pal 3.0.1 → 3.0.3
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/Rakefile +1 -1
- data/app/models/panda_pal/organization.rb +45 -1
- data/db/migrate/30171205194657_remove_old_organization_settings.rb +4 -0
- data/lib/panda_pal/version.rb +1 -1
- data/panda_pal.gemspec +0 -2
- data/spec/dummy/config/application.rb +0 -3
- data/spec/dummy/config/database.yml +3 -3
- data/spec/dummy/db/schema.rb +19 -35
- data/spec/models/panda_pal/organization_spec.rb +92 -6
- data/spec/spec_helper.rb +14 -3
- metadata +4 -23
- data/spec/dummy/db/migrate/20160415162152_create_panda_pal_organizations.panda_pal.rb +0 -16
- data/spec/dummy/db/migrate/20160415162153_create_delayed_jobs.panda_pal.rb +0 -24
- data/spec/dummy/db/migrate/20160415162154_create_panda_pal_sessions.panda_pal.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 142d69b7f513a07ebace023bd229a780b099f17d
|
4
|
+
data.tar.gz: 60bd6a9784c2e2a9265b2e7c6582759560892c66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c95b68006a09db2e5cb559bc653f93219d6fc3f2aff350e5c2daa942a2d85c6a4490c1a10020cd0b8b8901f91ce3d299977d9334b677014c8c1c5bda14389083
|
7
|
+
data.tar.gz: d7ddd1733b129b550d69b736f9201115e0667f06cb1b8e116115b890e108963597fecb05d9b962fe2926e030e4557682cdd49b09d4106bfd4239d66b90bdedab
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
15
|
end
|
16
16
|
|
17
|
-
APP_RAKEFILE = File.expand_path("../
|
17
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
18
18
|
load 'rails/tasks/engine.rake'
|
19
19
|
|
20
20
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module PandaPal
|
2
|
+
|
2
3
|
class Organization < ActiveRecord::Base
|
3
4
|
attribute :settings
|
4
5
|
attr_encrypted :settings, marshal: true, key: :encryption_key
|
@@ -8,7 +9,7 @@ module PandaPal
|
|
8
9
|
validates :name, uniqueness: { case_sensitive: false }, presence: true, format: { with: /\A[a-z0-9_]+\z/i }
|
9
10
|
validates :canvas_account_id, presence: true
|
10
11
|
validates :salesforce_id, presence: true, uniqueness: true
|
11
|
-
|
12
|
+
validate :validate_settings
|
12
13
|
after_create :create_schema
|
13
14
|
after_commit :destroy_schema, on: :destroy
|
14
15
|
|
@@ -37,5 +38,48 @@ module PandaPal
|
|
37
38
|
def destroy_schema
|
38
39
|
Apartment::Tenant.drop name
|
39
40
|
end
|
41
|
+
|
42
|
+
def validate_settings
|
43
|
+
record = self
|
44
|
+
if PandaPal.lti_options && PandaPal.lti_options[:settings_structure]
|
45
|
+
validate_level(record, PandaPal.lti_options[:settings_structure], record.settings, [])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
def validate_level(record, expectation, reality, previous_keys)
|
49
|
+
# Verify that the data elements at this level conform to requirements.
|
50
|
+
if expectation
|
51
|
+
expectation.each do |key, value|
|
52
|
+
is_required = expectation[key].try(:delete, :is_required)
|
53
|
+
data_type = expectation[key].try(:delete, :data_type)
|
54
|
+
value = reality.is_a?(Hash) ? reality.dig(key) : reality
|
55
|
+
|
56
|
+
if is_required && !value
|
57
|
+
record.errors[:settings] << "PandaPal::Organization.settings requires key [:#{previous_keys.push(key).join("][:")}]. It was not found."
|
58
|
+
end
|
59
|
+
if data_type && value
|
60
|
+
if value.class.to_s != data_type
|
61
|
+
record.errors[:settings] << "PandaPal::Organization.settings expected key [:#{previous_keys.push(key).join("][:")}] to be #{data_type} but it was instead #{value.class}."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
# Verify that anything that is in the real settings has an expectation.
|
67
|
+
if reality
|
68
|
+
if reality.is_a? Hash
|
69
|
+
reality.each do |key, value|
|
70
|
+
was_expected = expectation.has_key?(key)
|
71
|
+
if !was_expected
|
72
|
+
record.errors[:settings] << "PandaPal::Organization.settings had unexpected key: #{key}. If settings have expanded please update your lti_options accordingly."
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
# Recursively check out any children settings as well.
|
78
|
+
if expectation
|
79
|
+
expectation.each do |key, value|
|
80
|
+
validate_level(record, expectation[key], (reality.is_a?(Hash) ? reality.dig(key) : nil), previous_keys.deep_dup.push(key))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
40
84
|
end
|
41
85
|
end
|
@@ -1,4 +1,8 @@
|
|
1
1
|
class RemoveOldOrganizationSettings < ActiveRecord::Migration[5.1]
|
2
|
+
def current_tenant
|
3
|
+
@current_tenant ||= PandaPal::Organization.find_by_name(Apartment::Tenant.current)
|
4
|
+
end
|
5
|
+
|
2
6
|
def up
|
3
7
|
# migrations run for public and local tenants. However, PandaPal::Organization
|
4
8
|
# is going to always go to public tenant. So don't do this active record
|
data/lib/panda_pal/version.rb
CHANGED
data/panda_pal.gemspec
CHANGED
@@ -21,8 +21,6 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_dependency 'ims-lti', '~> 2.1.0'
|
22
22
|
s.add_dependency 'browser', '2.5.0'
|
23
23
|
s.add_dependency 'attr_encrypted', '~> 3.0.0'
|
24
|
-
|
25
24
|
s.add_development_dependency 'rspec-rails'
|
26
25
|
s.add_development_dependency 'factory_girl_rails'
|
27
|
-
s.add_development_dependency 'test_after_commit'
|
28
26
|
end
|
@@ -19,8 +19,5 @@ module Dummy
|
|
19
19
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
20
20
|
# config.i18n.default_locale = :de
|
21
21
|
|
22
|
-
# Do not swallow errors in after_commit/after_rollback callbacks.
|
23
|
-
config.active_record.raise_in_transactional_callbacks = true
|
24
22
|
end
|
25
23
|
end
|
26
|
-
|
@@ -5,20 +5,20 @@
|
|
5
5
|
# gem 'sqlite3'
|
6
6
|
#
|
7
7
|
default: &default
|
8
|
-
adapter:
|
8
|
+
adapter: postgresql
|
9
9
|
pool: 5
|
10
10
|
timeout: 5000
|
11
11
|
|
12
12
|
development:
|
13
13
|
<<: *default
|
14
|
-
database:
|
14
|
+
database: panda_pal_development
|
15
15
|
|
16
16
|
# Warning: The database defined as "test" will be erased and
|
17
17
|
# re-generated from your development database when you run "rake".
|
18
18
|
# Do not set this db to the same as development or production.
|
19
19
|
test:
|
20
20
|
<<: *default
|
21
|
-
database:
|
21
|
+
database: panda_pal_test
|
22
22
|
|
23
23
|
production:
|
24
24
|
<<: *default
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# This file is auto-generated from the current state of the database. Instead
|
3
2
|
# of editing this file, please use the migrations feature of Active Record to
|
4
3
|
# incrementally modify your database, and then regenerate this schema definition.
|
@@ -11,45 +10,30 @@
|
|
11
10
|
#
|
12
11
|
# It's strongly recommended that you check this file into your version control system.
|
13
12
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
15
|
-
|
16
|
-
create_table "delayed_jobs", force: :cascade do |t|
|
17
|
-
t.integer "priority", default: 0, null: false
|
18
|
-
t.integer "attempts", default: 0, null: false
|
19
|
-
t.text "handler", null: false
|
20
|
-
t.text "last_error"
|
21
|
-
t.datetime "run_at"
|
22
|
-
t.datetime "locked_at"
|
23
|
-
t.datetime "failed_at"
|
24
|
-
t.string "locked_by"
|
25
|
-
t.string "queue"
|
26
|
-
t.string "tenant"
|
27
|
-
t.datetime "created_at"
|
28
|
-
t.datetime "updated_at"
|
29
|
-
end
|
30
|
-
|
31
|
-
add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority"
|
13
|
+
ActiveRecord::Schema.define(version: 30171205194657) do
|
32
14
|
|
33
15
|
create_table "panda_pal_organizations", force: :cascade do |t|
|
34
|
-
t.string
|
35
|
-
t.string
|
36
|
-
t.string
|
37
|
-
t.string
|
38
|
-
t.
|
39
|
-
t.datetime "
|
40
|
-
t.
|
16
|
+
t.string "name"
|
17
|
+
t.string "key"
|
18
|
+
t.string "secret"
|
19
|
+
t.string "canvas_account_id"
|
20
|
+
t.datetime "created_at", null: false
|
21
|
+
t.datetime "updated_at", null: false
|
22
|
+
t.string "salesforce_id"
|
23
|
+
t.text "encrypted_settings"
|
24
|
+
t.string "encrypted_settings_iv"
|
25
|
+
t.index ["key"], name: "index_panda_pal_organizations_on_key", unique: true
|
26
|
+
t.index ["name"], name: "index_panda_pal_organizations_on_name", unique: true
|
41
27
|
end
|
42
28
|
|
43
|
-
add_index "panda_pal_organizations", ["key"], name: "index_panda_pal_organizations_on_key", unique: true
|
44
|
-
add_index "panda_pal_organizations", ["name"], name: "index_panda_pal_organizations_on_name", unique: true
|
45
|
-
|
46
29
|
create_table "panda_pal_sessions", force: :cascade do |t|
|
47
|
-
t.string
|
48
|
-
t.text
|
49
|
-
t.datetime "created_at",
|
50
|
-
t.datetime "updated_at",
|
30
|
+
t.string "session_key"
|
31
|
+
t.text "data"
|
32
|
+
t.datetime "created_at", null: false
|
33
|
+
t.datetime "updated_at", null: false
|
34
|
+
t.integer "panda_pal_organization_id"
|
35
|
+
t.index ["panda_pal_organization_id"], name: "index_panda_pal_sessions_on_panda_pal_organization_id"
|
36
|
+
t.index ["session_key"], name: "index_panda_pal_sessions_on_session_key", unique: true
|
51
37
|
end
|
52
38
|
|
53
|
-
add_index "panda_pal_sessions", ["session_key"], name: "index_panda_pal_sessions_on_session_key", unique: true
|
54
|
-
|
55
39
|
end
|
@@ -3,18 +3,44 @@ require 'rails_helper'
|
|
3
3
|
module PandaPal
|
4
4
|
RSpec.describe Organization, type: :model do
|
5
5
|
|
6
|
+
def set_test_settings_structure
|
7
|
+
PandaPal.lti_options = {
|
8
|
+
title: 'Test App',
|
9
|
+
settings_structure: YAML.load("
|
10
|
+
canvas:
|
11
|
+
is_required: true
|
12
|
+
data_type: Hash
|
13
|
+
api_token:
|
14
|
+
is_required: true
|
15
|
+
data_type: String
|
16
|
+
base_url:
|
17
|
+
is_required: true
|
18
|
+
data_type: String
|
19
|
+
reports:
|
20
|
+
is_required: true
|
21
|
+
data_type: Hash
|
22
|
+
active_term_allowance:
|
23
|
+
submissions_report_time_length:
|
24
|
+
is_required: true
|
25
|
+
data_type: ActiveSupport::Duration
|
26
|
+
recheck_wait:
|
27
|
+
data_type: ActiveSupport::Duration
|
28
|
+
max_recheck_time:
|
29
|
+
is_required: true
|
30
|
+
").deep_symbolize_keys
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
6
34
|
it 'creates a schema upon creation' do
|
7
35
|
expect(Apartment::Tenant).to receive(:create)
|
8
36
|
create :panda_pal_organization
|
9
37
|
end
|
10
38
|
|
11
39
|
it 'deletes a schema upon deletion' do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
org.destroy
|
17
|
-
end
|
40
|
+
expect(Apartment::Tenant).to receive(:create)
|
41
|
+
expect(Apartment::Tenant).to receive(:drop)
|
42
|
+
org = create :panda_pal_organization
|
43
|
+
org.destroy
|
18
44
|
end
|
19
45
|
|
20
46
|
it 'does not allow the name to be changed after creation' do
|
@@ -33,5 +59,65 @@ module PandaPal
|
|
33
59
|
org2 = build :panda_pal_organization, salesforce_id: 'salesforce'
|
34
60
|
expect(org2.valid?).to be_falsey
|
35
61
|
end
|
62
|
+
|
63
|
+
context 'settings validation' do
|
64
|
+
let!(:org) { create :panda_pal_organization }
|
65
|
+
|
66
|
+
it 'does not perform any validations if settings is not defined' do
|
67
|
+
PandaPal.lti_options = {}
|
68
|
+
expect_any_instance_of(PandaPal::Organization).not_to receive(:validate_level)
|
69
|
+
expect(org.valid?).to be_truthy
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'does not perform any validations if options is not defined' do
|
73
|
+
PandaPal.lti_options = nil
|
74
|
+
expect_any_instance_of(PandaPal::Organization).not_to receive(:validate_level)
|
75
|
+
expect(org.valid?).to be_truthy
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'does perform validations if settings_structure is defined' do
|
79
|
+
set_test_settings_structure
|
80
|
+
org.valid?
|
81
|
+
expect(org.valid?).to be_falsey
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'will fail if a required setting is not present' do
|
85
|
+
set_test_settings_structure
|
86
|
+
expect(org.valid?).to be_falsey
|
87
|
+
errors = org.errors.messages[:settings]
|
88
|
+
expect(errors[0]).to eq("PandaPal::Organization.settings requires key [:canvas]. It was not found.")
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'will fail if a setting is supplied but data_type is wrong' do
|
92
|
+
set_test_settings_structure
|
93
|
+
org.settings = {canvas: "Dog"}
|
94
|
+
expect(org.valid?).to be_falsey
|
95
|
+
errors = org.errors.messages[:settings]
|
96
|
+
expect(errors[0]).to eq("PandaPal::Organization.settings expected key [:canvas] to be Hash but it was instead String.")
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'will fail if a required subsetting is missing' do
|
100
|
+
set_test_settings_structure
|
101
|
+
org.settings = {canvas: {base_url: 'http://'}, reports: {}}
|
102
|
+
expect(org.valid?).to be_falsey
|
103
|
+
errors = org.errors.messages[:settings]
|
104
|
+
expect(errors[0]).to eq("PandaPal::Organization.settings requires key [:canvas][:api_token]. It was not found.")
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'will fail if extra options are specified' do
|
108
|
+
set_test_settings_structure
|
109
|
+
org.settings = {canvas: {base_url: 'http://'}, reports: {}, unknown_option: "WHAT IS THIS?"}
|
110
|
+
expect(org.valid?).to be_falsey
|
111
|
+
errors = org.errors.messages[:settings]
|
112
|
+
expect(errors[0]).to eq("PandaPal::Organization.settings had unexpected key: unknown_option. If settings have expanded please update your lti_options accordingly.")
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'will pass if all structure is maintained' do
|
116
|
+
set_test_settings_structure
|
117
|
+
org.settings = {canvas: {base_url: 'http://', api_token: 'TEST'}, reports: {submissions_report_time_length: 30.minutes, max_recheck_time: 10.hours}}
|
118
|
+
expect(org.valid?).to be_truthy
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
36
122
|
end
|
37
123
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,13 +3,17 @@ require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
|
3
3
|
require 'rspec/rails'
|
4
4
|
require 'rspec/autorun'
|
5
5
|
require 'nokogiri'
|
6
|
-
require 'delayed_job_active_record'
|
7
6
|
require 'factory_girl_rails'
|
8
|
-
require 'test_after_commit'
|
9
7
|
|
10
|
-
|
8
|
+
ActiveRecord::Migration.maintain_test_schema!
|
9
|
+
ActiveRecord::Schema.verbose = false
|
10
|
+
load 'dummy/db/schema.rb' # db agnostic
|
11
|
+
|
11
12
|
RSpec.configure do |config|
|
12
13
|
config.include FactoryGirl::Syntax::Methods
|
14
|
+
FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
|
15
|
+
FactoryGirl.find_definitions
|
16
|
+
|
13
17
|
# rspec-expectations config goes here. You can use an alternate
|
14
18
|
# assertion/expectation library such as wrong or the stdlib/minitest
|
15
19
|
# assertions if you prefer.
|
@@ -33,6 +37,13 @@ RSpec.configure do |config|
|
|
33
37
|
mocks.verify_partial_doubles = true
|
34
38
|
end
|
35
39
|
|
40
|
+
config.before(:each) do
|
41
|
+
PandaPal.lti_options = {
|
42
|
+
title: 'Test App',
|
43
|
+
settings_structure: {}
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
36
47
|
# The settings below are suggested to provide a good initial experience
|
37
48
|
# with RSpec, but feel free to customize to your heart's content.
|
38
49
|
=begin
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panda_pal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Young
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -123,20 +123,6 @@ dependencies:
|
|
123
123
|
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: test_after_commit
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
requirements:
|
130
|
-
- - ">="
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
version: '0'
|
133
|
-
type: :development
|
134
|
-
prerelease: false
|
135
|
-
version_requirements: !ruby/object:Gem::Requirement
|
136
|
-
requirements:
|
137
|
-
- - ">="
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
version: '0'
|
140
126
|
description:
|
141
127
|
email:
|
142
128
|
- byoung@instructure.com
|
@@ -206,9 +192,6 @@ files:
|
|
206
192
|
- spec/dummy/config/locales/en.yml
|
207
193
|
- spec/dummy/config/routes.rb
|
208
194
|
- spec/dummy/config/secrets.yml
|
209
|
-
- spec/dummy/db/migrate/20160415162152_create_panda_pal_organizations.panda_pal.rb
|
210
|
-
- spec/dummy/db/migrate/20160415162153_create_delayed_jobs.panda_pal.rb
|
211
|
-
- spec/dummy/db/migrate/20160415162154_create_panda_pal_sessions.panda_pal.rb
|
212
195
|
- spec/dummy/db/schema.rb
|
213
196
|
- spec/dummy/public/404.html
|
214
197
|
- spec/dummy/public/422.html
|
@@ -240,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
223
|
version: '0'
|
241
224
|
requirements: []
|
242
225
|
rubyforge_project:
|
243
|
-
rubygems_version: 2.
|
226
|
+
rubygems_version: 2.2.2
|
244
227
|
signing_key:
|
245
228
|
specification_version: 4
|
246
229
|
summary: LTI mountable engine
|
@@ -273,9 +256,6 @@ test_files:
|
|
273
256
|
- spec/dummy/config/routes.rb
|
274
257
|
- spec/dummy/config/secrets.yml
|
275
258
|
- spec/dummy/config.ru
|
276
|
-
- spec/dummy/db/migrate/20160415162152_create_panda_pal_organizations.panda_pal.rb
|
277
|
-
- spec/dummy/db/migrate/20160415162153_create_delayed_jobs.panda_pal.rb
|
278
|
-
- spec/dummy/db/migrate/20160415162154_create_panda_pal_sessions.panda_pal.rb
|
279
259
|
- spec/dummy/db/schema.rb
|
280
260
|
- spec/dummy/public/404.html
|
281
261
|
- spec/dummy/public/422.html
|
@@ -289,3 +269,4 @@ test_files:
|
|
289
269
|
- spec/models/panda_pal/session_spec.rb
|
290
270
|
- spec/rails_helper.rb
|
291
271
|
- spec/spec_helper.rb
|
272
|
+
has_rdoc:
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# This migration comes from panda_pal (originally 20160412205931)
|
2
|
-
class CreatePandaPalOrganizations < ActiveRecord::Migration
|
3
|
-
def change
|
4
|
-
create_table :panda_pal_organizations do |t|
|
5
|
-
t.string :name
|
6
|
-
t.string :key
|
7
|
-
t.string :secret
|
8
|
-
t.string :canvas_account_id
|
9
|
-
t.text :settings
|
10
|
-
|
11
|
-
t.timestamps null: false
|
12
|
-
end
|
13
|
-
add_index :panda_pal_organizations, :name, unique: true
|
14
|
-
add_index :panda_pal_organizations, :key, unique: true
|
15
|
-
end
|
16
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# This migration comes from panda_pal (originally 20160413132229)
|
2
|
-
class CreateDelayedJobs < ActiveRecord::Migration
|
3
|
-
def self.up
|
4
|
-
create_table :delayed_jobs, force: true do |table|
|
5
|
-
table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue
|
6
|
-
table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually.
|
7
|
-
table.text :handler, null: false # YAML-encoded string of the object that will do work
|
8
|
-
table.text :last_error # reason for last failure (See Note below)
|
9
|
-
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
10
|
-
table.datetime :locked_at # Set when a client is working on this object
|
11
|
-
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
12
|
-
table.string :locked_by # Who is working on this object (if locked)
|
13
|
-
table.string :queue # The name of the queue this job is in
|
14
|
-
table.string :tenant
|
15
|
-
table.timestamps null: true
|
16
|
-
end
|
17
|
-
|
18
|
-
add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority"
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.down
|
22
|
-
drop_table :delayed_jobs
|
23
|
-
end
|
24
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# This migration comes from panda_pal (originally 20160413135653)
|
2
|
-
class CreatePandaPalSessions < ActiveRecord::Migration
|
3
|
-
def change
|
4
|
-
create_table :panda_pal_sessions do |t|
|
5
|
-
t.string :session_key
|
6
|
-
t.text :data
|
7
|
-
|
8
|
-
t.timestamps null: false
|
9
|
-
end
|
10
|
-
add_index :panda_pal_sessions, :session_key, unique: true
|
11
|
-
end
|
12
|
-
end
|