clever_sdk 0.9.0.pre.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +26 -0
  3. data/.env.sample +20 -0
  4. data/.gitignore +22 -0
  5. data/.tool-versions +1 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +65 -0
  10. data/Rakefile +10 -0
  11. data/bin/console +31 -0
  12. data/bin/setup +8 -0
  13. data/bin/test +6 -0
  14. data/clever_sdk.gemspec +44 -0
  15. data/lib/clever_sdk/api/authentication.rb +38 -0
  16. data/lib/clever_sdk/api/courses.rb +54 -0
  17. data/lib/clever_sdk/api/districts.rb +23 -0
  18. data/lib/clever_sdk/api/events.rb +26 -0
  19. data/lib/clever_sdk/api/resources.rb +49 -0
  20. data/lib/clever_sdk/api/response.rb +59 -0
  21. data/lib/clever_sdk/api/schools.rb +68 -0
  22. data/lib/clever_sdk/api/sections.rb +70 -0
  23. data/lib/clever_sdk/api/terms.rb +46 -0
  24. data/lib/clever_sdk/api/users.rb +81 -0
  25. data/lib/clever_sdk/api.rb +81 -0
  26. data/lib/clever_sdk/authentication.rb +67 -0
  27. data/lib/clever_sdk/client/courses.rb +45 -0
  28. data/lib/clever_sdk/client/districts.rb +21 -0
  29. data/lib/clever_sdk/client/events.rb +22 -0
  30. data/lib/clever_sdk/client/resources.rb +40 -0
  31. data/lib/clever_sdk/client/schools.rb +54 -0
  32. data/lib/clever_sdk/client/sections.rb +59 -0
  33. data/lib/clever_sdk/client/terms.rb +40 -0
  34. data/lib/clever_sdk/client/users.rb +66 -0
  35. data/lib/clever_sdk/client.rb +41 -0
  36. data/lib/clever_sdk/configuration.rb +13 -0
  37. data/lib/clever_sdk/data/course/refs.rb +36 -0
  38. data/lib/clever_sdk/data/course.rb +44 -0
  39. data/lib/clever_sdk/data/courses.rb +79 -0
  40. data/lib/clever_sdk/data/district.rb +129 -0
  41. data/lib/clever_sdk/data/districts.rb +37 -0
  42. data/lib/clever_sdk/data/event.rb +93 -0
  43. data/lib/clever_sdk/data/events.rb +79 -0
  44. data/lib/clever_sdk/data/me.rb +34 -0
  45. data/lib/clever_sdk/data/resource/refs.rb +45 -0
  46. data/lib/clever_sdk/data/resource.rb +60 -0
  47. data/lib/clever_sdk/data/resources.rb +79 -0
  48. data/lib/clever_sdk/data/school/refs.rb +42 -0
  49. data/lib/clever_sdk/data/school.rb +88 -0
  50. data/lib/clever_sdk/data/schools.rb +79 -0
  51. data/lib/clever_sdk/data/section/refs.rb +45 -0
  52. data/lib/clever_sdk/data/section.rb +100 -0
  53. data/lib/clever_sdk/data/sections.rb +79 -0
  54. data/lib/clever_sdk/data/sso.rb +44 -0
  55. data/lib/clever_sdk/data/term/refs.rb +32 -0
  56. data/lib/clever_sdk/data/term.rb +46 -0
  57. data/lib/clever_sdk/data/terms.rb +79 -0
  58. data/lib/clever_sdk/data/token.rb +67 -0
  59. data/lib/clever_sdk/data/tokeninfo.rb +30 -0
  60. data/lib/clever_sdk/data/tokens.rb +35 -0
  61. data/lib/clever_sdk/data/user/contact_role.rb +19 -0
  62. data/lib/clever_sdk/data/user/district_admin_role.rb +19 -0
  63. data/lib/clever_sdk/data/user/refs.rb +56 -0
  64. data/lib/clever_sdk/data/user/staff_role.rb +19 -0
  65. data/lib/clever_sdk/data/user/student_role.rb +19 -0
  66. data/lib/clever_sdk/data/user/teacher_role.rb +19 -0
  67. data/lib/clever_sdk/data/user.rb +123 -0
  68. data/lib/clever_sdk/data/users.rb +79 -0
  69. data/lib/clever_sdk/error.rb +27 -0
  70. data/lib/clever_sdk/version.rb +5 -0
  71. data/lib/clever_sdk.rb +36 -0
  72. metadata +255 -0
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/terms"
4
+
5
+ module CleverSDK
6
+ class Client
7
+ module Terms
8
+ # count - acceptable values are nil, :true, :false, :undefined
9
+ def terms(limit: nil, starting_after: nil, ending_before: nil, count: nil)
10
+ response = api.terms(access_token: access_token,
11
+ limit: limit, starting_after: starting_after, ending_before: ending_before, count: count)
12
+ CleverSDK::Data::Terms.new(response)
13
+ end
14
+
15
+ def term(id)
16
+ response = api.term(access_token: access_token, id: id)
17
+ data = response.body.dig("data")
18
+ CleverSDK::Data::Term.new(data, response)
19
+ end
20
+
21
+ def term_district(id)
22
+ response = api.term_district(access_token: access_token, id: id)
23
+ data = response.body.dig("data")
24
+ CleverSDK::Data::District.new(data, response)
25
+ end
26
+
27
+ def term_schools(id, limit: nil, starting_after: nil, ending_before: nil)
28
+ response = api.term_schools(access_token: access_token, id: id,
29
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
30
+ CleverSDK::Data::Schools.new(response)
31
+ end
32
+
33
+ def term_sections(id)
34
+ response = api.term_sections(access_token: access_token, id: id,
35
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
36
+ CleverSDK::Data::Sections.new(response)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/users"
4
+
5
+ module CleverSDK
6
+ class Client
7
+ module Users
8
+ # role - acceptable values are nil, :contact, :district_admin, :staff, :student, :teacher
9
+ # count - acceptable values are nil, :true, :false, :undefined
10
+ def users(role: nil, limit: nil, starting_after: nil, ending_before: nil, count: nil)
11
+ response = api.users(access_token: access_token, role: role,
12
+ limit: limit, starting_after: starting_after, ending_before: ending_before, count: count)
13
+ CleverSDK::Data::Users.new(response)
14
+ end
15
+
16
+ def user(id)
17
+ response = api.user(access_token: access_token, id: id)
18
+ data = response.body.dig("data")
19
+ CleverSDK::Data::User.new(data, response)
20
+ end
21
+
22
+ def user_district(id)
23
+ response = api.user_district(access_token: access_token, id: id)
24
+ data = response.body.dig("data")
25
+ CleverSDK::Data::District.new(data, response)
26
+ end
27
+
28
+ def user_resources(id, limit: nil, starting_after: nil, ending_before: nil)
29
+ response = api.user_resources(access_token: access_token, id: id,
30
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
31
+ CleverSDK::Data::Resources.new(response)
32
+ end
33
+
34
+ # primary - acceptable values are nil, true
35
+ def user_schools(id, primary: nil, limit: nil, starting_after: nil, ending_before: nil)
36
+ response = api.user_schools(access_token: access_token, id: id, primary: primary,
37
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
38
+ CleverSDK::Data::Schools.new(response)
39
+ end
40
+
41
+ def user_sections(id, limit: nil, starting_after: nil, ending_before: nil)
42
+ response = api.user_sections(access_token: access_token, id: id,
43
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
44
+ CleverSDK::Data::Sections.new(response)
45
+ end
46
+
47
+ def user_mycontacts(id, limit: nil, starting_after: nil, ending_before: nil)
48
+ response = api.user_mycontacts(access_token: access_token, id: id,
49
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
50
+ CleverSDK::Data::Users.new(response)
51
+ end
52
+
53
+ def user_mystudents(id, limit: nil, starting_after: nil, ending_before: nil)
54
+ response = api.user_mystudents(access_token: access_token, id: id,
55
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
56
+ CleverSDK::Data::Users.new(response)
57
+ end
58
+
59
+ def user_myteachers(id, limit: nil, starting_after: nil, ending_before: nil)
60
+ response = api.user_myteachers(access_token: access_token, id: id,
61
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
62
+ CleverSDK::Data::Users.new(response)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/api"
4
+ require "clever_sdk/client/courses"
5
+ require "clever_sdk/client/districts"
6
+ require "clever_sdk/client/resources"
7
+ require "clever_sdk/client/schools"
8
+ require "clever_sdk/client/sections"
9
+ require "clever_sdk/client/terms"
10
+ require "clever_sdk/client/users"
11
+ require "clever_sdk/client/events"
12
+
13
+ module CleverSDK
14
+ class Client
15
+ include CleverSDK::Client::Courses
16
+ include CleverSDK::Client::Districts
17
+ include CleverSDK::Client::Resources
18
+ include CleverSDK::Client::Schools
19
+ include CleverSDK::Client::Sections
20
+ include CleverSDK::Client::Terms
21
+ include CleverSDK::Client::Users
22
+ include CleverSDK::Client::Events
23
+
24
+ attr_accessor :access_token, :configuration
25
+
26
+ def initialize(access_token, configuration = CleverSDK.configuration)
27
+ @access_token = access_token
28
+ @configuration = configuration
29
+ end
30
+
31
+ def inspect
32
+ "#<#{self.class.name}:0x#{(object_id * 2).to_s(16).rjust(16, "0")} #{access_token}>"
33
+ end
34
+
35
+ private
36
+
37
+ def api
38
+ @api ||= CleverSDK::Api.new
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ class Configuration
5
+ attr_accessor :client_id, :client_secret, :redirect_uri
6
+
7
+ def initialize(options = {})
8
+ @client_id = options.dig(:client_id) || ENV["CLEVER_ID"]
9
+ @client_secret = options.dig(:client_secret) || ENV["CLEVER_SECRET"]
10
+ @redirect_uri = options.dig(:redirect_uri) || ENV["CLEVER_REDIRECT_URI"]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class Course
6
+ class Refs
7
+ # private
8
+ def initialize(course)
9
+ @course = course
10
+ end
11
+
12
+ def district
13
+ client.course_district(@course.id)
14
+ end
15
+
16
+ def resources(limit: nil, starting_after: nil, ending_before: nil)
17
+ client.course_resources(@course.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
18
+ end
19
+
20
+ def schools(limit: nil, starting_after: nil, ending_before: nil)
21
+ client.course_schools(@course.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
22
+ end
23
+
24
+ def sections(limit: nil, starting_after: nil, ending_before: nil)
25
+ client.course_sections(@course.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
26
+ end
27
+
28
+ private
29
+
30
+ def client
31
+ @client ||= CleverSDK::Client.new(@course.response.access_token)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/course/refs"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Course
8
+ # private
9
+ attr_reader :data, :response
10
+
11
+ # private
12
+ def initialize(data, response)
13
+ @data = data
14
+ @response = response
15
+ end
16
+
17
+ def id
18
+ data.dig("id")
19
+ end
20
+
21
+ def district
22
+ data.dig("district")
23
+ end
24
+
25
+ def name
26
+ data.dig("name")
27
+ end
28
+
29
+ def number
30
+ data.dig("number")
31
+ end
32
+
33
+ def refs
34
+ @refs ||= CleverSDK::Data::Course::Refs.new(self)
35
+ end
36
+
37
+ def inspect
38
+ "#<#{self.class.name}(#{id}) #{first_name} #{last_name}>"
39
+ end
40
+
41
+ alias_method :to_h, :data
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/course"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Courses
8
+ include Enumerable
9
+
10
+ # private
11
+ attr_reader :response
12
+
13
+ # private
14
+ def initialize(response)
15
+ @response = response
16
+ end
17
+
18
+ def data
19
+ Array(response.body.dig("data"))
20
+ end
21
+
22
+ def each &block
23
+ return enum_for :each unless block
24
+
25
+ data
26
+ .lazy
27
+ .map { |datum| CleverSDK::Data::Course.new(datum.dig("data"), response) }
28
+ .each(&block)
29
+ end
30
+
31
+ def all &block
32
+ return enum_for :all unless block
33
+
34
+ page = self
35
+ loop do
36
+ page.each(&block)
37
+ page = page.next
38
+ break if page.nil?
39
+ end
40
+ end
41
+
42
+ def next?
43
+ link = find_link("next")
44
+ !link.nil?
45
+ end
46
+
47
+ def next
48
+ link = find_link("next")
49
+
50
+ return nil if link.nil?
51
+
52
+ self.class.new(CleverSDK::Api.new.page(path: link.dig("uri"), access_token: response.access_token))
53
+ end
54
+
55
+ def prev?
56
+ link = find_link("prev")
57
+ !link.nil?
58
+ end
59
+
60
+ def prev
61
+ link = find_link("prev")
62
+
63
+ return nil if link.nil?
64
+
65
+ self.class.new(CleverSDK::Api.new.page(path: link.dig("uri"), access_token: response.access_token))
66
+ end
67
+
68
+ def inspect
69
+ "#<#{self.class.name}:0x#{(object_id * 2).to_s(16).rjust(16, "0")} courses:#{data.count}>"
70
+ end
71
+
72
+ private
73
+
74
+ def find_link rel
75
+ Array(response.body.dig("links")).find { |link| link.dig("rel") == rel }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class District
6
+ # private
7
+ attr_reader :data, :response
8
+
9
+ # private
10
+ def initialize(data, response)
11
+ @data = data
12
+ @response = response
13
+ end
14
+
15
+ def id
16
+ data.dig("id")
17
+ end
18
+
19
+ def name
20
+ data.dig("name")
21
+ end
22
+
23
+ def mdr_number
24
+ data.dig("mdr_number")
25
+ end
26
+
27
+ def nces_id
28
+ data.dig("nces_id")
29
+ end
30
+
31
+ def sis_type
32
+ data.dig("sis_type")
33
+ end
34
+
35
+ def state
36
+ data.dig("state")
37
+ end
38
+
39
+ def last_sync
40
+ DateTime.parse(data.dig("last_sync"))
41
+ rescue
42
+ nil
43
+ end
44
+
45
+ def portal_url
46
+ data.dig("portal_url")
47
+ end
48
+
49
+ def login_methods
50
+ Array(data.dig("login_methods"))
51
+ end
52
+
53
+ def launch_date
54
+ Date.parse(data.dig("launch_date"))
55
+ rescue
56
+ nil
57
+ end
58
+
59
+ def pause_start
60
+ Date.parse(data.dig("pause_start"))
61
+ rescue
62
+ nil
63
+ end
64
+
65
+ def pause_end
66
+ Date.parse(data.dig("pause_end"))
67
+ rescue
68
+ nil
69
+ end
70
+
71
+ def district_contact
72
+ Contact.new(data.dig("district_contact"))
73
+ end
74
+
75
+ def error
76
+ data.dig("error")
77
+ end
78
+
79
+ def inspect
80
+ "#<#{self.class.name}(#{id}) #{name}>"
81
+ end
82
+
83
+ alias_method :to_h, :data
84
+
85
+ class Contact
86
+ attr_reader :data
87
+
88
+ # private
89
+ def initialize(data)
90
+ @data = data
91
+ end
92
+
93
+ def id
94
+ data.dig("id")
95
+ end
96
+
97
+ def district_id
98
+ data.dig("district_id")
99
+ end
100
+
101
+ def first_name
102
+ data.dig("name", "first")
103
+ end
104
+
105
+ def middle_name
106
+ data.dig("name", "middle")
107
+ end
108
+
109
+ def last_name
110
+ data.dig("name", "last")
111
+ end
112
+
113
+ def email
114
+ data.dig("email")
115
+ end
116
+
117
+ def title
118
+ data.dig("title")
119
+ end
120
+
121
+ def inspect
122
+ "#<#{self.class.name}(#{id}) #{first_name} #{last_name}>"
123
+ end
124
+
125
+ alias_method :to_h, :data
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/district"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Districts
8
+ include Enumerable
9
+
10
+ # private
11
+ attr_reader :response
12
+
13
+ # private
14
+ def initialize(response)
15
+ @response = response
16
+ end
17
+
18
+ def data
19
+ @data ||= Array(response.body.dig("data"))
20
+ end
21
+
22
+ def each &block
23
+ return enum_for :each unless block
24
+
25
+ data
26
+ .lazy
27
+ .map { |datum| CleverSDK::Data::District.new(datum.dig("data"), response) }
28
+ .each(&block)
29
+ end
30
+ alias_method :all, :each
31
+
32
+ def inspect
33
+ "#<#{self.class.name}:0x#{(object_id * 2).to_s(16).rjust(16, "0")} districts:#{data.count}>"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/courses"
4
+ require "clever_sdk/data/districts"
5
+ require "clever_sdk/data/schools"
6
+ require "clever_sdk/data/sections"
7
+ require "clever_sdk/data/terms"
8
+ require "clever_sdk/data/users"
9
+
10
+ module CleverSDK
11
+ module Data
12
+ class Event
13
+ # private
14
+ attr_reader :data, :response
15
+
16
+ # private
17
+ def initialize(data, response)
18
+ @data = data
19
+ @response = response
20
+ end
21
+
22
+ def id
23
+ data.dig("id")
24
+ end
25
+
26
+ def type
27
+ data.dig("type")
28
+ end
29
+
30
+ def created
31
+ DateTime.parse(data.dig("created"))
32
+ rescue
33
+ nil
34
+ end
35
+
36
+ def object
37
+ return object_class.new(object_data, response) if object_class
38
+
39
+ object_data
40
+ end
41
+
42
+ def previous_attributes
43
+ data.dig("data", "previous_attributes")
44
+ end
45
+
46
+ def inspect
47
+ "#<#{self.class.name}(#{id}) #{type}>"
48
+ end
49
+
50
+ alias_method :to_h, :data
51
+
52
+ private
53
+
54
+ def object_type
55
+ # courses
56
+ # districts
57
+ # schools
58
+ # sections
59
+ # terms
60
+ # users
61
+ type.split(".").first
62
+ end
63
+
64
+ def object_data
65
+ data.dig("data", "object")
66
+ end
67
+
68
+ def object_class
69
+ case object_type
70
+ when "courses"
71
+ CleverSDK::Data::Course
72
+ when "districts"
73
+ CleverSDK::Data::District
74
+ when "schools"
75
+ CleverSDK::Data::School
76
+ when "sections"
77
+ CleverSDK::Data::Section
78
+ when "terms"
79
+ CleverSDK::Data::Term
80
+ when "users"
81
+ CleverSDK::Data::User
82
+ end
83
+ end
84
+
85
+ def object_action
86
+ # created
87
+ # deleted
88
+ # updated
89
+ type.split(".").last
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/event"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Events
8
+ include Enumerable
9
+
10
+ # private
11
+ attr_reader :response
12
+
13
+ # private
14
+ def initialize(response)
15
+ @response = response
16
+ end
17
+
18
+ def data
19
+ Array(response.body.dig("data"))
20
+ end
21
+
22
+ def each &block
23
+ return enum_for :each unless block
24
+
25
+ data
26
+ .lazy
27
+ .map { |datum| CleverSDK::Data::Event.new(datum.dig("data"), response) }
28
+ .each(&block)
29
+ end
30
+
31
+ def all &block
32
+ return enum_for :all unless block
33
+
34
+ page = self
35
+ loop do
36
+ page.each(&block)
37
+ page = page.next
38
+ break if page.nil?
39
+ end
40
+ end
41
+
42
+ def next?
43
+ link = find_link("next")
44
+ !link.nil?
45
+ end
46
+
47
+ def next
48
+ link = find_link("next")
49
+
50
+ return nil if link.nil?
51
+
52
+ self.class.new(CleverSDK::Api.new.page(path: link.dig("uri"), access_token: response.access_token))
53
+ end
54
+
55
+ def prev?
56
+ link = find_link("prev")
57
+ !link.nil?
58
+ end
59
+
60
+ def prev
61
+ link = find_link("prev")
62
+
63
+ return nil if link.nil?
64
+
65
+ self.class.new(CleverSDK::Api.new.page(path: link.dig("uri"), access_token: response.access_token))
66
+ end
67
+
68
+ def inspect
69
+ "#<#{self.class.name}:0x#{(object_id * 2).to_s(16).rjust(16, "0")} events:#{data.count}>"
70
+ end
71
+
72
+ private
73
+
74
+ def find_link rel
75
+ Array(response.body.dig("links")).find { |link| link.dig("rel") == rel }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class Me
6
+ # private
7
+ attr_reader :data, :response
8
+
9
+ # private
10
+ def initialize(data, response)
11
+ @data = data
12
+ @response = response
13
+ end
14
+
15
+ def id
16
+ data.dig("id")
17
+ end
18
+
19
+ def district
20
+ data.dig("district")
21
+ end
22
+
23
+ def type
24
+ data.dig("type")
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class.name}(#{id}:#{type})>"
29
+ end
30
+
31
+ alias_method :to_h, :data
32
+ end
33
+ end
34
+ end