canvas_sync 0.1.8 → 0.2.0

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
  SHA1:
3
- metadata.gz: 450c9dd5440a29b40915b904cbbbe5eeeeff1c5d
4
- data.tar.gz: 76035ff5b19e381ff046e6a57eec80943bb43254
3
+ metadata.gz: 73fb470e4beeaee615dcf4cdb7170c973a2f9edb
4
+ data.tar.gz: df158059b78f81df04576230dee55e6bc230b755
5
5
  SHA512:
6
- metadata.gz: eabefd522ae7150d7e9d5774440670fc647084ebad7786d3bd1b57dee0025d7a77607ffc923e16d76969986f29c6c47957042d3cf8873713676f284ac78d0aa0
7
- data.tar.gz: 202029add66cc446630ba15c2a5816adbcdd2971085532d977e8cce40f365c5678d636833c9dd137b667bc18d27d25201d48da3b1ce7bb05f8c92b6003c8aee7
6
+ metadata.gz: 2af3c510be69d2432e57f21789b2cb2ca3dcdc61c7fa6b3b3d7d31fb67b00d4e45527bc0ca2eb9ee73c12764581676ca8b1cd2faf2adbae12f8155d404692c25
7
+ data.tar.gz: 174b2272acc70ffa36f2be27192fa366afcb9f18940bafda33d4ba8d8780ea24bdd72663ea1a28ece5dbc5dd88e8f2786e7baaab3d670ff7c0e8d964fd6954ad
data/README.md CHANGED
@@ -54,13 +54,13 @@ end
54
54
  Once that's done and you've used the generator to create your models and migrations you can run the standard provisioning sync:
55
55
 
56
56
  ```ruby
57
- CanvasSync.provisioning_sync(<array of models to sync>, <optional term scope>)
57
+ CanvasSync.provisioning_sync(<array of models to sync>, term_scope: <optional term scope>)
58
58
  ```
59
59
 
60
60
  Example:
61
61
 
62
62
  ```ruby
63
- CanvasSync.provisioning_sync(['users', 'courses'], :active)
63
+ CanvasSync.provisioning_sync(['users', 'courses'], term_scope: :active)
64
64
  ```
65
65
 
66
66
  This will kick off a string of jobs to sync your specified models.
@@ -69,6 +69,16 @@ If you pass in the optional `term_scope` the provisioning reports will be run fo
69
69
 
70
70
  Imports are inserted in bulk with [https://github.com/zdennis/activerecord-import](activerecord-import) so they should be very fast.
71
71
 
72
+ ## Legacy Support
73
+
74
+ If you have an old style tool that needs to sync data on a row by row basis, you can pass in the `legacy_support: true` option. In order for this to work, your models must have a `create_or_update_from_csv` class method defined that accepts a row argument. This method will get passed each row from the CSV, and it's up to you to persist it.
75
+
76
+ Example:
77
+
78
+ ```ruby
79
+ CanvasSync.provisioning_sync(['users', 'courses'], term_scope: :active, legacy_support: true)
80
+ ```
81
+
72
82
  ## CanvasSync::JobLog
73
83
 
74
84
  Running the migrations will create a `canvas_sync_job_logs` table. All the jobs written in this gem will create a `CanvasSync::JobLog` and store data about their arguments, job class, any exceptions, and start/completion time. This will work regardless of your queue adapter.
@@ -200,7 +210,7 @@ When adding to or updating this gem, make sure you do the following:
200
210
 
201
211
  ## TODO
202
212
 
203
- Currently in a pre-alpha like state.
204
-
205
- - Add better support for parallel job execution with job dependencies
206
- - Add some sort of `JobLog` model for tracking parallel execution and job metadata
213
+ - Rethink how options are passed around. The current strategy of having "global_options" and per job options works
214
+ decently, but can be confusing. The difficulty is representing the options in a way that is easily serializable
215
+ by the queue adaptor and easily passed around.
216
+ - Add support for defining "mappings" if your models don't match up with what CanvasSync expects.
@@ -1,4 +1,4 @@
1
- class CreateCanvasSyncJobLog < ActiveRecord::Migration[5.1]
1
+ class CreateCanvasSyncJobLog < ActiveRecord::Migration[Rails.version.to_f]
2
2
  def change
3
3
  create_table :canvas_sync_job_logs do |t|
4
4
  t.datetime :started_at
@@ -26,9 +26,14 @@ module CanvasSync
26
26
  # must be one of SUPPORTED_MODELS
27
27
  # @param term_scope [Symbol, nil] An optional symbol representing a scope that exists on the Term model.
28
28
  # The provisioning report will be run for each of the terms contained in that scope.
29
- def self.provisioning_sync(models, term_scope=nil)
29
+ # @param legacy_support [Boolean, false] This enables legacy_support, where rows are not bulk inserted.
30
+ # For this to work your models must have a `create_or_udpate_from_csv` class method that takes a row
31
+ # and inserts it into the database.
32
+ # @param account_id [Integer, nil] This optional parameter can be used if your Term creation and
33
+ # canvas_sync_client methods require an account ID.
34
+ def self.provisioning_sync(models, term_scope: nil, legacy_support: false, account_id: nil)
30
35
  validate_models!(models)
31
- invoke_next(default_provisioning_report_chain(models, term_scope))
36
+ invoke_next(default_provisioning_report_chain(models, term_scope, legacy_support, account_id))
32
37
  end
33
38
 
34
39
  # Runs a chain of ordered jobs
@@ -62,10 +67,16 @@ module CanvasSync
62
67
  #
63
68
  # @param models [Array<String>]
64
69
  # @param term_scope [String]
70
+ # @param legacy_support [Boolean, false] This enables legacy_support, where rows are not bulk inserted.
71
+ # For this to work your models must have a `create_or_udpate_from_csv` class method that takes a row
72
+ # and inserts it into the database.
73
+ # @param account_id [Integer, nil] This optional parameter can be used if your Term creation and
74
+ # canvas_sync_client methods require an account ID.
65
75
  # @return [Hash]
66
- def self.default_provisioning_report_chain(models, term_scope=nil)
76
+ def self.default_provisioning_report_chain(models, term_scope=nil, legacy_support=false, account_id=nil)
67
77
  term_scope = term_scope.to_s if term_scope
68
78
 
79
+
69
80
  # Always sync Terms first
70
81
  jobs = [{ job: CanvasSync::Jobs::SyncTermsJob.to_s, options: {} }]
71
82
 
@@ -77,7 +88,22 @@ module CanvasSync
77
88
 
78
89
  jobs.push({ job: CanvasSync::Jobs::SyncProvisioningReportJob.to_s, options: { term_scope: term_scope, models: models } })
79
90
 
80
- { jobs: jobs, options: {} }
91
+ global_options = { legacy_support: legacy_support }
92
+ global_options[:account_id] = account_id if account_id.present?
93
+
94
+ { jobs: jobs, global_options: global_options }
95
+ end
96
+
97
+ # Calls the canvas_sync_client in your app. If you have specified an account
98
+ # ID when starting the job it will pass the account ID to your canvas_sync_client method.
99
+ #
100
+ # @param options [Hash]
101
+ def self.get_canvas_sync_client(options)
102
+ if options[:account_id]
103
+ canvas_sync_client(options[:account_id])
104
+ else
105
+ canvas_sync_client
106
+ end
81
107
  end
82
108
 
83
109
  private
@@ -0,0 +1,17 @@
1
+ module CanvasSync
2
+ module Importers
3
+ class LegacyImporter
4
+ # Does a legacy style import, row by row. This will be invoked if you passed
5
+ # "legacy_support: true" when starting the sync. For this to work your models
6
+ # must have a `create_or_update_from_csv` class method defined.
7
+ #
8
+ # @param report_file_path [String]
9
+ # @param klass [Object]
10
+ def self.import(report_file_path, klass, account_id)
11
+ CSV.foreach(report_file_path, headers: true, header_converters: :symbol) do |row|
12
+ klass.create_or_update_from_csv(row, account_id)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -11,7 +11,7 @@ module CanvasSync
11
11
  # @param options [Hash] hash of options that will be passed to the job processor
12
12
  # @return [nil]
13
13
  def perform(job_chain, report_name, report_id, processor, options)
14
- report_status = canvas_sync_client.report_status('self', report_name, report_id)
14
+ report_status = CanvasSync.get_canvas_sync_client(job_chain[:global_options]).report_status('self', report_name, report_id)
15
15
 
16
16
  case report_status['status'].downcase
17
17
  when 'complete'
@@ -14,6 +14,10 @@ module CanvasSync
14
14
  # @return [nil]
15
15
  def perform(job_chain, report_name, report_url, processor, options)
16
16
  download(report_name, report_url) do |file_path|
17
+ options = options.merge({
18
+ legacy_support: job_chain[:global_options][:legacy_support],
19
+ account_id: job_chain[:global_options][:account_id]
20
+ })
17
21
  processor.constantize.process(file_path, options)
18
22
  end
19
23
 
@@ -9,7 +9,7 @@ module CanvasSync
9
9
  # @param options [Hash] hash of options that will be passed to the job processor
10
10
  # @return [nil]
11
11
  def perform(job_chain, report_name, report_params, processor, options)
12
- report = canvas_sync_client.start_report('self', report_name, report_params)
12
+ report = CanvasSync.get_canvas_sync_client(job_chain[:global_options]).start_report('self', report_name, report_params)
13
13
 
14
14
  CanvasSync::Jobs::ReportChecker.set(wait: report_checker_wait_time).perform_later(
15
15
  job_chain,
@@ -12,7 +12,7 @@ module CanvasSync
12
12
  # Deep copy the job_chain so each report gets the correct term id passed into
13
13
  # its options with no side effects
14
14
  duped_job_chain = Marshal.load(Marshal.dump(job_chain))
15
- duped_job_chain[:options][:canvas_term_id] = term.canvas_term_id
15
+ duped_job_chain[:global_options][:canvas_term_id] = term.canvas_term_id
16
16
  start_report(report_params(options, term.canvas_term_id), duped_job_chain, options)
17
17
  end
18
18
  else
@@ -8,8 +8,12 @@ module CanvasSync
8
8
  # @param job_chain [Hash]
9
9
  # @param options [Hash]
10
10
  def perform(job_chain, options)
11
- canvas_sync_client.terms('self').all_pages!.each do |term_params|
12
- Term.create_or_update(term_params)
11
+ CanvasSync.get_canvas_sync_client(job_chain[:global_options]).terms('self').all_pages!.each do |term_params|
12
+ if(job_chain[:global_options][:account_id])
13
+ Term.create_or_update(term_params, job_chain[:global_options][:account_id])
14
+ else
15
+ Term.create_or_update(term_params)
16
+ end
13
17
  end
14
18
 
15
19
  CanvasSync.invoke_next(job_chain)
@@ -64,20 +64,26 @@ module CanvasSync
64
64
  # @param report_file_path [String]
65
65
  # @param options [Hash]
66
66
  def self.process(report_file_path, options)
67
+ self.new(report_file_path, options)
68
+ end
69
+
70
+ def initialize(report_file_path, options)
71
+ @options = options
72
+
67
73
  if options[:models].length == 1
68
- send("process_#{options[:models][0]}", report_file_path)
74
+ run_import(options[:models][0], report_file_path)
69
75
  else
70
76
  unzipped_file_path = extract(report_file_path)
71
77
  Dir[unzipped_file_path + "/*.csv"].each do |file_path|
72
78
  model_name = file_path.split("/").last.split(".").first
73
- send("process_#{model_name}", file_path)
79
+ run_import(model_name, file_path)
74
80
  end
75
81
  end
76
82
  end
77
83
 
78
84
  private
79
85
 
80
- def self.extract(file_path)
86
+ def extract(file_path)
81
87
  unzipped_file_path = "#{file_path}_unzipped"
82
88
 
83
89
  Zip::File.open(file_path) do |zip_file|
@@ -91,30 +97,50 @@ module CanvasSync
91
97
  unzipped_file_path
92
98
  end
93
99
 
94
- def self.process_users(report_file_path)
100
+ def run_import(model_name, report_file_path)
101
+ if @options[:legacy_support]
102
+ CanvasSync::Importers::LegacyImporter.import(report_file_path, model_name.singularize.capitalize.constantize, @options[:account_id])
103
+ else
104
+ send("bulk_process_#{model_name}", report_file_path)
105
+ end
106
+ end
107
+
108
+ def bulk_process_users(report_file_path)
95
109
  CanvasSync::Importers::BulkImporter.import(
96
110
  report_file_path,
97
111
  USERS_CSV_MAPPING,
98
112
  User,
99
113
  :canvas_user_id,
100
- true)
114
+ true
115
+ )
101
116
  end
102
117
 
103
- def self.process_courses(report_file_path)
104
- CanvasSync::Importers::BulkImporter.import(report_file_path, COURSES_CSV_MAPPING, Course, :canvas_course_id)
118
+ def bulk_process_courses(report_file_path)
119
+ CanvasSync::Importers::BulkImporter.import(
120
+ report_file_path,
121
+ COURSES_CSV_MAPPING,
122
+ Course,
123
+ :canvas_course_id
124
+ )
105
125
  end
106
126
 
107
- def self.process_enrollments(report_file_path)
127
+ def bulk_process_enrollments(report_file_path)
108
128
  CanvasSync::Importers::BulkImporter.import(
109
129
  report_file_path,
110
130
  ENROLLMENTS_CSV_MAPPING,
111
131
  Enrollment,
112
132
  :canvas_enrollment_id,
113
- true)
133
+ true
134
+ )
114
135
  end
115
136
 
116
- def self.process_sections(report_file_path)
117
- CanvasSync::Importers::BulkImporter.import(report_file_path, SECTIONS_CSV_MAPPING, Section, :canvas_section_id)
137
+ def bulk_process_sections(report_file_path)
138
+ CanvasSync::Importers::BulkImporter.import(
139
+ report_file_path,
140
+ SECTIONS_CSV_MAPPING,
141
+ Section,
142
+ :canvas_section_id
143
+ )
118
144
  end
119
145
  end
120
146
  end
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.1.8"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -33,7 +33,7 @@ RSpec.describe CanvasSync do
33
33
  { job: CanvasSync::Jobs::SyncUsersJob.to_s, options: {} },
34
34
  { job: CanvasSync::Jobs::SyncProvisioningReportJob.to_s, options: { term_scope: 'active', models: ['courses'] } }
35
35
  ],
36
- options: {}
36
+ global_options: { legacy_support: false }
37
37
  })
38
38
  end
39
39
  end
@@ -46,7 +46,7 @@ RSpec.describe CanvasSync do
46
46
  { job: CanvasSync::Jobs::SyncTermsJob.to_s, options: {} },
47
47
  { job: CanvasSync::Jobs::SyncProvisioningReportJob.to_s, options: { term_scope: nil, models: ['users', 'courses'] } }
48
48
  ],
49
- options: {}
49
+ global_options: { legacy_support: false }
50
50
  })
51
51
  end
52
52
  end
@@ -5,11 +5,12 @@ RSpec.describe CanvasSync::Jobs::ReportChecker do
5
5
  let(:report_id) { 1 }
6
6
  let(:report_name) { 'provisioning_csv' }
7
7
  let(:processor) { 'FakeProcessor' }
8
+ let(:job_chain) { { jobs: [], global_options: {} } }
8
9
 
9
10
  describe '#perform' do
10
11
  def start_job
11
12
  CanvasSync::Jobs::ReportChecker.perform_now(
12
- [],
13
+ job_chain,
13
14
  'provisioning_csv',
14
15
  report_id,
15
16
  processor,
@@ -24,7 +25,7 @@ RSpec.describe CanvasSync::Jobs::ReportChecker do
24
25
  .and_return({ 'status' => 'complete', 'attachment' => { 'url' => 'blah' } })
25
26
 
26
27
  expect(CanvasSync::Jobs::ReportProcessorJob).to receive(:perform_later)
27
- .with([], report_name, 'blah', processor, {})
28
+ .with(job_chain, report_name, 'blah', processor, {})
28
29
 
29
30
  start_job
30
31
  end
@@ -6,7 +6,7 @@ RSpec.describe CanvasSync::Jobs::ReportProcessorJob do
6
6
  let(:report_name) { 'provisioning_csv' }
7
7
  let(:report_url) { 'https://test.instructure.com/sample_report_download' }
8
8
  let(:processor) { FakeProcessor.to_s }
9
- let(:job_chain) { ['another-job'] }
9
+ let(:job_chain) { { jobs: [], global_options: {} } }
10
10
 
11
11
  describe '#perform' do
12
12
  it 'downloads the report to a file and then calls the process method on the processor, and then invokes the next job' do
@@ -14,7 +14,7 @@ RSpec.describe CanvasSync::Jobs::ReportStarter do
14
14
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
15
15
 
16
16
  CanvasSync::Jobs::ReportStarter.perform_now(
17
- [],
17
+ { jobs: [], global_options: {} },
18
18
  report_name,
19
19
  report_params,
20
20
  processor,
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
4
4
  describe '#perform' do
5
- let(:job_chain) { {jobs: [], options: {}} }
5
+ let(:job_chain) { {jobs: [], global_options: {}} }
6
6
 
7
7
  context 'a term scope is specified' do
8
8
  let!(:active_term_1) { FactoryGirl.create(:term) }
@@ -11,7 +11,7 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
11
11
 
12
12
  it 'enqueues a ReportStarter for a provisioning report for the specified models for each term' do
13
13
  expected_job_chain = Marshal.load(Marshal.dump(job_chain))
14
- expected_job_chain[:options][:canvas_term_id] = active_term_1.canvas_term_id
14
+ expected_job_chain[:global_options][:canvas_term_id] = active_term_1.canvas_term_id
15
15
 
16
16
  expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
17
17
  .with(
@@ -28,7 +28,7 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
28
28
  )
29
29
 
30
30
  expected_job_chain_2 = Marshal.load(Marshal.dump(job_chain))
31
- expected_job_chain_2[:options][:canvas_term_id] = active_term_2.canvas_term_id
31
+ expected_job_chain_2[:global_options][:canvas_term_id] = active_term_2.canvas_term_id
32
32
 
33
33
  expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
34
34
  .with(
@@ -3,12 +3,13 @@ require 'spec_helper'
3
3
  RSpec.describe CanvasSync::Jobs::SyncTermsJob do
4
4
  describe '#perform' do
5
5
  let(:term_params) { open_canvas_fixture('terms')['enrollment_terms'] }
6
+ let(:job_chain) { { jobs: [], global_options: {}} }
6
7
 
7
8
  it 'retrieves all terms from the Canvas API and then invokes the next job' do
8
- expect(CanvasSync).to receive(:invoke_next).with([])
9
+ expect(CanvasSync).to receive(:invoke_next).with(job_chain)
9
10
 
10
11
  expect {
11
- CanvasSync::Jobs::SyncTermsJob.perform_now([], {})
12
+ CanvasSync::Jobs::SyncTermsJob.perform_now(job_chain, {})
12
13
  }.to change { Term.count }.by(term_params.length)
13
14
  end
14
15
  end
@@ -9,7 +9,7 @@ RSpec.describe CanvasSync::Jobs::SyncUsersJob do
9
9
 
10
10
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
11
11
 
12
- CanvasSync::Jobs::SyncUsersJob.perform_now([], {})
12
+ CanvasSync::Jobs::SyncUsersJob.perform_now({ jobs: [], global_options: {}}, {})
13
13
  end
14
14
  end
15
15
  end
@@ -37,5 +37,12 @@ RSpec.describe CanvasSync::Processors::ProvisioningReportProcessor do
37
37
  expect(Course.count).to eq(course_count + 2)
38
38
  end
39
39
  end
40
+
41
+ context 'legacy_support is true' do
42
+ it 'uses the LegacyImporter' do
43
+ expect(User).to receive(:create_or_update_from_csv).at_least(:once)
44
+ subject.process('spec/support/fixtures/reports/users.csv', { models: ['users'], legacy_support: true })
45
+ end
46
+ end
40
47
  end
41
48
  end
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.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Collings
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-19 00:00:00.000000000 Z
11
+ date: 2017-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 5.1.0
229
+ version: '4'
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
- version: 5.1.0
236
+ version: '4'
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: bearcat
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -301,6 +301,7 @@ files:
301
301
  - lib/canvas_sync/generators/templates/term.rb
302
302
  - lib/canvas_sync/generators/templates/user.rb
303
303
  - lib/canvas_sync/importers/bulk_importer.rb
304
+ - lib/canvas_sync/importers/legacy_importer.rb
304
305
  - lib/canvas_sync/job.rb
305
306
  - lib/canvas_sync/jobs/report_checker.rb
306
307
  - lib/canvas_sync/jobs/report_processor_job.rb
@@ -345,16 +346,12 @@ files:
345
346
  - spec/dummy/config/initializers/wrap_parameters.rb
346
347
  - spec/dummy/config/routes.rb
347
348
  - spec/dummy/config/secrets.yml
348
- - spec/dummy/db/development.sqlite3
349
349
  - spec/dummy/db/migrate/20170905192509_create_enrollments.rb
350
350
  - spec/dummy/db/migrate/20170906193506_create_terms.rb
351
351
  - spec/dummy/db/migrate/20170906203438_create_sections.rb
352
352
  - spec/dummy/db/migrate/20170914181345_create_courses.rb
353
353
  - spec/dummy/db/migrate/20170918221413_create_users.rb
354
354
  - spec/dummy/db/schema.rb
355
- - spec/dummy/db/test.sqlite3
356
- - spec/dummy/log/development.log
357
- - spec/dummy/log/test.log
358
355
  - spec/factories/course_factory.rb
359
356
  - spec/factories/enrollment_factory.rb
360
357
  - spec/factories/section_factory.rb
@@ -366,8 +363,6 @@ files:
366
363
  - spec/support/fixtures/reports/courses.csv
367
364
  - spec/support/fixtures/reports/enrollments.csv
368
365
  - spec/support/fixtures/reports/provisioning_csv
369
- - spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
370
- - spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
371
366
  - spec/support/fixtures/reports/sections.csv
372
367
  - spec/support/fixtures/reports/users.csv
373
368
  homepage: https://instructure.com
@@ -429,16 +424,12 @@ test_files:
429
424
  - spec/dummy/config/initializers/wrap_parameters.rb
430
425
  - spec/dummy/config/routes.rb
431
426
  - spec/dummy/config/secrets.yml
432
- - spec/dummy/db/development.sqlite3
433
427
  - spec/dummy/db/migrate/20170905192509_create_enrollments.rb
434
428
  - spec/dummy/db/migrate/20170906193506_create_terms.rb
435
429
  - spec/dummy/db/migrate/20170906203438_create_sections.rb
436
430
  - spec/dummy/db/migrate/20170914181345_create_courses.rb
437
431
  - spec/dummy/db/migrate/20170918221413_create_users.rb
438
432
  - spec/dummy/db/schema.rb
439
- - spec/dummy/db/test.sqlite3
440
- - spec/dummy/log/development.log
441
- - spec/dummy/log/test.log
442
433
  - spec/factories/course_factory.rb
443
434
  - spec/factories/enrollment_factory.rb
444
435
  - spec/factories/section_factory.rb
@@ -450,7 +441,5 @@ test_files:
450
441
  - spec/support/fixtures/reports/courses.csv
451
442
  - spec/support/fixtures/reports/enrollments.csv
452
443
  - spec/support/fixtures/reports/provisioning_csv
453
- - spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv
454
- - spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv
455
444
  - spec/support/fixtures/reports/sections.csv
456
445
  - spec/support/fixtures/reports/users.csv