clever_sdk 0.9.0.pre.pre

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.
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