studium 0.14.16

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of studium might be problematic. Click here for more details.

Files changed (883) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2987 -0
  3. data/bin/ask_exam_question +7 -0
  4. data/bin/check_description_of_these_lectures +7 -0
  5. data/bin/curriculum_module_displayer +7 -0
  6. data/bin/cycle +7 -0
  7. data/bin/d10 +7 -0
  8. data/bin/d100 +7 -0
  9. data/bin/d15 +7 -0
  10. data/bin/d20 +7 -0
  11. data/bin/d25 +7 -0
  12. data/bin/d3 +7 -0
  13. data/bin/d30 +7 -0
  14. data/bin/d5 +7 -0
  15. data/bin/determine_curricula +7 -0
  16. data/bin/display_lecture_url +7 -0
  17. data/bin/exam_registration_at +7 -0
  18. data/bin/exam_statistics +7 -0
  19. data/bin/exams_per_month +9 -0
  20. data/bin/finished_exams_at_this_university +7 -0
  21. data/bin/flashcards +7 -0
  22. data/bin/from_curriculum_id_to_university +9 -0
  23. data/bin/location_to_this_exam_topic.rb +7 -0
  24. data/bin/mandatory_continuous_assessment +7 -0
  25. data/bin/mandatory_upcoming_courses +10 -0
  26. data/bin/n_ECTS +7 -0
  27. data/bin/n_exam_questions_already_answered +16 -0
  28. data/bin/nquestions +7 -0
  29. data/bin/nsolved +7 -0
  30. data/bin/open_last_exam_question_asked_file +7 -0
  31. data/bin/passed_exams +7 -0
  32. data/bin/passed_pr/303/274fungsimmanente_courses +7 -0
  33. data/bin/pdf_for +7 -0
  34. data/bin/random_exam_topic +7 -0
  35. data/bin/report_solved_topics +7 -0
  36. data/bin/return_n_ects_from_this_file +7 -0
  37. data/bin/search_for_n_ects +7 -0
  38. data/bin/show_lectures_on_the_commandline +7 -0
  39. data/bin/show_themes +7 -0
  40. data/bin/solved +9 -0
  41. data/bin/solved_ects +7 -0
  42. data/bin/studienkennzahl +7 -0
  43. data/bin/studium +7 -0
  44. data/bin/studium_skeleton +7 -0
  45. data/bin/ufind +7 -0
  46. data/bin/upcoming_exams +7 -0
  47. data/bin/week_parser +7 -0
  48. data/doc/ECTS_CONSIDERATIONS.md +82 -0
  49. data/doc/HOW_TO_DETERMINE_WHICH_PART_IS_THE_QUESTION_AND_WHICH_PART_IS_THE_ANSWER.md +44 -0
  50. data/doc/README.gen +2947 -0
  51. data/doc/SQL_database_specification.md +46 -0
  52. data/doc/deprecated_components.md +24 -0
  53. data/doc/documentation_for_the_file_lecture_information.md +311 -0
  54. data/doc/elegant_colours.md +21 -0
  55. data/doc/statistics/yearly_statistics.md +5 -0
  56. data/doc/todo/todo_for_the_graphical_parts_of_the_studium_gem_including_www_related_aspects.md +32 -0
  57. data/doc/todo/todo_for_the_studium_gem.md +58 -0
  58. data/img/STUDIES.png +0 -0
  59. data/lib/studium/autoinclude.rb +7 -0
  60. data/lib/studium/base/base.rb +3054 -0
  61. data/lib/studium/base/prototype.rb +592 -0
  62. data/lib/studium/c/README.md +2 -0
  63. data/lib/studium/c/a.out +0 -0
  64. data/lib/studium/c/obtain_random_entry.c +11 -0
  65. data/lib/studium/check_and_sanitize/README.md +15 -0
  66. data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
  67. data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +118 -0
  68. data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +100 -0
  69. data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +191 -0
  70. data/lib/studium/check_and_sanitize/check_important_exams.rb +113 -0
  71. data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +163 -0
  72. data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +124 -0
  73. data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
  74. data/lib/studium/check_and_sanitize/sanitize_lecture_information.rb +428 -0
  75. data/lib/studium/check_and_sanitize/sanitize_this_string_containing_the_lva_dates.rb +79 -0
  76. data/lib/studium/colours/colours.rb +572 -0
  77. data/lib/studium/colours/sfancy.rb +46 -0
  78. data/lib/studium/colours/sfile.rb +35 -0
  79. data/lib/studium/colours/simp.rb +40 -0
  80. data/lib/studium/colours/use_colours.rb +39 -0
  81. data/lib/studium/colours/use_this_colour_for_exam_questions_and_exam_answers.rb +80 -0
  82. data/lib/studium/commandline/commandline.rb +932 -0
  83. data/lib/studium/commandline/menu.rb +906 -0
  84. data/lib/studium/constants/colours.rb +14 -0
  85. data/lib/studium/constants/constants.rb +1708 -0
  86. data/lib/studium/constants/image_constants.rb +271 -0
  87. data/lib/studium/constants/regexes.rb +44 -0
  88. data/lib/studium/constants/web_constants.rb +28 -0
  89. data/lib/studium/css/project.css +267 -0
  90. data/lib/studium/curricula/curriculum.rb +210 -0
  91. data/lib/studium/curricula/curriculum_as_string.rb +280 -0
  92. data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
  93. data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
  94. data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
  95. data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
  96. data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
  97. data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
  98. data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
  99. data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
  100. data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
  101. data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
  102. data/lib/studium/curricula/determine_curricula/help.rb +39 -0
  103. data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
  104. data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
  105. data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
  106. data/lib/studium/curricula/determine_curricula/report.rb +143 -0
  107. data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
  108. data/lib/studium/curricula/determine_curricula/run.rb +19 -0
  109. data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
  110. data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
  111. data/lib/studium/curricula/handle_curricula/README.md +9 -0
  112. data/lib/studium/curricula/handle_curricula/handle_curricula.rb +179 -0
  113. data/lib/studium/curricula/handle_curricula/misc.rb +705 -0
  114. data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +323 -0
  115. data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
  116. data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +75 -0
  117. data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +75 -0
  118. data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
  119. data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +163 -0
  120. data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
  121. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/constants.rb +11 -0
  122. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/initialize.rb +27 -0
  123. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/menu.rb +35 -0
  124. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/misc.rb +264 -0
  125. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/report.rb +163 -0
  126. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/reset.rb +64 -0
  127. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +38 -0
  128. data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
  129. data/lib/studium/curricula/sorted_individual_curricula.rb +121 -0
  130. data/lib/studium/ects/boku_ects_splitter.rb +128 -0
  131. data/lib/studium/ects/ects_per_university.rb +179 -0
  132. data/lib/studium/ects/ects_scanner.rb +141 -0
  133. data/lib/studium/ects/ects_to_university_parser.rb +142 -0
  134. data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
  135. data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
  136. data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +50 -0
  137. data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
  138. data/lib/studium/ects/return_n_ects_from_this_url.rb +196 -0
  139. data/lib/studium/ects/search_for_n_ects.rb +614 -0
  140. data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +191 -0
  141. data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
  142. data/lib/studium/ects/simple_total_ects_points.rb +135 -0
  143. data/lib/studium/ects/solved_ects/constants.rb +19 -0
  144. data/lib/studium/ects/solved_ects/reset.rb +51 -0
  145. data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
  146. data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
  147. data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +106 -0
  148. data/lib/studium/ects/still_missing.rb +129 -0
  149. data/lib/studium/ects/sum_of_ects.rb +144 -0
  150. data/lib/studium/encoding/encoding.rb +108 -0
  151. data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +100 -0
  152. data/lib/studium/exam_topics/abfall_als_ressource +86 -0
  153. data/lib/studium/exam_topics/advanced_biochemistry +793 -0
  154. data/lib/studium/exam_topics/advanced_biotechnology +225 -0
  155. data/lib/studium/exam_topics/advanced_cellbiology +105 -0
  156. data/lib/studium/exam_topics/advanced_chemistry +518 -0
  157. data/lib/studium/exam_topics/advanced_microbiology +44 -0
  158. data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +85 -0
  159. data/lib/studium/exam_topics/advanced_virology +229 -0
  160. data/lib/studium/exam_topics/ageing +117 -0
  161. data/lib/studium/exam_topics/agrar_ecology +63 -0
  162. data/lib/studium/exam_topics/agrarmarkt +74 -0
  163. data/lib/studium/exam_topics/agrarphysik +35 -0
  164. data/lib/studium/exam_topics/alcohols +29 -0
  165. data/lib/studium/exam_topics/algorithms +59 -0
  166. data/lib/studium/exam_topics/allergie +76 -0
  167. data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
  168. data/lib/studium/exam_topics/allgemeine_mikrobiologie +977 -0
  169. data/lib/studium/exam_topics/aminoacids +447 -0
  170. data/lib/studium/exam_topics/analytische_chemie_1 +132 -0
  171. data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
  172. data/lib/studium/exam_topics/anatomie +292 -0
  173. data/lib/studium/exam_topics/anorganische_chemie +323 -0
  174. data/lib/studium/exam_topics/anthropologie +117 -0
  175. data/lib/studium/exam_topics/antibodies_and_antigens +770 -0
  176. data/lib/studium/exam_topics/apoptosis +35 -0
  177. data/lib/studium/exam_topics/archaea +95 -0
  178. data/lib/studium/exam_topics/architecture +8 -0
  179. data/lib/studium/exam_topics/artificial_intelligence +85 -0
  180. data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
  181. data/lib/studium/exam_topics/audio +11 -0
  182. data/lib/studium/exam_topics/bacteriophages +243 -0
  183. data/lib/studium/exam_topics/basic_biochemistry +1005 -0
  184. data/lib/studium/exam_topics/basic_biotechnology +1004 -0
  185. data/lib/studium/exam_topics/basic_chemistry +1007 -0
  186. data/lib/studium/exam_topics/basic_virology +1010 -0
  187. data/lib/studium/exam_topics/bauwesen +6 -0
  188. data/lib/studium/exam_topics/betriebssysteme +126 -0
  189. data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
  190. data/lib/studium/exam_topics/bioanalytik_und_biosensoren +389 -0
  191. data/lib/studium/exam_topics/biochips +79 -0
  192. data/lib/studium/exam_topics/bioelektrochemie +57 -0
  193. data/lib/studium/exam_topics/biofilms +24 -0
  194. data/lib/studium/exam_topics/bioinformatics +507 -0
  195. data/lib/studium/exam_topics/biological_therapeutics +155 -0
  196. data/lib/studium/exam_topics/biologie +139 -0
  197. data/lib/studium/exam_topics/biomarkers +135 -0
  198. data/lib/studium/exam_topics/biomaterials +89 -0
  199. data/lib/studium/exam_topics/biomembranes +6 -0
  200. data/lib/studium/exam_topics/bionik +65 -0
  201. data/lib/studium/exam_topics/biophysik +34 -0
  202. data/lib/studium/exam_topics/biopolymers +10 -0
  203. data/lib/studium/exam_topics/bioprozesstechnik +149 -0
  204. data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
  205. data/lib/studium/exam_topics/birds +3 -0
  206. data/lib/studium/exam_topics/bodenkunde +373 -0
  207. data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
  208. data/lib/studium/exam_topics/cancerbiology +454 -0
  209. data/lib/studium/exam_topics/cell_cultures +221 -0
  210. data/lib/studium/exam_topics/cellbiology +1011 -0
  211. data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
  212. data/lib/studium/exam_topics/cellular_vesicles +11 -0
  213. data/lib/studium/exam_topics/cellulose +6 -0
  214. data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +209 -0
  215. data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
  216. data/lib/studium/exam_topics/chemisches_labor +60 -0
  217. data/lib/studium/exam_topics/chemotaxis_quorum_sensing_and_motility_in_prokaryotes +91 -0
  218. data/lib/studium/exam_topics/citric_acid_cycle +80 -0
  219. data/lib/studium/exam_topics/clinical_microbiology +506 -0
  220. data/lib/studium/exam_topics/computer_science +284 -0
  221. data/lib/studium/exam_topics/computer_vision_and_computer_graphics +12 -0
  222. data/lib/studium/exam_topics/crispr +48 -0
  223. data/lib/studium/exam_topics/cyanobacteria +43 -0
  224. data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +570 -0
  225. data/lib/studium/exam_topics/cytokines +6 -0
  226. data/lib/studium/exam_topics/databases_and_sql +116 -0
  227. data/lib/studium/exam_topics/dna_mutation_and_dna_repair +69 -0
  228. data/lib/studium/exam_topics/dna_replication +57 -0
  229. data/lib/studium/exam_topics/ecogenetics +26 -0
  230. data/lib/studium/exam_topics/ecological_agriculture +12 -0
  231. data/lib/studium/exam_topics/ecology +317 -0
  232. data/lib/studium/exam_topics/economy +211 -0
  233. data/lib/studium/exam_topics/elektronenmikroskopie +356 -0
  234. data/lib/studium/exam_topics/elektrophorese +89 -0
  235. data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +41 -0
  236. data/lib/studium/exam_topics/elisa +54 -0
  237. data/lib/studium/exam_topics/embryologie_und_entwicklung +603 -0
  238. data/lib/studium/exam_topics/endospores_and_spores +104 -0
  239. data/lib/studium/exam_topics/enzymes_and_cofactors +353 -0
  240. data/lib/studium/exam_topics/epigenetik +184 -0
  241. data/lib/studium/exam_topics/erste_hilfe +158 -0
  242. data/lib/studium/exam_topics/ethik +138 -0
  243. data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +356 -0
  244. data/lib/studium/exam_topics/excel +7 -0
  245. data/lib/studium/exam_topics/fish +19 -0
  246. data/lib/studium/exam_topics/fluorescence_microscopy +7 -0
  247. data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +83 -0
  248. data/lib/studium/exam_topics/forensik +11 -0
  249. data/lib/studium/exam_topics/forstwirtschaft +53 -0
  250. data/lib/studium/exam_topics/fortgeschrittene_genetik +576 -0
  251. data/lib/studium/exam_topics/fortgeschrittene_gentechnik +217 -0
  252. data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
  253. data/lib/studium/exam_topics/fungi +80 -0
  254. data/lib/studium/exam_topics/genetische_krankheiten +187 -0
  255. data/lib/studium/exam_topics/genexpression +1008 -0
  256. data/lib/studium/exam_topics/genomics_and_metagenomics +272 -0
  257. data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +928 -0
  258. data/lib/studium/exam_topics/geochemistry +67 -0
  259. data/lib/studium/exam_topics/geography +8 -0
  260. data/lib/studium/exam_topics/geologie_und_mineralogie +626 -0
  261. data/lib/studium/exam_topics/geometrie +54 -0
  262. data/lib/studium/exam_topics/geschichte +94 -0
  263. data/lib/studium/exam_topics/gluconeogenesis +64 -0
  264. data/lib/studium/exam_topics/glycogen +25 -0
  265. data/lib/studium/exam_topics/glycolysis +109 -0
  266. data/lib/studium/exam_topics/glykomik +101 -0
  267. data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
  268. data/lib/studium/exam_topics/grassland_cultivation +32 -0
  269. data/lib/studium/exam_topics/hormone +139 -0
  270. data/lib/studium/exam_topics/html +7 -0
  271. data/lib/studium/exam_topics/human_ecology +8 -0
  272. data/lib/studium/exam_topics/hygiene +224 -0
  273. data/lib/studium/exam_topics/imaging_and_microscopy +265 -0
  274. data/lib/studium/exam_topics/immunanalytik +94 -0
  275. data/lib/studium/exam_topics/immunologie +998 -0
  276. data/lib/studium/exam_topics/informatik +103 -0
  277. data/lib/studium/exam_topics/innate_immunity +24 -0
  278. data/lib/studium/exam_topics/insekten +64 -0
  279. data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
  280. data/lib/studium/exam_topics/java +597 -0
  281. data/lib/studium/exam_topics/javascript +14 -0
  282. data/lib/studium/exam_topics/klima +6 -0
  283. data/lib/studium/exam_topics/kryptographie +9 -0
  284. data/lib/studium/exam_topics/landtechnik +26 -0
  285. data/lib/studium/exam_topics/lebensmittel +222 -0
  286. data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
  287. data/lib/studium/exam_topics/linux +5 -0
  288. data/lib/studium/exam_topics/lipids +95 -0
  289. data/lib/studium/exam_topics/macroeconomics +40 -0
  290. data/lib/studium/exam_topics/marketing +7 -0
  291. data/lib/studium/exam_topics/mathematics +280 -0
  292. data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +251 -0
  293. data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +416 -0
  294. data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
  295. data/lib/studium/exam_topics/metabolismus +423 -0
  296. data/lib/studium/exam_topics/meteorologie_und_atmosph/303/244re +91 -0
  297. data/lib/studium/exam_topics/microbial_ecology +35 -0
  298. data/lib/studium/exam_topics/microcontrollers +11 -0
  299. data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +33 -0
  300. data/lib/studium/exam_topics/mikrobielle_physiologie +204 -0
  301. data/lib/studium/exam_topics/mitochondria +33 -0
  302. data/lib/studium/exam_topics/mixed +286 -0
  303. data/lib/studium/exam_topics/molecular_biology_of_plants +249 -0
  304. data/lib/studium/exam_topics/molekulare_medizin +133 -0
  305. data/lib/studium/exam_topics/nanotechnologie +453 -0
  306. data/lib/studium/exam_topics/nature_conservation_and_biodiversity +211 -0
  307. data/lib/studium/exam_topics/naturstoffe +9 -0
  308. data/lib/studium/exam_topics/netzwerke +34 -0
  309. data/lib/studium/exam_topics/neurobiology +272 -0
  310. data/lib/studium/exam_topics/nucleotide_sequencing +38 -0
  311. data/lib/studium/exam_topics/nutztierethologie +11 -0
  312. data/lib/studium/exam_topics/object_oriented_modeling +14 -0
  313. data/lib/studium/exam_topics/obstbau +249 -0
  314. data/lib/studium/exam_topics/organische_chemie +1007 -0
  315. data/lib/studium/exam_topics/organische_chemie_2 +125 -0
  316. data/lib/studium/exam_topics/paleobiology +39 -0
  317. data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +336 -0
  318. data/lib/studium/exam_topics/patent_law +55 -0
  319. data/lib/studium/exam_topics/pathologie +723 -0
  320. data/lib/studium/exam_topics/pcr +152 -0
  321. data/lib/studium/exam_topics/pentosephosphatweg +41 -0
  322. data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +66 -0
  323. data/lib/studium/exam_topics/pflanzenanatomie +255 -0
  324. data/lib/studium/exam_topics/pflanzenbau +24 -0
  325. data/lib/studium/exam_topics/pflanzenschutz +35 -0
  326. data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
  327. data/lib/studium/exam_topics/pharmaceutical_biotechnology +251 -0
  328. data/lib/studium/exam_topics/physik +443 -1
  329. data/lib/studium/exam_topics/physikalische_chemie +86 -0
  330. data/lib/studium/exam_topics/physiology_and_histology +520 -0
  331. data/lib/studium/exam_topics/phytochemie +33 -0
  332. data/lib/studium/exam_topics/plant_biotechnology +129 -0
  333. data/lib/studium/exam_topics/plant_breeding +64 -0
  334. data/lib/studium/exam_topics/plant_development +50 -0
  335. data/lib/studium/exam_topics/populationsgenetik +137 -0
  336. data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +195 -0
  337. data/lib/studium/exam_topics/projektmanagement +220 -0
  338. data/lib/studium/exam_topics/prokaryote_genetics +547 -0
  339. data/lib/studium/exam_topics/protein_engineering +16 -0
  340. data/lib/studium/exam_topics/proteolyse +36 -0
  341. data/lib/studium/exam_topics/proteomik +40 -0
  342. data/lib/studium/exam_topics/prozesstechnik +95 -0
  343. data/lib/studium/exam_topics/psychologie +14 -0
  344. data/lib/studium/exam_topics/python +355 -0
  345. data/lib/studium/exam_topics/quality_management +263 -0
  346. data/lib/studium/exam_topics/rechtsgrundlagen +116 -0
  347. data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
  348. data/lib/studium/exam_topics/rna_and_dna +457 -0
  349. data/lib/studium/exam_topics/rna_seq +11 -0
  350. data/lib/studium/exam_topics/robotik +6 -0
  351. data/lib/studium/exam_topics/ruby +183 -0
  352. data/lib/studium/exam_topics/ruby_on_rails +63 -0
  353. data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
  354. data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
  355. data/lib/studium/exam_topics/sexualbiologie +108 -0
  356. data/lib/studium/exam_topics/signal_transduction_and_laser_systems +197 -0
  357. data/lib/studium/exam_topics/splicing_exons_and_introns +63 -0
  358. data/lib/studium/exam_topics/statistik +241 -0
  359. data/lib/studium/exam_topics/stemcells +159 -0
  360. data/lib/studium/exam_topics/stickstofffixierung +76 -0
  361. data/lib/studium/exam_topics/structural_bioinformatics +54 -0
  362. data/lib/studium/exam_topics/strukturbiologie +387 -0
  363. data/lib/studium/exam_topics/system_biology_and_synthetic_biology +103 -0
  364. data/lib/studium/exam_topics/systematische_zoologie +436 -0
  365. data/lib/studium/exam_topics/technical_ecology +144 -0
  366. data/lib/studium/exam_topics/technische_chemie +204 -0
  367. data/lib/studium/exam_topics/technische_grundlagen_der_informatik +39 -0
  368. data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
  369. data/lib/studium/exam_topics/technisches_zeichnen +5 -0
  370. data/lib/studium/exam_topics/the_bacterial_cell_wall +97 -0
  371. data/lib/studium/exam_topics/the_c_plus_plus_programming_language +491 -0
  372. data/lib/studium/exam_topics/the_c_programming_language +129 -0
  373. data/lib/studium/exam_topics/the_cellcycle +89 -0
  374. data/lib/studium/exam_topics/the_european_union +119 -0
  375. data/lib/studium/exam_topics/the_interferon_system +39 -0
  376. data/lib/studium/exam_topics/the_microbiome +164 -0
  377. data/lib/studium/exam_topics/the_universe +26 -0
  378. data/lib/studium/exam_topics/theoretische_chemie +5 -0
  379. data/lib/studium/exam_topics/theoretische_informatik +157 -0
  380. data/lib/studium/exam_topics/thermodynamics +3 -0
  381. data/lib/studium/exam_topics/tierzucht +139 -0
  382. data/lib/studium/exam_topics/toxikologie +447 -0
  383. data/lib/studium/exam_topics/transcription +164 -0
  384. data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +144 -0
  385. data/lib/studium/exam_topics/umweltbiotechnologie +64 -0
  386. data/lib/studium/exam_topics/umweltchemie +233 -0
  387. data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
  388. data/lib/studium/exam_topics/urea_cycle +55 -0
  389. data/lib/studium/exam_topics/vaccines_and_vaccination +246 -0
  390. data/lib/studium/exam_topics/vectors_and_gene_therapy +246 -0
  391. data/lib/studium/exam_topics/verfahrenstechnik +37 -0
  392. data/lib/studium/exam_topics/veterinary_medicine +10 -0
  393. data/lib/studium/exam_topics/vitamine +25 -0
  394. data/lib/studium/exam_topics/wasserkunde +137 -0
  395. data/lib/studium/exam_topics/weinbau +82 -0
  396. data/lib/studium/exam_topics/wissenschaft +18 -0
  397. data/lib/studium/exam_topics/yeast +102 -0
  398. data/lib/studium/exam_topics/zoologie +333 -0
  399. data/lib/studium/exams/afterburn/afterburn.rb +257 -0
  400. data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
  401. data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
  402. data/lib/studium/exams/ask_question_from_alias.rb +141 -0
  403. data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +131 -0
  404. data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
  405. data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
  406. data/lib/studium/exams/ask_random_question.rb +195 -0
  407. data/lib/studium/exams/autoinclude.rb +7 -0
  408. data/lib/studium/exams/average_grade.rb +396 -0
  409. data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
  410. data/lib/studium/exams/cycle.rb +291 -0
  411. data/lib/studium/exams/dataset.rb +124 -0
  412. data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
  413. data/lib/studium/exams/exam/exam.rb +130 -0
  414. data/lib/studium/exams/exam_question/README.md +3 -0
  415. data/lib/studium/exams/exam_question/answer.rb +193 -0
  416. data/lib/studium/exams/exam_question/constants.rb +111 -0
  417. data/lib/studium/exams/exam_question/exam_question.rb +1136 -0
  418. data/lib/studium/exams/exam_question/menu.rb +333 -0
  419. data/lib/studium/exams/exam_question/misc.rb +898 -0
  420. data/lib/studium/exams/exam_question/question.rb +91 -0
  421. data/lib/studium/exams/exam_question/reset.rb +96 -0
  422. data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
  423. data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
  424. data/lib/studium/exams/exam_registration_at/help.rb +46 -0
  425. data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
  426. data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
  427. data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
  428. data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
  429. data/lib/studium/exams/exam_topics.rb +194 -0
  430. data/lib/studium/exams/exams.rb +20 -0
  431. data/lib/studium/exams/exams_per_month/exams_per_month.rb +2438 -0
  432. data/lib/studium/exams/exams_this_week.rb +182 -0
  433. data/lib/studium/exams/fix_exam_dates.rb +121 -0
  434. data/lib/studium/exams/frozen.rb +36 -0
  435. data/lib/studium/exams/last_exams/last_exams.rb +398 -0
  436. data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
  437. data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1359 -0
  438. data/lib/studium/exams/move_the_last_exam_question_to_the_top_of_the_file/move_the_last_exam_question_to_the_top_of_the_file.rb +111 -0
  439. data/lib/studium/exams/n_exams_in_these_topics.rb +404 -0
  440. data/lib/studium/exams/next_exam.rb +107 -0
  441. data/lib/studium/exams/next_exams.rb +378 -0
  442. data/lib/studium/exams/open_exam_associated_url.rb +154 -0
  443. data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
  444. data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
  445. data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +109 -0
  446. data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
  447. data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +377 -0
  448. data/lib/studium/exams/remote_ftp_url.rb +52 -0
  449. data/lib/studium/exams/repeat_last_question.rb +78 -0
  450. data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
  451. data/lib/studium/exams/show_backlog_of_exams.rb +117 -0
  452. data/lib/studium/exams/show_next_exams_for.rb +133 -0
  453. data/lib/studium/exams/show_themes/constants.rb +28 -0
  454. data/lib/studium/exams/show_themes/menu.rb +61 -0
  455. data/lib/studium/exams/show_themes/misc.rb +537 -0
  456. data/lib/studium/exams/show_themes/reset.rb +62 -0
  457. data/lib/studium/exams/show_themes/show_themes.rb +27 -0
  458. data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +1146 -0
  459. data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
  460. data/lib/studium/exams/solved/constants.rb +32 -0
  461. data/lib/studium/exams/solved/help.rb +24 -0
  462. data/lib/studium/exams/solved/initialize.rb +55 -0
  463. data/lib/studium/exams/solved/menu.rb +41 -0
  464. data/lib/studium/exams/solved/reset.rb +28 -0
  465. data/lib/studium/exams/solved/solved.rb +317 -0
  466. data/lib/studium/exams/timetable/timetable.rb +510 -0
  467. data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +162 -0
  468. data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +556 -0
  469. data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
  470. data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
  471. data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
  472. data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
  473. data/lib/studium/exams/upcoming_registered_exams/upcoming_registered_exams.rb +257 -0
  474. data/lib/studium/exams/upload_exam_topics.rb +360 -0
  475. data/lib/studium/graphviz/README.md +4 -0
  476. data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
  477. data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
  478. data/lib/studium/gui/gtk3/README.md +1 -0
  479. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.config +6 -0
  480. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.rb +760 -0
  481. data/lib/studium/gui/gtk3/ask_exam_question/manifest.yml +12 -0
  482. data/lib/studium/gui/gtk3/control_panel/control_panel.rb +39 -0
  483. data/lib/studium/gui/gtk3/curriculum_viewer/curriculum_viewer.rb +510 -0
  484. data/lib/studium/gui/gtk3/ects_per_university/ects_per_university.rb +217 -0
  485. data/lib/studium/gui/gtk3/exam_question_widget/exam_question_widget.rb +1888 -0
  486. data/lib/studium/gui/gtk3/expand_time_range/expand_time_range.rb +34 -0
  487. data/lib/studium/gui/gtk3/information_about_a_lecture/information_about_a_lecture.rb +34 -0
  488. data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +200 -0
  489. data/lib/studium/gui/gtk3/show_upcoming_exams/show_upcoming_exams.rb +34 -0
  490. data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
  491. data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
  492. data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
  493. data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
  494. data/lib/studium/gui/jruby/exam_question_widget/exam_question_widget.rb +317 -0
  495. data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +349 -0
  496. data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +314 -0
  497. data/lib/studium/gui/shared_code/exam_question_widget/exam_question_widget_module.rb +39 -0
  498. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range.css +0 -0
  499. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range_module.rb +190 -0
  500. data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +180 -0
  501. data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +206 -0
  502. data/lib/studium/images/libui_ask_exam_question.png +0 -0
  503. data/lib/studium/images/outdated.png +0 -0
  504. data/lib/studium/images/small_logos/DNA.png +0 -0
  505. data/lib/studium/images/small_logos/README.md +2 -0
  506. data/lib/studium/images/small_logos/solved.png +0 -0
  507. data/lib/studium/images/studies_favicon.png +0 -0
  508. data/lib/studium/java/Mkdir.java +15 -0
  509. data/lib/studium/java/README.md +2 -0
  510. data/lib/studium/java/ask_exam_question/AskExamQuestion.class +0 -0
  511. data/lib/studium/java/ask_exam_question/AskExamQuestion.java +480 -0
  512. data/lib/studium/java/constants/Constants.class +0 -0
  513. data/lib/studium/java/constants/Constants.java +77 -0
  514. data/lib/studium/java/solved/Solved.class +0 -0
  515. data/lib/studium/java/solved/Solved.java +110 -0
  516. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
  517. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.java +80 -0
  518. data/lib/studium/logging/README.md +2 -0
  519. data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +47 -0
  520. data/lib/studium/logging/html_log_directory.rb +41 -0
  521. data/lib/studium/logging/log_directory.rb +112 -0
  522. data/lib/studium/logging/store_last_question_asked_into_file.rb +137 -0
  523. data/lib/studium/parsers/README.md +2 -0
  524. data/lib/studium/parsers/custom_exam_results_parser.rb +206 -0
  525. data/lib/studium/parsers/parse_lva_dates.rb +233 -0
  526. data/lib/studium/parsers/parse_remote_lecture.rb +331 -0
  527. data/lib/studium/project/project.rb +76 -0
  528. data/lib/studium/requires/common_popular_requires.rb +37 -0
  529. data/lib/studium/requires/commonly_used_requires.rb +14 -0
  530. data/lib/studium/requires/require_class_exams_solved.rb +7 -0
  531. data/lib/studium/requires/require_ects_scripts.rb +27 -0
  532. data/lib/studium/requires/require_encoding.rb +7 -0
  533. data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
  534. data/lib/studium/requires/require_the_curricula_files.rb +28 -0
  535. data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
  536. data/lib/studium/requires/require_the_exams_files.rb +45 -0
  537. data/lib/studium/requires/require_the_logging_files.rb +23 -0
  538. data/lib/studium/requires/require_the_parsers.rb +28 -0
  539. data/lib/studium/requires/require_the_studium_constants.rb +10 -0
  540. data/lib/studium/requires/require_the_studium_project.rb +60 -0
  541. data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
  542. data/lib/studium/requires/require_the_utility_scripts.rb +49 -0
  543. data/lib/studium/requires/require_upcoming_exams.rb +7 -0
  544. data/lib/studium/requires/require_yaml.rb +7 -0
  545. data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
  546. data/lib/studium/requires/with_GUI.rb +13 -0
  547. data/lib/studium/requires/www_mode.rb +17 -0
  548. data/lib/studium/statistics/README.md +4 -0
  549. data/lib/studium/statistics/best_exam_months.rb +92 -0
  550. data/lib/studium/statistics/curriculum_comparer.rb +337 -0
  551. data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
  552. data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +119 -0
  553. data/lib/studium/statistics/max_stats.rb +170 -0
  554. data/lib/studium/statistics/new_questions_per_year.rb +147 -0
  555. data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
  556. data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +473 -0
  557. data/lib/studium/statistics/show_exam_statistics.rb +66 -0
  558. data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
  559. data/lib/studium/statistics/top_stats.rb +127 -0
  560. data/lib/studium/toplevel_methods/all_passed_exams.rb +37 -0
  561. data/lib/studium/toplevel_methods/already_solved_this_lecture.rb +100 -0
  562. data/lib/studium/toplevel_methods/available_topics.rb +156 -0
  563. data/lib/studium/toplevel_methods/calculate_pr/303/274fungsimmanente_lectures_from_this_file.rb +55 -0
  564. data/lib/studium/toplevel_methods/copy_the_last_backup_of_file_lecture_information.rb +34 -0
  565. data/lib/studium/toplevel_methods/curriculum_related_code.rb +1082 -0
  566. data/lib/studium/toplevel_methods/determine_local_directory_of_this_lecture.rb +72 -0
  567. data/lib/studium/toplevel_methods/does_this_course_require_mandatory_presence.rb +51 -0
  568. data/lib/studium/toplevel_methods/download.rb +163 -0
  569. data/lib/studium/toplevel_methods/e.rb +16 -0
  570. data/lib/studium/toplevel_methods/ects_from_lectures.rb +250 -0
  571. data/lib/studium/toplevel_methods/editor.rb +65 -0
  572. data/lib/studium/toplevel_methods/esystem.rb +22 -0
  573. data/lib/studium/toplevel_methods/filter_away_invalid_questions.rb +77 -0
  574. data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3538 -0
  575. data/lib/studium/toplevel_methods/handle_archive_of_the_exam_questions.rb +136 -0
  576. data/lib/studium/toplevel_methods/has_this_lecture_been_already_passed_but_the_id_was_changed_lateron.rb +42 -0
  577. data/lib/studium/toplevel_methods/has_this_module_been_completed.rb +206 -0
  578. data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +32 -0
  579. data/lib/studium/toplevel_methods/is_on_roebe.rb +26 -0
  580. data/lib/studium/toplevel_methods/is_this_exam_topic_included.rb +46 -0
  581. data/lib/studium/toplevel_methods/is_this_homepage_registered.rb +31 -0
  582. data/lib/studium/toplevel_methods/is_this_lecture_a_practical_course.rb +93 -0
  583. data/lib/studium/toplevel_methods/is_this_lecture_registered_in_upcoming_exams.rb +42 -0
  584. data/lib/studium/toplevel_methods/java.rb +32 -0
  585. data/lib/studium/toplevel_methods/lecture_information.rb +108 -0
  586. data/lib/studium/toplevel_methods/lva_numbers.rb +355 -0
  587. data/lib/studium/toplevel_methods/main_dataset.rb +73 -0
  588. data/lib/studium/toplevel_methods/map_input_to_this_curriculum_filename.rb +595 -0
  589. data/lib/studium/toplevel_methods/methods_related_to_directories.rb +225 -0
  590. data/lib/studium/toplevel_methods/methods_related_to_files.rb +209 -0
  591. data/lib/studium/toplevel_methods/misc.rb +288 -0
  592. data/lib/studium/toplevel_methods/n_questions_available.rb +137 -0
  593. data/lib/studium/toplevel_methods/n_topics_available.rb +63 -0
  594. data/lib/studium/toplevel_methods/names_of_all_solved_exams.rb +71 -0
  595. data/lib/studium/toplevel_methods/note_down_the_start_time_and_how_many_exams_have_been_already_solved.rb +69 -0
  596. data/lib/studium/toplevel_methods/opnn.rb +25 -0
  597. data/lib/studium/toplevel_methods/passed_this_exam_on.rb +105 -0
  598. data/lib/studium/toplevel_methods/pristine.rb +69 -0
  599. data/lib/studium/toplevel_methods/read_delay_between_questions_from_file.rb +34 -0
  600. data/lib/studium/toplevel_methods/regexes.rb +90 -0
  601. data/lib/studium/toplevel_methods/registered_for_this_exam.rb +82 -0
  602. data/lib/studium/toplevel_methods/remove_comments.rb +26 -0
  603. data/lib/studium/toplevel_methods/remove_exam_topics_that_were_already_answered.rb +27 -0
  604. data/lib/studium/toplevel_methods/remove_tags.rb +32 -0
  605. data/lib/studium/toplevel_methods/report.rb +435 -0
  606. data/lib/studium/toplevel_methods/return_all_exams_on_this_day.rb +66 -0
  607. data/lib/studium/toplevel_methods/return_dataset_for_this_exam_topic.rb +41 -0
  608. data/lib/studium/toplevel_methods/return_ects_from_this_lecture_stored_in_the_file_lecture_information.rb +194 -0
  609. data/lib/studium/toplevel_methods/return_hash_of_already_solved_lectures.rb +46 -0
  610. data/lib/studium/toplevel_methods/return_last_exam_question.rb +34 -0
  611. data/lib/studium/toplevel_methods/return_local_path_of_this_pwdstud.rb +60 -0
  612. data/lib/studium/toplevel_methods/return_lva_number_of_this_lecture.rb +72 -0
  613. data/lib/studium/toplevel_methods/return_n_percent_solved_from_this_topic.rb +90 -0
  614. data/lib/studium/toplevel_methods/return_n_questions_were_answered_for_this_topic.rb +60 -0
  615. data/lib/studium/toplevel_methods/return_proper_university_image.rb +86 -0
  616. data/lib/studium/toplevel_methods/return_question_answer_string_from_this_topic.rb +63 -0
  617. data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +10951 -0
  618. data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +2201 -0
  619. data/lib/studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb +110 -0
  620. data/lib/studium/toplevel_methods/return_theme_of_the_next_upcoming_exam.rb +38 -0
  621. data/lib/studium/toplevel_methods/rinstall2.rb +34 -0
  622. data/lib/studium/toplevel_methods/rti_conflict.rb +35 -0
  623. data/lib/studium/toplevel_methods/runmode.rb +87 -0
  624. data/lib/studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb +52 -0
  625. data/lib/studium/toplevel_methods/set_last_file_for_exam_questions.rb +64 -0
  626. data/lib/studium/toplevel_methods/set_this_cd_alias_to.rb +86 -0
  627. data/lib/studium/toplevel_methods/show_passed_exams_having_this_grade.rb +34 -0
  628. data/lib/studium/toplevel_methods/spacer.rb +18 -0
  629. data/lib/studium/toplevel_methods/time.rb +297 -0
  630. data/lib/studium/toplevel_methods/total_ects_points_passed.rb +72 -0
  631. data/lib/studium/toplevel_methods/try_to_guess_the_most_likely_lva_id.rb +57 -0
  632. data/lib/studium/toplevel_methods/try_to_return_the_expanded_name_of_this_lecture.rb +63 -0
  633. data/lib/studium/toplevel_methods/unfinished.rb +51 -0
  634. data/lib/studium/toplevel_methods/url.rb +100 -0
  635. data/lib/studium/toplevel_methods/verbose_truth.rb +36 -0
  636. data/lib/studium/toplevel_methods/when_was_this_lecture_passed.rb +54 -0
  637. data/lib/studium/toplevel_methods/word_wrap.rb +56 -0
  638. data/lib/studium/toplevel_methods/write_into_file_related_functionality.rb +195 -0
  639. data/lib/studium/toplevel_methods/yes_or_no_ja_oder_nein.rb +33 -0
  640. data/lib/studium/universities_in_austria/README.md +2 -0
  641. data/lib/studium/universities_in_austria/boku/README.md +4 -0
  642. data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
  643. data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
  644. data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
  645. data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
  646. data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
  647. data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
  648. data/lib/studium/university_course/university_course.rb +384 -0
  649. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
  650. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
  651. data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
  652. data/lib/studium/utility_scripts/audio_stats.rb +171 -0
  653. data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
  654. data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
  655. data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
  656. data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
  657. data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +93 -0
  658. data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +143 -0
  659. data/lib/studium/utility_scripts/blocked_courses.rb +141 -0
  660. data/lib/studium/utility_scripts/calendar/README.md +2 -0
  661. data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
  662. data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
  663. data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
  664. data/lib/studium/utility_scripts/course_registrations/course_registrations.rb +98 -0
  665. data/lib/studium/utility_scripts/create/README.md +2 -0
  666. data/lib/studium/utility_scripts/create/webpage_of_university.rb +129 -0
  667. data/lib/studium/utility_scripts/create/webpage_of_university_BOKU.rb +59 -0
  668. data/lib/studium/utility_scripts/create/webpage_of_university_TU.rb +58 -0
  669. data/lib/studium/utility_scripts/create/webpage_of_university_UniWien.rb +57 -0
  670. data/lib/studium/utility_scripts/create_database/create_database.rb +106 -0
  671. data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
  672. data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
  673. data/lib/studium/utility_scripts/display_lecture_url.rb +176 -0
  674. data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +488 -0
  675. data/lib/studium/utility_scripts/finished_exams_at_this_university.rb +94 -0
  676. data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
  677. data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
  678. data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
  679. data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
  680. data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
  681. data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
  682. data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
  683. data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
  684. data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +354 -0
  685. data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
  686. data/lib/studium/utility_scripts/holidays/holidays.rb +150 -0
  687. data/lib/studium/utility_scripts/homepage_of_these_courses.rb +118 -0
  688. data/lib/studium/utility_scripts/lecture_downloader.rb +107 -0
  689. data/lib/studium/utility_scripts/lectures_attributed_to_universities.rb +336 -0
  690. data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
  691. data/lib/studium/utility_scripts/lva_nummer.rb +431 -0
  692. data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
  693. data/lib/studium/utility_scripts/name_of_this_lva_id.rb +110 -0
  694. data/lib/studium/utility_scripts/new_stud.rb +324 -0
  695. data/lib/studium/utility_scripts/next_week.rb +103 -0
  696. data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
  697. data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +288 -0
  698. data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
  699. data/lib/studium/utility_scripts/pdf/README.md +2 -0
  700. data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +355 -0
  701. data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
  702. data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +312 -0
  703. data/lib/studium/utility_scripts/priority.rb +164 -0
  704. data/lib/studium/utility_scripts/priority_points/priority_points.rb +263 -0
  705. data/lib/studium/utility_scripts/publish_my_exams.rb +174 -0
  706. data/lib/studium/utility_scripts/regexes/README.md +1 -0
  707. data/lib/studium/utility_scripts/regexes/generate_regex.rb +314 -0
  708. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
  709. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
  710. data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
  711. data/lib/studium/utility_scripts/report_total_amount_of_questions_and_answers_for.rb +116 -0
  712. data/lib/studium/utility_scripts/report_whether_this_lecture_is_registered_in_the_file_lecture_information.rb +128 -0
  713. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
  714. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
  715. data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
  716. data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
  717. data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +374 -0
  718. data/lib/studium/utility_scripts/semesterplaner.rb +289 -0
  719. data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +97 -0
  720. data/lib/studium/utility_scripts/show_all_passed_master_lectures.rb +119 -0
  721. data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1339 -0
  722. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
  723. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
  724. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
  725. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
  726. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
  727. data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
  728. data/lib/studium/utility_scripts/show_lectures/constants.rb +11 -0
  729. data/lib/studium/utility_scripts/show_lectures/help.rb +35 -0
  730. data/lib/studium/utility_scripts/show_lectures/initialize.rb +23 -0
  731. data/lib/studium/utility_scripts/show_lectures/menu.rb +138 -0
  732. data/lib/studium/utility_scripts/show_lectures/misc.rb +606 -0
  733. data/lib/studium/utility_scripts/show_lectures/reset.rb +89 -0
  734. data/lib/studium/utility_scripts/show_lectures/run.rb +28 -0
  735. data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +49 -0
  736. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
  737. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
  738. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +3142 -0
  739. data/lib/studium/utility_scripts/show_lectures_on_this_day.rb +149 -0
  740. data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture.rb +169 -0
  741. data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +91 -0
  742. data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +210 -0
  743. data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
  744. data/lib/studium/utility_scripts/steop/README.md +4 -0
  745. data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
  746. data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
  747. data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
  748. data/lib/studium/utility_scripts/studienkennzahl.rb +116 -0
  749. data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +231 -0
  750. data/lib/studium/utility_scripts/stundenplan.rb +595 -0
  751. data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
  752. data/lib/studium/utility_scripts/ufind/ufind.rb +98 -0
  753. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
  754. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
  755. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +187 -0
  756. data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
  757. data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
  758. data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
  759. data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
  760. data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
  761. data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
  762. data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
  763. data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
  764. data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
  765. data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
  766. data/lib/studium/utility_scripts/wochenplanung.rb +261 -0
  767. data/lib/studium/version/version.rb +46 -0
  768. data/lib/studium/www/curriculum_displayer.rb +162 -0
  769. data/lib/studium/www/exams.cgi +54 -0
  770. data/lib/studium/www/fast_ask_exam_question.cgi +156 -0
  771. data/lib/studium/www/handle_curricula/handle_curricula.cgi +154 -0
  772. data/lib/studium/www/next_generation_exam_question_trainer/next_generation_exam_question_trainer.cgi +79 -0
  773. data/lib/studium/www/sinatra/app.rb +231 -0
  774. data/lib/studium/www/sinatra/misc.rb +115 -0
  775. data/lib/studium/www/statistics/statistics.cgi +70 -0
  776. data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
  777. data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +15 -0
  778. data/lib/studium/yaml/allowed_themes_for_exams/allowed_themes_for_exams.yml +347 -0
  779. data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information.yml +71 -0
  780. data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
  781. data/lib/studium/yaml/backlog_of_exams.yml +37 -0
  782. data/lib/studium/yaml/colours/custom_colours.yml +28 -0
  783. data/lib/studium/yaml/colours/use_colours.yml +1 -0
  784. data/lib/studium/yaml/current_exams.yml +30 -0
  785. data/lib/studium/yaml/curricula/README.md +39 -0
  786. data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +147 -0
  787. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +71 -0
  788. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +100 -0
  789. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
  790. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +122 -0
  791. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +106 -0
  792. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
  793. data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
  794. data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +182 -0
  795. data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
  796. data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
  797. data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +136 -0
  798. data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
  799. data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +121 -0
  800. data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +283 -0
  801. data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
  802. data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
  803. data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
  804. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +131 -0
  805. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
  806. data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +143 -0
  807. data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
  808. data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
  809. data/lib/studium/yaml/curricula/experimental/bachelor_informatik_in_den_lebenswissenschaften.yml +137 -0
  810. data/lib/studium/yaml/curricula/individual/bachelor_formale_logik.yml +88 -0
  811. data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
  812. data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
  813. data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
  814. data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
  815. data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +75 -0
  816. data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
  817. data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +66 -0
  818. data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
  819. data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
  820. data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +112 -0
  821. data/lib/studium/yaml/curricula/master/master_molecular_biology_066865.yml +72 -0
  822. data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +151 -0
  823. data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +176 -0
  824. data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
  825. data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
  826. data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
  827. data/lib/studium/yaml/curricula.yml +562 -0
  828. data/lib/studium/yaml/daily_questions_solved.yml +1654 -0
  829. data/lib/studium/yaml/default_delay.yml +4 -0
  830. data/lib/studium/yaml/default_encoding.yml +1 -0
  831. data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
  832. data/lib/studium/yaml/editor.yml +1 -0
  833. data/lib/studium/yaml/exams/next_exams_to_do.md +9 -0
  834. data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
  835. data/lib/studium/yaml/german/README.md +2 -0
  836. data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
  837. data/lib/studium/yaml/grouped_themes.yml +192 -0
  838. data/lib/studium/yaml/holidays.yml +201 -0
  839. data/lib/studium/yaml/important_exams.yml +266 -0
  840. data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
  841. data/lib/studium/yaml/lecture_aliases.yml +138 -0
  842. data/lib/studium/yaml/lecture_information/lecture_information.yml +61740 -0
  843. data/lib/studium/yaml/log_dir.yml +1 -0
  844. data/lib/studium/yaml/main_topic.yml +11 -0
  845. data/lib/studium/yaml/max_stats.yml +249 -0
  846. data/lib/studium/yaml/meta_themes/README.md +13 -0
  847. data/lib/studium/yaml/meta_themes/biochemistry.md +6 -0
  848. data/lib/studium/yaml/meta_themes/bioinformatics.md +6 -0
  849. data/lib/studium/yaml/meta_themes/biotechnology.md +9 -0
  850. data/lib/studium/yaml/meta_themes/cellbiology.md +9 -0
  851. data/lib/studium/yaml/meta_themes/chemistry.md +9 -0
  852. data/lib/studium/yaml/meta_themes/genetics.md +10 -0
  853. data/lib/studium/yaml/meta_themes/immunology.md +5 -0
  854. data/lib/studium/yaml/meta_themes/metabolic_pathways.md +12 -0
  855. data/lib/studium/yaml/meta_themes/molecular_biology.md +9 -0
  856. data/lib/studium/yaml/meta_themes/protein_engineering.md +10 -0
  857. data/lib/studium/yaml/meta_themes/statistics.md +2 -0
  858. data/lib/studium/yaml/mitbelegung/README.md +4 -0
  859. data/lib/studium/yaml/mitbelegung/mitbelegung.yml +21 -0
  860. data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
  861. data/lib/studium/yaml/n_total_questions.yml +1 -0
  862. data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
  863. data/lib/studium/yaml/semester_planner/README.md +4 -0
  864. data/lib/studium/yaml/semester_planner/semester_planner.yml +189 -0
  865. data/lib/studium/yaml/show_topic.yml +1 -0
  866. data/lib/studium/yaml/statistics/lecture_information.yml +1 -0
  867. data/lib/studium/yaml/statistics/max_stats.yml +239 -0
  868. data/lib/studium/yaml/statistics/statistics.yml +75 -0
  869. data/lib/studium/yaml/week/01_monday.yml +25 -0
  870. data/lib/studium/yaml/week/02_tuesday.yml +68 -0
  871. data/lib/studium/yaml/week/03_wednesday.yml +63 -0
  872. data/lib/studium/yaml/week/04_thursday.yml +20 -0
  873. data/lib/studium/yaml/week/05_friday.yml +31 -0
  874. data/lib/studium/yaml/week/06_saturday.yml +16 -0
  875. data/lib/studium/yaml/week/07_sunday.yml +0 -0
  876. data/lib/studium/yaml/week/README.md +10 -0
  877. data/lib/studium.rb +5 -0
  878. data/studium.gemspec +82 -0
  879. data/test/testing_studium.rb +244 -0
  880. data/test/testing_studium_base_class.rb +31 -0
  881. data/test/testing_the_file_lecture_information.rb +18 -0
  882. data/test/testing_time_component.rb +29 -0
  883. metadata +1094 -0
@@ -0,0 +1,1339 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === Studium::ShowConflictingLvaLectures
6
+ #
7
+ # This class can show conflicting dates for Lva-lectures (and exams to
8
+ # these lectures).
9
+ #
10
+ # As argument you can pass in a string in a date format such as 'dd.mm.yyyy',
11
+ # which is commonly seen in Europe.
12
+ # =========================================================================== #
13
+ # require 'studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb'
14
+ # Studium::ShowConflictingLvaLectures.new(ARGV)
15
+ # =========================================================================== #
16
+ require 'studium/base/base.rb'
17
+
18
+ module Studium
19
+
20
+ class ShowConflictingLvaLectures < Base # === Studium::ShowConflictingLvaLectures
21
+
22
+ require 'studium/utility_scripts/holidays/holidays.rb'
23
+ require 'studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb'
24
+
25
+ # ========================================================================= #
26
+ # === UNICODE_THUMBS_UP
27
+ # ========================================================================= #
28
+ UNICODE_THUMBS_UP = '👍'
29
+
30
+ # ========================================================================= #
31
+ # === ALPHABET
32
+ #
33
+ # Keep a reference to the alphabet.
34
+ # ========================================================================= #
35
+ ALPHABET = ('a'..'z').to_a
36
+
37
+ # ========================================================================= #
38
+ # === A
39
+ #
40
+ # This special constant denotes a very important date, such as the
41
+ # '01.10.2018' (first october in the year 2018). Based on this date,
42
+ # we can also input capital letters into this class, such as "conflict A",
43
+ # "conflict B", "conflict C" - where conflict is an alias to this class
44
+ # here. A means this set date, aka '01.10.2018', B then simply refers to
45
+ # the date after this date listed at A, C then means the date after B
46
+ # and so on, and so forth.
47
+ #
48
+ # The idea behind this is to just quickly input single letters and still
49
+ # get some meaningful output, without having to type whole years in the
50
+ # dd.mm.yyyy schemata, as the latter can become fairly tedious.
51
+ #
52
+ # Ideally, a monday may be used for A, simply because this is the start
53
+ # of the week.
54
+ # ========================================================================= #
55
+ A = '18.10.2022'
56
+
57
+ # ========================================================================= #
58
+ # === ARRAY_SHORTCUTS_FOR_TOMORROW
59
+ #
60
+ # Some string-aliases, stored as array, for "tomorrow".
61
+ # ========================================================================= #
62
+ ARRAY_SHORTCUTS_FOR_TOMORROW = %w(
63
+ morgen
64
+ tomorrow
65
+ +1
66
+ +
67
+ )
68
+
69
+ # ========================================================================= #
70
+ # === ARRAY_SHORTCUTS_FOR_THE_DAY_AFTER_TOMORROW
71
+ # ========================================================================= #
72
+ ARRAY_SHORTCUTS_FOR_THE_DAY_AFTER_TOMORROW = %w(
73
+ übermorgen
74
+ +2
75
+ )
76
+
77
+ # ========================================================================= #
78
+ # === initialize
79
+ # ========================================================================= #
80
+ def initialize(
81
+ use_this_date = DEFAULT_DATE,
82
+ run_already = true
83
+ )
84
+ reset
85
+ use_this_date = check_for_commandline_arguments(
86
+ use_this_date
87
+ )
88
+ set_use_this_date(
89
+ use_this_date
90
+ )
91
+ run if run_already
92
+ end
93
+
94
+ # ========================================================================= #
95
+ # === show_help (help tag)
96
+ #
97
+ # Invoke this method like so:
98
+ #
99
+ # conflict --help
100
+ #
101
+ # ========================================================================= #
102
+ def show_help
103
+ e
104
+ e "#{rev}This class can report all study-related lectures on "\
105
+ "the given (input) date."
106
+ e
107
+ e "The date must be in the format dd.mm.yyyy, such as #{sfancy('01.10.2018')}"
108
+ e
109
+ e ' conflict <DD.MM.YYYY> # example: conflict 11.10.2018'
110
+ e
111
+ e ' conflict --lva-dates-of=301246 # show the lva-dates of lecture id 301246'
112
+ e ' # ^^^ this is, sort of, a batch-variant'
113
+ e
114
+ e " conflict A # show the courses on day #{sfancy(A)}"
115
+ e ' conflict B # show the courses on day +1 after '+sfancy(A)
116
+ e ' conflict def # simply repeat the last day '\
117
+ 'that was used before'
118
+ e
119
+ e 'Do note that for the last example (conflict def) to work, at the least'
120
+ e 'one other date has to have been used before.'
121
+ e
122
+ e ' --show-raw # show some debug information (rarely needed)'
123
+ e
124
+ e 'You can also input a range separated via "-", such as in:'
125
+ e
126
+ e ' conflict 11.10.2020-11.11.2020'
127
+ e
128
+ e 'This would specify a total of 5 consecutive days.'
129
+ e
130
+ end
131
+
132
+ # ========================================================================= #
133
+ # === menu (menu tag)
134
+ # ========================================================================= #
135
+ def menu(
136
+ i = commandline_arguments?
137
+ )
138
+ if i.is_a? Array
139
+ i.each {|entry| menu(entry) }
140
+ else
141
+ case i
142
+ # ===================================================================== #
143
+ # === conflict 15.01.2019 --show-raw-data
144
+ # ===================================================================== #
145
+ when /^-?-?show(-|_)?raw(-|_)?data$/,
146
+ /^-?-?show(-|_)?raw$/
147
+ do_show_raw_data
148
+ # ===================================================================== #
149
+ # === slectures --help
150
+ # ===================================================================== #
151
+ when /help$/
152
+ show_help
153
+ exit
154
+ # ===================================================================== #
155
+ # === slectures --lva-dates-of=301246
156
+ #
157
+ # This entry point allows us to show all LVA-dates of a specific
158
+ # lecture, by using the lecture-id for this.
159
+ #
160
+ # Invocation examples:
161
+ #
162
+ # slectures --lvaid=941110
163
+ #
164
+ # ===================================================================== #
165
+ when /^-?-?lva(-|_)?dates(-|_)?of=(.+)$/i,
166
+ /^-?-?for=(.+)$/i,
167
+ /^-?-?lvaid=(.+)$/i
168
+ _ = $1.to_s.dup
169
+ _ = $3.to_s.dup if $3
170
+ show_lva_dates_of_this_lecture(_)
171
+ end
172
+ end
173
+ end
174
+
175
+ # ========================================================================= #
176
+ # === check_for_commandline_arguments
177
+ # ========================================================================= #
178
+ def check_for_commandline_arguments(i)
179
+ if i.is_a? Array
180
+ if i.any? {|line| line.start_with?('--') }
181
+ # =================================================================== #
182
+ # Ok, the user has provided at the least one -- argument.
183
+ # =================================================================== #
184
+ set_commandline_arguments(
185
+ i.select {|inner_line| inner_line.start_with?('--') }
186
+ )
187
+ # =================================================================== #
188
+ # And reject them, too.
189
+ # =================================================================== #
190
+ i.reject! {|inner_line| inner_line.start_with?('--') }
191
+ end
192
+ end
193
+ i # We must return this here.
194
+ end
195
+
196
+ # ========================================================================= #
197
+ # === do_show_raw_data
198
+ # ========================================================================= #
199
+ def do_show_raw_data
200
+ @show_raw_data = true
201
+ end
202
+
203
+ # ========================================================================= #
204
+ # === show_raw_data?
205
+ # ========================================================================= #
206
+ def show_raw_data?
207
+ @show_raw_data
208
+ end; alias show_raw? show_raw_data? # === show_raw?
209
+ alias debug? show_raw_data? # === debug?
210
+
211
+ # ========================================================================= #
212
+ # === append_onto_the_main_hash
213
+ # ========================================================================= #
214
+ def append_onto_the_main_hash(
215
+ i = @use_these_dates
216
+ )
217
+ our_date_of_interest = Time.parse(i) # This will be a date such as 2023-01-18 00:00:00.
218
+ @dataset.each_pair {|name_of_the_lecture, inner_hash|
219
+ # ===================================================================== #
220
+ # === Check for exams on that day
221
+ #
222
+ # First find relevant exams: We will also register the lva_dates
223
+ # but check them later.
224
+ # ===================================================================== #
225
+ exams = inner_hash['exams']
226
+ if exams
227
+ begin
228
+ # ================================================================= #
229
+ # First, check for flawed entries:
230
+ # ================================================================= #
231
+ if exams.is_a?(Array) and exams.first.nil?
232
+ opne 'A '+steelblue('problem')+' occurred for '+
233
+ sfancy(name_of_the_lecture)+'.'
234
+ opne tomato('There is a faulty exams: entry. Please correct '\
235
+ 'this before this class can continue')
236
+ pp exams
237
+ exit
238
+ end
239
+ array_exams_on = remove_weekday_names_from(
240
+ exams
241
+ ).map(&:strip)
242
+ array_exams_on.compact!
243
+ array_exams_on.map!(&:strip).map {|line|
244
+ # =============================================================== #
245
+ # Get rid of "Ort" if it is there:
246
+ # =============================================================== #
247
+ if line.include? ', Ort:'
248
+ line = line.split(', Ort:').first.to_s.strip
249
+ end
250
+ Time.parse(line.delete(','))
251
+ }
252
+ rescue ArgumentError => error
253
+ opnn; e 'An error was encountered for '\
254
+ 'the '+steelblue('lecture')+' called `'+
255
+ royalblue(name_of_the_lecture)+'`:'
256
+ pp error; e; pp exams; e; pp array_exams_on; e
257
+ opnn; e tomato('Exiting now - consider fixing this problem.')
258
+ exit
259
+ end
260
+ end
261
+ # ===================================================================== #
262
+ # Check for the lva-dates entry next.
263
+ # ===================================================================== #
264
+ lva_dates = inner_hash['lva_dates']
265
+ if lva_dates
266
+ begin
267
+ # ================================================================= #
268
+ # First remove all "Ort:" entries here.
269
+ # ================================================================= #
270
+ lva_dates.map! {|entry|
271
+ if entry.include?('Ort:')
272
+ entry = entry.split('Ort:').first.to_s
273
+ end
274
+ entry.strip
275
+ }
276
+ array_lva_dates_on = remove_weekday_names_from(
277
+ lva_dates
278
+ ).map(&:strip).map {|line| line.delete(',').strip }
279
+ array_lva_dates_on.map! {|line|
280
+ Time.parse(line.strip)
281
+ }
282
+ rescue ArgumentError => error
283
+ opnn; e 'Problem with lecture name: '+
284
+ sfancy(name_of_the_lecture)
285
+ pp error
286
+ end
287
+ end
288
+ if exams.nil?
289
+ else
290
+ if exams
291
+ # =================================================================== #
292
+ # Ok, we have found at the least one exam here.
293
+ # =================================================================== #
294
+ exams.map! {|line| line.to_s.strip }
295
+ if exams.first.empty?
296
+ opnn; e 'Empty exams-entry for '+
297
+ slateblue(name_of_the_lecture)
298
+ end
299
+ # =================================================================== #
300
+ # Next, we must find out if the exams are on the same date.
301
+ # This works if we use date-objects via Time.at().to_date.
302
+ # =================================================================== #
303
+ if array_exams_on.any? {|time_entry|
304
+ date1 = time_entry
305
+ if date1.is_a? String
306
+ if date1.include? ', Ort:'
307
+ date1 = date1.split(', Ort:').first.to_s.strip
308
+ end
309
+ date1 = Time.parse(date1)
310
+ end
311
+ if date1.respond_to? :to_date
312
+ date1 = date1.to_date
313
+ end
314
+ date2 = our_date_of_interest.to_date
315
+ # =============================================================== #
316
+ # Must convert date1 to start at 00:00:00 too.
317
+ # =============================================================== #
318
+ if date1.respond_to? :day
319
+ _ = date1.day.to_s+'.'+
320
+ date1.month.to_s+'.'+
321
+ date1.year.to_s
322
+ date1 = Time.parse(_).to_date
323
+ end
324
+ date1 === date2
325
+ }
326
+
327
+ # ================================================================= #
328
+ # Store our findings next:
329
+ # ================================================================= #
330
+ main_hash?[:exams] << name_of_the_lecture
331
+ end
332
+ end
333
+ end
334
+ # ===================================================================== #
335
+ # Next check for lva-dates.
336
+ # ===================================================================== #
337
+ if lva_dates.nil?
338
+ else
339
+ # =================================================================== #
340
+ # Next, we must find out if the exams are on the same date.
341
+ # This works if we use date-objects via Time.at().to_date.
342
+ # =================================================================== #
343
+ if array_lva_dates_on.any? {|time_entry|
344
+ date1 = time_entry.to_date
345
+ date2 = our_date_of_interest.to_date
346
+ # =============================================================== #
347
+ # Must convert date1 to start at 00:00:00 too.
348
+ # =============================================================== #
349
+ assumed_date = date1.day.to_s+'.'+date1.month.to_s+'.'+date1.year.to_s
350
+ date1 = Time.parse(assumed_date).to_date
351
+ # =============================================================== #
352
+ # Check whether it is from the past year:
353
+ # =============================================================== #
354
+ if date2.year - date1.year > 0
355
+ register_this_lecture_having_a_wrong_date(
356
+ name_of_the_lecture.strip, date1
357
+ )
358
+ opnn; e crimson('There may be a wrong date (year) set '\
359
+ 'for the lecture `')+royalblue(name_of_the_lecture)+
360
+ crimson('`.')
361
+ pp date1
362
+ end
363
+ date1 === date2
364
+ }
365
+ main_hash?[:lva_dates] << name_of_the_lecture
366
+ end
367
+ if @show_raw_data
368
+ opnn; e royalblue('Debug output of the variable called array_lva_dates_on')
369
+ opnn; e slateblue('For the lecture called ')+lightgreen(name_of_the_lecture)
370
+ e
371
+ pp array_lva_dates_on
372
+ e
373
+ e 'The inner_hash dataset was:'
374
+ e
375
+ pp inner_hash
376
+ e
377
+ end
378
+ end
379
+ }
380
+ if @show_raw_data
381
+ opnn; e royalblue('Debug output:')
382
+ e
383
+ pp main_hash?
384
+ e
385
+ end
386
+ report_lectures_having_an_outdated_year
387
+ end
388
+
389
+ # ========================================================================= #
390
+ # === prepare_dataset_and_then_report_for_this_date
391
+ # ========================================================================= #
392
+ def prepare_dataset_and_then_report_for_this_date(
393
+ this_date
394
+ )
395
+ reset_internal_dataset
396
+ filter_the_main_dataset
397
+ append_onto_the_main_hash(
398
+ this_date
399
+ )
400
+ report(
401
+ this_date
402
+ )
403
+ store_this_date_into_a_local_file
404
+ end
405
+
406
+ # ========================================================================= #
407
+ # === report (report tag)
408
+ # ========================================================================= #
409
+ def report(
410
+ i = main_day?
411
+ )
412
+ e # An initial newline to make this prettier.
413
+ opnn { :no_colon }
414
+ header_string = (" [Heutiger Tag: #{return_weekday}, #{dd_mm_yyyy}]").
415
+ rjust(50)
416
+ if use_unicode_symbols? and Object.const_defined? :Roebe
417
+ lindex = header_string.index('[')
418
+ header_string[lindex, 0] = '|'
419
+ splitted = header_string.split('|')
420
+ splitted[0] = crimson(splitted[0]+Roebe.shamrock) # Add a shamrock-unicode icon.
421
+ splitted[1] = lightseagreen(splitted[1])+
422
+ crimson(Roebe.shamrock) # Add the clear-sun weather icon.
423
+ header_string = lightseagreen(splitted.join)
424
+
425
+ else
426
+ header_string = lightseagreen(header_string)
427
+ end
428
+ ee header_string
429
+ e
430
+ e
431
+ if Studium.is_this_day_a_holiday?(i)
432
+ opnn; e "Note that the day #{sfancy(i)} is a holiday."
433
+ e
434
+ end
435
+ # ======================================================================= #
436
+ # First, look if there are any "vorbesprechungen", aka
437
+ # "preliminary meetings". If so, we will show these first.
438
+ # ======================================================================= #
439
+ if Studium.is_a_vorbesprechungs_day?(i)
440
+ do_report_all_preliminary_meetings_on_that_day(i)
441
+ end
442
+ lva_dates_on_that_day = main_hash?[:lva_dates]
443
+ sorted_lectures_on_that_day = []
444
+ main_day = i
445
+ unless lva_dates_on_that_day.empty?
446
+ # ===================================================================== #
447
+ # === "The following lectures occur on"
448
+ # ===================================================================== #
449
+ result = 'The following '.dup
450
+ if use_unicode_symbols? and Object.const_defined? :Roebe
451
+ result << lightgreen(Roebe.white_sun_with_rays)+' '
452
+ end
453
+ result << colour_for_lectures('lectures')+
454
+ ' occur on '+orange(main_day)+
455
+ ' ('+colourize_weekday(translate_dd_mm_yyy_to_weekday(main_day))+
456
+ ')'+
457
+ darkslategray(':')
458
+ e result
459
+ # ===================================================================== #
460
+ # Iterate over our lectures next:
461
+ # ===================================================================== #
462
+ lva_dates_on_that_day.each {|name_of_the_lecture|
463
+ pointer = main_dataset?[name_of_the_lecture]
464
+ currently_participating_in_this_course = pointer[:currently_participating_in_this_course]
465
+ selection = pointer['lva_dates'].select {|line|
466
+ line.include? i
467
+ }
468
+ if selection
469
+ _ = selection.first
470
+ _.strip! if _
471
+ # ================================================================= #
472
+ # The _ variable is now something like this: "16.04.2018, 18:00-19:30"
473
+ # ================================================================= #
474
+ _.delete!(',')
475
+ _.squeeze!(' ')
476
+ if _.include? '-'
477
+ _ = _.split('-').first+':00'
478
+ end
479
+ begin
480
+ sorted_lectures_on_that_day << [
481
+ name_of_the_lecture,
482
+ Time.parse(_),
483
+ { participating_in_this_course: currently_participating_in_this_course }
484
+ ]
485
+ rescue Exception => error
486
+ e 'A problem occurred.'
487
+ pp error
488
+ pp name_of_the_lecture
489
+ pp _
490
+ exit
491
+ end
492
+ end
493
+ }
494
+ sorted_lectures_on_that_day = sorted_lectures_on_that_day.sort_by {|a, time_entry, c|
495
+ time_entry
496
+ }
497
+ # ===================================================================== #
498
+ # === The lectures on that day
499
+ #
500
+ # Finally, we will display the lectures that happen on that day.
501
+ # ===================================================================== #
502
+ display_these_lectures_on_that_day(
503
+ sorted_lectures_on_that_day
504
+ )
505
+ # ===================================================================== #
506
+ # === Report upcoming exams next
507
+ #
508
+ # Next, report the exams. The lva-dates will be reported lateron.
509
+ # i will be a String such as "18.01.2023".
510
+ # ===================================================================== #
511
+ do_report_the_upcoming_exams(i)
512
+ else
513
+ e grey("No lectures were found on the day ")+
514
+ orange(main_day)+
515
+ grey(" (")+
516
+ colourize_weekday(
517
+ return_weekday_for(main_day)
518
+ )+
519
+ grey(").")
520
+ end
521
+ e
522
+ end
523
+
524
+ # ========================================================================= #
525
+ # === reset (reset tag)
526
+ # ========================================================================= #
527
+ def reset
528
+ super()
529
+ reset_internal_dataset
530
+ infer_the_namespace
531
+ # ======================================================================= #
532
+ # === :commandline_arguments
533
+ # ======================================================================= #
534
+ reset_the_commandline_arguments
535
+ # ======================================================================= #
536
+ # === @store_into_this_file
537
+ # ======================================================================= #
538
+ @store_into_this_file =
539
+ "#{log_dir?}last_date_for_conflicting_lva_lectures.md"
540
+ # ======================================================================= #
541
+ # === @show_raw_data
542
+ #
543
+ # The next instance variable determines whether we will show some
544
+ # additional debug information or not. By default we will not do
545
+ # so, hence why it is set to false.
546
+ # ======================================================================= #
547
+ @show_raw_data = false
548
+ # ======================================================================= #
549
+ # === @reported_n_lectures_having_a_wrong_date
550
+ # ======================================================================= #
551
+ @reported_n_lectures_having_a_wrong_date = 0
552
+ end
553
+
554
+ # ========================================================================= #
555
+ # === reset_internal_dataset
556
+ #
557
+ # Put variables into this method here only if you really wish to
558
+ # reset them. Commandline arguments should normally NOT be reset
559
+ # in this method.
560
+ # ========================================================================= #
561
+ def reset_internal_dataset
562
+ # ======================================================================= #
563
+ # The @main_hash will store :exams and :lectures as separate entities.
564
+ # ======================================================================= #
565
+ @main_hash = {}
566
+ @main_hash[:exams] = []
567
+ @main_hash[:lva_dates] = []
568
+ # ======================================================================= #
569
+ # === @array_we_have_registered_for_these_exams_on_that_day
570
+ # ======================================================================= #
571
+ @array_we_have_registered_for_these_exams_on_that_day = []
572
+ # ======================================================================= #
573
+ # === @original_dataset
574
+ # ======================================================================= #
575
+ @original_dataset = return_dataset_from_file_lecture_information
576
+ # ======================================================================= #
577
+ # === @dataset
578
+ # ======================================================================= #
579
+ @dataset = @original_dataset.dup
580
+ # ======================================================================= #
581
+ # === @n_ljust
582
+ # ======================================================================= #
583
+ @n_ljust = 78
584
+ # ======================================================================= #
585
+ # === @left_pad
586
+ # ======================================================================= #
587
+ @left_pad = ' ' # This one is displayed when showing indices in this class.
588
+ # ======================================================================= #
589
+ # === @hash_these_lectures_have_a_wrong_date
590
+ # ======================================================================= #
591
+ @hash_these_lectures_have_a_wrong_date = {}
592
+ end
593
+
594
+ # ========================================================================= #
595
+ # === dataset?
596
+ # ========================================================================= #
597
+ def dataset?
598
+ @dataset
599
+ end; alias main_dataset? dataset? # === main_dataset?
600
+
601
+ # ========================================================================= #
602
+ # === main_hash?
603
+ # ========================================================================= #
604
+ def main_hash?
605
+ @main_hash
606
+ end
607
+
608
+ # ========================================================================= #
609
+ # === input_given?
610
+ #
611
+ # This will return the first date.
612
+ # ========================================================================= #
613
+ def input_given?
614
+ @use_these_dates.first
615
+ end
616
+
617
+ # ========================================================================= #
618
+ # === filter_the_main_dataset
619
+ #
620
+ # We have to be careful what we filter in this method, as an erroneous
621
+ # filter means we may drop lectures and exams that are still relevant
622
+ # to the user.
623
+ # ========================================================================= #
624
+ def filter_the_main_dataset
625
+ # ======================================================================= #
626
+ # (1) First, we will skip lectures that have already been passed
627
+ # successfully.
628
+ # ======================================================================= #
629
+ @dataset.reject! {|name_of_the_lecture, inner_hash|
630
+ inner_hash.has_key?(:already_solved) and
631
+ inner_hash[:already_solved] == true
632
+ }
633
+ # ======================================================================= #
634
+ # (2) Second, we will only respect courses that have either a
635
+ # lva_dates entry or an exams-entry.
636
+ # ======================================================================= #
637
+ @dataset.select! {|name_of_the_lecture, inner_hash|
638
+ inner_hash.has_key?('lva_dates') or
639
+ inner_hash.has_key?('exams')
640
+ }
641
+ end
642
+
643
+ # ========================================================================= #
644
+ # === append_university
645
+ #
646
+ # This will properly format and colourize the "university-string", before
647
+ # returning it. It is to be used to append it to the displayed string.
648
+ # ========================================================================= #
649
+ def append_university(i)
650
+ # Still have to modify these two:
651
+ # VetMed
652
+ case i
653
+ when 'TU Vienna'
654
+ i = 'TU'
655
+ when 'Uni Wien'
656
+ i = 'UniWien'
657
+ end
658
+ i = " #{i.center(8)}"
659
+ return dodgerblue(i) # Or deepskyblue
660
+ end
661
+
662
+ # ========================================================================= #
663
+ # === properly_colourize_this_lecture_type
664
+ #
665
+ # Lecture types such as SE, UE and so forth, will be displayed in a
666
+ # slightly brighter colour, to denote that they are more important
667
+ # than other lecture-types such as VO.
668
+ # ========================================================================= #
669
+ def properly_colourize_this_lecture_type(lecture_type)
670
+ _ = ' ['+lecture_type+'] '
671
+ if is_prüfungsimmanent?(lecture_type)
672
+ darkturquoise(_)
673
+ else
674
+ steelblue(_)
675
+ end
676
+ end
677
+
678
+ # ========================================================================= #
679
+ # === colourize_weekday
680
+ # ========================================================================= #
681
+ def colourize_weekday(i)
682
+ limegreen(i)
683
+ end
684
+
685
+ # ========================================================================= #
686
+ # === use_this_date?
687
+ # ========================================================================= #
688
+ def use_these_dates?
689
+ @use_these_dates
690
+ end; alias main_day? use_these_dates? # === main_day?
691
+ alias interesting_day? use_these_dates? # === interesting_day?
692
+ alias use_this_date? use_these_dates? # === use_this_date?
693
+ alias use_which_date? use_these_dates? # === use_which_date?
694
+
695
+ # ========================================================================= #
696
+ # === return_dataset_of_this_lecture
697
+ # ========================================================================= #
698
+ def return_dataset_of_this_lecture(i)
699
+ @dataset[i]
700
+ end
701
+
702
+ # ========================================================================= #
703
+ # === colour_for_index_strings
704
+ # ========================================================================= #
705
+ def colour_for_index_strings(i)
706
+ powderblue(i)
707
+ end
708
+
709
+ # ========================================================================= #
710
+ # === colour_for_preliminary_meetings
711
+ # ========================================================================= #
712
+ def colour_for_preliminary_meetings(i)
713
+ rosybrown(i)
714
+ end
715
+
716
+ # ========================================================================= #
717
+ # === colour_for_exams
718
+ # ========================================================================= #
719
+ def colour_for_exams(
720
+ i,
721
+ optional_priority = nil,
722
+ optional_registered_for_that_exam = false
723
+ )
724
+ if optional_registered_for_that_exam
725
+ orangered(i)+
726
+ orangered(" #{left_arrow} [Registered for this exam]")
727
+ else
728
+ case optional_priority
729
+ when 1
730
+ crimson(i)+
731
+ crimson(" #{left_arrow} [High Priority Exam]")
732
+ else
733
+ springgreen(i)
734
+ end
735
+ end
736
+ end
737
+
738
+ # ========================================================================= #
739
+ # === colour_for_lectures
740
+ # ========================================================================= #
741
+ def colour_for_lectures(i)
742
+ turquoise(i)
743
+ end; alias colour_for_vorbesprechungs_termin colour_for_lectures # === colour_for_vorbesprechungs_termin
744
+
745
+ # ========================================================================= #
746
+ # === display_these_exams_on_that_day
747
+ #
748
+ # This is the method that will report which exams will happen during
749
+ # the given input-day.
750
+ # ========================================================================= #
751
+ def display_these_exams_on_that_day(i)
752
+ index = 0
753
+ e
754
+ i.each {|name_of_the_lecture, date_of_the_lecture| index += 1
755
+ _ = date_of_the_lecture
756
+ padded_index = "#{index})".rjust(3)
757
+ colourized_and_padded_index = powderblue(padded_index)
758
+ priority = return_dataset_of_this_lecture(name_of_the_lecture)[:priority]
759
+ which_university = return_dataset_of_this_lecture(name_of_the_lecture)[:university].to_s
760
+ registered_for_an_upcoming_exam_at = @dataset[name_of_the_lecture]['registered']
761
+ if registered_for_an_upcoming_exam_at
762
+ if registered_for_an_upcoming_exam_at.is_a? Array
763
+ # ================================================================= #
764
+ # Note that the array above may have some additional ' '
765
+ # characters, so we apply .squeeze() on it.
766
+ #
767
+ # An example for this is:
768
+ #
769
+ # "Dienstag 12.06.2018, 14:00-16:00, Ort: Foobar"
770
+ # ================================================================= #
771
+ registered_for_an_upcoming_exam_at.map! {|entry| entry.squeeze(' ') }
772
+ registered_for_an_upcoming_exam_at = registered_for_an_upcoming_exam_at.first
773
+ end
774
+ registered_for_an_upcoming_exam_at = remove_leading_weeknames(
775
+ registered_for_an_upcoming_exam_at
776
+ )
777
+ end
778
+ case which_university
779
+ when 'TU Vienna'
780
+ which_university = 'TU Wien'
781
+ end
782
+ padded_which_university = " #{which_university}".center(10)
783
+ colourized_and_padded_which_university = plum('['+padded_which_university+'] ')
784
+ # ===================================================================== #
785
+ # In the event that priority is 1, we will use slightly different
786
+ # colours - aka red.
787
+ # ===================================================================== #
788
+ are_we_registered_for_that_exam = false
789
+ if registered_for_an_upcoming_exam_at # to prevent nil-entries
790
+ # =================================================================== #
791
+ # The line may be like this:
792
+ # "18.06.2018, 14:00-16:00, Ort: Hörsaal 2 UZA 1 Biozentrum 2.249 1.OG"
793
+ # =================================================================== #
794
+ splitted = registered_for_an_upcoming_exam_at.split(',')
795
+ first = splitted.first
796
+ if first == input_given?
797
+ are_we_registered_for_that_exam = true
798
+ end
799
+ end
800
+ return_colourized_entry_for_an_upcoming_exam = colour_for_exams(
801
+ '['+return_dd_mm_yy_and_time_from(date_of_the_lecture).to_s.rjust(19,'0')+']',
802
+ priority,
803
+ are_we_registered_for_that_exam
804
+ )
805
+ padded_name_of_the_lecture = name_of_the_lecture.ljust(@n_ljust)
806
+ # ===================================================================== #
807
+ # If we are registered for that particular exam then we
808
+ # will use a slightly brighter colour.
809
+ # ===================================================================== #
810
+ if are_we_registered_for_that_exam
811
+ @array_we_have_registered_for_these_exams_on_that_day << [
812
+ name_of_the_lecture, date_of_the_lecture
813
+ ]
814
+ colourized_and_padded_name_of_the_lecture =
815
+ cadetblue(padded_name_of_the_lecture)
816
+ else
817
+ colourized_and_padded_name_of_the_lecture =
818
+ cornflowerblue(padded_name_of_the_lecture)
819
+ end
820
+ # ===================================================================== #
821
+ # And finally, report which exams will happen on that day next,
822
+ # on the commandline.
823
+ # ===================================================================== #
824
+ e @left_pad+
825
+ colourized_and_padded_index+ # The index such as ' 1)'
826
+ ' '+
827
+ colourized_and_padded_name_of_the_lecture+ # The name of the lecture.
828
+ colourized_and_padded_which_university+
829
+ return_colourized_entry_for_an_upcoming_exam
830
+ }
831
+ e
832
+ end
833
+
834
+ # ========================================================================= #
835
+ # === this_exam_happens_on_that_day?
836
+ # ========================================================================= #
837
+ def this_exam_happens_on_that_day?(i)
838
+ result = false
839
+ unless @array_we_have_registered_for_these_exams_on_that_day.empty?
840
+ @array_we_have_registered_for_these_exams_on_that_day.each {|a, b|
841
+ result = true if a.include? i
842
+ }
843
+ end
844
+ result
845
+ end
846
+
847
+ # ========================================================================= #
848
+ # === store_this_date_into_a_local_file
849
+ #
850
+ # This method will store the date used, aka the dd.mm.yyyy format,
851
+ # into a local file.
852
+ # ========================================================================= #
853
+ def store_this_date_into_a_local_file
854
+ what = use_which_date?
855
+ what = what.first if what.is_a? Array
856
+ into = @store_into_this_file
857
+ write_what_into(what, into)
858
+ end
859
+
860
+ # ========================================================================= #
861
+ # === register_this_lecture_having_a_wrong_date
862
+ # ========================================================================= #
863
+ def register_this_lecture_having_a_wrong_date(
864
+ name_of_the_lecture, date
865
+ )
866
+ # ======================================================================= #
867
+ # We will only register the first incorrect lecture; the others will
868
+ # be ignored. This way the user can fix the flawed dataset.
869
+ # ======================================================================= #
870
+ unless @hash_these_lectures_have_a_wrong_date.has_key? name_of_the_lecture.strip
871
+ @hash_these_lectures_have_a_wrong_date[name_of_the_lecture.strip] = date
872
+ end
873
+ end
874
+
875
+ # ========================================================================= #
876
+ # === show_lva_dates_of_this_lecture
877
+ #
878
+ # This method will report all LVA-dates of the given lecture at hand.
879
+ # ========================================================================= #
880
+ def show_lva_dates_of_this_lecture(i)
881
+ entries = @dataset.select {|name_of_the_lecture, inner_dataset|
882
+ name_of_the_lecture.include? i
883
+ }
884
+ if entries.size > 1
885
+ e 'More than one entry. Need to decide what to do with that.'
886
+ e 'Proposing to just return the first entry. Acceptable? '\
887
+ 'Consider later (July 2018)'
888
+ else
889
+ name = entries.keys.first
890
+ e 'Showing all lva-dates of the lecture `'+royalblue(name)+'` next:'
891
+ hash = entries[name]
892
+ lva_dates = hash['lva_dates']
893
+ if lva_dates
894
+ lva_dates.each {|lva_date|
895
+ lva_date = remove_weekday_name(lva_date).strip
896
+ lva_date = extract_dd_mm_yyyy(lva_date)
897
+ prepare_dataset_and_then_report_for_this_date(lva_date)
898
+ }
899
+ else
900
+ e 'No lva_dates: entry appears to be '\
901
+ 'registered for `'+royalblue(name)+'`.'
902
+ end
903
+ end
904
+ exit
905
+ end
906
+
907
+ # ========================================================================= #
908
+ # === return_colourized_people_cheering_for_an_exam
909
+ # ========================================================================= #
910
+ def return_colourized_people_cheering_for_an_exam
911
+ colourized_orangered(
912
+ return_people_cheering_for_an_exam
913
+ )
914
+ end
915
+
916
+ # ========================================================================= #
917
+ # === colourized_orangered
918
+ # ========================================================================= #
919
+ def colourized_orangered(i)
920
+ orangered(i)
921
+ end; alias colourize_via_orangered colourized_orangered # === colourize_via_orangered
922
+
923
+ # ========================================================================= #
924
+ # === set_use_this_date (set tag)
925
+ #
926
+ # This will set the date that we are interested in. If the input is an
927
+ # Array then we will work on a String. In general, the String should
928
+ # be in the format dd.mm.yyyy such as '25.02.2018'.
929
+ # ========================================================================= #
930
+ def set_use_this_date(
931
+ i = nil
932
+ )
933
+ i = DEFAULT_DATE if i.nil?
934
+ # ======================================================================= #
935
+ # === Handle Arrays next
936
+ # ======================================================================= #
937
+ if i.is_a?(Array)
938
+ # ===================================================================== #
939
+ # First, we will reject all entries that are a weekday, such as
940
+ # "Freitag". The reason for this behaviour is because we can also
941
+ # invoke this class here via e. g.:
942
+ #
943
+ # conflict Freitag 25.10.2019
944
+ #
945
+ # But we don't care about the weekday name here; the dd.mm.yyyy format
946
+ # is sufficient. So, let's modify the array.
947
+ # ===================================================================== #
948
+ i.reject! {|entry| weekdays?.include?(entry.capitalize) }
949
+ first = i.first
950
+ if i.empty?
951
+ i = return_dd_mm_yyyy
952
+ elsif first.is_a?(String) and first.include?('-') and (first =~ /\d+/)
953
+ require 'studium/utility_scripts/expand_time_range.rb'
954
+ i = Studium.expand_these_lectures(i)
955
+ elsif first !~ /\d+/ # If it does not have a number but is not empty.
956
+ case first
957
+ # =================================================================== #
958
+ # === default
959
+ # =================================================================== #
960
+ when 'default','def'
961
+ if File.exist? @store_into_this_file
962
+ opnn; e 'Reading from the file'
963
+ opnn; e " `#{sfile(@store_into_this_file)}`."
964
+ i = File.read(@store_into_this_file).strip
965
+ else
966
+ opnn
967
+ e 'No entry could be found at non-existing '\
968
+ 'file `'+sfile(@store_into_this_file)+'`.'
969
+ end
970
+ when *ALPHABET.map(&:upcase)
971
+ i = A # ← i will now be e. g. 01.10.2018
972
+ # ================================================================= #
973
+ # Next, we add the difference to this string.
974
+ # ================================================================= #
975
+ n_difference = ALPHABET.index(first.downcase)
976
+ i = Time.parse(i) + ONE_DAY * n_difference
977
+ i = dd_mm_yyyy(i)
978
+ end
979
+ end
980
+ end
981
+ if i.is_a?(Array) and i.size == 1
982
+ i = i.first
983
+ end
984
+ case i # case tag
985
+ when *ARRAY_SHORTCUTS_FOR_THE_DAY_AFTER_TOMORROW
986
+ i = Time.now + ONE_DAY + ONE_DAY
987
+ i = return_dd_mm_yyyy(i)
988
+ when *ARRAY_SHORTCUTS_FOR_TOMORROW
989
+ i = Time.now + ONE_DAY
990
+ i = return_dd_mm_yyyy(i)
991
+ end
992
+ # ======================================================================= #
993
+ # We require an Array past this point:
994
+ # ======================================================================= #
995
+ i = [i].compact unless i.is_a? Array
996
+ i.flatten!
997
+ i.map! {|line|
998
+ line = remove_leading_weekdays(line)
999
+ case line
1000
+ when *ARRAY_SHORTCUTS_FOR_TOMORROW
1001
+ line = Time.now + ONE_DAY # ← Add one day.
1002
+ line = return_dd_mm_yyyy(line)
1003
+ when 'today','heute'
1004
+ line = return_dd_mm_yyyy(Time.now)
1005
+ end
1006
+ if line.end_with? ','
1007
+ line = line.dup if line.frozen?
1008
+ line.chop!
1009
+ end
1010
+ # ===================================================================== #
1011
+ # Check for a proper date, which is in the format dd.mm.yyyy.
1012
+ # ===================================================================== #
1013
+ if line =~ /^\d{1,2}\.\d{1,2}\.\d{4}$/
1014
+ else
1015
+ if line.count('.') == 1
1016
+ line = line.dup if line.frozen?
1017
+ line << '.'+current_year?
1018
+ end
1019
+ end
1020
+ line
1021
+ }
1022
+ @use_these_dates = i
1023
+ end
1024
+
1025
+ # ========================================================================= #
1026
+ # === report_lectures_having_an_outdated_year
1027
+ # ========================================================================= #
1028
+ def report_lectures_having_an_outdated_year
1029
+ unless @hash_these_lectures_have_a_wrong_date.empty?
1030
+ @hash_these_lectures_have_a_wrong_date.each_pair {|name_of_the_lecture, date|
1031
+ @reported_n_lectures_having_a_wrong_date += 1
1032
+ unless @reported_n_lectures_having_a_wrong_date > 3
1033
+ # ================================================================= #
1034
+ # Don't show more than 3 outdated dates.
1035
+ # ================================================================= #
1036
+ e crimson('There may be a wrong date (year) set '\
1037
+ 'for the lecture `')+royalblue(name_of_the_lecture)+
1038
+ crimson('`.')
1039
+ pp date
1040
+ end
1041
+ }
1042
+ end
1043
+ end
1044
+
1045
+ # ========================================================================= #
1046
+ # === do_report_the_upcoming_exams
1047
+ #
1048
+ # The input argument to this method should be a String, representing
1049
+ # the exam-date, such as "18.01.2023".
1050
+ # ========================================================================= #
1051
+ def do_report_the_upcoming_exams(
1052
+ i = main_day?
1053
+ )
1054
+ i = i.dup if i.frozen?
1055
+ i.strip! # Get rid of irrelevant ' ', just in case.
1056
+ main_day = i
1057
+ exams_on_that_day = main_hash?[:exams]
1058
+ unless exams_on_that_day.empty?
1059
+ # ===================================================================== #
1060
+ # === "The following exams happen on ..."
1061
+ # ===================================================================== #
1062
+ e grey('The following ')+
1063
+ colour_for_exams('exams')+
1064
+ grey(' happen on ')+
1065
+ orange(main_day)+
1066
+ grey(' (')+
1067
+ colourize_weekday(
1068
+ translate_dd_mm_yyy_to_weekday(main_day)
1069
+ )+
1070
+ grey(')')+
1071
+ darkslategray(':')
1072
+ sorted_exams_on_that_day = []
1073
+ exams_on_that_day = exams_on_that_day.each {|name_of_the_lecture|
1074
+ pointer = main_dataset?[name_of_the_lecture]
1075
+ selection = pointer['exams'].select {|line|
1076
+ line.include? i
1077
+ }
1078
+ if selection
1079
+ if selection.empty?
1080
+ opnn; e "The selection is empty for the day #{sfancy(i.to_s)}."
1081
+ opnn; e "The name of the lecture was #{sfancy(name_of_the_lecture)}"
1082
+ pp exams_on_that_day
1083
+ else
1084
+ selection_match = selection.first.strip
1085
+ if selection_match.include?('Ort:')
1086
+ selection_match = selection_match.split('Ort:').first.to_s.delete(',')
1087
+ end
1088
+ begin
1089
+ parsed_date = Time.parse(selection_match)
1090
+ rescue Exception => error
1091
+ e tomato('An error happened for ')+
1092
+ steelblue(selection_match)
1093
+ e
1094
+ pp error
1095
+ e
1096
+ end
1097
+ sorted_exams_on_that_day << [
1098
+ name_of_the_lecture,
1099
+ parsed_date
1100
+ ]
1101
+ end
1102
+ end
1103
+ }
1104
+ sorted_exams_on_that_day = sorted_exams_on_that_day.sort_by {|a,b|
1105
+ b
1106
+ }
1107
+ display_these_exams_on_that_day(sorted_exams_on_that_day)
1108
+ else
1109
+ e "No exams were found on the day #{orange(main_day)}"\
1110
+ " (#{sfancy(return_weekday_for(main_day))})."
1111
+ end
1112
+ end
1113
+
1114
+ # ========================================================================= #
1115
+ # === do_report_all_preliminary_meetings_on_that_day
1116
+ # ========================================================================= #
1117
+ def do_report_all_preliminary_meetings_on_that_day(
1118
+ i,
1119
+ use_this_key = :preparatory_meeting # This used to be 'vorbesprechung' in the past.
1120
+ )
1121
+ selection = @original_dataset.select {|a, inner_hash|
1122
+ if inner_hash.has_key?(use_this_key)
1123
+ pointer = inner_hash[use_this_key]
1124
+ if pointer.is_a? Array
1125
+ pointer = pointer.first
1126
+ end
1127
+ pointer = pointer.to_s
1128
+ pointer.include?(i.to_s)
1129
+ end
1130
+ }
1131
+ index = 0
1132
+ if selection.empty?
1133
+ else
1134
+ # ===================================================================== #
1135
+ # === "The following preliminary meetings happen on ... "
1136
+ # ===================================================================== #
1137
+ e 'The following '+
1138
+ colour_for_preliminary_meetings('preliminary meetings')+
1139
+ ' happen on '+orange(i)+
1140
+ ' ('+simp(translate_dd_mm_yyy_to_weekday(i))+').'
1141
+ e
1142
+ selection.each_pair {|name_of_the_lecture, hash| index += 1
1143
+ vorbesprechungs_day = hash[use_this_key]
1144
+ if vorbesprechungs_day.is_a? Array
1145
+ vorbesprechungs_day = vorbesprechungs_day.first
1146
+ end
1147
+ colourized_and_padded_index =
1148
+ ' '+colour_for_index_strings(index.to_s+')')
1149
+ e colourized_and_padded_index+' '+
1150
+ sfancy(name_of_the_lecture.ljust(@n_ljust+5))+
1151
+ colour_for_vorbesprechungs_termin(
1152
+ '['+vorbesprechungs_day+']'
1153
+ )
1154
+ }
1155
+ end
1156
+ e
1157
+ end
1158
+
1159
+ # ========================================================================= #
1160
+ # === return_people_cheering_for_an_exam
1161
+ # ========================================================================= #
1162
+ def return_people_cheering_for_an_exam
1163
+ '\\o/ EXAM \\o/'
1164
+ end
1165
+
1166
+ # ========================================================================= #
1167
+ # === display_these_lectures_on_that_day (lectures tag)
1168
+ #
1169
+ # This method will display the lectures on that given day, along
1170
+ # with some additional information to make it easier to read what
1171
+ # is all happening on that day.
1172
+ # ========================================================================= #
1173
+ def display_these_lectures_on_that_day(i)
1174
+ index = 0
1175
+ # ======================================================================= #
1176
+ # Obtain a reference to the main dataset next:
1177
+ # ======================================================================= #
1178
+ main_dataset = main_dataset?
1179
+ # ======================================================================= #
1180
+ # Merge in all exams that occur on that day:
1181
+ # ======================================================================= #
1182
+ unless @array_we_have_registered_for_these_exams_on_that_day.empty?
1183
+ @array_we_have_registered_for_these_exams_on_that_day.each {|element|
1184
+ # =================================================================== #
1185
+ # We have to re-set the time counter for these elements, as they
1186
+ # may have the wrong timezone-offset, which would mess up our
1187
+ # sorting done at a later point.
1188
+ # =================================================================== #
1189
+ second_element = Studium.normalize_time(
1190
+ element.last
1191
+ )
1192
+ element[-1] = second_element
1193
+ # =================================================================== #
1194
+ # We will add that element onto the dataset, aka i - but before
1195
+ # we do so, we have to remove the old element from our dataset.
1196
+ # =================================================================== #
1197
+ i.reject! {|array|
1198
+ name = array.first
1199
+ first_entry = element.first
1200
+ name == first_entry
1201
+ }
1202
+ i << element
1203
+ }
1204
+ end
1205
+ sorted_by_date = i.sort_by {|name_of_the_lecture, time_entry, participating_in_this_course|
1206
+ Time.parse(time_entry.to_s)
1207
+ }
1208
+ # ======================================================================= #
1209
+ # Go through our dataset and finally display the useful content:
1210
+ # ======================================================================= #
1211
+ e; sorted_by_date.each {|name_of_the_lecture, date_of_the_lecture, hash_participating_in_this_course| index += 1
1212
+ _ = date_of_the_lecture
1213
+ # ===================================================================== #
1214
+ # Pad the index a bit:
1215
+ # ===================================================================== #
1216
+ padded_index = ("#{index})").rjust(3)
1217
+ if this_exam_happens_on_that_day?(name_of_the_lecture)
1218
+ colourized_and_padded_index = colourize_via_orangered(padded_index)
1219
+ else
1220
+ colourized_and_padded_index = colour_for_index_strings(padded_index)
1221
+ end
1222
+ priority = main_dataset[name_of_the_lecture][:priority]
1223
+ lecture_type = main_dataset[name_of_the_lecture][:type] # Can be "VO" or "VO+SE" and so forth.
1224
+ name_of_the_university = main_dataset[name_of_the_lecture][:university]
1225
+ do_we_participate = main_dataset[name_of_the_lecture][:currently_participating_in_this_course]
1226
+ # ===================================================================== #
1227
+ # We will store everything in the String referenced via the variabled
1228
+ # called "result".
1229
+ # ===================================================================== #
1230
+ result = @left_pad+colourized_and_padded_index # First show the index
1231
+ if do_we_participate
1232
+ # =================================================================== #
1233
+ # Prepend a ✓ icon next.
1234
+ # =================================================================== #
1235
+ result[1,1] = mediumseagreen('✓') # This icon denotes that we currently participate in this course.
1236
+ end
1237
+ # ===================================================================== #
1238
+ # Next we will append the lecture-type, such as "VO" or "SE" or "PR" etc.
1239
+ # ===================================================================== #
1240
+ result << properly_colourize_this_lecture_type(lecture_type)
1241
+ padding_to_use = @n_ljust
1242
+ if lecture_type.size > 2
1243
+ # =================================================================== #
1244
+ # In this case, use a slightly shorter padding.
1245
+ # =================================================================== #
1246
+ padding_to_use -= (lecture_type.size - 2)
1247
+ end
1248
+ # ===================================================================== #
1249
+ # Make too long names shorter (truncate):
1250
+ # ===================================================================== #
1251
+ chop_off_at_this_offset = @n_ljust - 4
1252
+ if name_of_the_lecture.size > chop_off_at_this_offset
1253
+ name_of_the_lecture = name_of_the_lecture[0 .. (chop_off_at_this_offset - 6)]+' [...]'
1254
+ end
1255
+ padded_name_of_the_lecture = name_of_the_lecture.ljust(padding_to_use)
1256
+ # ===================================================================== #
1257
+ # === Colourize the lecture name next
1258
+ #
1259
+ # The normal colour for lectures here is slateblue; but if the
1260
+ # lecture is of high priority, aka priority 1, then a slightly
1261
+ # brighter colour will be used, to also visually denote that
1262
+ # this lecture is more important.
1263
+ # ===================================================================== #
1264
+ if this_exam_happens_on_that_day?(name_of_the_lecture)
1265
+ # =================================================================== #
1266
+ # In this case we will also pad anew:
1267
+ # =================================================================== #
1268
+ result << orangered(
1269
+ (
1270
+ "#{name_of_the_lecture} # #{left_arrow} #{return_people_cheering_for_an_exam}"
1271
+ ).ljust(padding_to_use)
1272
+ )
1273
+ else
1274
+ if do_we_participate
1275
+ result << tomato(padded_name_of_the_lecture)
1276
+ else
1277
+ case priority
1278
+ when 1
1279
+ result << mediumpurple(padded_name_of_the_lecture) # Now the name of the lecture.
1280
+ else
1281
+ result << slateblue(padded_name_of_the_lecture) # Now the name of the lecture.
1282
+ end
1283
+ end
1284
+ end
1285
+ # ===================================================================== #
1286
+ # Next we will append a String such as "[08.03.2023 17:00:00]".
1287
+ # ===================================================================== #
1288
+ result << colour_for_lectures(
1289
+ '['+return_dd_mm_yy_and_time_from(date_of_the_lecture).to_s.rjust(19,'0')+']'
1290
+ )
1291
+ # ===================================================================== #
1292
+ # Find out whether this exame happens on the day:
1293
+ # ===================================================================== #
1294
+ if this_exam_happens_on_that_day?(name_of_the_lecture)
1295
+ # =================================================================== #
1296
+ # Registered exams will appear in another colour:
1297
+ # =================================================================== #
1298
+ result << skyblue(' [')+return_colourized_people_cheering_for_an_exam+skyblue(']')
1299
+ elsif priority.to_i == 1
1300
+ result << skyblue(' [')+orange('Priorität: '+priority.to_s)+skyblue(']')
1301
+ else
1302
+ result << skyblue(" [Priorität: #{priority}]")
1303
+ end
1304
+ # ===================================================================== #
1305
+ # Next, append the university.
1306
+ # ===================================================================== #
1307
+ result << append_university(name_of_the_university)
1308
+ # ===================================================================== #
1309
+ # Last but not least, append the unicode-thumbs-up symbol if we are
1310
+ # currently participating in this course:
1311
+ # ===================================================================== #
1312
+ if hash_participating_in_this_course and (hash_participating_in_this_course[:participating_in_this_course])
1313
+ result << " #{yellowgreen(UNICODE_THUMBS_UP)}"
1314
+ end
1315
+ e result
1316
+ }
1317
+ e
1318
+ end
1319
+
1320
+ # ========================================================================= #
1321
+ # === run
1322
+ # ========================================================================= #
1323
+ def run
1324
+ ensure_that_the_log_directory_exists # Make sure that the log dir exists.
1325
+ menu # Pass the commandline arguments into the menu() interface.
1326
+ @use_these_dates.each {|this_date|
1327
+ prepare_dataset_and_then_report_for_this_date(this_date)
1328
+ }
1329
+ end
1330
+
1331
+ end; end
1332
+
1333
+ if __FILE__ == $PROGRAM_NAME
1334
+ Studium::ShowConflictingLvaLectures.new(ARGV)
1335
+ end # conflict 15.04.2018
1336
+ # conflict 20.04.2018 21.04.2018
1337
+ # conflict 19.06.2018
1338
+ # conflict --lva-dates-of=LVA_ID_HERE
1339
+ # conflict --lva-dates-of=301246