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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class Term
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 name
24
+ data.dig("name")
25
+ end
26
+
27
+ def start_date
28
+ Date.parse(data.dig("start_date"))
29
+ rescue
30
+ nil
31
+ end
32
+
33
+ def end_date
34
+ Date.parse(data.dig("end_date"))
35
+ rescue
36
+ nil
37
+ end
38
+
39
+ def inspect
40
+ "#<#{self.class.name}(#{id}) #{name}>"
41
+ end
42
+
43
+ alias_method :to_h, :data
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/term"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Terms
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::Term.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")} terms:#{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,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class Token
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 created
20
+ DateTime.parse(data.dig("created"))
21
+ rescue
22
+ nil
23
+ end
24
+
25
+ def owner_id
26
+ data.dig("owner", "id")
27
+ end
28
+
29
+ def owner_type
30
+ data.dig("owner", "type")
31
+ end
32
+
33
+ def access_token
34
+ data.dig("access_token")
35
+ end
36
+
37
+ def scopes
38
+ data.dig("scopes")
39
+ end
40
+
41
+ def inspect
42
+ "#<#{self.class.name}(#{id}) #{access_token}>"
43
+ end
44
+
45
+ alias_method :to_h, :data
46
+ end
47
+ end
48
+ end
49
+
50
+ # example response
51
+ # {
52
+ # "id"=>"63e673d9d016950008e5b5b2",
53
+ # "created"=>"2023-02-10T16:42:01.701Z",
54
+ # "owner"=>{"type"=>"district", "id"=>"63e673d91c05c2527736ba41"},
55
+ # "access_token"=>"TEST_TOKEN",
56
+ # "scopes"=>
57
+ # ["read:district_admins",
58
+ # "read:districts",
59
+ # "read:resources",
60
+ # "read:school_admins",
61
+ # "read:schools",
62
+ # "read:sections",
63
+ # "read:student_contacts",
64
+ # "read:students",
65
+ # "read:teachers",
66
+ # "read:user_id"]
67
+ # }
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class Tokeninfo
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 client_id
16
+ data.dig("client_id")
17
+ end
18
+
19
+ def scopes
20
+ data.dig("scopes")
21
+ end
22
+
23
+ def inspect
24
+ "#<#{self.class.name}(#{client_id}) #{access_token}>"
25
+ end
26
+
27
+ alias_method :to_h, :data
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/token"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Tokens
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
+ tokens = Array(data).lazy.map { |datum| CleverSDK::Data::Token.new(datum, response) }
26
+ tokens.each(&block)
27
+ end
28
+ alias_method :all, :each
29
+
30
+ def inspect
31
+ "#<#{self.class.name}:0x#{(object_id * 2).to_s(16).rjust(16, "0")} tokens:#{data.count}>"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class ContactRole
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ @role = @user.roles.dig("contact")
11
+ end
12
+
13
+ def legacy_id
14
+ @role.dig("legacy_id")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class DistrictAdminRole
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ @role = @user.roles.dig("district_admin")
11
+ end
12
+
13
+ def legacy_id
14
+ @role.dig("legacy_id")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class Refs
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ end
11
+
12
+ def district
13
+ client.user_district(@user.id)
14
+ end
15
+
16
+ def resources(limit: nil, starting_after: nil, ending_before: nil)
17
+ client.user_resources(@user.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
18
+ end
19
+
20
+ # primary - acceptable values are nil, true
21
+ def schools(primary: nil, limit: nil, starting_after: nil, ending_before: nil)
22
+ client.user_schools(@user.id, primary: primary,
23
+ limit: limit, starting_after: starting_after, ending_before: ending_before)
24
+ end
25
+
26
+ def sections(limit: nil, starting_after: nil, ending_before: nil)
27
+ client.user_sections(@user.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
28
+ end
29
+
30
+ def mycontacts(limit: nil, starting_after: nil, ending_before: nil)
31
+ return unless @user.student?
32
+
33
+ client.user_mycontacts(@user.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
34
+ end
35
+
36
+ def mystudents(limit: nil, starting_after: nil, ending_before: nil)
37
+ return unless @user.teacher?
38
+
39
+ client.user_mystudents(@user.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
40
+ end
41
+
42
+ def myteachers(limit: nil, starting_after: nil, ending_before: nil)
43
+ return unless @user.student?
44
+
45
+ client.user_myteachers(@user.id, limit: limit, starting_after: starting_after, ending_before: ending_before)
46
+ end
47
+
48
+ private
49
+
50
+ def client
51
+ @client ||= CleverSDK::Client.new(@user.response.access_token)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class StaffRole
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ @role = @user.roles.dig("staff")
11
+ end
12
+
13
+ def legacy_id
14
+ @role.dig("legacy_id")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class StudentRole
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ @role = @user.roles.dig("student")
11
+ end
12
+
13
+ def sis_id
14
+ @role.dig("sis_id")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ module Data
5
+ class User
6
+ class TeacherRole
7
+ # private
8
+ def initialize(user)
9
+ @user = user
10
+ @role = @user.roles.dig("teacher")
11
+ end
12
+
13
+ def legacy_id
14
+ @role.dig("legacy_id")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/user/contact_role"
4
+ require "clever_sdk/data/user/district_admin_role"
5
+ require "clever_sdk/data/user/staff_role"
6
+ require "clever_sdk/data/user/student_role"
7
+ require "clever_sdk/data/user/teacher_role"
8
+ require "clever_sdk/data/user/refs"
9
+
10
+ module CleverSDK
11
+ module Data
12
+ class User
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 district
27
+ data.dig("district")
28
+ end
29
+
30
+ def first_name
31
+ data.dig("name", "first")
32
+ end
33
+
34
+ def middle_name
35
+ data.dig("name", "middle")
36
+ end
37
+
38
+ def last_name
39
+ data.dig("name", "last")
40
+ end
41
+
42
+ def email
43
+ data.dig("email")
44
+ end
45
+
46
+ def roles
47
+ data.dig("roles")
48
+ end
49
+
50
+ def created
51
+ DateTime.parse(data.dig("created"))
52
+ rescue
53
+ nil
54
+ end
55
+
56
+ def last_modified
57
+ DateTime.parse(data.dig("last_modified"))
58
+ rescue
59
+ nil
60
+ end
61
+
62
+ def contact?
63
+ !roles.dig("contact").nil?
64
+ end
65
+
66
+ def contact
67
+ return unless contact?
68
+
69
+ @contact ||= CleverSDK::Data::User::ContactRole.new(self)
70
+ end
71
+
72
+ def district_admin?
73
+ !roles.dig("district_admin").nil?
74
+ end
75
+
76
+ def district_admin
77
+ return unless district_admin?
78
+
79
+ @district_admin ||= CleverSDK::Data::User::DistrictAdminRole.new(self)
80
+ end
81
+
82
+ def staff?
83
+ !roles.dig("staff").nil?
84
+ end
85
+
86
+ def staff
87
+ return unless staff?
88
+
89
+ @staff ||= CleverSDK::Data::User::StaffRole.new(self)
90
+ end
91
+
92
+ def teacher?
93
+ !roles.dig("teacher").nil?
94
+ end
95
+
96
+ def teacher
97
+ return unless teacher?
98
+
99
+ @teacher ||= CleverSDK::Data::User::TeacherRole.new(self)
100
+ end
101
+
102
+ def student?
103
+ !roles.dig("student").nil?
104
+ end
105
+
106
+ def student
107
+ return unless student?
108
+
109
+ @student ||= CleverSDK::Data::User::StudentRole.new(self)
110
+ end
111
+
112
+ def refs
113
+ @refs ||= CleverSDK::Data::User::Refs.new(self)
114
+ end
115
+
116
+ def inspect
117
+ "#<#{self.class.name}(#{id}) #{first_name} #{last_name}>"
118
+ end
119
+
120
+ alias_method :to_h, :data
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "clever_sdk/data/user"
4
+
5
+ module CleverSDK
6
+ module Data
7
+ class Users
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::User.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")} users:#{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,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ class Error < StandardError
5
+ def self.handle(typhoeus_response)
6
+ explanation = CleverSDK::Api::Response.status_code_explanations[typhoeus_response.code]
7
+
8
+ error_obj = if explanation.nil?
9
+ new
10
+ else
11
+ new([explanation[:meaning], explanation[:action_to_take]].join(": "))
12
+ end
13
+
14
+ error_obj.response = typhoeus_response
15
+ error_obj.code = typhoeus_response.code
16
+ error_obj.meaning = explanation[:meaning] if explanation
17
+ error_obj.action_to_take = explanation[:action_to_take] if explanation
18
+ error_obj
19
+ end
20
+
21
+ attr_accessor :response, :code, :meaning, :action_to_take
22
+
23
+ def intitialize(message = "Unknown API error")
24
+ super(message)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CleverSDK
4
+ VERSION = "0.9.0-pre"
5
+ end
data/lib/clever_sdk.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "typhoeus"
4
+ require "json"
5
+
6
+ require "clever_sdk/configuration"
7
+ require "clever_sdk/error"
8
+ require "clever_sdk/authentication"
9
+ require "clever_sdk/client"
10
+ require "clever_sdk/version"
11
+
12
+ module CleverSDK
13
+ class << self
14
+ attr_writer :configuration
15
+ end
16
+
17
+ def self.configure
18
+ yield(configuration)
19
+ end
20
+
21
+ def self.configuration
22
+ @configuration ||= CleverSDK::Configuration.new
23
+ end
24
+
25
+ def self.authentication(configuration = CleverSDK.configuration)
26
+ yield configuration if block_given?
27
+
28
+ CleverSDK::Authentication.new(configuration)
29
+ end
30
+
31
+ def self.client(access_token, configuration = CleverSDK.configuration)
32
+ yield configuration if block_given?
33
+
34
+ CleverSDK::Client.new(access_token, configuration)
35
+ end
36
+ end