bridge_api 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 15c3b894f06ca9f65f91b19eb4cde98f2ef5c570
4
+ data.tar.gz: a369351fe7d85428b9a6fe90f71fc72b076bc962
5
+ SHA512:
6
+ metadata.gz: 37eccbf695ba29433e660db1c93a516d1eb57ffecf41a9f0d05f89489597d04456bb2757e2709725ebbeca086f5263f6f9f328dce1c8ee44e773867b5b3e875a
7
+ data.tar.gz: b9c5fe4cf15c271badb1a3ca210fff894cb0648f7a8300835675870bd5e19c663a43abb1f3a18885648e39bf32f604af8e8b0e5385006a9e047719d79cb9ed68
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+
2
+ /.*.iml
3
+ .idea/
4
+ bridge_api.iml
5
+ .byebug.*
6
+
7
+ .*.gem
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'bridge_api/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ["Jay Shaffer"]
7
+ gem.email = ["jshaffer@instructure.com"]
8
+ gem.description = %q{Ruby gem for interacting with the bridge API}
9
+ gem.summary = %q{Bridge API}
10
+ gem.homepage = "https://getbridge.com"
11
+ gem.license = 'MIT'
12
+
13
+ gem.files = `git ls-files`.split("\n")
14
+ gem.files += Dir.glob("lib/**/*.rb")
15
+ gem.files += Dir.glob("spec/**/*")
16
+ gem.test_files = Dir.glob("spec/**/*")
17
+ gem.name = "bridge_api"
18
+ gem.require_paths = ["lib"]
19
+ gem.version = BridgeAPI::VERSION
20
+
21
+ gem.add_development_dependency 'rake', '~> 0'
22
+ gem.add_development_dependency 'bundler', '~> 1.0', '>= 1.0.0'
23
+ gem.add_development_dependency 'rspec', '~> 2.6'
24
+ gem.add_development_dependency 'webmock', '~> 0'
25
+ gem.add_development_dependency 'pry', '~> 0'
26
+ gem.add_development_dependency 'tilt', '>= 1.3.4', '~> 1.3'
27
+
28
+ gem.add_dependency 'footrest', '~> 0.2', '>= 0.2.2'
29
+
30
+ end
data/lib/bridge_api.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'bridge_api/version'
2
+ require 'bridge_api/client'
@@ -0,0 +1,122 @@
1
+
2
+ module BridgeAPI
3
+ class ApiArray
4
+ include Enumerable
5
+
6
+ @next_page = nil
7
+ @prev_page = nil
8
+
9
+ META_FIELDS = %w(meta linked).freeze
10
+
11
+ attr_reader :status, :headers, :members
12
+
13
+ def self.process_response(response, api_client)
14
+ ApiArray.new(response, api_client)
15
+ end
16
+
17
+ def initialize(response, api_client)
18
+ @api_client = api_client
19
+ case response.status
20
+ when 200..206
21
+ apply_response_metadata(response)
22
+ @members = get_response_content(response)
23
+ end
24
+ end
25
+
26
+ def length
27
+ @members.length
28
+ end
29
+
30
+ def [](i)
31
+ @members[i]
32
+ end
33
+
34
+ def last
35
+ @members.last
36
+ end
37
+
38
+ def each(&block)
39
+ @members.each { |member| block.call(member) }
40
+ end
41
+
42
+ def pages?
43
+ !@next_page.nil?
44
+ end
45
+
46
+ def next_page
47
+ load_page(@next_page)
48
+ end
49
+
50
+ def each_page(&block)
51
+ block.call(@members)
52
+ while @next_page
53
+ response = get_page(@next_page)
54
+ apply_response_metadata(response)
55
+ block.call(@members)
56
+ end
57
+ @link_hash = {}
58
+ end
59
+
60
+ def all_pages!
61
+ if pages?
62
+ response = get_page(@next_page)
63
+ apply_response_metadata(response)
64
+ @members.concat(get_response_content(response))
65
+ while @next_page
66
+ response = get_page(@next_page)
67
+ apply_response_metadata(response)
68
+ @members.concat(get_response_content(response))
69
+ end
70
+ end
71
+ self
72
+ end
73
+
74
+ private
75
+
76
+ def get_page(url, params = {})
77
+ query = URI.parse(url).query
78
+ p = CGI.parse(query).merge(params)
79
+ u = url.gsub("?#{query}", '')
80
+ p.each { |k, v| p[k] = v.first if v.is_a?(Array) }
81
+ @api_client.connection.send(:get) do |r|
82
+ r.url(u, p)
83
+ end
84
+ end
85
+
86
+ def load_page(url)
87
+ response = get_page(url)
88
+ ApiArray.process_response(response, @api_client)
89
+ end
90
+
91
+ def get_response_content(response)
92
+ if response.body.is_a?(Hash)
93
+ content = response.body.reject{|k, v| META_FIELDS.include?(k)}
94
+ if content.length > 0
95
+ return content.values[0]
96
+ end
97
+ end
98
+ []
99
+ end
100
+
101
+ def apply_response_metadata(response)
102
+ @status = response.status
103
+ @headers = response.headers
104
+ @method = response.env[:method]
105
+ init_pages(response)
106
+ end
107
+
108
+ def init_pages(response)
109
+ @next_page = nil
110
+ @prev_page = nil
111
+ if response.body.is_a?(Hash) && response.body.key?('meta')
112
+ if response.body['meta'].key?('next')
113
+ @next_page = response.body['meta']['next']
114
+ end
115
+ if response.body['meta'].key?('prev')
116
+ @prev_page = response.body['meta']['prev']
117
+ end
118
+ end
119
+ end
120
+
121
+ end
122
+ end
@@ -0,0 +1,30 @@
1
+ require 'footrest/client'
2
+
3
+ module BridgeAPI
4
+ class Client < Footrest::Client
5
+
6
+ COURSE_TEMPLATE_PATH = '/course_templates'
7
+ ENROLLMENT_PATH = '/enrollments'
8
+ USER_PATH = '/users'
9
+ ADMIN_PATH = "/admin"
10
+ AUTHOR_PATH = "/author"
11
+ LEARNER_PATH = "/learner"
12
+ API_VERSION = 1
13
+ API_PATH = '/api'
14
+
15
+ require 'bridge_api/api_array'
16
+
17
+ Dir[File.dirname(__FILE__) + '/client/*.rb'].each {|file| require file }
18
+
19
+ include CourseTemplate
20
+ include Enrollment
21
+ include User
22
+
23
+ # Override Footrest request for ApiArray support
24
+ def request(method, &block)
25
+ ApiArray::process_response(connection.send(method, &block), self)
26
+ end
27
+
28
+ end
29
+ end
30
+
@@ -0,0 +1,31 @@
1
+ module BridgeAPI
2
+ class Client
3
+ module CourseTemplate
4
+
5
+ def get_all_course_templates(params = {})
6
+ get("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}", params)
7
+ end
8
+
9
+ def create_course_template(params = {})
10
+ post("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}", params)
11
+ end
12
+
13
+ def delete_course_template(course_template_id, params = {})
14
+ delete("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}", params)
15
+ end
16
+
17
+ def publish_course_template(course_template_id, params = {})
18
+ post("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}/publish", params)
19
+ end
20
+
21
+ def get_course_template(course_template_id, params = {})
22
+ get("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}", params)
23
+ end
24
+
25
+ def update_course_template(course_template_id, params = {})
26
+ put("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}", params)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module BridgeAPI
2
+ class Client
3
+ module Enrollment
4
+
5
+ def add_enrollment(course_template_id, params = {})
6
+ post("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}#{ENROLLMENT_PATH}", params)
7
+ end
8
+
9
+ def delete_enrollment(enrollment_id, params = {})
10
+ delete("#{API_PATH}#{AUTHOR_PATH}#{ENROLLMENT_PATH}/#{enrollment_id}", params)
11
+ end
12
+
13
+ def update_enrollment(enrollment_id, params = {})
14
+ put("#{API_PATH}#{AUTHOR_PATH}#{ENROLLMENT_PATH}/#{enrollment_id}", params)
15
+ end
16
+
17
+ def get_all_enrollments(course_template_id, params = {})
18
+ get("#{API_PATH}#{AUTHOR_PATH}#{COURSE_TEMPLATE_PATH}/#{course_template_id}#{ENROLLMENT_PATH}", params)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ module BridgeAPI
2
+ class Client
3
+ module User
4
+
5
+ def add_user(params = {})
6
+ post("#{API_PATH}#{ADMIN_PATH}#{USER_PATH}", params)
7
+ end
8
+
9
+ def get_user(user_id, params = {})
10
+ get("#{API_PATH}#{AUTHOR_PATH}#{USER_PATH}/#{user_id}", params)
11
+ end
12
+
13
+ def delete_user(user_id, params = {})
14
+ delete("#{API_PATH}#{ADMIN_PATH}#{USER_PATH}/#{user_id}", params)
15
+ end
16
+
17
+ def update_user(user_id, params = {})
18
+ put("#{API_PATH}#{AUTHOR_PATH}#{USER_PATH}/#{user_id}", params)
19
+ end
20
+
21
+ def get_all_users(params = {})
22
+ get("#{API_PATH}#{AUTHOR_PATH}#{USER_PATH}", params)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module BridgeAPI
2
+ VERSION = '0.0.1' unless defined?(BridgeAPI::VERSION)
3
+ end
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+ describe BridgeAPI::Client::CourseTemplate do
4
+
5
+ before do
6
+ @client = BridgeAPI::Client.new(prefix: "http://test.bridge.com", token: "test_token")
7
+ end
8
+
9
+ it 'should get all course templates' do
10
+ templates = @client.get_all_course_templates.all_pages!
11
+ expect(templates.count).to(eq(2))
12
+ expect(templates.first['title']).to(eq('My Test Course'))
13
+ end
14
+
15
+ it 'should create a course template' do
16
+ template = @client.create_course_template
17
+ expect(template.count).to(eq(1))
18
+ expect(template.first['title']).to(eq('My only course'))
19
+ end
20
+
21
+ it 'should delete a course' do
22
+ response = @client.delete_course_template(1)
23
+ expect(response.status).to(eq(204))
24
+ end
25
+
26
+ it 'should publish a course' do
27
+ template = @client.publish_course_template(1)
28
+ expect(template.count).to(eq(1))
29
+ expect(template.first['title']).to(eq('My only course'))
30
+ end
31
+
32
+ it 'should get a single course template' do
33
+ template = @client.get_course_template(1)
34
+ expect(template.count).to(eq(1))
35
+ expect(template.first['title']).to(eq('My only course'))
36
+ end
37
+
38
+ it 'should update a course template' do
39
+ template = @client.update_course_template(1)
40
+ expect(template.count).to(eq(1))
41
+ expect(template.first['title']).to(eq('My only course'))
42
+ end
43
+
44
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ describe BridgeAPI::Client::Enrollment do
4
+
5
+ before do
6
+ @client = BridgeAPI::Client.new(prefix: "http://test.bridge.com", token: "test_token")
7
+ end
8
+
9
+ it 'should add an enrollment' do
10
+ response = @client.add_enrollment(1)
11
+ expect(response.status).to(eq(204))
12
+ end
13
+
14
+ it 'should delete an enrollment' do
15
+ response = @client.delete_enrollment(1)
16
+ expect(response.status).to(eq(204))
17
+
18
+ end
19
+
20
+ it 'should update an enrollment' do
21
+ enrollment = @client.update_enrollment(1)
22
+ expect(enrollment.first['id']).to(eq("3"))
23
+ end
24
+
25
+ it 'should get all enrollments' do
26
+ enrollments = @client.get_all_enrollments(1)
27
+ expect(enrollments.length).to(eq(2))
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ describe BridgeAPI::Client::User do
4
+
5
+ before do
6
+ @client = BridgeAPI::Client.new(prefix: "http://test.bridge.com", token: "test_token")
7
+ end
8
+
9
+ it 'should add an user' do
10
+ response = @client.add_user
11
+ expect(response.first['id']).to(eq("10"))
12
+ end
13
+
14
+ it 'should get a user' do
15
+ response = @client.get_user(1)
16
+ expect(response.first['id']).to(eq("10"))
17
+ end
18
+
19
+ it 'should delete an user' do
20
+ response = @client.delete_user(1)
21
+ expect(response.status).to(eq(204))
22
+ end
23
+
24
+ it 'should update a user' do
25
+ response = @client.update_user(1)
26
+ expect(response.first['id']).to(eq("10"))
27
+ end
28
+
29
+ it 'should get all users' do
30
+ response = @client.get_all_users
31
+ expect(response.length).to(eq(2))
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,23 @@
1
+ {
2
+ "meta": {},
3
+ "course_templates": [
4
+ {
5
+ "id": "1",
6
+ "estimated_time": 1,
7
+ "passing_threshold": 80,
8
+ "title": "My only course",
9
+ "is_published": true,
10
+ "has_unpublished_changes": false,
11
+ "default_days_until_due": 7,
12
+ "has_certificate": false,
13
+ "program_ids": ["3", "4"],
14
+ "external_status": "inapplicable",
15
+ "course_type":"bridge",
16
+ "enrollments_count": 2,
17
+ "next_section_due": "2015-07-07T23:59:59.000Z",
18
+ "links": {
19
+ "author": "1"
20
+ }
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "meta": {},
3
+ "course_templates": [
4
+ {
5
+ "id": "1",
6
+ "estimated_time": 1,
7
+ "passing_threshold": 80,
8
+ "title": "My Test Course",
9
+ "is_published": true,
10
+ "has_unpublished_changes": false,
11
+ "default_days_until_due": 7,
12
+ "has_certificate": false,
13
+ "program_ids": ["3", "4"],
14
+ "external_status": "inapplicable",
15
+ "course_type":"bridge",
16
+ "enrollments_count": 2,
17
+ "next_section_due": "2015-07-07T23:59:59.000Z",
18
+ "links": {
19
+ "author": "1"
20
+ }
21
+ },
22
+ {
23
+ "id": "2",
24
+ "estimated_time": 1,
25
+ "passing_threshold": 80,
26
+ "title": "My second test Course",
27
+ "is_published": true,
28
+ "has_unpublished_changes": false,
29
+ "default_days_until_due": 7,
30
+ "has_certificate": false,
31
+ "program_ids": ["3", "4"],
32
+ "external_status": "inapplicable",
33
+ "course_type":"bridge",
34
+ "enrollments_count": 2,
35
+ "next_section_due": "2015-07-07T23:59:59.000Z",
36
+ "links": {
37
+ "author": "1"
38
+ }
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "meta": {},
3
+ "linked": {
4
+ "course_templates": [
5
+ {
6
+ "id": "2"
7
+ }
8
+ ],
9
+ "learners": [
10
+ {
11
+ "id": "15",
12
+ "name": "John Smith",
13
+ "avatar_url": null,
14
+ "deleted": false
15
+ },
16
+ {
17
+ "id": "11",
18
+ "name": "jshaffer@instructure.com",
19
+ "avatar_url": null,
20
+ "deleted": false
21
+ }
22
+ ]
23
+ },
24
+ "enrollments": [
25
+ {
26
+ "id": "3",
27
+ "course_template": "2",
28
+ "end_at": "2015-12-29T23:59:59.000-07:00",
29
+ "progress": 0,
30
+ "can_be_removed": true,
31
+ "completed_at": null,
32
+ "score": 0,
33
+ "state": "created",
34
+ "links": {
35
+ "learner": {
36
+ "type": "learners",
37
+ "id": "11"
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "meta": {},
3
+ "linked": {
4
+ "course_templates": [
5
+ {
6
+ "id": "2"
7
+ }
8
+ ],
9
+ "learners": [
10
+ {
11
+ "id": "15",
12
+ "name": "John Smith",
13
+ "avatar_url": null,
14
+ "deleted": false
15
+ },
16
+ {
17
+ "id": "11",
18
+ "name": "jshaffer@instructure.com",
19
+ "avatar_url": null,
20
+ "deleted": false
21
+ }
22
+ ]
23
+ },
24
+ "enrollments": [
25
+ {
26
+ "id": "2",
27
+ "course_template": "2",
28
+ "end_at": "2015-12-29T23:59:59.000-07:00",
29
+ "progress": 0,
30
+ "can_be_removed": true,
31
+ "completed_at": null,
32
+ "score": 0,
33
+ "state": "created",
34
+ "links": {
35
+ "learner": {
36
+ "type": "learners",
37
+ "id": "11"
38
+ }
39
+ }
40
+ },
41
+ {
42
+ "id": "34",
43
+ "course_template": "2",
44
+ "end_at": "2016-02-29T23:59:59.000-07:00",
45
+ "progress": 0,
46
+ "can_be_removed": true,
47
+ "completed_at": null,
48
+ "score": 0,
49
+ "state": "created",
50
+ "links": {
51
+ "learner": {
52
+ "type": "learners",
53
+ "id": "15"
54
+ }
55
+ }
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "meta": {},
3
+ "programs": [
4
+ {
5
+ "id": "1",
6
+ "title": "New Program",
7
+ "course_count": 0,
8
+ "unfinished_learners_count": 0,
9
+ "next_due_at": null,
10
+ "overdue_learners_count": null,
11
+ "is_published": true,
12
+ "publishable": true,
13
+ "has_unpublished_changes": false,
14
+ "assignment_period": 0,
15
+ "sub_account": {
16
+ "id": 1,
17
+ "name": "chrisc",
18
+ "not_current": false
19
+ },
20
+ "course_templates": [
21
+ {
22
+ "id": "1",
23
+ "estimated_time": 1,
24
+ "passing_threshold": 80,
25
+ "default_days_until_due": 7,
26
+ "title": "Test Course 1",
27
+ "is_published": true
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ "id": "2",
33
+ "title": "New Program 2",
34
+ "course_count": 0,
35
+ "unfinished_learners_count": 0,
36
+ "next_due_at": null,
37
+ "overdue_learners_count": null,
38
+ "is_published": true,
39
+ "publishable": true,
40
+ "has_unpublished_changes": false,
41
+ "assignment_period": 0,
42
+ "sub_account": {
43
+ "id": 1,
44
+ "name": "chrisc",
45
+ "not_current": false
46
+ },
47
+ "course_templates": [
48
+ {
49
+ "id": "2",
50
+ "estimated_time": 1,
51
+ "passing_threshold": 80,
52
+ "default_days_until_due": 7,
53
+ "title": "Test Course 1",
54
+ "is_published": true
55
+ }
56
+ ]
57
+ }
58
+ ]
59
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "meta": {},
3
+ "linked": {},
4
+ "users": [
5
+ {
6
+ "id": "10",
7
+ "uid": "testuser",
8
+ "first_name": "test",
9
+ "last_name": "mcfake",
10
+ "email": "test@test.com",
11
+ "roles": [],
12
+ "name": "Brandon Broshinsky",
13
+ "avatar_url": null,
14
+ "deleted_at": null,
15
+ "unsubscribed": null,
16
+ "welcomedAt": "2015-09-28T14:03:43.771-06:00",
17
+ "loggedInAt": null,
18
+ "links": {},
19
+ "meta": {
20
+ "can_masquerade": true
21
+ }
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "meta": {},
3
+ "linked": {},
4
+ "users": [
5
+ {
6
+ "id": "9",
7
+ "uid": "brandonbr",
8
+ "first_name": "test",
9
+ "last_name": "mcfake",
10
+ "email": "test@test.com",
11
+ "roles": [],
12
+ "name": "Brandon Broshinsky",
13
+ "avatar_url": null,
14
+ "deleted_at": null,
15
+ "unsubscribed": null,
16
+ "welcomedAt": "2015-09-28T14:03:43.771-06:00",
17
+ "loggedInAt": null,
18
+ "links": {},
19
+ "meta": {
20
+ "can_masquerade": true
21
+ }
22
+ },
23
+ {
24
+ "id": "4",
25
+ "uid": "jfarnworth+bridgetest1@instructure.com",
26
+ "first_name": "Jtest",
27
+ "last_name": "Ftest",
28
+ "email": "jfarnworth+bridgetest1@instructure.com",
29
+ "roles": [],
30
+ "name": "Jtest Ftest",
31
+ "avatar_url": null,
32
+ "deleted_at": null,
33
+ "unsubscribed": null,
34
+ "welcomedAt": "2015-09-08T15:56:36.307-06:00",
35
+ "loggedInAt": "2015-07-17T00:00:00.000-06:00",
36
+ "links": {},
37
+ "meta": {
38
+ "can_masquerade": true
39
+ }
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,90 @@
1
+ require 'sinatra/base'
2
+ require 'tilt'
3
+
4
+ class FakeBridge < Sinatra::Base
5
+
6
+ ## Course Templates
7
+
8
+ get %r{/api/author/course_templates$} do
9
+ get_json_data 200, 'courses.json'
10
+ end
11
+
12
+ get %r{/api/author/course_templates/\d+$} do
13
+ get_json_data 200, 'course.json'
14
+ end
15
+
16
+ post %r{/api/author/course_templates$} do
17
+ get_json_data 200, 'course.json'
18
+ end
19
+
20
+ post %r{/api/author/course_templates/\d+/publish$} do
21
+ get_json_data 200, 'course.json'
22
+ end
23
+
24
+ put %r{/api/author/course_templates/\d+$} do
25
+ get_json_data 200, 'course.json'
26
+ end
27
+
28
+ delete %r{/api/author/course_templates/\d+$} do
29
+ get_json_data 204, nil
30
+ end
31
+
32
+ ## Programs
33
+
34
+ get %r{/api/author/programs.*$} do
35
+ get_json_data 200, 'programs.json'
36
+ end
37
+
38
+ ## Users
39
+
40
+ get %r{/api/author/users$} do
41
+ get_json_data 200, 'users.json'
42
+ end
43
+
44
+ get %r{/api/author/users/\d+$} do
45
+ get_json_data 200, 'user.json'
46
+ end
47
+
48
+ put %r{/api/author/users/\d+$} do
49
+ get_json_data 200, 'user.json'
50
+ end
51
+
52
+ post %r{/api/admin/users$} do
53
+ get_json_data 200, 'user.json'
54
+ end
55
+
56
+ delete %r{/api/admin/users/\d+$} do
57
+ get_json_data 204, nil
58
+ end
59
+
60
+ ## Enrollments
61
+
62
+ post %r{/api/author/course_templates/\d+/enrollments$} do
63
+ get_json_data 204, nil
64
+ end
65
+
66
+ get %r{/api/author/course_templates/\d+/enrollments$} do
67
+ get_json_data 200, 'enrollments.json'
68
+ end
69
+
70
+ delete %r{/api/author/enrollments.*$} do
71
+ get_json_data 204, nil
72
+ end
73
+
74
+ put %r{/api/author/enrollments.*$} do
75
+ get_json_data 200, 'enrollment.json'
76
+ end
77
+
78
+ private
79
+
80
+ def get_json_data(response_code, file_name)
81
+ content_type :json
82
+ status response_code
83
+ unless file_name.nil?
84
+ File.open(File.dirname(__FILE__) + '/../fixtures/' + file_name).read
85
+ else
86
+ {}
87
+ end
88
+ end
89
+
90
+ end
@@ -0,0 +1,23 @@
1
+ require 'bridge_api'
2
+ require 'rspec'
3
+ require 'webmock/rspec'
4
+ require 'json'
5
+ require 'pry'
6
+
7
+ RSpec.configure do |config|
8
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
9
+
10
+ config.before(:each) do
11
+ WebMock.disable_net_connect!
12
+ WebMock.stub_request(:any, /api\/.*/).to_rack(FakeBridge)
13
+ end
14
+ end
15
+
16
+
17
+ def fixture(*file)
18
+ File.new(File.join(File.expand_path("../fixtures", __FILE__), *file))
19
+ end
20
+
21
+
22
+
23
+
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bridge_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jay Shaffer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.0
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.6'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.6'
61
+ - !ruby/object:Gem::Dependency
62
+ name: webmock
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: tilt
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 1.3.4
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '1.3'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 1.3.4
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.3'
109
+ - !ruby/object:Gem::Dependency
110
+ name: footrest
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '0.2'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 0.2.2
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0.2'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 0.2.2
129
+ description: Ruby gem for interacting with the bridge API
130
+ email:
131
+ - jshaffer@instructure.com
132
+ executables: []
133
+ extensions: []
134
+ extra_rdoc_files: []
135
+ files:
136
+ - ".gitignore"
137
+ - bridge_api.gemspec
138
+ - lib/bridge_api.rb
139
+ - lib/bridge_api/api_array.rb
140
+ - lib/bridge_api/client.rb
141
+ - lib/bridge_api/client/course_template.rb
142
+ - lib/bridge_api/client/enrollment.rb
143
+ - lib/bridge_api/client/user.rb
144
+ - lib/bridge_api/version.rb
145
+ - spec/bridge_api/client/course_template_spec.rb
146
+ - spec/bridge_api/client/enrollment_spec.rb
147
+ - spec/bridge_api/client/user_spec.rb
148
+ - spec/fixtures/course.json
149
+ - spec/fixtures/courses.json
150
+ - spec/fixtures/enrollment.json
151
+ - spec/fixtures/enrollments.json
152
+ - spec/fixtures/programs.json
153
+ - spec/fixtures/user.json
154
+ - spec/fixtures/users.json
155
+ - spec/support/fake_bridge.rb
156
+ - spec/test_helper.rb
157
+ homepage: https://getbridge.com
158
+ licenses:
159
+ - MIT
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 2.4.3
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: Bridge API
181
+ test_files:
182
+ - spec/bridge_api/client/course_template_spec.rb
183
+ - spec/bridge_api/client/enrollment_spec.rb
184
+ - spec/bridge_api/client/user_spec.rb
185
+ - spec/fixtures/course.json
186
+ - spec/fixtures/courses.json
187
+ - spec/fixtures/enrollment.json
188
+ - spec/fixtures/enrollments.json
189
+ - spec/fixtures/programs.json
190
+ - spec/fixtures/user.json
191
+ - spec/fixtures/users.json
192
+ - spec/support/fake_bridge.rb
193
+ - spec/test_helper.rb
194
+ has_rdoc: