Class: Studium::Exams::NextExams

Inherits:
Base
  • Object
show all
Defined in:
lib/studium/exams/next_exams.rb

Overview

Studium::Exams::NextExams

Constant Summary collapse

NAMESPACE =
#

NAMESPACE

#
inspect
DEFAULT_REMOTE_URL =
#

DEFAULT_REMOTE_URL

Example URL:

https://online.boku.ac.at/BOKUonline/wbExamOffer.wbExamsOfCourse?pCourseNr=278031
#
'https://online.boku.ac.at/BOKUonline/wbExamOffer.wbExamsOfCourse?pCourseNr=278031'
USE_THIS_REGEX_FOR_EXAMS_AT_THE_BOKU =
#

USE_THIS_REGEX_FOR_EXAMS_AT_THE_BOKU

This regex is specifically for exams at the BOKU.

See: rubular.com/r/Lza6qKILrA

#
/<span><span class="ExamDate\s{0,1}">(\d?\d.\d\d.\d\d\d\d)<\/span><br\/><span class="NoWarpTime\s{0,1}">(\d?\d:\d\d\s{0,1}-\s{0,1}\d?\d:\d\d)<\/span><\/span><\/div>/
USE_THIS_REGEX_FOR_EXAMS_AT_THE_TU_VIENNA =
#

USE_THIS_REGEX_FOR_EXAMS_AT_THE_TU_VIENNA

Use a regex for exams at the TU Vienna.

See: rubular.com/r/UoLvMHGLai

#
/\s+<th>Anmeldefrist<\/th>\s+<th>Anmeldung<\/th>\s+<th>Prüfung<\/th>\s+<\/tr>\s+<\/thead>\s+<tr>\s+<td>.+\s+<\/td>\s+<td>\s+-?\s+<\/td>\s+<td>(\d\d.\d\d.\d\d\d\d)\s+<\/td>\s+<td>/

Constants inherited from Base

Base::ARRAY_HTML_COLOURS_IN_USE, Base::CHECK_FOR_INCORRECT_ENTRIES_IN_THE_QUESTION_ANSWER_FILE_THAT_SHOULD_BE_COMMENTS, Base::COLOURS, Base::COMMON_YEAR_DAYS_IN_MONTH, Base::GRAY, Base::LEFT_PADDING, Base::N_CHARACTERS_PER_LINE, Base::UNICODE_RIGHT_ARROW

Constants included from Colours

Colours::COLOURS

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#add_proper_year_entry_to_this_line, #already_solved_this_lva_number?, #append_what_into, #available_topics_as_short_name, #average_grade, #bachelor_master_or_diploma, #base_dir?, #be_silent, #be_verbose?, #beautiful_url, #change_directory, #cheering_person, #cliner, #colour_for_ects_points, #colourize_percentage, #commandline_arguments?, #commandline_arguments_joined, #commandline_arguments_with_hyphens?, #convert_this_array_of_lectures_into_the_full_dataset, #copy, #cpruby, #create_directory, #create_file, #csv_file?, #current_month?, #datum?, #day_month_year, #debug?, #delete_file, #directory_of_the_exam_topics?, #directory_to_my_exam_topics, #directory_to_the_exam_topics?, #disable_colours, #disable_colours_globally, #do_not_be_verbose, #do_not_use_opn, #do_these_curricula_include_both_a_bachelor_and_a_master_curriculum?, #does_this_line_include_a_german_weekday?, #does_this_line_include_a_html_colour?, #e, #ecomment, #editor?, #ee, #enable_colours, #enable_colours_globally, #enable_debug, #encoding?, #english_to_german_weekday, #ensure_main_encoding, #ensure_that_the_log_directory_exists, #eparse, #erev, #esystem, #etomato, #exit_program, #expand_topic, #extract_dd_mm_yyyy, #file_lecture_information?, #file_read_with_proper_encoding, #filter_away_invalid_questions, #find_corresponding_exam_topic, #first_argument?, #first_non_hyphen_argument?, #from_curriculum_id_to_university, #german_date_notation, #german_weekday?, #german_weekdays?, #has_a_bachelor_curriculum?, #has_a_master_curriculum?, #has_this_exam_topic_been_solved?, #has_year_entry?, #hh_mm_ss_dd_mm_yyyy, #horizontal_bar?, #html_log_directory?, #is_a_master_lecture?, #is_a_weekday?, #is_connected_to_the_www?, #is_on_roebe?, #is_prüfungsimmanent?, #is_this_a_valid_html_colour?, #is_this_day_today?, #konsole_support?, #last_file?, #lectures_from_indi1, #lectures_from_indi2, #lectures_from_indi3, #lectures_from_indi4, #lectures_from_the_bachelor_genetik_curriculum, #lectures_from_the_individual_vektor_curricula, #load_yaml_dataset, #move_file, #n_days_difference_from_today_to_this_day, #no_ext_name, #no_file_at, #number_to_month, #obtain, #obtain_lectures_from_this_curriculum, #open_in_editor, #opnn, #path_to_exam_topic?, #read_dataset_from_a_curriculum_file, #read_in_exam_dataset_from_this_file, #read_this_file_with_default_encoding, #readlines_from_this_input_file, #register_sigint, #remove_empty_strings, #remove_escape_sequences, #remove_internal_comments, #remove_leading_comments, #remove_leading_weekday_names_from, #remove_newlines, #remove_tags_from_this_input, #rename_kde_konsole_tab, #rename_konsole_tab?, #replace_all_html_colours_in_this, #replace_bold_token_with_default_colour, #replace_italic_token_with_default_colour, #replace_italic_token_with_this_colour, #replace_regular_numbers_with_unicode_numbers, #replace_underline_token_with_default_colour, #replace_underline_token_with_this_colour, #return_all_bachelor_lectures, #return_all_exams_on_this_day, #return_all_numbers_from, #return_all_registered_curricula, #return_all_steop_lectures, #return_current_year, #return_dataset_for_this_topic, #return_dataset_from_this_curriculum_file, #return_dd_mm_yy_and_time_from, #return_directory_for, #return_ects_points_from_these_lectures, #return_either_grey_or_the_custom_colour_for_answers, #return_either_grey_or_the_custom_colour_for_questions, #return_file_for_this_curriculum, #return_german_name_for_this_english_month, #return_german_weekday_of?, #return_hh_mm_ss_from, #return_hour_from_this, #return_lectures_from_bachelor_vektor_curriculum, #return_lectures_with_at_the_least_one_upcoming_exam, #return_local_path_of_this_pwdstud, #return_lva_number_of_this_lecture, #return_month_fitting_to_this_input, #return_n_days_until_monday, #return_n_days_until_sunday, #return_n_exam_questions_in, #return_n_questions_were_answered_for_this_topic, #return_name_of_the_weekday, #return_name_of_this_curriculum, #return_name_of_this_curriculum_based_on_its_id_number, #return_opnn, #return_passed_courses, #return_pwd, #return_random_curriculum, #return_sanitized_dataset_from_the_file_lecture_information, #return_solved_lectures, #return_steop_lectures, #return_the_remote_homepage_url, #return_this_line_has_n_characters_as_html_colour_tags, #return_title_from_this_curriculum_file, #rev, #right_arrow?, #rinstall2, #roebe_exam_directory?, #ruby_src_dir_at_home?, #runmode?, #sanitize_this_topic, #sanitize_url, #select_lectures_with_this_key, #set_be_quiet, #set_be_verbose, #set_commandline_arguments, #set_commandline_mode, #set_runmode, #set_this_cd_alias_to, #set_www_mode, #sfancy, #shall_we_make_use_of_unicode_symbols?, #show_todays_date, #simp, #sort_these_lecture_names_by_time, #spacer, #swarn, #this_month_has_n_days?, #total_ects_points_passed, #translate_dd_mm_yyyy_to_weekday, #try_to_require_the_rcfiles, #turn_this_array_into_the_full_dataset, #unicode_blocks_line, #use_colours?, #use_opn?, #vertical_bar?, #web_liner, #weekday?, #weekdays?, #word_wrap, #write_what_into, #www_connection_is_unavailable, #www_mode?, #yaml_dir?

Methods included from Colours

#bold_blue, #bold_red, #bold_yellow, #cadetblue, #chartreuse, crimson, #darkgray, darkgreen, darkseagreen, deepskyblue, #deepskyblue, default_colour, #dimgray, disable_colours, #dodgerblue, e, #efancy, enable_colours, #ewarn, #forestgreen, gold, #grey, lightblue, lightgreen, #lightslategray, #lightsteelblue, #mediumorchid, #mediumseagreen, #oldlace, #olivedrab, orange, orangered, #orchid, palevioletred, #papayawhip, rev, royalblue, sdir, #sdir, sfancy, #sfancy, sfile, #sfile, simp, #simp, slateblue, steelblue, #steelblue, #swarn, swarn, #teal, turquoise, use_colours?, use_this_colour_for_exam_answers, use_this_colour_for_exam_questions, #yellow

Constructor Details

#initialize(i = nil, run_already = true) ⇒ NextExams

#

initialize

#


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/studium/exams/next_exams.rb', line 72

def initialize(
    i           = nil,
    run_already = true
  )
  reset
  set_remote_url(i)
  if block_given?
    yielded = yield
    case yielded
    when :be_quiet
      do_be_quiet
    end
  end 
  run if run_already
end

Class Method Details

.[](i = '') ⇒ Object

#

Studium::Exams::NextExams[]

#


346
347
348
# File 'lib/studium/exams/next_exams.rb', line 346

def self.[](i = '')
  new(i)
end

.from_this_url(remote_url = DEFAULT_REMOTE_URL) ⇒ Object

#

Studium::Exams::NextExams.from_this_url()

Use this method to find out all upcoming exams from a particular remote URL.

The first argument is the URL - see below for such a specific example.

#


335
336
337
338
339
340
341
# File 'lib/studium/exams/next_exams.rb', line 335

def self.from_this_url(
    # remote_url = 'https://ufind.univie.ac.at/de/course.html?lv=300195&semester=2016W'
    remote_url = DEFAULT_REMOTE_URL
  )
  object = self.new(remote_url)
  return object
end

.regex?Boolean

#

Studium::Exams::NextExams.regex?

#

Returns:

  • (Boolean)


169
170
171
# File 'lib/studium/exams/next_exams.rb', line 169

def self.regex?
  USE_THIS_REGEX_FOR_EXAMS_AT_THE_BOKU
end

Instance Method Details

#apply_main_regex_to_find_all_exam_datesObject

#

apply_main_regex_to_find_all_exam_dates

Apply our main regex here to find all the upcoming exam dates.

#


239
240
241
242
243
244
# File 'lib/studium/exams/next_exams.rb', line 239

def apply_main_regex_to_find_all_exam_dates
  if is_connected_to_the_www?
    @exam_dates = @dataset.scan(regex?)
    sanitize_exam_dates # Convert it into a Hash.
  end
end

#do_be_quietObject

#

do_be_quiet

#


230
231
232
# File 'lib/studium/exams/next_exams.rb', line 230

def do_be_quiet
  @do_report_the_result = false
end

#do_use_regex_for_tu_viennaObject Also known as: do_use_tu_vienna_regex

#

do_use_regex_for_tu_vienna

#


162
163
164
# File 'lib/studium/exams/next_exams.rb', line 162

def do_use_regex_for_tu_vienna
  @use_this_regex = USE_THIS_REGEX_FOR_EXAMS_AT_THE_TU_VIENNA
end

#exam_dates?Boolean

#

exam_dates?

#

Returns:

  • (Boolean)


183
184
185
# File 'lib/studium/exams/next_exams.rb', line 183

def exam_dates?
  @exam_dates
end

#local_file_with_upcoming_exams?Boolean Also known as: main_file?

#

local_file_with_upcoming_exams?

#

Returns:

  • (Boolean)


135
136
137
# File 'lib/studium/exams/next_exams.rb', line 135

def local_file_with_upcoming_exams?
  nil
end

#next_exam?Boolean

#

next_exam?

Simply return the next exam.

#

Returns:

  • (Boolean)


220
221
222
223
224
225
# File 'lib/studium/exams/next_exams.rb', line 220

def next_exam?
  if @exam_dates
    _ = @exam_dates.first # Use only the very next exam (singular entry) 
    return Hash[*_]
  end
end

#notify_which_remote_url_we_will_use(i = remote_url?) ) ⇒ Object

#

notify_which_remote_url_we_will_use

#


142
143
144
145
146
147
148
149
150
# File 'lib/studium/exams/next_exams.rb', line 142

def notify_which_remote_url_we_will_use(i = remote_url?)
  if i
    opnn; e 'We will use the remote URL `'+sfancy(i)+'`.'
  else
    opnn; e 'Trying to use the local dataset (from file: '+sfile(
      local_file_with_upcoming_exams?
    )+')'
  end
end

#obtain_dataset(i = remote_url?) ) ⇒ Object

#

obtain_dataset

#


249
250
251
252
253
254
255
256
257
258
259
260
261
# File 'lib/studium/exams/next_exams.rb', line 249

def obtain_dataset(i = remote_url?)
  if i
    begin
      @dataset = URI.open(i).read
    rescue OpenSSL::SSL::SSLError => error
      pp error
      www_connection_is_unavailable
    rescue SocketError => error
      pp error
      www_connection_is_unavailable
    end
  end
end

#regex?Boolean

#

regex?

#

Returns:

  • (Boolean)


155
156
157
# File 'lib/studium/exams/next_exams.rb', line 155

def regex?
  @use_this_regex
end

#remote_url?Boolean

#

remote_url?

#

Returns:

  • (Boolean)


176
177
178
# File 'lib/studium/exams/next_exams.rb', line 176

def remote_url?
  @remote_url
end

#report_exam_dates(i = @exam_dates) ⇒ Object Also known as: report

#

report_exam_dates (report tag)

This method will simply report the upcoming exam dates.

The input to this method should be a Hash. It can be an Array too, though, but the default is a Hash.

#


271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/studium/exams/next_exams.rb', line 271

def report_exam_dates(i = @exam_dates)
  if i.is_a? Hash
    i.each_pair {|date, hour_time|
      e date+': '+hour_time.to_s
    }
  else # Else assume an Array in this case.
    # In this case, we additionally assume that the entry
    # must be sanitized.
    # ===================================================================== #
    i.each {|line|
      splitted = line.split(',')
      date = splitted.first
      hour_time = splitted.last
      e date+': '+hour_time.to_s
    }
  end
end

#resetObject

#

reset (reset tag)

#


91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/studium/exams/next_exams.rb', line 91

def reset
  super()
  # ======================================================================= #
  # === @namespace
  # ======================================================================= #
  @namespace = NAMESPACE
  # ======================================================================= #
  # === @remote_url
  # ======================================================================= #
  @remote_url = nil
  # ======================================================================= #
  # === @exam_dates
  # ======================================================================= #
  @exam_dates = nil # This will eventually become a Hash.
  @do_report_the_result = true
  # ======================================================================= #
  # Which regex to use - defaults to regexes at the BOKU.
  # ======================================================================= #
  @use_this_regex = USE_THIS_REGEX_FOR_EXAMS_AT_THE_BOKU
end

#runObject

#

run (run tag)

#


320
321
322
323
324
325
# File 'lib/studium/exams/next_exams.rb', line 320

def run
  notify_which_remote_url_we_will_use if @do_report_the_result
  obtain_dataset
  apply_main_regex_to_find_all_exam_dates
  report_exam_dates if @do_report_the_result
end

#sanitize_exam_datesObject

#

sanitize_exam_dates

#


190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/studium/exams/next_exams.rb', line 190

def sanitize_exam_dates
  # ======================================================================= #
  # Keep the exam dates sorted in reverse-manner. This means that you can
  # obtain the first element of the hash and it will be the very next
  # exam upcoming entry.
  # ======================================================================= #
  _ = @exam_dates.reverse # <--- This is an Array.
  _.map! {|inner_array|
    last = inner_array.last
    if last.include? ' - '
      last.delete!(' ')
    end
    inner_array[-1] = last
    inner_array
  }
  hash = Hash[*_.flatten] # Turn it into a Hash again.
  # ======================================================================= #
  # Next, reject all invalid dates - that is, days from the past.
  # ======================================================================= #
  hash.reject! {|key, value|
    Time.parse(key) < Time.now 
  }
  @exam_dates = hash # And re-assign it again. This time it is a Hash.
end

#set_remote_url(i = '') ⇒ Object

#

set_remote_url

#


115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/studium/exams/next_exams.rb', line 115

def set_remote_url(i = '')
  i = i.first if i.is_a? Array
  i = DEFAULT_REMOTE_URL if i.nil?
  i = i.to_s.dup
  # ======================================================================= #
  # The default is matching exams at the BOKU.
  # ======================================================================= #
  if i.include? 'tiss.tuwien.ac.at'
    do_use_tu_vienna_regex
  end
  if i.include? 'http'
    @remote_url = i
  else # else assume local dataset and thus short-circuit here.
    try_to_find_this_local_exam(i)
  end
end

#try_to_find_this_local_exam(i) ⇒ Object

#

try_to_find_this_local_exam

#


292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
# File 'lib/studium/exams/next_exams.rb', line 292

def try_to_find_this_local_exam(i)
  opnn; e 'We will assume that the given input '+simp(i)
  opnn; e 'is a locally registered exam.'
  _ = main_file?
  if File.exist? _
    dataset = YAML.load_file(_)
    if dataset.has_key? i # Ok has it registered.
      possible_entries = dataset[i]
      # =================================================================== #
      # In this case, we have found something, and thus we
      # will report that we have found something.
      # =================================================================== #
      opnn; e 'We have at the least one upcoming exam for this lecture.'
      report(possible_entries)
    else
      opnn; e 'No registered entry called '+sfancy(i)+' was found.'
    end
    exit # Exit in any case.
  else
    opnn; e 'No file exists at '+sfile(_)+' - thus, we can not continue.'
    opnn; e 'Exiting now as a consequence.'
    exit
  end
end