canvas_sync 0.17.32 → 0.17.35
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/canvas_sync/concerns/sync_mapping.rb +1 -1
- data/lib/canvas_sync/engine.rb +35 -16
- data/lib/canvas_sync/generators/templates/migrations/create_learning_outcomes.rb +30 -0
- data/lib/canvas_sync/generators/templates/models/learning_outcome.rb +22 -0
- data/lib/canvas_sync/job_batches/batch.rb +17 -0
- data/lib/canvas_sync/job_batches/callback.rb +1 -1
- data/lib/canvas_sync/job_batches/pool.rb +4 -4
- data/lib/canvas_sync/job_batches/sidekiq/web/helpers.rb +1 -1
- data/lib/canvas_sync/job_batches/sidekiq/web/views/batch.erb +10 -0
- data/lib/canvas_sync/processors/model_mappings.yml +55 -0
- data/lib/canvas_sync/processors/provisioning_report_processor.rb +7 -0
- data/lib/canvas_sync/processors/report_processor.rb +3 -2
- data/lib/canvas_sync/version.rb +1 -1
- data/lib/canvas_sync.rb +1 -0
- data/spec/canvas_sync/processors/provisioning_report_processor_spec.rb +6 -0
- data/spec/dummy/app/models/learning_outcome.rb +28 -0
- data/spec/dummy/db/migrate/20220712210559_create_learning_outcomes.rb +36 -0
- data/spec/dummy/db/schema.rb +25 -1
- data/spec/support/fixtures/reports/learning_outcomes.csv +3 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43e293e4d64336d70983fbf6eedffb1279252c7d95dfe7a525aa1fa2da5f5463
|
4
|
+
data.tar.gz: b13c557e206b4ea989ff962ad385b0fef0862e67a07626eb8a661faae8c96fd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1866a0aafdc8eac4471c5e498055a64690f99982218d06a0ea14ac5ad8a496df1db6add14012d967a8de61efcdced32a1ec14aa7d5dc07c2a0299dc837cd6f0e
|
7
|
+
data.tar.gz: e16462ec03aa1a207871ab2dee9d0075a349aa09aaa7c8014833e9c4f3abe684a62e124fbdc5a76bd5340b913add521ec4304eae0f449b95c624358c4504c8f3
|
data/lib/canvas_sync/engine.rb
CHANGED
@@ -29,27 +29,46 @@ module CanvasSync
|
|
29
29
|
}
|
30
30
|
}
|
31
31
|
|
32
|
+
initializer 'canvas_sync.global_methods' do
|
33
|
+
next if defined?(canvas_sync_client)
|
34
|
+
|
35
|
+
require 'panda_pal'
|
36
|
+
|
37
|
+
def canvas_sync_client(account_id = nil)
|
38
|
+
Bearcat::Client.new(
|
39
|
+
prefix: current_organization.canvas_url,
|
40
|
+
token: current_organization.canvas_api_token,
|
41
|
+
master_rate_limit: (Rails.env.production? && !!defined?(Redis) && ENV['REDIS_URL'].present?),
|
42
|
+
)
|
43
|
+
end
|
44
|
+
rescue LoadError
|
45
|
+
end
|
46
|
+
|
32
47
|
initializer :integrate_pandapal do
|
33
48
|
require 'panda_pal'
|
34
49
|
|
35
|
-
|
36
|
-
if PandaPal::Organization.respond_to?(:
|
37
|
-
PandaPal::Organization.
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
50
|
+
Rails.application.reloader.to_prepare do
|
51
|
+
if PandaPal::Organization.respond_to?(:scheduled_task)
|
52
|
+
if PandaPal::Organization.respond_to?(:define_setting)
|
53
|
+
PandaPal::Organization.define_setting(:canvas_sync, {
|
54
|
+
type: 'Hash',
|
55
|
+
required: false,
|
56
|
+
properties: {
|
57
|
+
job_log_retention: { **RETENTION_TYPE },
|
58
|
+
sync_batch_retention: { **RETENTION_TYPE },
|
59
|
+
}
|
60
|
+
})
|
61
|
+
end
|
46
62
|
|
47
|
-
|
48
|
-
|
49
|
-
|
63
|
+
unless PandaPal::Organization.task_scheduled?(:clean_canvas_sync_logs)
|
64
|
+
PandaPal::Organization.scheduled_task '0 0 3 * * *', :clean_canvas_sync_logs do
|
65
|
+
job_log_retention = ChronicDuration.parse(settings.dig(:canvas_sync, :job_log_retention) || '3 months', keep_zero: true).seconds.ago
|
66
|
+
JobLog.where('updated_at < ?', job_log_retention).delete_all
|
50
67
|
|
51
|
-
|
52
|
-
|
68
|
+
sync_batch_retention = ChronicDuration.parse(settings.dig(:canvas_sync, :sync_batch_retention) || '6 months', keep_zero: true).seconds.ago
|
69
|
+
SyncBatch.where('updated_at < ?', sync_batch_retention).delete_all
|
70
|
+
end
|
71
|
+
end
|
53
72
|
end
|
54
73
|
end
|
55
74
|
rescue LoadError
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# <%= autogenerated_migration_warning %>
|
2
|
+
|
3
|
+
class CreateLearningOutcomes < ActiveRecord::Migration[5.1]
|
4
|
+
def change
|
5
|
+
create_table :learning_outcomes do |t|
|
6
|
+
t.bigint :canvas_id, null: false
|
7
|
+
t.integer :canvas_context_id
|
8
|
+
t.string :canvas_context_type
|
9
|
+
t.string :name
|
10
|
+
t.string :friendly_name
|
11
|
+
t.string :workflow_state
|
12
|
+
t.datetime :canvas_created_at
|
13
|
+
t.datetime :canvas_updated_at
|
14
|
+
t.string :migration_id
|
15
|
+
t.string :vendor_guid
|
16
|
+
t.string :low_grade
|
17
|
+
t.string :high_grade
|
18
|
+
t.string :calculation_method
|
19
|
+
t.string :calculation_int
|
20
|
+
t.integer :outcome_import_id
|
21
|
+
t.integer :root_account_ids, array: true, default: []
|
22
|
+
t.text :description
|
23
|
+
|
24
|
+
t.timestamps
|
25
|
+
end
|
26
|
+
|
27
|
+
add_index :learning_outcomes, :canvas_id, unique: true
|
28
|
+
add_index :learning_outcomes, [:canvas_context_id, :canvas_context_type], name: "index_learning_outcomes_on_context"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# # <%= autogenerated_migration_warning %>
|
4
|
+
|
5
|
+
class LearningOutcome < ApplicationRecord
|
6
|
+
include CanvasSync::Record
|
7
|
+
include CanvasSync::Concerns::ApiSyncable
|
8
|
+
|
9
|
+
belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
|
10
|
+
|
11
|
+
api_syncable({
|
12
|
+
canvas_id: :id,
|
13
|
+
canvas_context_id: :context_id,
|
14
|
+
canvas_context_type: :context_type,
|
15
|
+
name: :title,
|
16
|
+
friendly_name: :display_name,
|
17
|
+
vendor_guid: :vendor_guid,
|
18
|
+
calculation_method: :calculation_method,
|
19
|
+
calculation_int: :calculation_int,
|
20
|
+
description: :description
|
21
|
+
}, ->(api) { api.get("/api/v1/outcomes/#{canvas_id}") })
|
22
|
+
end
|
@@ -453,6 +453,23 @@ module CanvasSync
|
|
453
453
|
end
|
454
454
|
end
|
455
455
|
|
456
|
+
def uget(key)
|
457
|
+
Batch.redis do |r|
|
458
|
+
case r.type(key)
|
459
|
+
when 'string'
|
460
|
+
r.get(key)
|
461
|
+
when 'list'
|
462
|
+
r.lrange(key, 0, -1)
|
463
|
+
when 'hash'
|
464
|
+
r.hgetall(key)
|
465
|
+
when 'set'
|
466
|
+
r.smembers(key)
|
467
|
+
when 'zset'
|
468
|
+
r.smembers(key, 0, -1)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
456
473
|
def method_missing(method_name, *arguments, &block)
|
457
474
|
Batch.redis do |r|
|
458
475
|
r.send(method_name, *arguments, &block)
|
@@ -27,7 +27,7 @@ module CanvasSync
|
|
27
27
|
|
28
28
|
if clazz && object = Object.const_get(clazz)
|
29
29
|
target = target == :instance ? object.new : object
|
30
|
-
if target.respond_to?(method)
|
30
|
+
if target.respond_to?(method, true)
|
31
31
|
target.send(method, status, opts)
|
32
32
|
else
|
33
33
|
Batch.logger.warn("Invalid callback method #{definition} - #{target.to_s} does not respond to #{method}")
|
@@ -44,7 +44,7 @@ module CanvasSync
|
|
44
44
|
wrapper.on(checkin_event, "#{self.class.to_s}.job_checked_in", pool_id: pid)
|
45
45
|
wrapper.jobs {}
|
46
46
|
|
47
|
-
job_desc = job_desc.
|
47
|
+
job_desc = job_desc.symbolize_keys
|
48
48
|
job_desc = job_desc.merge!(
|
49
49
|
job: job_desc[:job].to_s,
|
50
50
|
pool_wrapper_batch: wrapper.bid,
|
@@ -149,7 +149,7 @@ module CanvasSync
|
|
149
149
|
if current_count < limit
|
150
150
|
job_desc = pop_job_from_pool
|
151
151
|
if job_desc.present?
|
152
|
-
Batch.new(job_desc[
|
152
|
+
Batch.new(job_desc[:pool_wrapper_batch]).jobs do
|
153
153
|
ChainBuilder.enqueue_job(job_desc)
|
154
154
|
end
|
155
155
|
jobs_added += 1
|
@@ -170,7 +170,7 @@ module CanvasSync
|
|
170
170
|
def push_job_to_pool(job_desc)
|
171
171
|
jobs_key = "#{redis_key}-jobs"
|
172
172
|
# This allows duplicate jobs when a Redis Set is used
|
173
|
-
job_desc[
|
173
|
+
job_desc[:_pool_random_key_] = SecureRandom.urlsafe_base64(10)
|
174
174
|
job_json = JSON.unparse(ActiveJob::Arguments.serialize([job_desc]))
|
175
175
|
order = self.order
|
176
176
|
|
@@ -204,7 +204,7 @@ module CanvasSync
|
|
204
204
|
|
205
205
|
return nil unless job_json.present?
|
206
206
|
|
207
|
-
ActiveJob::Arguments.deserialize(JSON.parse(job_json))[0]
|
207
|
+
ActiveJob::Arguments.deserialize(JSON.parse(job_json))[0]&.symbolize_keys
|
208
208
|
end
|
209
209
|
|
210
210
|
def self.redis(&blk)
|
@@ -10,6 +10,16 @@
|
|
10
10
|
<th colspan="2" scope=row><%= t('Batch') %></td>
|
11
11
|
<td><%= @batch.bid %></td>
|
12
12
|
</tr>
|
13
|
+
<tr>
|
14
|
+
<th colspan="2" scope=row><%= t('Parent') %></td>
|
15
|
+
<td>
|
16
|
+
<% if @batch.parent_bid.present? %>
|
17
|
+
<a href="<%= root_path %>batches/<%= @batch.parent_bid %>"><%= @batch.parent_bid %></a>
|
18
|
+
<% else %>
|
19
|
+
ROOT
|
20
|
+
<% end %>
|
21
|
+
</td>
|
22
|
+
</tr>
|
13
23
|
<tr>
|
14
24
|
<th colspan="2" scope=row><%= t('Started') %></td>
|
15
25
|
<td><%= safe_relative_time(@batch.created_at.to_f) %></td>
|
@@ -509,3 +509,58 @@ content_migrations:
|
|
509
509
|
canvas_root_account_id:
|
510
510
|
database_column_name: canvas_root_account_id
|
511
511
|
type: integer
|
512
|
+
|
513
|
+
learning_outcomes:
|
514
|
+
conflict_target: learning_outcome_id
|
515
|
+
report_columns:
|
516
|
+
learning_outcome_id:
|
517
|
+
database_column_name: canvas_id
|
518
|
+
type: integer
|
519
|
+
context_id:
|
520
|
+
database_column_name: canvas_context_id
|
521
|
+
type: integer
|
522
|
+
context_type:
|
523
|
+
database_column_name: canvas_context_type
|
524
|
+
type: string
|
525
|
+
name:
|
526
|
+
database_column_name: name
|
527
|
+
type: string
|
528
|
+
friendly_name:
|
529
|
+
database_column_name: friendly_name
|
530
|
+
type: string
|
531
|
+
workflow_state:
|
532
|
+
database_column_name: workflow_state
|
533
|
+
type: string
|
534
|
+
created_at:
|
535
|
+
database_column_name: canvas_created_at
|
536
|
+
type: datetime
|
537
|
+
updated_at:
|
538
|
+
database_column_name: canvas_updated_at
|
539
|
+
type: datetime
|
540
|
+
migration_id:
|
541
|
+
database_column_name: migration_id
|
542
|
+
type: string
|
543
|
+
vendor_guid:
|
544
|
+
database_column_name: vendor_guid
|
545
|
+
type: string
|
546
|
+
low_grade:
|
547
|
+
database_column_name: low_grade
|
548
|
+
type: string
|
549
|
+
high_grade:
|
550
|
+
database_column_name: high_grade
|
551
|
+
type: string
|
552
|
+
calculation_method:
|
553
|
+
database_column_name: calculation_method
|
554
|
+
type: string
|
555
|
+
calculation_int:
|
556
|
+
database_column_name: calculation_int
|
557
|
+
type: integer
|
558
|
+
outcome_import_id:
|
559
|
+
database_column_name: outcome_import_id
|
560
|
+
type: integer
|
561
|
+
root_account_ids:
|
562
|
+
database_column_name: root_account_ids
|
563
|
+
type: integer
|
564
|
+
description:
|
565
|
+
database_column_name: description
|
566
|
+
type: string
|
@@ -116,6 +116,13 @@ module CanvasSync
|
|
116
116
|
def bulk_process_group_membership(report_file_path)
|
117
117
|
do_bulk_import(report_file_path, GroupMembership, options: @options)
|
118
118
|
end
|
119
|
+
|
120
|
+
def bulk_process_learning_outcomes(report_file_path)
|
121
|
+
do_bulk_import(report_file_path, LearningOutcome, options: @options) do |row|
|
122
|
+
row[:root_account_ids] = JSON.parse row[:root_account_ids]
|
123
|
+
row
|
124
|
+
end
|
125
|
+
end
|
119
126
|
end
|
120
127
|
end
|
121
128
|
end
|
@@ -12,14 +12,15 @@ module CanvasSync
|
|
12
12
|
model.try(:get_sync_mapping, key) || mapping[key || CanvasSync::Concerns::SyncMapping::Mapping.normalize_model_name(model)]
|
13
13
|
end
|
14
14
|
|
15
|
-
def do_bulk_import(report_file_path, model, options: {}, mapping_key: nil)
|
15
|
+
def do_bulk_import(report_file_path, model, options: {}, mapping_key: nil, &blk)
|
16
16
|
m = mapping_for(model, mapping_key)
|
17
17
|
CanvasSync::Importers::BulkImporter.import(
|
18
18
|
report_file_path,
|
19
19
|
m[:report_columns],
|
20
20
|
model,
|
21
21
|
m[:conflict_target],
|
22
|
-
import_args: options
|
22
|
+
import_args: options,
|
23
|
+
&blk
|
23
24
|
)
|
24
25
|
end
|
25
26
|
end
|
data/lib/canvas_sync/version.rb
CHANGED
data/lib/canvas_sync.rb
CHANGED
@@ -104,6 +104,12 @@ RSpec.describe CanvasSync::Processors::ProvisioningReportProcessor do
|
|
104
104
|
expect(obj.workflow_state).to eq 'active'
|
105
105
|
end
|
106
106
|
|
107
|
+
it 'processes learning_outcomes' do
|
108
|
+
expect {
|
109
|
+
subject.process('spec/support/fixtures/reports/learning_outcomes.csv', { models: ['learning_outcomes'] }, 1)
|
110
|
+
}.to change { LearningOutcome.count }.by(2)
|
111
|
+
end
|
112
|
+
|
107
113
|
it 'model with composite key behaves as expected' do
|
108
114
|
expect {
|
109
115
|
subject.process('spec/support/fixtures/reports/user_observers.csv', { models: ['user_observers'] }, 1)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# # #
|
4
|
+
# AUTO GENERATED MIGRATION
|
5
|
+
# This migration was auto generated by the CanvasSync Gem.
|
6
|
+
# You can add new columns to this table, but removing or
|
7
|
+
# re-naming ones created here may break Canvas Syncing.
|
8
|
+
#
|
9
|
+
|
10
|
+
|
11
|
+
class LearningOutcome < ApplicationRecord
|
12
|
+
include CanvasSync::Record
|
13
|
+
include CanvasSync::Concerns::ApiSyncable
|
14
|
+
|
15
|
+
belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type
|
16
|
+
|
17
|
+
api_syncable({
|
18
|
+
canvas_id: :id,
|
19
|
+
canvas_context_id: :context_id,
|
20
|
+
canvas_context_type: :context_type,
|
21
|
+
name: :title,
|
22
|
+
friendly_name: :display_name,
|
23
|
+
vendor_guid: :vendor_guid,
|
24
|
+
calculation_method: :calculation_method,
|
25
|
+
calculation_int: :calculation_int,
|
26
|
+
description: :description
|
27
|
+
}, ->(api) { api.get("/api/v1/outcomes/#{canvas_id}") })
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# #
|
2
|
+
# AUTO GENERATED MIGRATION
|
3
|
+
# This migration was auto generated by the CanvasSync Gem.
|
4
|
+
# You can add new columns to this table, but removing or
|
5
|
+
# re-naming ones created here may break Canvas Syncing.
|
6
|
+
#
|
7
|
+
|
8
|
+
|
9
|
+
class CreateLearningOutcomes < ActiveRecord::Migration[5.1]
|
10
|
+
def change
|
11
|
+
create_table :learning_outcomes do |t|
|
12
|
+
t.bigint :canvas_id, null: false
|
13
|
+
t.integer :canvas_context_id
|
14
|
+
t.string :canvas_context_type
|
15
|
+
t.string :name
|
16
|
+
t.string :friendly_name
|
17
|
+
t.string :workflow_state
|
18
|
+
t.datetime :canvas_created_at
|
19
|
+
t.datetime :canvas_updated_at
|
20
|
+
t.string :migration_id
|
21
|
+
t.string :vendor_guid
|
22
|
+
t.string :low_grade
|
23
|
+
t.string :high_grade
|
24
|
+
t.string :calculation_method
|
25
|
+
t.string :calculation_int
|
26
|
+
t.integer :outcome_import_id
|
27
|
+
t.integer :root_account_ids, array: true, default: []
|
28
|
+
t.text :description
|
29
|
+
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
|
33
|
+
add_index :learning_outcomes, :canvas_id, unique: true
|
34
|
+
add_index :learning_outcomes, [:canvas_context_id, :canvas_context_type], name: "index_learning_outcomes_on_context"
|
35
|
+
end
|
36
|
+
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2022_07_12_210559) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -246,6 +246,30 @@ ActiveRecord::Schema.define(version: 2022_03_08_072643) do
|
|
246
246
|
t.index ["canvas_id"], name: "index_groups_on_canvas_id", unique: true
|
247
247
|
end
|
248
248
|
|
249
|
+
create_table "learning_outcomes", force: :cascade do |t|
|
250
|
+
t.bigint "canvas_id", null: false
|
251
|
+
t.integer "canvas_context_id"
|
252
|
+
t.string "canvas_context_type"
|
253
|
+
t.string "name"
|
254
|
+
t.string "friendly_name"
|
255
|
+
t.string "workflow_state"
|
256
|
+
t.datetime "canvas_created_at"
|
257
|
+
t.datetime "canvas_updated_at"
|
258
|
+
t.string "migration_id"
|
259
|
+
t.string "vendor_guid"
|
260
|
+
t.string "low_grade"
|
261
|
+
t.string "high_grade"
|
262
|
+
t.string "calculation_method"
|
263
|
+
t.string "calculation_int"
|
264
|
+
t.integer "outcome_import_id"
|
265
|
+
t.integer "root_account_ids", default: [], array: true
|
266
|
+
t.text "description"
|
267
|
+
t.datetime "created_at", null: false
|
268
|
+
t.datetime "updated_at", null: false
|
269
|
+
t.index ["canvas_context_id", "canvas_context_type"], name: "index_learning_outcomes_on_context"
|
270
|
+
t.index ["canvas_id"], name: "index_learning_outcomes_on_canvas_id", unique: true
|
271
|
+
end
|
272
|
+
|
249
273
|
create_table "pseudonyms", force: :cascade do |t|
|
250
274
|
t.bigint "canvas_id", null: false
|
251
275
|
t.bigint "canvas_user_id"
|
@@ -0,0 +1,3 @@
|
|
1
|
+
learning_outcome_id,context_id,context_type,name,friendly_name,workflow_state,created_at,updated_at,migration_id,vendor_guid,low_grade,high_grade,calculation_method,calculation_int,outcome_import_id,root_account_ids,description
|
2
|
+
1,1,Course,Course Outcome,"",active,2021-08-12 21:11:40 UTC,2021-08-13 01:05:40 UTC,,,,,decaying_average,65,,[1],<p>description</p>
|
3
|
+
2,1,Account,Account Outcome,Friendly Name,active,2021-08-12 21:11:40 UTC,2021-08-13 01:05:40 UTC,,,,,decaying_average,65,,[1],<p>description</p>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.17.
|
4
|
+
version: 0.17.35
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nate Collings
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -390,6 +390,7 @@ files:
|
|
390
390
|
- lib/canvas_sync/generators/templates/migrations/create_grading_periods.rb
|
391
391
|
- lib/canvas_sync/generators/templates/migrations/create_group_memberships.rb
|
392
392
|
- lib/canvas_sync/generators/templates/migrations/create_groups.rb
|
393
|
+
- lib/canvas_sync/generators/templates/migrations/create_learning_outcomes.rb
|
393
394
|
- lib/canvas_sync/generators/templates/migrations/create_pseudonyms.rb
|
394
395
|
- lib/canvas_sync/generators/templates/migrations/create_roles.rb
|
395
396
|
- lib/canvas_sync/generators/templates/migrations/create_sections.rb
|
@@ -410,6 +411,7 @@ files:
|
|
410
411
|
- lib/canvas_sync/generators/templates/models/grading_period_group.rb
|
411
412
|
- lib/canvas_sync/generators/templates/models/group.rb
|
412
413
|
- lib/canvas_sync/generators/templates/models/group_membership.rb
|
414
|
+
- lib/canvas_sync/generators/templates/models/learning_outcome.rb
|
413
415
|
- lib/canvas_sync/generators/templates/models/pseudonym.rb
|
414
416
|
- lib/canvas_sync/generators/templates/models/role.rb
|
415
417
|
- lib/canvas_sync/generators/templates/models/section.rb
|
@@ -551,6 +553,7 @@ files:
|
|
551
553
|
- spec/dummy/app/models/grading_period_group.rb
|
552
554
|
- spec/dummy/app/models/group.rb
|
553
555
|
- spec/dummy/app/models/group_membership.rb
|
556
|
+
- spec/dummy/app/models/learning_outcome.rb
|
554
557
|
- spec/dummy/app/models/pseudonym.rb
|
555
558
|
- spec/dummy/app/models/role.rb
|
556
559
|
- spec/dummy/app/models/section.rb
|
@@ -620,6 +623,7 @@ files:
|
|
620
623
|
- spec/dummy/db/migrate/20210907233330_create_grading_periods.rb
|
621
624
|
- spec/dummy/db/migrate/20211001184920_create_grading_period_groups.rb
|
622
625
|
- spec/dummy/db/migrate/20220308072643_create_content_migrations.rb
|
626
|
+
- spec/dummy/db/migrate/20220712210559_create_learning_outcomes.rb
|
623
627
|
- spec/dummy/db/schema.rb
|
624
628
|
- spec/dummy/log/development.log
|
625
629
|
- spec/dummy/log/test.log
|
@@ -671,6 +675,7 @@ files:
|
|
671
675
|
- spec/support/fixtures/reports/grading_periods.csv
|
672
676
|
- spec/support/fixtures/reports/group_memberships.csv
|
673
677
|
- spec/support/fixtures/reports/groups.csv
|
678
|
+
- spec/support/fixtures/reports/learning_outcomes.csv
|
674
679
|
- spec/support/fixtures/reports/provisioning_csv
|
675
680
|
- spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
|
676
681
|
- spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
|
@@ -697,7 +702,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
697
702
|
- !ruby/object:Gem::Version
|
698
703
|
version: '0'
|
699
704
|
requirements: []
|
700
|
-
rubygems_version: 3.
|
705
|
+
rubygems_version: 3.1.6
|
701
706
|
signing_key:
|
702
707
|
specification_version: 4
|
703
708
|
summary: Gem for generating Canvas models and migrations and syncing data from Canvas
|
@@ -759,6 +764,7 @@ test_files:
|
|
759
764
|
- spec/dummy/app/models/grading_period_group.rb
|
760
765
|
- spec/dummy/app/models/group.rb
|
761
766
|
- spec/dummy/app/models/group_membership.rb
|
767
|
+
- spec/dummy/app/models/learning_outcome.rb
|
762
768
|
- spec/dummy/app/models/pseudonym.rb
|
763
769
|
- spec/dummy/app/models/role.rb
|
764
770
|
- spec/dummy/app/models/section.rb
|
@@ -828,6 +834,7 @@ test_files:
|
|
828
834
|
- spec/dummy/db/migrate/20210907233330_create_grading_periods.rb
|
829
835
|
- spec/dummy/db/migrate/20211001184920_create_grading_period_groups.rb
|
830
836
|
- spec/dummy/db/migrate/20220308072643_create_content_migrations.rb
|
837
|
+
- spec/dummy/db/migrate/20220712210559_create_learning_outcomes.rb
|
831
838
|
- spec/dummy/db/schema.rb
|
832
839
|
- spec/dummy/log/development.log
|
833
840
|
- spec/dummy/log/test.log
|
@@ -879,6 +886,7 @@ test_files:
|
|
879
886
|
- spec/support/fixtures/reports/grading_periods.csv
|
880
887
|
- spec/support/fixtures/reports/group_memberships.csv
|
881
888
|
- spec/support/fixtures/reports/groups.csv
|
889
|
+
- spec/support/fixtures/reports/learning_outcomes.csv
|
882
890
|
- spec/support/fixtures/reports/provisioning_csv
|
883
891
|
- spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
|
884
892
|
- spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
|