bearcat 1.3.2 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6025f318168d2b515c2e86bd4ab95210e11ad82e
4
- data.tar.gz: 99b3c3f6ac3fe8277285549eea3f918d3a5322b1
3
+ metadata.gz: 244cd4a8f9e8a9996c2b0d0f4c98b2dc80bf9b64
4
+ data.tar.gz: 5d081d0e5c5eb3734439d25ac3f89ee4523fb80a
5
5
  SHA512:
6
- metadata.gz: c79145ea7bc176eff1a2fccc6160f182fff30db7f1cd1760d9c756f2965090d22c64efc063aae26b3be631cc59d49406e8716f9c5621977790d7df303615489c
7
- data.tar.gz: a726db6b0147a51d530f2f9030e2f8a34531f449d43bdf0f7b8b4d28edff6c4c753be4c47fb966fa023e8a385df4023371a66d1a6da2e32fe2ff85141e84cb46
6
+ metadata.gz: d933adc2b8cf295b326b595697b27403b0768c4a2e1690ccfb091c2717897e9c75cf25fbafd8168b702f3c3c84e76a3e57ad09f8abaf4cca8c70d363787894a5
7
+ data.tar.gz: d8c701f1f5f65c9d7741d343108453ce61ebd09e20cb5f4c38b59000e493dbbf7521590313ef7e6e0a42ec55e6aa11dabb3f9e117ead2fdbdfc38cd48b97c83a
@@ -1,3 +1,5 @@
1
+ require 'csv'
2
+
1
3
  module Bearcat
2
4
  class Client < Footrest::Client
3
5
  module Reports
@@ -22,6 +24,35 @@ module Bearcat
22
24
  delete("/api/v1/accounts/#{account}/reports/#{report_name}/#{report_id}")
23
25
  end
24
26
 
27
+ def download_report(url, save_location=nil)
28
+ #This method takes the verified URL returned in a Canvas report (attachment['url']), and if
29
+ #a save_location is included, it will download it in chunks to the disk to save memory. You
30
+ #can also download the report to memory if you do not include a save location.
31
+ attempts = 0
32
+ begin
33
+ uri = URI.parse(url)
34
+ http = Net::HTTP.new(uri.host, uri.port)
35
+ http.use_ssl = true if url.start_with?('https')
36
+ response = http.head(uri.to_s)
37
+ url = response['Location']
38
+ attempts += 1
39
+ end while attempts <= 5 && (response.code == '301' || response.code == '302' || response.code == '307')
40
+ http = Net::HTTP.new(uri.host, uri.port)
41
+ http.use_ssl = true if uri.to_s.start_with?('https')
42
+ if save_location
43
+ File.open(save_location, 'wb') do |file|
44
+ http.request_get(uri.to_s) do |resp|
45
+ resp.read_body do |segment|
46
+ file.write(segment)
47
+ end
48
+ end
49
+ end
50
+ else
51
+ response = http.request_get(uri.to_s)
52
+ CSV.parse(response.read_body, headers: true)
53
+ end
54
+ end
55
+
25
56
  end
26
57
  end
27
- end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Bearcat
2
- VERSION = '1.3.2' unless defined?(Bearcat::VERSION)
2
+ VERSION = '1.3.3' unless defined?(Bearcat::VERSION)
3
3
  end
@@ -5,16 +5,18 @@ describe Bearcat::Client::ContentMigrations do
5
5
  @client = Bearcat::Client.new(prefix: "http://canvas.instructure.com", token: "test_token")
6
6
  end
7
7
 
8
- it 'uploads a file' do
9
- stub_post(@client, "my/upload/path").
10
- with(:body => {"name" => "cc.imscc", "size" => "2034"}).
11
- to_return(json_response('content_migrations', 'upload_success.json'))
8
+ it 'uploads a file' do
9
+ stub_post(@client, "/my/upload/path").
10
+ to_return(json_response('content_migration_files/response.json'))
12
11
 
13
- stub_request(:post, "https://upload-url.invalid/").
14
- to_return(status: 302, headers: {'Location' => 'https://confirm-upload.invalid/confirm?param=true'})
12
+ stub_request(:post, "http://host/files_api").
13
+ to_return(status: 302, headers: {'Location' => 'https://confirm-upload.invalid/confirm?param=true'})
15
14
 
16
- response = @client.upload_content_package('my/upload/path', fixture('cc.imscc'))
17
- expect(response['id']).to eq 293
18
- end
15
+ stub_post(@client, '/confirm').to_return(json_response('content_migration_files/upload_success.json'))
16
+
17
+ opts = {migration_type: 'canvas_cartridge_importer', pre_attachment: {name: 'cc.imscc', size: '2034'}}
18
+ response = @client.upload_content_package('my/upload/path', fixture('cc.imscc'), opts)
19
+ expect(response['id']).to eq 293
20
+ end
19
21
 
20
22
  end
@@ -36,7 +36,7 @@ describe Bearcat::Client::Quizzes do
36
36
  end
37
37
 
38
38
  it 'returns a quiz assignment override' do
39
- stub_post(@client, "/api/v1/courses/1/quizzes/assignment_overrides").to_return(json_response("quizzes/quiz_assignment_override.json"))
39
+ stub_get(@client, "/api/v1/courses/1/quizzes/assignment_overrides?quiz_assignment_overrides%5B%5D%5Bquiz_ids%5D=13").to_return(json_response("quizzes/quiz_assignment_override.json"))
40
40
  quiz_overrides = @client.quiz_assignment_overrides('1',{:quiz_assignment_overrides => [{ :quiz_ids => 13 }] })
41
41
  quiz_overrides.class.should eq(Hash)
42
42
  quiz_overrides['quiz_assignment_overrides'].first['quiz_id'].should eq(1014)
@@ -35,4 +35,43 @@ describe Bearcat::Client::Reports do
35
35
  status['report'] == 'last_user_access_csv'
36
36
  end
37
37
 
38
- end
38
+ context '#download_report' do
39
+ it 'downloads a report to memory' do
40
+ report = IO.read(fixture('file.csv'))
41
+ stub_request(:head, 'https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string').to_return(status: 200, body: report)
42
+ stub_request(:get, 'https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string').to_return(status: 200, body: report)
43
+ csv = @client.download_report('https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string')
44
+ expect(csv.count).to eq 4
45
+ expect(csv.first.fields).to eq ['132',nil,'Alg202CR','Algebra 2 Semester 2 Credit Recovery','11',nil,'1',nil,'unpublished',nil,nil,'false']
46
+ end
47
+
48
+ it 'downloads a report to disk' do
49
+ report = IO.read(fixture('file.csv'))
50
+ tempfile = Tempfile.new('report')
51
+ stub_request(:head, 'https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string').to_return(status: 200, body: report)
52
+ stub_request(:get,'https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string').to_return(status: 200, body: report)
53
+ @client.download_report('https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string', tempfile)
54
+ csv = CSV.read(tempfile, headers: true)
55
+ expect(csv.count).to eq 4
56
+ expect(csv.first.fields).to eq ['132',nil,'Alg202CR','Algebra 2 Semester 2 Credit Recovery','11',nil,'1',nil,'unpublished',nil,nil,'false']
57
+ end
58
+
59
+ it 'follows redirects' do
60
+ report = IO.read(fixture('file.csv'))
61
+ tempfile = Tempfile.new('report')
62
+ stub_request(:head, 'https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string')
63
+ .to_return(status: 302, body: 'You are being redirected',headers: {'Location' => 'https://cluster1-files.instructure.com/files/1/download?download_frd=1&sf_verifier=verifier=1478139862&user_id=1&verifier=verifier'})
64
+ stub_request(:head, 'https://cluster1-files.instructure.com/files/1/download?download_frd=1&sf_verifier=verifier=1478139862&user_id=1&verifier=verifier')
65
+ .to_return(status: 302, body: 'You are being redirected', headers: {'Location' => 'https://instructure-uploads.s3.amazonaws.com/account_1/attachments/1/assignment_submission.csv'})
66
+ stub_request(:head, 'https://instructure-uploads.s3.amazonaws.com/account_1/attachments/1/assignment_submission.csv')
67
+ .to_return(status: 200)
68
+ stub_request(:get, 'https://instructure-uploads.s3.amazonaws.com/account_1/attachments/1/assignment_submission.csv')
69
+ .to_return(status: 200, body: report)
70
+ @client.download_report('https://canvas.instructure.com/files/1/download?download_frd=1&verifier=string', tempfile)
71
+ csv = CSV.read(tempfile, headers: true)
72
+ expect(csv.count).to eq 4
73
+ expect(csv.first.fields).to eq ['132',nil,'Alg202CR','Algebra 2 Semester 2 Credit Recovery','11',nil,'1',nil,'unpublished',nil,nil,'false']
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,42 @@
1
+ [
2
+ {
3
+ "id": 1,
4
+ "name": "2010",
5
+ "max_membership": null,
6
+ "is_public": false,
7
+ "join_level": "invitation_only",
8
+ "group_category_id": 22446,
9
+ "description": null,
10
+ "members_count": 7,
11
+ "storage_quota_mb": 50,
12
+ "context_type": "Account",
13
+ "account_id": 97006,
14
+ "avatar_url": null,
15
+ "role": null,
16
+ "leader": null,
17
+ "sis_group_id": null,
18
+ "sis_import_id": null,
19
+ "has_submission": false,
20
+ "concluded": false
21
+ },
22
+ {
23
+ "id": 3,
24
+ "name": "UI Test Groups",
25
+ "max_membership": null,
26
+ "is_public": false,
27
+ "join_level": "invitation_only",
28
+ "group_category_id": 13091,
29
+ "description": null,
30
+ "members_count": 6,
31
+ "storage_quota_mb": 50,
32
+ "context_type": "Account",
33
+ "account_id": 97006,
34
+ "avatar_url": null,
35
+ "role": null,
36
+ "leader": null,
37
+ "sis_group_id": null,
38
+ "sis_import_id": null,
39
+ "has_submission": false,
40
+ "concluded": false
41
+ }
42
+ ]
@@ -0,0 +1,5 @@
1
+ canvas_course_id,course_id,short_name,long_name,canvas_account_id,account_id,canvas_term_id,term_id,status,start_date,end_date,created_by_sis
2
+ 132,,Alg202CR,Algebra 2 Semester 2 Credit Recovery,11,,1,,unpublished,,,false
3
+ 78,,mark,mark alsdorf,3,,1,,unpublished,,,false
4
+ 64,,PhySci102standard,Physical Science 1 Semester 2 Standard,6,,1,,deleted,,,false
5
+ 37,,A2,Algebra 2,9,,1,,unpublished,,,false
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bearcat
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Mills, Jake Sorce
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-10 00:00:00.000000000 Z
11
+ date: 2016-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -173,6 +173,7 @@ files:
173
173
  - spec/fixtures/account_admins.json
174
174
  - spec/fixtures/account_courses.json
175
175
  - spec/fixtures/account_grading_standards.json
176
+ - spec/fixtures/account_groups.json
176
177
  - spec/fixtures/account_reports.json
177
178
  - spec/fixtures/account_reports_index.json
178
179
  - spec/fixtures/account_reports_result_success.json
@@ -234,6 +235,7 @@ files:
234
235
  - spec/fixtures/edited_group_category.json
235
236
  - spec/fixtures/enroll_student.json
236
237
  - spec/fixtures/enrollment_terms.json
238
+ - spec/fixtures/file.csv
237
239
  - spec/fixtures/gradebook_history.json
238
240
  - spec/fixtures/group.json
239
241
  - spec/fixtures/group_categories.json
@@ -338,6 +340,7 @@ test_files:
338
340
  - spec/fixtures/account_admins.json
339
341
  - spec/fixtures/account_courses.json
340
342
  - spec/fixtures/account_grading_standards.json
343
+ - spec/fixtures/account_groups.json
341
344
  - spec/fixtures/account_reports.json
342
345
  - spec/fixtures/account_reports_index.json
343
346
  - spec/fixtures/account_reports_result_success.json
@@ -399,6 +402,7 @@ test_files:
399
402
  - spec/fixtures/edited_group_category.json
400
403
  - spec/fixtures/enroll_student.json
401
404
  - spec/fixtures/enrollment_terms.json
405
+ - spec/fixtures/file.csv
402
406
  - spec/fixtures/gradebook_history.json
403
407
  - spec/fixtures/group.json
404
408
  - spec/fixtures/group_categories.json