magister 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: faf4f432a878e25770d0a9faf41d4d1691332a60ce70d0bf5d71087da14d080e
4
- data.tar.gz: 7e8fdd7861269b393f96af946b4790a682a5b9661ec99ec8a0435303e95924b6
3
+ metadata.gz: bd94a0cc6b6ee2470916892afd0c9ffe626d2c7a31acd3fc2bd7e7e4485415bc
4
+ data.tar.gz: 21f397e67ca49836e84af7fd83a425223a30b385e41a116149c2a0b02074fce4
5
5
  SHA512:
6
- metadata.gz: 88ebd7702f2ac21a3724b131da9b374847b6412d66b17d55a722f1c04769c56cc48b3e9e33855e1d40dc6a4b10f7462c0db7496dbe460809c53410cbbb88a981
7
- data.tar.gz: fcb21e21d0dc94c815cf1b75e08a573c7ed66463e5060e244517c54ec145358c7786d21235242f40c64c292af4beb29e13387e6fb93696ad5efcbec54b9873d3
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.rb'
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
- return Profile.new(token, school)
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
@@ -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["Id"].to_i
50
- puts "Succesfully authenticated as #{@person["Roepnaam"]} with id #{@person["Id"]}"
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!"
@@ -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
- def usOnline
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
- # singular getter
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
@@ -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
- # getters
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
- def values
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
- # getters
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
- # getters
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.rb'
5
- require 'magister/data.rb'
6
- require 'magister/authenticator.rb'
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.0
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-19 00:00:00.000000000 Z
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: