magister 1.1.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/magister/authenticator.rb +31 -2
- data/lib/magister/data.rb +13 -0
- data/lib/magister/profile.rb +34 -3
- data/lib/magister/types/class.rb +114 -1
- data/lib/magister/types/classroom.rb +7 -1
- data/lib/magister/types/grade.rb +55 -2
- data/lib/magister/types/person.rb +138 -0
- data/lib/magister/types/subject.rb +14 -1
- data/lib/magister/types/teacher.rb +19 -1
- data/lib/magister.rb +38 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd94a0cc6b6ee2470916892afd0c9ffe626d2c7a31acd3fc2bd7e7e4485415bc
|
4
|
+
data.tar.gz: 21f397e67ca49836e84af7fd83a425223a30b385e41a116149c2a0b02074fce4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53033d79c500d959a80a63f83763091ff28900fdc52356f789022b69da6bce591e53961c7ab30254eff05df8906528daa2acf03ef3ee4336359b4176d29cc732
|
7
|
+
data.tar.gz: 6b5762af287bbaf677e06d50462d4284856de1817f0c9afa9f76d0b96f3cb03303eebc8926edffbc8eca28ac697a52220641eb2b545ed16ee7b43638e2ccec20
|
@@ -1,17 +1,24 @@
|
|
1
1
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
|
-
require 'magister/profile
|
4
|
+
require 'magister/profile'
|
5
5
|
require 'net/http'
|
6
6
|
require 'json'
|
7
7
|
require 'securerandom'
|
8
8
|
require 'base64'
|
9
9
|
require 'digest'
|
10
10
|
require 'selenium-webdriver'
|
11
|
+
require 'time'
|
11
12
|
|
13
|
+
# A module used to authenticate a user with the magister api.
|
12
14
|
module Authenticator
|
13
15
|
extend self
|
14
16
|
|
17
|
+
# Log in with username and password
|
18
|
+
# @param username [String] The username, usually in the form of a "leerlingnummer"
|
19
|
+
# @param password [String] The users password
|
20
|
+
# @param school [String] The school the user attends
|
21
|
+
# @since 1.1.0
|
15
22
|
def login(username, password, school)
|
16
23
|
# uri = URI("https://#{school}.magister.net/oidc_config.js")
|
17
24
|
# http = Net::HTTP.new(uri.host, uri.port)
|
@@ -21,6 +28,19 @@ module Authenticator
|
|
21
28
|
# oidc_conf = (response.body.split("config =").last.split("};").first.gsub("window.location.hostname", "'" + uri.hostname + "'") + "}").gsub(': ', '":').gsub(/,(\s*)/, ',"').gsub(/{(\s*)/, '{"').gsub("'", '"').gsub('" + "', "")
|
22
29
|
|
23
30
|
# oidc_conf = JSON.parse(oidc_conf)
|
31
|
+
if $magister_useCache && File.exist?($magister_cachingDirectory + "/auth.json")
|
32
|
+
f = File.open($magister_cachingDirectory + "/auth.json")
|
33
|
+
cached_data = f.read
|
34
|
+
cached_data = JSON.parse(cached_data)
|
35
|
+
expires = Time.at(cached_data["expires"].to_i)
|
36
|
+
puts "attempting to use cached token..."
|
37
|
+
if expires.to_i > Time.now.to_i
|
38
|
+
puts "using cached token."
|
39
|
+
return Profile.new(cached_data["token"], school)
|
40
|
+
else
|
41
|
+
puts "cached token expired."
|
42
|
+
end
|
43
|
+
end
|
24
44
|
|
25
45
|
codeVerifier = SecureRandom.alphanumeric(128)
|
26
46
|
verifier = Base64.urlsafe_encode64(codeVerifier)
|
@@ -34,6 +54,7 @@ module Authenticator
|
|
34
54
|
auth_uri = "https://#{school}.magister.net/connect/authorize?client_id=M6LOAPP&redirect_uri=m6loapp%3A%2F%2Foauth2redirect%2F&scope=openid%20profile%20opp.read%20opp.manage%20attendance.overview%20attendance.administration%20calendar.ical.user%20calendar.to-do.user%20grades.read%20grades.manage&state=#{@@state}&nonce=#{@@nonce}&code_challenge=#{challenge}&code_challenge_method=S256&prompt=select_account"
|
35
55
|
# puts "using authentication url #{auth_uri}"
|
36
56
|
|
57
|
+
token = ""
|
37
58
|
if $authMode == "local"
|
38
59
|
raise NotImplementedError.new("\n\nLocal authentication mode has not been implemented yet, \nCheck our github for any updates, or if you want to help implementing it!\n")
|
39
60
|
else
|
@@ -63,11 +84,19 @@ module Authenticator
|
|
63
84
|
wait = Selenium::WebDriver::Wait.new(timeout: 30)
|
64
85
|
wait.until { driver.current_url.start_with? "https://#{school}.magister.net/oidc/redirect_callback.html" }
|
65
86
|
|
87
|
+
expires_in = driver.current_url.split("expires_in=").last.split("&").first.to_i
|
88
|
+
expires = Time.now + expires_in
|
66
89
|
token = driver.current_url.split("access_token=").last.split("&").first
|
67
90
|
|
68
91
|
driver.quit
|
92
|
+
end
|
69
93
|
|
70
|
-
|
94
|
+
if $magister_useCache
|
95
|
+
if $magister_cacheType == "json"
|
96
|
+
File.write($magister_cachingDirectory + "/auth.json", "{\"token\": \"#{token}\", \"expires\": \"#{expires.to_i}\"}")
|
97
|
+
end
|
71
98
|
end
|
99
|
+
|
100
|
+
return Profile.new(token, school)
|
72
101
|
end
|
73
102
|
end
|
data/lib/magister/data.rb
CHANGED
@@ -6,6 +6,10 @@ require 'magister/types/grade'
|
|
6
6
|
require 'date'
|
7
7
|
require 'json'
|
8
8
|
|
9
|
+
# Validates a date
|
10
|
+
# @param date [String]
|
11
|
+
# @return [Boolean]
|
12
|
+
# @see get_classes
|
9
13
|
def validate_date(date)
|
10
14
|
format = '%Y-%m-%d'
|
11
15
|
DateTime.strptime(date, format)
|
@@ -14,7 +18,12 @@ rescue ArgumentError
|
|
14
18
|
false
|
15
19
|
end
|
16
20
|
|
21
|
+
# Functions for getting or setting data from/to the magister apis
|
17
22
|
module MagisterData
|
23
|
+
# Get all the scheduled classes between 2 dates
|
24
|
+
# @param dateFrom [String] the start of the selection
|
25
|
+
# @param dateTo [String] the end of the selection
|
26
|
+
# @since 1.0.0
|
18
27
|
def get_classes(dateFrom, dateTo)
|
19
28
|
if validate_date(dateFrom) && validate_date(dateTo)
|
20
29
|
data = @profile.authenticatedRequest("/personen/{*id*}/afspraken?status=1&van=#{dateFrom}&tot=#{dateTo}")
|
@@ -28,6 +37,10 @@ module MagisterData
|
|
28
37
|
end
|
29
38
|
end
|
30
39
|
|
40
|
+
# Get a certain ammount of grades.
|
41
|
+
# @param count [String] The ammount of grades to get
|
42
|
+
# @param page [String] What page to get from
|
43
|
+
# @since 1.1.0
|
31
44
|
def get_grades(count = 5, page = 0)
|
32
45
|
data = @profile.authenticatedRequest("/personen/{*id*}/cijfers/laatste?top=#{count}&skip=#{count * page}")
|
33
46
|
grades = Array.new
|
data/lib/magister/profile.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
|
+
require 'magister/types/person'
|
4
5
|
require 'uri'
|
5
6
|
require 'net/http'
|
6
7
|
require 'json'
|
7
8
|
|
9
|
+
# This represents a profile or a user in magister
|
8
10
|
class Profile
|
11
|
+
# Returns a new instance of Profile.
|
12
|
+
# @param token [String] the users token
|
13
|
+
# @param school [String] the school the user attends
|
14
|
+
# @since 1.1.0
|
9
15
|
def initialize(token, school)
|
10
16
|
@token = token
|
11
17
|
@id = 0
|
@@ -13,23 +19,41 @@ class Profile
|
|
13
19
|
@person = nil
|
14
20
|
end
|
15
21
|
|
22
|
+
# Set the user token
|
23
|
+
# @param token [String] new token
|
24
|
+
# @since 1.1.0
|
16
25
|
def token=(token)
|
17
26
|
@token=token
|
18
27
|
end
|
28
|
+
# Get the user id
|
29
|
+
# @return [Integer] id
|
30
|
+
# @since 1.0.0
|
19
31
|
def id
|
20
32
|
@id
|
21
33
|
end
|
34
|
+
# What school the user attends
|
35
|
+
# @return [String] name of the school
|
36
|
+
# @since 1.0.0
|
22
37
|
def school
|
23
38
|
@school
|
24
39
|
end
|
40
|
+
# Get a summary of the object
|
41
|
+
# @return [String] the summary
|
42
|
+
# @since 1.0.0
|
25
43
|
def inspect
|
26
44
|
"#<#{self.class}:0x#{object_id} @token=\"[PRIVATE]\", @id=#{@id}, @school=#{@school}>"
|
27
45
|
end
|
28
46
|
|
47
|
+
# Get the person of the profile
|
48
|
+
# @return [Person] the person
|
49
|
+
# @since 1.0.0
|
29
50
|
def person
|
30
51
|
@person
|
31
52
|
end
|
32
53
|
|
54
|
+
# Verify the authenticity of the token and obtain user data
|
55
|
+
# @note +token+ and +school+ of the #Profile must be defined
|
56
|
+
# @since 1.0.0
|
33
57
|
def verify()
|
34
58
|
if @school == nil || @token == nil
|
35
59
|
puts "Either school or token was not defined!"
|
@@ -45,9 +69,9 @@ class Profile
|
|
45
69
|
response = http.request(request)
|
46
70
|
if response.is_a?(Net::HTTPSuccess)
|
47
71
|
res = JSON.parse(response.body)
|
48
|
-
@person = res["Persoon"]
|
49
|
-
@id = person
|
50
|
-
puts "Succesfully authenticated as #{@person
|
72
|
+
@person = Person.new res["Persoon"]
|
73
|
+
@id = @person.id.to_i
|
74
|
+
puts "Succesfully authenticated as #{@person.firstName} with id #{@person.id}"
|
51
75
|
else
|
52
76
|
puts "Failed to authenticate, http code #{response.code}"
|
53
77
|
end
|
@@ -56,6 +80,13 @@ class Profile
|
|
56
80
|
end
|
57
81
|
end
|
58
82
|
|
83
|
+
# Makes a request that is authenticated on the users behalve.
|
84
|
+
# @param endpoint [String] the endpoint to request (starting with slash, excluding /api)
|
85
|
+
# @note if you put +{*id*}+ in the endpoint, it will be replaced by the users actual id.
|
86
|
+
# @return [Hash] the response given by the magister api.
|
87
|
+
# @example make a request to +https://SCHOOL.magister.net/api/sessions/current+ to get information about the current session (+profile+ is an instance of +Profile+)
|
88
|
+
# sessionInfo = profile.authenticatedRequest("/sessions/current")
|
89
|
+
# @since 1.0.0
|
59
90
|
def authenticatedRequest(endpoint)
|
60
91
|
if @id == 0
|
61
92
|
puts "Not yet authenticated!"
|
data/lib/magister/types/class.rb
CHANGED
@@ -5,8 +5,12 @@ require "magister/types/classroom.rb"
|
|
5
5
|
require "magister/types/subject.rb"
|
6
6
|
require "magister/types/teacher.rb"
|
7
7
|
|
8
|
+
# This class describes a Class as it would appear in the schedule in magister.
|
8
9
|
# MagClass instead of Class becasue ruby got confused with class
|
9
10
|
class MagClass
|
11
|
+
# Returns a new instance of MagClass.
|
12
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
13
|
+
# @since 1.1.0
|
10
14
|
def initialize(rawParsed)
|
11
15
|
@id = rawParsed["Id"]
|
12
16
|
@classStart = rawParsed["Start"]
|
@@ -51,89 +55,198 @@ class MagClass
|
|
51
55
|
@groups = rawParsed["Groepen"]
|
52
56
|
end
|
53
57
|
|
58
|
+
# Gets a summary of the object.
|
59
|
+
# Overwrites default function.
|
60
|
+
# @return [String] object summary
|
61
|
+
# @since 1.1.0
|
54
62
|
def inspect
|
55
63
|
"#<#{self.class}:0x#{object_id} @id=#{@id}, @description=#{@description}, @subjects[0]=#{@subjects[0].inspect}, @teachers[0]=#{@teachers[0].inspect}, @location=#{@location}>"
|
56
64
|
end
|
57
65
|
|
58
66
|
# getters
|
67
|
+
|
68
|
+
# The ID of the class
|
69
|
+
# @return [Integer] the id
|
70
|
+
# @since 1.1.0
|
59
71
|
def id
|
60
72
|
@id
|
61
73
|
end
|
74
|
+
# The time the class starts
|
75
|
+
# @return [String] the date formatted in ISO 8601
|
76
|
+
# @since 1.1.0
|
62
77
|
def classStart
|
63
78
|
@classStart
|
64
79
|
end
|
80
|
+
# @see classStart
|
81
|
+
# @since 1.1.0
|
65
82
|
def startTime
|
66
83
|
@classStart
|
67
84
|
end
|
85
|
+
# The time the class ends
|
86
|
+
# @return [String] the ending date formatted in ISO 8601
|
87
|
+
# @since 1.1.0
|
68
88
|
def classEndInclusive
|
69
89
|
@classEndInclusive
|
70
90
|
end
|
91
|
+
# @see classEndInclusive
|
92
|
+
# @since 1.1.0
|
71
93
|
def endTime
|
72
94
|
@classEndInclusive
|
73
95
|
end
|
96
|
+
# If the class lasts the whole day
|
97
|
+
# @return [Boolean]
|
98
|
+
# @since 1.1.0
|
74
99
|
def wholeDay
|
75
100
|
@wholeDay
|
76
101
|
end
|
102
|
+
# The description of the class formatted like
|
103
|
+
# a - b - c.
|
104
|
+
# where a is a short version of the classes name.
|
105
|
+
# where b is the short code of the teachers name.
|
106
|
+
# where c is the class/group the class belongs to.
|
107
|
+
# @return [String] a - b - c
|
108
|
+
# @since 1.1.0
|
77
109
|
def description
|
78
110
|
@description
|
79
111
|
end
|
112
|
+
# The location where the class is
|
113
|
+
# @note reccommended to use the +classrooms+ property instead
|
114
|
+
# @return [String] the location
|
115
|
+
# @see classrooms
|
116
|
+
# @since 1.1.0
|
80
117
|
def location
|
81
118
|
@location
|
82
119
|
end
|
120
|
+
# The content of the class.
|
121
|
+
# @return [String, nil] the content
|
122
|
+
# @note This is stuff like homework or test descriptions.
|
123
|
+
# @since 1.1.0
|
83
124
|
def content
|
84
125
|
@content
|
85
126
|
end
|
127
|
+
# A remark (opmerking) added to the class
|
128
|
+
# @return [String, nil] the remark
|
129
|
+
# @note This is diffrent form the +note+
|
130
|
+
# @see note
|
131
|
+
# @since 1.1.0
|
86
132
|
def remark
|
87
133
|
@remark
|
88
134
|
end
|
135
|
+
# A note (aantekening) added to the class
|
136
|
+
# @return [String, nil] the note
|
137
|
+
# @note This is diffrent from +remark+
|
138
|
+
# @see remark
|
139
|
+
# @since 1.1.0
|
89
140
|
def note
|
90
141
|
@note
|
91
142
|
end
|
143
|
+
# If it is marked as finished
|
144
|
+
# @note this has been set by the user, not by the teacher or anyone else.
|
145
|
+
# @return [Boolean]
|
146
|
+
# @since 1.1.0
|
92
147
|
def finished
|
93
148
|
@finished
|
94
149
|
end
|
150
|
+
# If the class repeats
|
151
|
+
# @note Currently we are not certain what every status means.
|
152
|
+
# @return [Integer] the status
|
153
|
+
# @since 1.1.0
|
95
154
|
def repeatStatus
|
96
155
|
@repeatStatus
|
97
156
|
end
|
157
|
+
# |?| How it repeats
|
158
|
+
# @note We do not have info on what this property does/means
|
159
|
+
# @return [?]
|
160
|
+
# @since 1.1.0
|
98
161
|
def repeat
|
99
162
|
@repeat
|
100
163
|
end
|
164
|
+
# What subjects are in this class
|
165
|
+
# @return [Array<Subject>] The subjects
|
166
|
+
# @since 1.1.0
|
101
167
|
def subjects
|
102
168
|
@subjects
|
103
169
|
end
|
170
|
+
# What teachers are giving this class
|
171
|
+
# @return [Array<Teacher>] The teachers
|
172
|
+
# @since 1.1.0
|
104
173
|
def teachers
|
105
174
|
@teachers
|
106
175
|
end
|
176
|
+
# What classrooms this class is given in
|
177
|
+
# @return [Array<ClassRoom>] The classrooms
|
178
|
+
# @since 1.1.0
|
107
179
|
def classrooms
|
108
180
|
@classrooms
|
109
181
|
end
|
182
|
+
# If the class has any attachments
|
183
|
+
# @return [Boolean] has attachments
|
184
|
+
# @see attachments
|
185
|
+
# @since 1.1.0
|
110
186
|
def hasAttachments
|
111
187
|
@hasAttachments
|
112
188
|
end
|
189
|
+
# The attachments that are attached
|
190
|
+
# @note Unsure yet what type the attachments will be
|
191
|
+
# @return [?, nil]
|
192
|
+
# @since 1.1.0
|
113
193
|
def attachments
|
114
194
|
@attachments
|
115
195
|
end
|
196
|
+
|
197
|
+
# |?| What kind of content it has
|
198
|
+
# @note We do not have info on what this property does/means
|
199
|
+
# @return [?]
|
200
|
+
# @since 1.1.0
|
116
201
|
def infoType
|
117
202
|
@infoType
|
118
203
|
end
|
204
|
+
# |?| if the class is cancelled etc?
|
205
|
+
# @note We do not have info on what this property does/means
|
206
|
+
# @return [Integer]
|
207
|
+
# @since 1.1.0
|
119
208
|
def status
|
120
209
|
@status
|
121
210
|
end
|
211
|
+
# |?|
|
212
|
+
# @note We do not have info on what this property does/means
|
213
|
+
# @return [?]
|
214
|
+
# @since 1.1.0
|
122
215
|
def type
|
123
216
|
@type
|
124
217
|
end
|
218
|
+
# |?|
|
219
|
+
# @note We do not have info on what this property does/means
|
220
|
+
# @return [?]
|
221
|
+
# @since 1.1.0
|
125
222
|
def subtype
|
126
223
|
@subtype
|
127
224
|
end
|
128
|
-
|
225
|
+
# |?| Wether or not the class has online attendance
|
226
|
+
# @note We do not have info on what this property does/means
|
227
|
+
# @return [Boolean]
|
228
|
+
# @since 1.1.0
|
229
|
+
def isOnline
|
129
230
|
@isOnline
|
130
231
|
end
|
232
|
+
# |?|
|
233
|
+
# @note We do not have info on what this property does/means
|
234
|
+
# @return [Integer]
|
235
|
+
# @since 1.1.0
|
131
236
|
def viewType
|
132
237
|
@viewType
|
133
238
|
end
|
239
|
+
# |?|
|
240
|
+
# @note We do not have info on what this property does/means
|
241
|
+
# @return [?]
|
242
|
+
# @since 1.1.0
|
134
243
|
def assignmentId
|
135
244
|
@assignmentId
|
136
245
|
end
|
246
|
+
# |?|
|
247
|
+
# @note We do not have info on what this property does/means
|
248
|
+
# @return [?, nil]
|
249
|
+
# @since 1.1.0
|
137
250
|
def groups
|
138
251
|
@groups
|
139
252
|
end
|
@@ -2,12 +2,18 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# This class represents a physical classroom.
|
5
6
|
class ClassRoom
|
7
|
+
# Returns a new instance of ClassRoom.
|
8
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
9
|
+
# @since 1.1.0
|
6
10
|
def initialize(rawParsed)
|
7
11
|
@name = rawParsed["Naam"]
|
8
12
|
end
|
9
13
|
|
10
|
-
#
|
14
|
+
# The name of the class
|
15
|
+
# @return [String] name
|
16
|
+
# @since 1.1.0
|
11
17
|
def name
|
12
18
|
@name
|
13
19
|
end
|
data/lib/magister/types/grade.rb
CHANGED
@@ -3,7 +3,11 @@
|
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
4
|
require 'json'
|
5
5
|
|
6
|
+
# This class is used to represent a grade and all metadata of it.
|
6
7
|
class Grade
|
8
|
+
# Returns a new instance of Grade.
|
9
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
10
|
+
# @since 1.1.0
|
7
11
|
def initialize(rawParsed)
|
8
12
|
@id = rawParsed["kolomId"]
|
9
13
|
@description = rawParsed["omschrijving"]
|
@@ -25,46 +29,95 @@ class Grade
|
|
25
29
|
@earnedOn = rawParsed["behaaldOp"]
|
26
30
|
end
|
27
31
|
|
28
|
-
#
|
32
|
+
# The id of the grade
|
33
|
+
# @return [Integer] id
|
34
|
+
# @since 1.1.0
|
29
35
|
def id
|
30
36
|
@id
|
31
37
|
end
|
38
|
+
# The description of the grade
|
39
|
+
# @return [String] description
|
40
|
+
# @since 1.1.0
|
32
41
|
def description
|
33
42
|
@description
|
34
43
|
end
|
44
|
+
# The subject the grade belongs to
|
45
|
+
# @return [Subject] subject
|
46
|
+
# @since 1.1.0
|
35
47
|
def subject
|
36
48
|
@subject
|
37
49
|
end
|
50
|
+
# If the grade is considered sufficient
|
51
|
+
# @return [Boolean] sufficient
|
52
|
+
# @since 1.1.0
|
38
53
|
def isSufficient
|
39
54
|
@isSufficient
|
40
55
|
end
|
56
|
+
# If the grade is considered insufficient
|
57
|
+
# @return [Boolean] insufficient
|
58
|
+
# @note This is simply the inverse of +isSufficient+
|
59
|
+
# @see isSufficient
|
60
|
+
# @since 1.1.0
|
41
61
|
def isInsufficient
|
42
62
|
!@isSufficient
|
43
63
|
end
|
64
|
+
# Get the actual grade/value
|
65
|
+
# @return [Float] grade
|
66
|
+
# @since 1.1.0
|
44
67
|
def grade
|
45
68
|
@grade
|
46
69
|
end
|
47
|
-
|
70
|
+
# Get the actual grade/value
|
71
|
+
# @return [Float] grade
|
72
|
+
# @see grade
|
73
|
+
# @since 1.1.0
|
74
|
+
def value
|
48
75
|
@grade
|
49
76
|
end
|
77
|
+
# Get the wight of the grade
|
78
|
+
# @return [Integer] weight
|
79
|
+
# @since 1.1.0
|
50
80
|
def weight
|
51
81
|
@weight
|
52
82
|
end
|
83
|
+
# If the grade actually counts
|
84
|
+
# @return [Boolean] counts
|
85
|
+
# @since 1.1.0
|
53
86
|
def counts
|
54
87
|
@counts
|
55
88
|
end
|
89
|
+
# If the test/thing that caused the grade needs to be caught up on
|
90
|
+
# @return [Boolean] needs to be caught up
|
91
|
+
# @since 1.1.0
|
56
92
|
def toBeCaughtUp
|
57
93
|
@toBeCaughtUp
|
58
94
|
end
|
95
|
+
# If the current user is exempt from the subject
|
96
|
+
# @return [Boolean] exempt
|
97
|
+
# @since 1.1.0
|
59
98
|
def isExempt
|
60
99
|
@isExempt
|
61
100
|
end
|
101
|
+
# If the current user is exempt from the subject
|
102
|
+
# @return [Boolean] exempt
|
103
|
+
# @see exempt
|
104
|
+
# @since 1.1.0
|
62
105
|
def exempt
|
63
106
|
@isExempt
|
64
107
|
end
|
108
|
+
# When the grade was entered
|
109
|
+
# @return [String] Date
|
110
|
+
# @note This is when the teacher added the grade to magisters
|
111
|
+
# @see earnedOn
|
112
|
+
# @since 1.1.0
|
65
113
|
def addedOn
|
66
114
|
@addedOn
|
67
115
|
end
|
116
|
+
# If the current user is exempt from the subhect
|
117
|
+
# @return [Boolean, nil] exempt
|
118
|
+
# @note This is when the actual test occurred
|
119
|
+
# @see addedOn
|
120
|
+
# @since 1.1.0
|
68
121
|
def earnedOn
|
69
122
|
@earnedOn
|
70
123
|
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
|
+
|
5
|
+
# Module used in the #person class
|
6
|
+
# @since 1.2.0
|
7
|
+
module Birth
|
8
|
+
# The birthday of the person
|
9
|
+
# @return [String] birthday
|
10
|
+
# @since 1.2.0
|
11
|
+
def day
|
12
|
+
@birthDay
|
13
|
+
end
|
14
|
+
# The persons last name given at birth
|
15
|
+
# @return [String] name
|
16
|
+
# @since 1.2.0
|
17
|
+
def lastName
|
18
|
+
@birthLastName
|
19
|
+
end
|
20
|
+
# The persons preposition given at birth
|
21
|
+
# @return [String] preposition
|
22
|
+
# @since 1.2.0
|
23
|
+
def preposition
|
24
|
+
@birthnamePreposition
|
25
|
+
end
|
26
|
+
# Wether or not to use the users birth name
|
27
|
+
# @return [Boolean] use birth name
|
28
|
+
# @since 1.2.0
|
29
|
+
def use
|
30
|
+
@useBirthname
|
31
|
+
end
|
32
|
+
# Wether or not to use the users birth name
|
33
|
+
# @return [Boolean] use birth name
|
34
|
+
# @since 1.2.0
|
35
|
+
def useBirthname
|
36
|
+
@useBirthname
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Module used in the #person class
|
41
|
+
# @since 1.2.0
|
42
|
+
module Official
|
43
|
+
# The official first of the person
|
44
|
+
# @return [String] name
|
45
|
+
# @since 1.2.0
|
46
|
+
def firstNames
|
47
|
+
@officialFirstNames
|
48
|
+
end
|
49
|
+
# The official prepositions of the person
|
50
|
+
# @return [String, nil] prepositions
|
51
|
+
# @since 1.2.0
|
52
|
+
def prepositions
|
53
|
+
@officialPrepositions
|
54
|
+
end
|
55
|
+
# The official last name of the person
|
56
|
+
# @return [String] name
|
57
|
+
# @since 1.2.0
|
58
|
+
def lastName
|
59
|
+
@officialLastName
|
60
|
+
end
|
61
|
+
# The initials of the person
|
62
|
+
# @return [String] initials
|
63
|
+
# @since 1.2.0
|
64
|
+
def initials
|
65
|
+
@initials
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# This class describes the person object the magister api gives us
|
70
|
+
# this object includes all the user's personal data like name and birthday
|
71
|
+
class Person
|
72
|
+
include Birth
|
73
|
+
include Official
|
74
|
+
|
75
|
+
# Returns a new instance of Person.
|
76
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
77
|
+
# @since 1.2.0
|
78
|
+
def initialize(rawParsed)
|
79
|
+
@id = rawParsed["Id"]
|
80
|
+
@firstName = rawParsed["Roepnaam"]
|
81
|
+
@preposition = rawParsed["Tussenvoegsel"]
|
82
|
+
@lastName = rawParsed["Achternaam"]
|
83
|
+
@officialFirstNames = rawParsed["OfficieleVoornamen"]
|
84
|
+
@initials = rawParsed["Voorletters"]
|
85
|
+
@officialPrepositions = rawParsed["OfficieleTussenvoegsels"]
|
86
|
+
@officialLastName = rawParsed["OfficieleAchternaam"]
|
87
|
+
@birthDay = rawParsed["Geboortedatum"]
|
88
|
+
@birthLastName = rawParsed["GeboorteAchternaam"]
|
89
|
+
@birthnamePreposition = rawParsed["GeboortenaamTussenvoegsel"]
|
90
|
+
@useBirthname = rawParsed["GebruikGeboortenaam"]
|
91
|
+
|
92
|
+
# probably only for tracking
|
93
|
+
@externalId = rawParsed["ExterneId"]
|
94
|
+
end
|
95
|
+
|
96
|
+
# The id of the person
|
97
|
+
# @return [Integer] id
|
98
|
+
# @since 1.2.0
|
99
|
+
def id
|
100
|
+
@id
|
101
|
+
end
|
102
|
+
# The first name of the person
|
103
|
+
# @return [String] name
|
104
|
+
# @since 1.2.0
|
105
|
+
def firstName
|
106
|
+
@firstName
|
107
|
+
end
|
108
|
+
# The preposition (thing between first & last name) of the person
|
109
|
+
# @return [String, nil] preposition
|
110
|
+
# @since 1.2.0
|
111
|
+
def preposition
|
112
|
+
@preposition
|
113
|
+
end
|
114
|
+
# The last name of the person
|
115
|
+
# @return [String] name
|
116
|
+
# @since 1.2.0
|
117
|
+
def lastName
|
118
|
+
@lastName
|
119
|
+
end
|
120
|
+
# The initials of the person
|
121
|
+
# @return [String] initials
|
122
|
+
# @since 1.2.0
|
123
|
+
def initials
|
124
|
+
@initials
|
125
|
+
end
|
126
|
+
# The birthday of the person
|
127
|
+
# @return [String] birthday
|
128
|
+
# @since 1.2.0
|
129
|
+
def birthDay
|
130
|
+
@birthDay
|
131
|
+
end
|
132
|
+
# Wether or not to use the users birth name
|
133
|
+
# @return [Boolean] use birth name
|
134
|
+
# @since 1.2.0
|
135
|
+
def useBirthname
|
136
|
+
@useBirthname
|
137
|
+
end
|
138
|
+
end
|
@@ -2,16 +2,29 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# This class represents a subject in magister in the sense of when it is linked to another object
|
5
6
|
class Subject
|
7
|
+
# Returns a new instance of Subject.
|
8
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
9
|
+
# @since 1.1.0
|
6
10
|
def initialize(rawParsed)
|
7
11
|
@id = rawParsed["Id"]
|
8
12
|
@name = rawParsed["Naam"]
|
9
13
|
end
|
10
14
|
|
11
|
-
#
|
15
|
+
# The id (or code) of the subject
|
16
|
+
# @return [Integer, String] id
|
17
|
+
# @note When initialized by +Grade+ it uses the code as the id to initialize
|
18
|
+
# @see Grade
|
19
|
+
# @since 1.1.0
|
12
20
|
def id
|
13
21
|
@id
|
14
22
|
end
|
23
|
+
# The name of the subject
|
24
|
+
# @return [String] Name
|
25
|
+
# @note When initialized by +Grade+ it uses the description as the name to initialize
|
26
|
+
# @see Grade
|
27
|
+
# @since 1.1.0
|
15
28
|
def name
|
16
29
|
@name
|
17
30
|
end
|
@@ -2,26 +2,44 @@
|
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
4
|
|
5
|
+
# This class represents the teacher object magister gives us.
|
5
6
|
class Teacher
|
7
|
+
# Returns a new instance of Teacher.
|
8
|
+
# @param rawParsed [Hash] The raw data, yet it has already been parsed (like with JSON.parse)
|
9
|
+
# @since 1.1.0
|
6
10
|
def initialize(rawParsed)
|
7
11
|
@id = rawParsed["Id"]
|
8
12
|
@name = rawParsed["Naam"]
|
9
13
|
@abrev = rawParsed["Docentcode"]
|
10
14
|
end
|
11
15
|
|
12
|
-
#
|
16
|
+
# The id of the teacher
|
17
|
+
# @return [Integer] id
|
18
|
+
# @since 1.1.0
|
13
19
|
def id
|
14
20
|
@id
|
15
21
|
end
|
22
|
+
# The name of the teacher
|
23
|
+
# @return [String] name
|
24
|
+
# @since 1.1.0
|
16
25
|
def name
|
17
26
|
@name
|
18
27
|
end
|
28
|
+
# The abreviation of the teacher
|
29
|
+
# @return [String] Abreviation
|
30
|
+
# @since 1.1.0
|
19
31
|
def abrev
|
20
32
|
@abrev
|
21
33
|
end
|
34
|
+
# The abreviation of the teacher
|
35
|
+
# @return [String] Abreviation
|
36
|
+
# @since 1.1.0
|
22
37
|
def abreviaton
|
23
38
|
@abrev
|
24
39
|
end
|
40
|
+
# The abreviation of the teacher
|
41
|
+
# @return [String] Abreviation
|
42
|
+
# @since 1.1.0
|
25
43
|
def code
|
26
44
|
@abrev
|
27
45
|
end
|
data/lib/magister.rb
CHANGED
@@ -1,30 +1,65 @@
|
|
1
1
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
2
2
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
3
3
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
4
|
-
require 'magister/profile
|
5
|
-
require 'magister/data
|
6
|
-
require 'magister/authenticator
|
4
|
+
require 'magister/profile'
|
5
|
+
require 'magister/data'
|
6
|
+
require 'magister/authenticator'
|
7
7
|
|
8
8
|
# can be either "selenium" or "local"
|
9
9
|
# "selenium" will run headlessly
|
10
10
|
# "local" will open a browser window for the user to login
|
11
11
|
$authMode = "selenium"
|
12
12
|
|
13
|
+
# Caching options
|
14
|
+
$magister_useCache = true
|
15
|
+
$magister_cachingDirectory = ".cache/magister"
|
16
|
+
|
17
|
+
# Cache type can eitehr be "compact" or "json"
|
18
|
+
$magister_cacheType = "json"
|
19
|
+
# Wether to encrypt the cache, this can secure the acount by not exposing the token or any sensetive data.
|
20
|
+
$magister_encryptCache = false
|
21
|
+
# When using encryption, this may not be empty
|
22
|
+
$magister_encryptionKey = ""
|
23
|
+
|
24
|
+
# The main magister class
|
13
25
|
class Magister
|
14
26
|
include MagisterData
|
15
27
|
|
28
|
+
# Returns a new instance of Magister.
|
29
|
+
# @since 1.0.0
|
16
30
|
def initialize
|
17
31
|
@profile = nil
|
32
|
+
|
33
|
+
if $magister_useCache
|
34
|
+
prev = ""
|
35
|
+
$magister_cachingDirectory.split("/").each do |directory|
|
36
|
+
Dir.mkdir(prev + directory) unless File.exist?(prev + directory)
|
37
|
+
prev += directory + "/"
|
38
|
+
end
|
39
|
+
end
|
18
40
|
end
|
19
41
|
|
42
|
+
# Create a new profile and authenticate with a token
|
43
|
+
# @param school [String] The school the user attends
|
44
|
+
# @param token [String] The users token
|
45
|
+
# @since 1.0.0
|
20
46
|
def authenticate(school, token)
|
21
47
|
@profile = Profile.new(token, school)
|
22
48
|
@profile.verify
|
23
49
|
end
|
50
|
+
# Create a new profile based on a username and password
|
51
|
+
# @param school [String] The school the user attends
|
52
|
+
# @param username [String] The users username
|
53
|
+
# @param password [String] The users password
|
54
|
+
# @see Authenticator#login
|
55
|
+
# @since 1.1.0
|
24
56
|
def login(school, username, password)
|
25
57
|
@profile = Authenticator.login(username, password, school)
|
26
58
|
end
|
27
59
|
|
60
|
+
# Get the users profile
|
61
|
+
# @return [Profile] the profile
|
62
|
+
# @since 1.0.0
|
28
63
|
def profile
|
29
64
|
@profile
|
30
65
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magister
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Riley0122
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- lib/magister/types/class.rb
|
86
86
|
- lib/magister/types/classroom.rb
|
87
87
|
- lib/magister/types/grade.rb
|
88
|
+
- lib/magister/types/person.rb
|
88
89
|
- lib/magister/types/subject.rb
|
89
90
|
- lib/magister/types/teacher.rb
|
90
91
|
homepage: https://github.com/riley0122/rubymag#readme
|
@@ -92,6 +93,7 @@ licenses:
|
|
92
93
|
- MPL-2.0
|
93
94
|
metadata:
|
94
95
|
source_code_uri: https://github.com/riley0122/rubymag
|
96
|
+
documentation_uri: https://riley0122.github.io/rubymag
|
95
97
|
post_install_message:
|
96
98
|
rdoc_options: []
|
97
99
|
require_paths:
|