canvas_sync 0.17.32 → 0.17.35
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/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
|