studium 0.16.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (887) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3211 -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/return_n_questions_solved_in_total +7 -0
  38. data/bin/rti_conflict +7 -0
  39. data/bin/search_for_n_ects +7 -0
  40. data/bin/show_lectures_on_the_commandline +7 -0
  41. data/bin/show_passed_exams_having_this_grade +7 -0
  42. data/bin/show_themes +7 -0
  43. data/bin/solved +9 -0
  44. data/bin/solved_ects +7 -0
  45. data/bin/studienkennzahl +7 -0
  46. data/bin/studium +7 -0
  47. data/bin/studium_skeleton +7 -0
  48. data/bin/ufind +7 -0
  49. data/bin/upcoming_exams +7 -0
  50. data/bin/week_parser +7 -0
  51. data/doc/ECTS_CONSIDERATIONS/ECTS_CONSIDERATIONS.md +82 -0
  52. data/doc/HOW_TO_DETERMINE_WHICH_PART_IS_THE_QUESTION_AND_WHICH_PART_IS_THE_ANSWER/HOW_TO_DETERMINE_WHICH_PART_IS_THE_QUESTION_AND_WHICH_PART_IS_THE_ANSWER.md +44 -0
  53. data/doc/README.gen +3164 -0
  54. data/doc/SQL_database_specification/SQL_database_specification.md +46 -0
  55. data/doc/deprecated_components/deprecated_components.md +46 -0
  56. data/doc/documentation_for_the_file_lecture_information/documentation_for_the_file_lecture_information.md +311 -0
  57. data/doc/elegant_colours/elegant_colours.md +21 -0
  58. data/doc/statistics/yearly_statistics.md +8 -0
  59. data/doc/todo/todo_for_the_graphical_parts_of_the_studium_gem_including_www_related_aspects.md +92 -0
  60. data/doc/todo/todo_for_the_studium_gem.md +55 -0
  61. data/img/STUDIES.png +0 -0
  62. data/lib/studium/autoinclude.rb +7 -0
  63. data/lib/studium/base/base.rb +3229 -0
  64. data/lib/studium/base/colours.rb +246 -0
  65. data/lib/studium/base/commandline_arguments_module/commandline_arguments_module.rb +115 -0
  66. data/lib/studium/base/prototype/prototype.rb +230 -0
  67. data/lib/studium/base/runmode_module/runmode_module.rb +103 -0
  68. data/lib/studium/c/README.md +2 -0
  69. data/lib/studium/c/a.out +0 -0
  70. data/lib/studium/c/obtain_random_entry.c +11 -0
  71. data/lib/studium/check_and_sanitize/README.md +15 -0
  72. data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
  73. data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +118 -0
  74. data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +100 -0
  75. data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +194 -0
  76. data/lib/studium/check_and_sanitize/check_important_exams.rb +132 -0
  77. data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +166 -0
  78. data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +124 -0
  79. data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
  80. data/lib/studium/check_and_sanitize/sanitize_lecture_information.rb +427 -0
  81. data/lib/studium/check_and_sanitize/sanitize_this_string_containing_the_lva_dates.rb +79 -0
  82. data/lib/studium/colours/colours.rb +587 -0
  83. data/lib/studium/colours/sfancy.rb +49 -0
  84. data/lib/studium/colours/sfile.rb +39 -0
  85. data/lib/studium/colours/simp.rb +40 -0
  86. data/lib/studium/colours/use_colours.rb +39 -0
  87. data/lib/studium/colours/use_this_colour_for_exam_questions_and_exam_answers.rb +80 -0
  88. data/lib/studium/commandline/commandline.rb +1839 -0
  89. data/lib/studium/constants/colours.rb +16 -0
  90. data/lib/studium/constants/constants.rb +533 -0
  91. data/lib/studium/constants/curricula_related_constants.rb +504 -0
  92. data/lib/studium/constants/exam_topics.rb +156 -0
  93. data/lib/studium/constants/file_lecture_information.rb +55 -0
  94. data/lib/studium/constants/image_constants.rb +272 -0
  95. data/lib/studium/constants/regexes.rb +58 -0
  96. data/lib/studium/constants/roebe_specific_constants.rb +216 -0
  97. data/lib/studium/constants/standalone_constants.rb +372 -0
  98. data/lib/studium/constants/web_constants.rb +28 -0
  99. data/lib/studium/css/project.css +267 -0
  100. data/lib/studium/curricula/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
  101. data/lib/studium/curricula/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
  102. data/lib/studium/curricula/curricula_from_this_website/curricula_from_this_website.rb +141 -0
  103. data/lib/studium/curricula/curriculum.rb +213 -0
  104. data/lib/studium/curricula/curriculum_as_string.rb +280 -0
  105. data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
  106. data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
  107. data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
  108. data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
  109. data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
  110. data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
  111. data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
  112. data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
  113. data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
  114. data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
  115. data/lib/studium/curricula/determine_curricula/help.rb +39 -0
  116. data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
  117. data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
  118. data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
  119. data/lib/studium/curricula/determine_curricula/report.rb +143 -0
  120. data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
  121. data/lib/studium/curricula/determine_curricula/run.rb +19 -0
  122. data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
  123. data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
  124. data/lib/studium/curricula/handle_curricula/README.md +9 -0
  125. data/lib/studium/curricula/handle_curricula/handle_curricula.rb +100 -0
  126. data/lib/studium/curricula/handle_curricula/misc.rb +798 -0
  127. data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +323 -0
  128. data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
  129. data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +75 -0
  130. data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +75 -0
  131. data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
  132. data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +164 -0
  133. data/lib/studium/curricula/show_all_unfinished_courses_of_this_curriculum/show_all_unfinished_courses_of_this_curriculum.rb +116 -0
  134. data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
  135. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +554 -0
  136. data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
  137. data/lib/studium/curricula/sorted_individual_curricula.rb +121 -0
  138. data/lib/studium/ects/boku_ects_splitter.rb +128 -0
  139. data/lib/studium/ects/ects_per_university/ects_per_university.rb +179 -0
  140. data/lib/studium/ects/ects_scanner.rb +141 -0
  141. data/lib/studium/ects/ects_to_university_parser.rb +142 -0
  142. data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
  143. data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
  144. data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +50 -0
  145. data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
  146. data/lib/studium/ects/return_n_ects_from_this_url.rb +197 -0
  147. data/lib/studium/ects/search_for_n_ects/OLD_search_for_n_ects.rb +0 -0
  148. data/lib/studium/ects/search_for_n_ects/search_for_n_ects.rb +719 -0
  149. data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +232 -0
  150. data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
  151. data/lib/studium/ects/simple_total_ects_points.rb +135 -0
  152. data/lib/studium/ects/solved_ects/constants.rb +19 -0
  153. data/lib/studium/ects/solved_ects/reset.rb +51 -0
  154. data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
  155. data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
  156. data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +106 -0
  157. data/lib/studium/ects/still_missing.rb +129 -0
  158. data/lib/studium/ects/sum_of_ects.rb +144 -0
  159. data/lib/studium/encoding/encoding.rb +109 -0
  160. data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +100 -0
  161. data/lib/studium/exam_topics/abfall_als_ressource +86 -0
  162. data/lib/studium/exam_topics/advanced_biochemistry +927 -0
  163. data/lib/studium/exam_topics/advanced_biotechnology +234 -0
  164. data/lib/studium/exam_topics/advanced_cellbiology +219 -0
  165. data/lib/studium/exam_topics/advanced_chemistry +527 -0
  166. data/lib/studium/exam_topics/advanced_immunology +152 -0
  167. data/lib/studium/exam_topics/advanced_microbiology +44 -0
  168. data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +109 -0
  169. data/lib/studium/exam_topics/advanced_virology +245 -0
  170. data/lib/studium/exam_topics/ageing +153 -0
  171. data/lib/studium/exam_topics/agrar_ecology +67 -0
  172. data/lib/studium/exam_topics/agrarmarkt +73 -0
  173. data/lib/studium/exam_topics/agrarphysik +35 -0
  174. data/lib/studium/exam_topics/alcohols +31 -0
  175. data/lib/studium/exam_topics/algorithms +77 -0
  176. data/lib/studium/exam_topics/allergie +76 -0
  177. data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
  178. data/lib/studium/exam_topics/allgemeine_mikrobiologie +1008 -0
  179. data/lib/studium/exam_topics/aminoacids +464 -0
  180. data/lib/studium/exam_topics/analytische_chemie_1 +133 -0
  181. data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
  182. data/lib/studium/exam_topics/anatomie +295 -0
  183. data/lib/studium/exam_topics/anorganische_chemie +350 -0
  184. data/lib/studium/exam_topics/anthropologie +138 -0
  185. data/lib/studium/exam_topics/antibodies_and_antigens +791 -0
  186. data/lib/studium/exam_topics/apoptosis +35 -0
  187. data/lib/studium/exam_topics/archaea +112 -0
  188. data/lib/studium/exam_topics/archaeo_viruses +7 -0
  189. data/lib/studium/exam_topics/architecture +8 -0
  190. data/lib/studium/exam_topics/artificial_intelligence +89 -0
  191. data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
  192. data/lib/studium/exam_topics/audio +11 -0
  193. data/lib/studium/exam_topics/bacteriophages +266 -0
  194. data/lib/studium/exam_topics/basic_biochemistry +1008 -0
  195. data/lib/studium/exam_topics/basic_biotechnology +1011 -0
  196. data/lib/studium/exam_topics/basic_chemistry +1007 -0
  197. data/lib/studium/exam_topics/basic_virology +1007 -0
  198. data/lib/studium/exam_topics/bauwesen +6 -0
  199. data/lib/studium/exam_topics/betriebssysteme +128 -0
  200. data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
  201. data/lib/studium/exam_topics/bioanalytik_und_biosensoren +391 -0
  202. data/lib/studium/exam_topics/biochips +79 -0
  203. data/lib/studium/exam_topics/bioelektrochemie +57 -0
  204. data/lib/studium/exam_topics/biofilms +54 -0
  205. data/lib/studium/exam_topics/bioinformatics +511 -0
  206. data/lib/studium/exam_topics/biological_therapeutics +156 -0
  207. data/lib/studium/exam_topics/biologie +149 -0
  208. data/lib/studium/exam_topics/biomarkers +137 -0
  209. data/lib/studium/exam_topics/biomaterials +90 -0
  210. data/lib/studium/exam_topics/biomembranes +6 -0
  211. data/lib/studium/exam_topics/bionik +65 -0
  212. data/lib/studium/exam_topics/biophysik +34 -0
  213. data/lib/studium/exam_topics/biopolymers +10 -0
  214. data/lib/studium/exam_topics/bioprozesstechnik +149 -0
  215. data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
  216. data/lib/studium/exam_topics/birds +5 -0
  217. data/lib/studium/exam_topics/bodenkunde +384 -0
  218. data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
  219. data/lib/studium/exam_topics/cancerbiology +484 -0
  220. data/lib/studium/exam_topics/cell_cultures +229 -0
  221. data/lib/studium/exam_topics/cellbiology +1011 -0
  222. data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
  223. data/lib/studium/exam_topics/cellular_vesicles +11 -0
  224. data/lib/studium/exam_topics/cellulose +6 -0
  225. data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +209 -0
  226. data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
  227. data/lib/studium/exam_topics/chemisches_labor +60 -0
  228. data/lib/studium/exam_topics/chemokines_and_cytokines +45 -0
  229. data/lib/studium/exam_topics/chemotaxis_quorum_sensing_and_motility_in_prokaryotes +116 -0
  230. data/lib/studium/exam_topics/citric_acid_cycle +84 -0
  231. data/lib/studium/exam_topics/clinical_microbiology +516 -0
  232. data/lib/studium/exam_topics/computer_science +308 -0
  233. data/lib/studium/exam_topics/computer_vision_and_computer_graphics +13 -0
  234. data/lib/studium/exam_topics/crispr +51 -0
  235. data/lib/studium/exam_topics/cyanobacteria +44 -0
  236. data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +579 -0
  237. data/lib/studium/exam_topics/databases_and_sql +126 -0
  238. data/lib/studium/exam_topics/dna_mutation_and_dna_repair +70 -0
  239. data/lib/studium/exam_topics/dna_replication +67 -0
  240. data/lib/studium/exam_topics/ecogenetics +26 -0
  241. data/lib/studium/exam_topics/ecological_agriculture +12 -0
  242. data/lib/studium/exam_topics/ecology +330 -0
  243. data/lib/studium/exam_topics/economy +218 -0
  244. data/lib/studium/exam_topics/electron_microscopy +7 -0
  245. data/lib/studium/exam_topics/elektronenmikroskopie +356 -0
  246. data/lib/studium/exam_topics/elektrophorese +132 -0
  247. data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +42 -0
  248. data/lib/studium/exam_topics/elisa +55 -0
  249. data/lib/studium/exam_topics/embryologie_und_entwicklung +650 -0
  250. data/lib/studium/exam_topics/endospores_and_spores +104 -0
  251. data/lib/studium/exam_topics/enzymes_and_cofactors +393 -0
  252. data/lib/studium/exam_topics/epigenetik +187 -0
  253. data/lib/studium/exam_topics/erste_hilfe +174 -0
  254. data/lib/studium/exam_topics/ethik +143 -0
  255. data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +367 -0
  256. data/lib/studium/exam_topics/excel +7 -0
  257. data/lib/studium/exam_topics/fish +19 -0
  258. data/lib/studium/exam_topics/fluorescence_microscopy +10 -0
  259. data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +92 -0
  260. data/lib/studium/exam_topics/forensik +11 -0
  261. data/lib/studium/exam_topics/forstwirtschaft +53 -0
  262. data/lib/studium/exam_topics/fortgeschrittene_genetik +643 -0
  263. data/lib/studium/exam_topics/fortgeschrittene_gentechnik +218 -0
  264. data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
  265. data/lib/studium/exam_topics/fungi +119 -0
  266. data/lib/studium/exam_topics/genetische_krankheiten +198 -0
  267. data/lib/studium/exam_topics/genexpression +1008 -0
  268. data/lib/studium/exam_topics/genomics_and_metagenomics +280 -0
  269. data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +954 -0
  270. data/lib/studium/exam_topics/geochemistry +67 -0
  271. data/lib/studium/exam_topics/geography +9 -0
  272. data/lib/studium/exam_topics/geologie_und_mineralogie +624 -0
  273. data/lib/studium/exam_topics/geometrie +56 -0
  274. data/lib/studium/exam_topics/geschichte +95 -0
  275. data/lib/studium/exam_topics/gluconeogenesis +72 -0
  276. data/lib/studium/exam_topics/glycogen +45 -0
  277. data/lib/studium/exam_topics/glycolysis +118 -0
  278. data/lib/studium/exam_topics/glykomik +121 -0
  279. data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
  280. data/lib/studium/exam_topics/grassland_cultivation +32 -0
  281. data/lib/studium/exam_topics/hormone +148 -0
  282. data/lib/studium/exam_topics/html +8 -0
  283. data/lib/studium/exam_topics/human_ecology +8 -0
  284. data/lib/studium/exam_topics/hygiene +224 -0
  285. data/lib/studium/exam_topics/imaging_and_microscopy +267 -0
  286. data/lib/studium/exam_topics/immunanalytik +94 -0
  287. data/lib/studium/exam_topics/immunologie +1011 -0
  288. data/lib/studium/exam_topics/informatik +117 -0
  289. data/lib/studium/exam_topics/innate_immunity +42 -0
  290. data/lib/studium/exam_topics/insekten +64 -0
  291. data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
  292. data/lib/studium/exam_topics/java +618 -0
  293. data/lib/studium/exam_topics/javascript +20 -0
  294. data/lib/studium/exam_topics/klima +6 -0
  295. data/lib/studium/exam_topics/kryptographie +9 -0
  296. data/lib/studium/exam_topics/landtechnik +26 -0
  297. data/lib/studium/exam_topics/lebensmittel_und_getr/303/244nke +223 -0
  298. data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
  299. data/lib/studium/exam_topics/light_microscopy +19 -0
  300. data/lib/studium/exam_topics/linux_and_unix +36 -0
  301. data/lib/studium/exam_topics/lipids +141 -0
  302. data/lib/studium/exam_topics/macroeconomics +39 -0
  303. data/lib/studium/exam_topics/marketing +7 -0
  304. data/lib/studium/exam_topics/mathematics +297 -0
  305. data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +254 -0
  306. data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +437 -0
  307. data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
  308. data/lib/studium/exam_topics/metabolismus +478 -0
  309. data/lib/studium/exam_topics/meteorologie_und_atmosph/303/244re +120 -0
  310. data/lib/studium/exam_topics/microbial_ecology +36 -0
  311. data/lib/studium/exam_topics/microcontrollers +11 -0
  312. data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +54 -0
  313. data/lib/studium/exam_topics/mikrobielle_physiologie +285 -0
  314. data/lib/studium/exam_topics/mitochondria +40 -0
  315. data/lib/studium/exam_topics/mixed +287 -0
  316. data/lib/studium/exam_topics/molecular_biology_of_plants +272 -0
  317. data/lib/studium/exam_topics/molekulare_medizin +133 -0
  318. data/lib/studium/exam_topics/nanotechnologie +453 -0
  319. data/lib/studium/exam_topics/nature_conservation_and_biodiversity +244 -0
  320. data/lib/studium/exam_topics/naturstoffe +9 -0
  321. data/lib/studium/exam_topics/netzwerke +63 -0
  322. data/lib/studium/exam_topics/neurobiology +307 -0
  323. data/lib/studium/exam_topics/nucleotide_sequencing +41 -0
  324. data/lib/studium/exam_topics/nutztierethologie +11 -0
  325. data/lib/studium/exam_topics/object_oriented_modeling +14 -0
  326. data/lib/studium/exam_topics/obstbau +249 -0
  327. data/lib/studium/exam_topics/organische_chemie +1007 -0
  328. data/lib/studium/exam_topics/organische_chemie_2 +136 -0
  329. data/lib/studium/exam_topics/paleobiology +39 -0
  330. data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +336 -0
  331. data/lib/studium/exam_topics/patent_law +55 -0
  332. data/lib/studium/exam_topics/pathologie +731 -0
  333. data/lib/studium/exam_topics/pcr +155 -0
  334. data/lib/studium/exam_topics/pentosephosphatweg +61 -0
  335. data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +66 -0
  336. data/lib/studium/exam_topics/pflanzenanatomie +261 -0
  337. data/lib/studium/exam_topics/pflanzenbau +24 -0
  338. data/lib/studium/exam_topics/pflanzenschutz +35 -0
  339. data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
  340. data/lib/studium/exam_topics/pharmaceutical_biotechnology +251 -0
  341. data/lib/studium/exam_topics/physik +446 -1
  342. data/lib/studium/exam_topics/physikalische_chemie +79 -0
  343. data/lib/studium/exam_topics/physiology_and_histology +536 -0
  344. data/lib/studium/exam_topics/phytochemie +33 -0
  345. data/lib/studium/exam_topics/plant_biotechnology +131 -0
  346. data/lib/studium/exam_topics/plant_breeding +64 -0
  347. data/lib/studium/exam_topics/plant_development +50 -0
  348. data/lib/studium/exam_topics/populationsgenetik +138 -0
  349. data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +197 -0
  350. data/lib/studium/exam_topics/projektmanagement +220 -0
  351. data/lib/studium/exam_topics/prokaryote_genetics +562 -0
  352. data/lib/studium/exam_topics/protein_engineering +35 -0
  353. data/lib/studium/exam_topics/proteolyse +38 -0
  354. data/lib/studium/exam_topics/proteomik +41 -0
  355. data/lib/studium/exam_topics/protozoans +24 -0
  356. data/lib/studium/exam_topics/prozesstechnik +95 -0
  357. data/lib/studium/exam_topics/psychologie +18 -0
  358. data/lib/studium/exam_topics/python +372 -0
  359. data/lib/studium/exam_topics/quality_management +266 -0
  360. data/lib/studium/exam_topics/rechtsgrundlagen +123 -0
  361. data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
  362. data/lib/studium/exam_topics/rna_and_dna +519 -0
  363. data/lib/studium/exam_topics/rna_seq +13 -0
  364. data/lib/studium/exam_topics/robotics +12 -0
  365. data/lib/studium/exam_topics/ruby +238 -0
  366. data/lib/studium/exam_topics/ruby_on_rails +63 -0
  367. data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
  368. data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
  369. data/lib/studium/exam_topics/sexualbiologie +183 -0
  370. data/lib/studium/exam_topics/signal_transduction_and_laser_systems +212 -0
  371. data/lib/studium/exam_topics/sozialbiologie +9 -0
  372. data/lib/studium/exam_topics/splicing_exons_and_introns +65 -0
  373. data/lib/studium/exam_topics/statistik +268 -0
  374. data/lib/studium/exam_topics/stemcells +181 -0
  375. data/lib/studium/exam_topics/stickstofffixierung +91 -0
  376. data/lib/studium/exam_topics/structural_bioinformatics +54 -0
  377. data/lib/studium/exam_topics/strukturbiologie +423 -0
  378. data/lib/studium/exam_topics/system_biology_and_synthetic_biology +108 -0
  379. data/lib/studium/exam_topics/systematische_zoologie +439 -0
  380. data/lib/studium/exam_topics/technical_ecology +144 -0
  381. data/lib/studium/exam_topics/technische_chemie +208 -0
  382. data/lib/studium/exam_topics/technische_grundlagen_der_informatik +39 -0
  383. data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
  384. data/lib/studium/exam_topics/technisches_zeichnen +5 -0
  385. data/lib/studium/exam_topics/the_bacterial_cell_wall +98 -0
  386. data/lib/studium/exam_topics/the_c_plus_plus_programming_language +531 -0
  387. data/lib/studium/exam_topics/the_c_programming_language +133 -0
  388. data/lib/studium/exam_topics/the_cellcycle +98 -0
  389. data/lib/studium/exam_topics/the_european_union +121 -0
  390. data/lib/studium/exam_topics/the_interferon_system +39 -0
  391. data/lib/studium/exam_topics/the_microbiome +164 -0
  392. data/lib/studium/exam_topics/the_universe +31 -0
  393. data/lib/studium/exam_topics/theoretische_chemie +5 -0
  394. data/lib/studium/exam_topics/theoretische_informatik +161 -0
  395. data/lib/studium/exam_topics/thermodynamics +21 -0
  396. data/lib/studium/exam_topics/tierzucht +139 -0
  397. data/lib/studium/exam_topics/toxikologie +453 -0
  398. data/lib/studium/exam_topics/transcription +185 -0
  399. data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +154 -0
  400. data/lib/studium/exam_topics/umweltbiotechnologie +64 -0
  401. data/lib/studium/exam_topics/umweltchemie +233 -0
  402. data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
  403. data/lib/studium/exam_topics/urea_cycle +56 -0
  404. data/lib/studium/exam_topics/vaccines_and_vaccination +250 -0
  405. data/lib/studium/exam_topics/vectors_and_gene_therapy +247 -0
  406. data/lib/studium/exam_topics/verfahrenstechnik +37 -0
  407. data/lib/studium/exam_topics/verhaltensbiologie +56 -0
  408. data/lib/studium/exam_topics/veterinary_medicine +10 -0
  409. data/lib/studium/exam_topics/vitamine +32 -0
  410. data/lib/studium/exam_topics/wasserkunde +138 -0
  411. data/lib/studium/exam_topics/weinbau +86 -0
  412. data/lib/studium/exam_topics/wissenschaft +20 -0
  413. data/lib/studium/exam_topics/yeast +104 -0
  414. data/lib/studium/exam_topics/zoologie +334 -0
  415. data/lib/studium/exams/afterburn/afterburn.rb +304 -0
  416. data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
  417. data/lib/studium/exams/ask_exam_question/ask_exam_question.rb +2757 -0
  418. data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
  419. data/lib/studium/exams/ask_question_from_alias.rb +141 -0
  420. data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +130 -0
  421. data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
  422. data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
  423. data/lib/studium/exams/ask_random_question.rb +195 -0
  424. data/lib/studium/exams/autoinclude.rb +7 -0
  425. data/lib/studium/exams/average_grade/average_grade.rb +402 -0
  426. data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
  427. data/lib/studium/exams/cycle.rb +291 -0
  428. data/lib/studium/exams/dataset/dataset.rb +128 -0
  429. data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
  430. data/lib/studium/exams/exam/exam.rb +130 -0
  431. data/lib/studium/exams/exam_bubble/exam_bubble.rb +445 -0
  432. data/lib/studium/exams/exam_bubble/menu_for_the_main_loop.rb +111 -0
  433. data/lib/studium/exams/exam_question/README.md +3 -0
  434. data/lib/studium/exams/exam_question/exam_question.rb +427 -0
  435. data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
  436. data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
  437. data/lib/studium/exams/exam_registration_at/help.rb +46 -0
  438. data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
  439. data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
  440. data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
  441. data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
  442. data/lib/studium/exams/exam_topics.rb +194 -0
  443. data/lib/studium/exams/exams.rb +20 -0
  444. data/lib/studium/exams/exams_per_month/exams_per_month.rb +2429 -0
  445. data/lib/studium/exams/exams_this_week.rb +182 -0
  446. data/lib/studium/exams/fix_exam_dates.rb +121 -0
  447. data/lib/studium/exams/frozen.rb +36 -0
  448. data/lib/studium/exams/last_exams/last_exams.rb +398 -0
  449. data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
  450. data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1359 -0
  451. data/lib/studium/exams/move_all_unsolved_exam_questions_to_the_top_of_the_file.rb +173 -0
  452. 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
  453. data/lib/studium/exams/n_exams_in_these_topics.rb +477 -0
  454. data/lib/studium/exams/next_exam.rb +107 -0
  455. data/lib/studium/exams/next_exams.rb +378 -0
  456. data/lib/studium/exams/open_exam_associated_url/open_exam_associated_url.rb +154 -0
  457. data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
  458. data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
  459. data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +110 -0
  460. data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
  461. data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +374 -0
  462. data/lib/studium/exams/remote_ftp_url.rb +52 -0
  463. data/lib/studium/exams/repeat_last_question.rb +78 -0
  464. data/lib/studium/exams/report_total_amount_of_questions_and_answers_for.rb +116 -0
  465. data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
  466. data/lib/studium/exams/show_backlog_of_exams/show_backlog_of_exams.rb +116 -0
  467. data/lib/studium/exams/show_next_exams_for.rb +133 -0
  468. data/lib/studium/exams/show_themes/constants.rb +28 -0
  469. data/lib/studium/exams/show_themes/menu.rb +61 -0
  470. data/lib/studium/exams/show_themes/misc.rb +537 -0
  471. data/lib/studium/exams/show_themes/reset.rb +62 -0
  472. data/lib/studium/exams/show_themes/show_themes.rb +27 -0
  473. data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +1375 -0
  474. data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
  475. data/lib/studium/exams/solved/constants.rb +32 -0
  476. data/lib/studium/exams/solved/help.rb +24 -0
  477. data/lib/studium/exams/solved/initialize.rb +55 -0
  478. data/lib/studium/exams/solved/menu.rb +41 -0
  479. data/lib/studium/exams/solved/reset.rb +28 -0
  480. data/lib/studium/exams/solved/solved.rb +326 -0
  481. data/lib/studium/exams/timetable/constants.rb +142 -0
  482. data/lib/studium/exams/timetable/timetable.rb +450 -0
  483. data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +163 -0
  484. data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +556 -0
  485. data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
  486. data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
  487. data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
  488. data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
  489. data/lib/studium/exams/upcoming_registered_exams/upcoming_registered_exams.rb +257 -0
  490. data/lib/studium/exams/upload_exam_topics.rb +360 -0
  491. data/lib/studium/graphviz/README.md +4 -0
  492. data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
  493. data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
  494. data/lib/studium/gui/gtk3/README.md +1 -0
  495. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.config +6 -0
  496. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.rb +760 -0
  497. data/lib/studium/gui/gtk3/ask_exam_question/manifest.yml +12 -0
  498. data/lib/studium/gui/gtk3/control_panel/control_panel.rb +39 -0
  499. data/lib/studium/gui/gtk3/curriculum_viewer/curriculum_viewer.rb +513 -0
  500. data/lib/studium/gui/gtk3/ects_per_university/ects_per_university.rb +217 -0
  501. data/lib/studium/gui/gtk3/exam_question_widget/exam_question_widget.rb +1889 -0
  502. data/lib/studium/gui/gtk3/expand_time_range/expand_time_range.rb +34 -0
  503. data/lib/studium/gui/gtk3/information_about_a_lecture/information_about_a_lecture.rb +34 -0
  504. data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +200 -0
  505. data/lib/studium/gui/gtk3/show_upcoming_exams/show_upcoming_exams.rb +34 -0
  506. data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
  507. data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
  508. data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
  509. data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
  510. data/lib/studium/gui/jruby/exam_question_widget/exam_question_widget.rb +317 -0
  511. data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +349 -0
  512. data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +314 -0
  513. data/lib/studium/gui/shared_code/exam_question_widget/exam_question_widget_module.rb +39 -0
  514. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range.css +0 -0
  515. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range_module.rb +190 -0
  516. data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +180 -0
  517. data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +206 -0
  518. data/lib/studium/images/libui_ask_exam_question.png +0 -0
  519. data/lib/studium/images/outdated.png +0 -0
  520. data/lib/studium/images/small_logos/DNA.png +0 -0
  521. data/lib/studium/images/small_logos/README.md +2 -0
  522. data/lib/studium/images/small_logos/solved.png +0 -0
  523. data/lib/studium/images/studies_favicon.png +0 -0
  524. data/lib/studium/java/README.md +5 -0
  525. data/lib/studium/java/studium/AskExamQuestion.java +461 -0
  526. data/lib/studium/java/studium/Base.java +123 -0
  527. data/lib/studium/java/studium/Constants.java +122 -0
  528. data/lib/studium/java/studium/EnsureThatTheLogDirectoryExists.java +57 -0
  529. data/lib/studium/java/studium/Mkdir.java +13 -0
  530. data/lib/studium/java/studium/OpenLastExamQuestionurlLinkViaTheBrowser.java +90 -0
  531. data/lib/studium/java/studium/ReturnNQuestionsSolvedInTotal.java +69 -0
  532. data/lib/studium/java/studium/Solved.java +112 -0
  533. data/lib/studium/java/studium/Test.java +60 -0
  534. data/lib/studium/java/studium/studium/AskExamQuestion.class +0 -0
  535. data/lib/studium/java/studium/studium/Base.class +0 -0
  536. data/lib/studium/java/studium/studium/Constants.class +0 -0
  537. data/lib/studium/java/studium/studium/EnsureThatTheLogDirectoryExists.class +0 -0
  538. data/lib/studium/java/studium/studium/Mkdir.class +0 -0
  539. data/lib/studium/java/studium/studium/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
  540. data/lib/studium/java/studium/studium/ReturnNQuestionsSolvedInTotal.class +0 -0
  541. data/lib/studium/java/studium/studium/Solved.class +0 -0
  542. data/lib/studium/java/studium/studium/Test.class +0 -0
  543. data/lib/studium/jobs/jobs.rb +80 -0
  544. data/lib/studium/logging/README.md +2 -0
  545. data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +58 -0
  546. data/lib/studium/logging/html_log_directory.rb +42 -0
  547. data/lib/studium/logging/log_directory.rb +112 -0
  548. data/lib/studium/logging/store_last_question_asked_into_file.rb +137 -0
  549. data/lib/studium/parsers/README.md +2 -0
  550. data/lib/studium/parsers/custom_exam_results_parser.rb +209 -0
  551. data/lib/studium/parsers/parse_lva_dates.rb +233 -0
  552. data/lib/studium/parsers/parse_remote_lecture.rb +331 -0
  553. data/lib/studium/project/project.rb +88 -0
  554. data/lib/studium/requires/common_popular_requires.rb +37 -0
  555. data/lib/studium/requires/commonly_used_requires.rb +14 -0
  556. data/lib/studium/requires/require_class_exams_solved.rb +7 -0
  557. data/lib/studium/requires/require_ects_scripts.rb +27 -0
  558. data/lib/studium/requires/require_encoding.rb +7 -0
  559. data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
  560. data/lib/studium/requires/require_the_curricula_files.rb +28 -0
  561. data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
  562. data/lib/studium/requires/require_the_exams_files.rb +46 -0
  563. data/lib/studium/requires/require_the_logging_files.rb +23 -0
  564. data/lib/studium/requires/require_the_parsers.rb +28 -0
  565. data/lib/studium/requires/require_the_studium_constants.rb +10 -0
  566. data/lib/studium/requires/require_the_studium_project.rb +70 -0
  567. data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
  568. data/lib/studium/requires/require_the_utility_scripts.rb +34 -0
  569. data/lib/studium/requires/require_upcoming_exams.rb +7 -0
  570. data/lib/studium/requires/require_yaml.rb +7 -0
  571. data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
  572. data/lib/studium/requires/with_GUI.rb +13 -0
  573. data/lib/studium/requires/www_mode.rb +17 -0
  574. data/lib/studium/statistics/README.md +4 -0
  575. data/lib/studium/statistics/best_exam_months.rb +92 -0
  576. data/lib/studium/statistics/curriculum_comparer/curriculum_comparer.rb +386 -0
  577. data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
  578. data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +119 -0
  579. data/lib/studium/statistics/max_stats.rb +170 -0
  580. data/lib/studium/statistics/new_questions_per_year.rb +147 -0
  581. data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
  582. data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +474 -0
  583. data/lib/studium/statistics/show_exam_statistics.rb +66 -0
  584. data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
  585. data/lib/studium/statistics/top_stats.rb +127 -0
  586. data/lib/studium/toplevel_methods/all_passed_exams.rb +37 -0
  587. data/lib/studium/toplevel_methods/already_solved_this_lecture.rb +101 -0
  588. data/lib/studium/toplevel_methods/available_topics.rb +161 -0
  589. data/lib/studium/toplevel_methods/calculate_pr/303/274fungsimmanente_lectures_from_this_file.rb +55 -0
  590. data/lib/studium/toplevel_methods/copy_the_last_backup_of_file_lecture_information.rb +34 -0
  591. data/lib/studium/toplevel_methods/curriculum_related_code.rb +1038 -0
  592. data/lib/studium/toplevel_methods/does_this_course_require_mandatory_presence.rb +52 -0
  593. data/lib/studium/toplevel_methods/download.rb +161 -0
  594. data/lib/studium/toplevel_methods/e.rb +16 -0
  595. data/lib/studium/toplevel_methods/ects_from_lectures.rb +250 -0
  596. data/lib/studium/toplevel_methods/editor.rb +67 -0
  597. data/lib/studium/toplevel_methods/esystem.rb +29 -0
  598. data/lib/studium/toplevel_methods/filter_away_invalid_questions.rb +77 -0
  599. data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3807 -0
  600. data/lib/studium/toplevel_methods/has_this_lecture_been_already_passed_but_the_id_was_changed_lateron.rb +42 -0
  601. data/lib/studium/toplevel_methods/has_this_module_been_completed.rb +208 -0
  602. data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +32 -0
  603. data/lib/studium/toplevel_methods/is_on_roebe.rb +27 -0
  604. data/lib/studium/toplevel_methods/is_this_exam_topic_included.rb +46 -0
  605. data/lib/studium/toplevel_methods/is_this_homepage_registered.rb +32 -0
  606. data/lib/studium/toplevel_methods/is_this_lecture_a_practical_course.rb +93 -0
  607. data/lib/studium/toplevel_methods/is_this_lecture_registered_in_upcoming_exams.rb +45 -0
  608. data/lib/studium/toplevel_methods/java.rb +32 -0
  609. data/lib/studium/toplevel_methods/lecture_information.rb +108 -0
  610. data/lib/studium/toplevel_methods/lva_numbers.rb +358 -0
  611. data/lib/studium/toplevel_methods/main_dataset.rb +73 -0
  612. data/lib/studium/toplevel_methods/map_input_to_this_curriculum_filename.rb +607 -0
  613. data/lib/studium/toplevel_methods/methods_related_to_files_and_directories.rb +481 -0
  614. data/lib/studium/toplevel_methods/misc.rb +580 -0
  615. data/lib/studium/toplevel_methods/n_questions_available.rb +141 -0
  616. data/lib/studium/toplevel_methods/n_topics_available.rb +63 -0
  617. data/lib/studium/toplevel_methods/names_of_all_solved_exams.rb +77 -0
  618. data/lib/studium/toplevel_methods/note_down_the_start_time_and_how_many_exams_have_been_already_solved.rb +69 -0
  619. data/lib/studium/toplevel_methods/opnn.rb +27 -0
  620. data/lib/studium/toplevel_methods/passed_this_exam_on.rb +105 -0
  621. data/lib/studium/toplevel_methods/read_delay_between_questions_from_file.rb +36 -0
  622. data/lib/studium/toplevel_methods/regexes.rb +90 -0
  623. data/lib/studium/toplevel_methods/registered_for_this_exam.rb +83 -0
  624. data/lib/studium/toplevel_methods/remove_comments.rb +27 -0
  625. data/lib/studium/toplevel_methods/remove_exam_topics_that_were_already_answered.rb +27 -0
  626. data/lib/studium/toplevel_methods/remove_tags.rb +35 -0
  627. data/lib/studium/toplevel_methods/report.rb +439 -0
  628. data/lib/studium/toplevel_methods/return_all_exams_on_this_day.rb +69 -0
  629. data/lib/studium/toplevel_methods/return_dataset_for_this_exam_topic.rb +45 -0
  630. data/lib/studium/toplevel_methods/return_ects_from_this_lecture_stored_in_the_file_lecture_information.rb +194 -0
  631. data/lib/studium/toplevel_methods/return_hash_of_already_solved_lectures.rb +46 -0
  632. data/lib/studium/toplevel_methods/return_last_exam_question.rb +34 -0
  633. data/lib/studium/toplevel_methods/return_lva_number_of_this_lecture.rb +72 -0
  634. data/lib/studium/toplevel_methods/return_n_percent_solved_from_this_topic.rb +90 -0
  635. data/lib/studium/toplevel_methods/return_n_questions_were_answered_for_this_topic.rb +62 -0
  636. data/lib/studium/toplevel_methods/return_proper_university_image.rb +86 -0
  637. data/lib/studium/toplevel_methods/return_question_answer_string_from_this_topic.rb +63 -0
  638. data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +11311 -0
  639. data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +2405 -0
  640. data/lib/studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb +110 -0
  641. data/lib/studium/toplevel_methods/return_theme_of_the_next_upcoming_exam.rb +40 -0
  642. data/lib/studium/toplevel_methods/runmode.rb +97 -0
  643. data/lib/studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb +53 -0
  644. data/lib/studium/toplevel_methods/set_last_file_for_exam_questions.rb +64 -0
  645. data/lib/studium/toplevel_methods/set_this_cd_alias_to.rb +92 -0
  646. data/lib/studium/toplevel_methods/spacer.rb +18 -0
  647. data/lib/studium/toplevel_methods/time.rb +297 -0
  648. data/lib/studium/toplevel_methods/total_ects_points_passed.rb +73 -0
  649. data/lib/studium/toplevel_methods/try_to_guess_the_most_likely_lva_id.rb +58 -0
  650. data/lib/studium/toplevel_methods/try_to_return_the_expanded_name_of_this_lecture.rb +64 -0
  651. data/lib/studium/toplevel_methods/unfinished.rb +51 -0
  652. data/lib/studium/toplevel_methods/url.rb +106 -0
  653. data/lib/studium/toplevel_methods/verbose_truth.rb +36 -0
  654. data/lib/studium/toplevel_methods/when_was_this_lecture_passed.rb +54 -0
  655. data/lib/studium/toplevel_methods/word_wrap.rb +56 -0
  656. data/lib/studium/toplevel_methods/write_into_file_related_functionality.rb +197 -0
  657. data/lib/studium/toplevel_methods/yes_or_no_ja_oder_nein.rb +33 -0
  658. data/lib/studium/universities_in_austria/README.md +2 -0
  659. data/lib/studium/universities_in_austria/boku/README.md +4 -0
  660. data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
  661. data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
  662. data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
  663. data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
  664. data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
  665. data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
  666. data/lib/studium/university_course/university_course.rb +409 -0
  667. data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
  668. data/lib/studium/utility_scripts/audio_stats.rb +171 -0
  669. data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
  670. data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
  671. data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
  672. data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
  673. data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +93 -0
  674. data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +155 -0
  675. data/lib/studium/utility_scripts/blocked_courses.rb +146 -0
  676. data/lib/studium/utility_scripts/calendar/README.md +2 -0
  677. data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
  678. data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
  679. data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
  680. data/lib/studium/utility_scripts/course_registrations/course_registrations.rb +98 -0
  681. data/lib/studium/utility_scripts/courses/courses.rb +177 -0
  682. data/lib/studium/utility_scripts/create/README.md +2 -0
  683. data/lib/studium/utility_scripts/create/webpage_of_university.rb +129 -0
  684. data/lib/studium/utility_scripts/create/webpage_of_university_BOKU.rb +61 -0
  685. data/lib/studium/utility_scripts/create/webpage_of_university_TU.rb +60 -0
  686. data/lib/studium/utility_scripts/create/webpage_of_university_UniWien.rb +60 -0
  687. data/lib/studium/utility_scripts/create_database/create_database.rb +106 -0
  688. data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
  689. data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
  690. data/lib/studium/utility_scripts/display_lecture_url/display_lecture_url.rb +176 -0
  691. data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +521 -0
  692. data/lib/studium/utility_scripts/finished_exams_at_this_university/finished_exams_at_this_university.rb +173 -0
  693. data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
  694. data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
  695. data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
  696. data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
  697. data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
  698. data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
  699. data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
  700. data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
  701. data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +354 -0
  702. data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
  703. data/lib/studium/utility_scripts/holidays/holidays.rb +156 -0
  704. data/lib/studium/utility_scripts/homepage_of_these_courses/homepage_of_these_courses.rb +125 -0
  705. data/lib/studium/utility_scripts/lectures_attributed_to_universities/lectures_attributed_to_universities.rb +336 -0
  706. data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
  707. data/lib/studium/utility_scripts/lva_nummer/lva_nummer.rb +431 -0
  708. data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
  709. data/lib/studium/utility_scripts/moodle/moodle.rb +213 -0
  710. data/lib/studium/utility_scripts/name_of_this_lva_id/name_of_this_lva_id.rb +110 -0
  711. data/lib/studium/utility_scripts/new_stud.rb +324 -0
  712. data/lib/studium/utility_scripts/next_week/next_week.rb +103 -0
  713. data/lib/studium/utility_scripts/not_yet_registered/not_yet_registered.rb +120 -0
  714. data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
  715. data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +313 -0
  716. data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
  717. data/lib/studium/utility_scripts/pdf/README.md +2 -0
  718. data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +355 -0
  719. data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
  720. data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +317 -0
  721. data/lib/studium/utility_scripts/priority/priority.rb +164 -0
  722. data/lib/studium/utility_scripts/priority_points/priority_points.rb +263 -0
  723. data/lib/studium/utility_scripts/publish_my_exams/publish_my_exams.rb +174 -0
  724. data/lib/studium/utility_scripts/regexes/README.md +1 -0
  725. data/lib/studium/utility_scripts/regexes/generate_regex.rb +314 -0
  726. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
  727. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
  728. data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
  729. data/lib/studium/utility_scripts/report_whether_this_lecture_is_registered_in_the_file_lecture_information/report_whether_this_lecture_is_registered_in_the_file_lecture_information.rb +128 -0
  730. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
  731. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
  732. data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
  733. data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
  734. data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +374 -0
  735. data/lib/studium/utility_scripts/semesterplaner/semesterplaner.rb +311 -0
  736. data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +97 -0
  737. data/lib/studium/utility_scripts/show_all_passed_master_lectures/show_all_passed_master_lectures.rb +126 -0
  738. data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1385 -0
  739. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
  740. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
  741. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
  742. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
  743. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
  744. data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
  745. data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +910 -0
  746. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
  747. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
  748. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +3167 -0
  749. data/lib/studium/utility_scripts/show_lectures_on_this_day/show_lectures_on_this_day.rb +150 -0
  750. data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture/show_lva_dates_of_this_lecture.rb +182 -0
  751. data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +92 -0
  752. data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +214 -0
  753. data/lib/studium/utility_scripts/show_passed_exams_having_this_grade/show_passed_exams_having_this_grade.rb +91 -0
  754. data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
  755. data/lib/studium/utility_scripts/steop/README.md +4 -0
  756. data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
  757. data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
  758. data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
  759. data/lib/studium/utility_scripts/studienkennzahl/studienkennzahl.rb +116 -0
  760. data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +242 -0
  761. data/lib/studium/utility_scripts/stundenplan.rb +600 -0
  762. data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
  763. data/lib/studium/utility_scripts/ufind/ufind.rb +106 -0
  764. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
  765. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
  766. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +187 -0
  767. data/lib/studium/utility_scripts/video_lecture_downloader/video_lecture_downloader.rb +107 -0
  768. data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
  769. data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
  770. data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
  771. data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
  772. data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
  773. data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
  774. data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
  775. data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
  776. data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
  777. data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
  778. data/lib/studium/utility_scripts/wochenplanung/wochenplanung.rb +267 -0
  779. data/lib/studium/version/version.rb +46 -0
  780. data/lib/studium/www/exams/exams.cgi +54 -0
  781. data/lib/studium/www/fast_ask_exam_question/fast_ask_exam_question.cgi +156 -0
  782. data/lib/studium/www/handle_curricula/handle_curricula.cgi +154 -0
  783. data/lib/studium/www/next_generation_exam_question_trainer/next_generation_exam_question_trainer.cgi +112 -0
  784. data/lib/studium/www/next_generation_exam_question_trainer/solved.cgi +26 -0
  785. data/lib/studium/www/sinatra/app.rb +231 -0
  786. data/lib/studium/www/sinatra/curriculum_displayer/curriculum_displayer.rb +162 -0
  787. data/lib/studium/www/sinatra/misc.rb +115 -0
  788. data/lib/studium/www/statistics/statistics.cgi +82 -0
  789. data/lib/studium/www/upcoming_exams/upcoming_exams.cgi +36 -0
  790. data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
  791. data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +22 -0
  792. data/lib/studium/yaml/allowed_themes_for_courses/allowed_themes_for_courses.yml +348 -0
  793. data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information/array_allowed_entries_for_the_file_lecture_information.yml +71 -0
  794. data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
  795. data/lib/studium/yaml/backlog_of_exams.yml +37 -0
  796. data/lib/studium/yaml/colours/custom_colours.yml +50 -0
  797. data/lib/studium/yaml/colours/use_colours.yml +1 -0
  798. data/lib/studium/yaml/current_exams.yml +30 -0
  799. data/lib/studium/yaml/curricula/README.md +39 -0
  800. data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +147 -0
  801. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +71 -0
  802. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +100 -0
  803. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
  804. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +122 -0
  805. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +106 -0
  806. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
  807. data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
  808. data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +182 -0
  809. data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
  810. data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
  811. data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +136 -0
  812. data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
  813. data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +121 -0
  814. data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +283 -0
  815. data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
  816. data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
  817. data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
  818. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +131 -0
  819. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
  820. data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +142 -0
  821. data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
  822. data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
  823. data/lib/studium/yaml/curricula/experimental/bachelor_informatik_in_den_lebenswissenschaften.yml +137 -0
  824. data/lib/studium/yaml/curricula/individual/bachelor_formale_logik.yml +88 -0
  825. data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
  826. data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
  827. data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
  828. data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
  829. data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +75 -0
  830. data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
  831. data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +66 -0
  832. data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
  833. data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
  834. data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +112 -0
  835. data/lib/studium/yaml/curricula/master/master_molecular_biology_066865.yml +72 -0
  836. data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +151 -0
  837. data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +176 -0
  838. data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
  839. data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
  840. data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
  841. data/lib/studium/yaml/curricula.yml +562 -0
  842. data/lib/studium/yaml/daily_questions_solved/daily_questions_solved.yml +1849 -0
  843. data/lib/studium/yaml/default_delay.yml +4 -0
  844. data/lib/studium/yaml/default_encoding.yml +1 -0
  845. data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
  846. data/lib/studium/yaml/editor.yml +1 -0
  847. data/lib/studium/yaml/exams/next_exams_to_do.md +9 -0
  848. data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
  849. data/lib/studium/yaml/german/README.md +2 -0
  850. data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
  851. data/lib/studium/yaml/grouped_themes/grouped_themes.yml +258 -0
  852. data/lib/studium/yaml/holidays/holidays.yml +201 -0
  853. data/lib/studium/yaml/important_exams.yml +274 -0
  854. data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
  855. data/lib/studium/yaml/lecture_aliases.yml +138 -0
  856. data/lib/studium/yaml/lecture_information/lecture_information.yml +63818 -0
  857. data/lib/studium/yaml/log_dir.yml +1 -0
  858. data/lib/studium/yaml/main_topic/main_topic.yml +11 -0
  859. data/lib/studium/yaml/max_stats.yml +256 -0
  860. data/lib/studium/yaml/meta_themes +1 -0
  861. data/lib/studium/yaml/mitbelegung/README.md +4 -0
  862. data/lib/studium/yaml/mitbelegung/mitbelegung.yml +21 -0
  863. data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
  864. data/lib/studium/yaml/n_total_questions.yml +1 -0
  865. data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
  866. data/lib/studium/yaml/semester_planner/README.md +4 -0
  867. data/lib/studium/yaml/semester_planner/semester_planner.yml +189 -0
  868. data/lib/studium/yaml/show_topic.yml +1 -0
  869. data/lib/studium/yaml/statistics/lecture_information.yml +1 -0
  870. data/lib/studium/yaml/statistics/max_stats.yml +239 -0
  871. data/lib/studium/yaml/statistics/statistics.yml +77 -0
  872. data/lib/studium/yaml/week/01_monday.yml +25 -0
  873. data/lib/studium/yaml/week/02_tuesday.yml +68 -0
  874. data/lib/studium/yaml/week/03_wednesday.yml +63 -0
  875. data/lib/studium/yaml/week/04_thursday.yml +20 -0
  876. data/lib/studium/yaml/week/05_friday.yml +31 -0
  877. data/lib/studium/yaml/week/06_saturday.yml +16 -0
  878. data/lib/studium/yaml/week/07_sunday.yml +0 -0
  879. data/lib/studium/yaml/week/README.md +10 -0
  880. data/lib/studium.rb +5 -0
  881. data/studium.gemspec +82 -0
  882. data/test/testing_colourized_question_and_answer.rb +18 -0
  883. data/test/testing_studium.rb +244 -0
  884. data/test/testing_studium_base_class.rb +31 -0
  885. data/test/testing_the_file_lecture_information.rb +18 -0
  886. data/test/testing_time_component.rb +29 -0
  887. metadata +1101 -0
@@ -0,0 +1,1038 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'studium/toplevel_methods/curriculum_related_code.rb'
6
+ # =========================================================================== #
7
+ module Studium
8
+
9
+ require 'studium/requires/require_encoding.rb'
10
+ require 'studium/constants/constants.rb'
11
+ require 'studium/colours/colours.rb'
12
+ require 'studium/toplevel_methods/e.rb'
13
+ require 'studium/toplevel_methods/main_dataset.rb'
14
+ require 'studium/toplevel_methods/map_input_to_this_curriculum_filename.rb'
15
+ require 'studium/toplevel_methods/methods_related_to_files_and_directories.rb'
16
+ require 'studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb'
17
+
18
+ # ========================================================================= #
19
+ # === Studium.map_partial_input_to_full_curriculum_name
20
+ #
21
+ # Note that this method will, if more than one match is found, always
22
+ # return the very first entry of an Array.
23
+ #
24
+ # Usage example:
25
+ #
26
+ # Studium.map_partial_input_to_full_curriculum_name('master_biotech') # => "Mastercurriculum Biotechnology"
27
+ # Studium.map_partial_input_to_full_curriculum_name(:bachelor_agrarwissenschaften) # => "Bachelorcurriculum Agrarwissenschaften"
28
+ # Studium.map_partial_input_to_full_curriculum_name('mbiotech') # => "Bachelorcurriculum Agrarwissenschaften"
29
+ #
30
+ # ========================================================================= #
31
+ def self.map_partial_input_to_full_curriculum_name(
32
+ i = 'master_biotech'
33
+ )
34
+ # ======================================================================= #
35
+ # First, load all registered curricula entries:
36
+ # ======================================================================= #
37
+ _ = YAML.load_file(Studium.file_curricula)
38
+ i = i.dup if i.is_a? Array
39
+ copy = i.to_s.dup
40
+ if File.exist? i
41
+ i = Studium.from_filename_to_curriculum_name(i)
42
+ else
43
+ unless i =~ /^\d+$/ # Unless only numbers
44
+ try_to_find_a_local_file = Studium.return_file_for_this_curriculum(i)
45
+ if try_to_find_a_local_file.is_a? Array
46
+ try_to_find_a_local_file = try_to_find_a_local_file.last
47
+ end
48
+ if File.exist? try_to_find_a_local_file
49
+ return Studium.from_filename_to_curriculum_name(try_to_find_a_local_file)
50
+ end
51
+ end
52
+ end
53
+ inverted_dataset = _.invert.map {|key, value|
54
+ key.first # The first entry is e. g. "Bachelorcurriculum Geodäsie und Geoinformation".
55
+ }
56
+ if copy.include? 'master_'
57
+ copy.sub!(/master_/,'Mastercurriculum ')
58
+ elsif copy.include? 'bachelor_'
59
+ copy.sub!(/bachelor_/,'Bachelorcurriculum ')
60
+ end
61
+ selection = inverted_dataset.select {|entry|
62
+ entry.downcase.start_with?(copy.downcase) or
63
+ entry.downcase.include?(copy.downcase)
64
+ }
65
+ if selection
66
+ if selection.size > 1
67
+ selection = selection.first # Obtain the first entry.
68
+ end
69
+ selection = selection.first if selection.is_a? Array
70
+ return selection
71
+ else
72
+ return i # else return the original input unmodified.
73
+ end
74
+ end
75
+
76
+ # ========================================================================= #
77
+ # === Studium.name_of_this_curriculum
78
+ #
79
+ # Note that we will assume that the curricula-files, which are yaml
80
+ # files, will have the name of the curriculum at hand on the first
81
+ # line.
82
+ # ========================================================================= #
83
+ def self.name_of_this_curriculum(i)
84
+ i = i.first if i.is_a? Array
85
+ i = Studium.return_file_for_this_curriculum(i)
86
+ i = i.last if i.is_a? Array
87
+ if File.exist? i
88
+ dataset = File.readlines(i, encoding: ::Studium.encoding?)
89
+ first_line = dataset.select {|line| line.start_with? '# === ' }.first.strip
90
+ i = first_line.sub(/^# === /,'').
91
+ sub(/Bachelorcurriculum /,'').
92
+ sub(/Mastercurriculum /,'')
93
+ end
94
+ return i.strip
95
+ end
96
+
97
+ # ========================================================================= #
98
+ # === Studium::ARRAY_ALL_AVAILABLE_CURRICULA
99
+ #
100
+ # The following Array has to be populated manually for now.
101
+ #
102
+ # In theory we could perhaps move this into its own file and its own
103
+ # sub-namespace, but for now, let's do the manual thing.
104
+ #
105
+ # Since as of December 2022 we will use Dir[] to dynamically find
106
+ # all curricula there.
107
+ # ========================================================================= #
108
+ ARRAY_ALL_AVAILABLE_CURRICULA = Dir[
109
+ "#{Studium.project_yaml_dir?}curricula/**/**.yml"
110
+ ].reject {|line| line.include? 'curricula/outdated/' }
111
+ # .map {|line| Studium.return_file_for_this_curriculum(line) }
112
+
113
+ # ========================================================================= #
114
+ # === Studium.map_curriculum_name_to_curriculum_number
115
+ #
116
+ # This method will map from a curriculum name to the corresponding
117
+ # curriculum number.
118
+ #
119
+ # This method will return a String such as "033630".
120
+ #
121
+ # You can also provide a partial input such as:
122
+ #
123
+ # Studium.map_curriculum_name_to_curriculum_number('master_biotech')
124
+ # Studium.map_curriculum_name_to_curriculum_number(:bachelor_agrarwissenschaften) # => "033255"
125
+ # Studium.map_curriculum_name_to_curriculum_number(:bachelor_lbt)
126
+ #
127
+ # ========================================================================= #
128
+ def self.map_curriculum_name_to_curriculum_number(
129
+ this_curriculum_name
130
+ )
131
+ if this_curriculum_name.is_a? Symbol
132
+ # ===================================================================== #
133
+ # Here we try to find a substitute, if the input is a Symbol.
134
+ # ===================================================================== #
135
+ this_curriculum_name = Studium.map_input_to_this_curriculum_filename(this_curriculum_name)
136
+ if File.exist? this_curriculum_name
137
+ this_curriculum_name = Studium.from_filename_to_curriculum_name(this_curriculum_name)
138
+ end
139
+ end
140
+ this_curriculum_name = this_curriculum_name.to_s
141
+ _ = YAML.load_file(Studium.file_curricula)
142
+ inverted_dataset = _.invert
143
+ # ======================================================================= #
144
+ # The entries to the above dataset may be like this:
145
+ #
146
+ # ["Mastercurriculum Lehramt UF Biologie und Umweltkunde", "Uni Wien"]=>
147
+ # "199502"
148
+ # ======================================================================= #
149
+ # We will build a new Hash, using only the first element of the above
150
+ # key.
151
+ # ======================================================================= #
152
+ new_hash = Hash[inverted_dataset.map {|array, curriculum_number|
153
+ [array.first, curriculum_number]
154
+ }]
155
+ unless new_hash.has_key? this_curriculum_name
156
+ # ===================================================================== #
157
+ # In this case we try to match the curriculum name.
158
+ # ===================================================================== #
159
+ possible_curriculum_name = Studium.map_partial_input_to_full_curriculum_name(this_curriculum_name)
160
+ if new_hash.has_key? possible_curriculum_name
161
+ this_curriculum_name = possible_curriculum_name
162
+ end
163
+ end
164
+ # ======================================================================= #
165
+ # Do some ad-hoc sanitizing next:
166
+ # ======================================================================= #
167
+ case this_curriculum_name
168
+ when /Bachelorcurriculum(_|-| )?Mikrobiologie(_|-| )?und(_|-| )?Genetik$/i,
169
+ /Biologie(_|-| )?Basisblock$/i
170
+ this_curriculum_name = 'Bachelorcurriculum Biologie'
171
+ end
172
+ this_curriculum = new_hash[this_curriculum_name]
173
+ unless this_curriculum
174
+ e "No result for `#{this_curriculum_name}`." # Notify the user in this case.
175
+ end
176
+ return this_curriculum
177
+ end; self.instance_eval { alias to_curriculum_id map_curriculum_name_to_curriculum_number } # === Studium.to_curriculum_id
178
+
179
+ # ========================================================================= #
180
+ # === Studium.from_filename_to_curriculum_name
181
+ #
182
+ # This method will translate from the filename to the curriculum name.
183
+ #
184
+ # Usage example:
185
+ #
186
+ # Studium.from_filename_to_curriculum_name('/usr/lib/ruby/site_ruby/3.2.0/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml')
187
+ #
188
+ # ========================================================================= #
189
+ def self.from_filename_to_curriculum_name(i)
190
+ if i and File.exist? i
191
+ _ = File.readlines(i)
192
+ # ===================================================================== #
193
+ # We assume the second line is the one containing the real name.
194
+ # ===================================================================== #
195
+ i = _[1].delete('#=').strip
196
+ end
197
+ return i
198
+ end
199
+
200
+ # ========================================================================= #
201
+ # === Studium.map_curriculum_number_to_curriculum_name
202
+ #
203
+ # This method will take a curriculum number and convert it into
204
+ # the long name of the curriculum at hand.
205
+ #
206
+ # This method will return a String.
207
+ #
208
+ # Usage examples:
209
+ #
210
+ # Studium.map_curriculum_number_to_curriculum_name('033255') # => "Bachelorcurriculum Agrarwissenschaften"
211
+ # Studium.map_curriculum_number_to_curriculum_name('/home/x/programming/ruby/src/studium/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml') # => "Bachelorcurriculum Agrarwissenschaften"
212
+ #
213
+ # ========================================================================= #
214
+ def self.map_curriculum_number_to_curriculum_name(
215
+ this_curriculum_number,
216
+ reverse_order = false
217
+ )
218
+ # ======================================================================= #
219
+ # === Load the main dataset next, the file that keeps all curricula
220
+ #
221
+ # We need the proper encoding for the dataset from the
222
+ # curricula-yaml file. This is no longer necessary since
223
+ # as of June 2021. The old code was:
224
+ #
225
+ # _ = ensure_main_encoding(YAML.load_file(Studium.file_curricula))
226
+ #
227
+ # In the future this comment will probably be removed.
228
+ # ======================================================================= #
229
+ _ = YAML.load_file(Studium.file_curricula)
230
+ this_curriculum_number = this_curriculum_number.to_s
231
+ # ======================================================================= #
232
+ # Before we perform the actual conversion we will check whether the
233
+ # input is a .yml file. If it is, and such a file can be found to
234
+ # exist locally, we will apply a regex onto it to extract the real
235
+ # curriculum number. This will not work in all cases, but for simple
236
+ # input this should work fine.
237
+ # ======================================================================= #
238
+ if this_curriculum_number and this_curriculum_number.end_with?('.yml') and
239
+ File.exist?(this_curriculum_number)
240
+ # ===================================================================== #
241
+ # Apply the regex next:
242
+ # ===================================================================== #
243
+ use_this_regex = /_(\d{6,6}).yml$$/
244
+ this_curriculum_number =~ use_this_regex
245
+ this_curriculum_number = $1.to_s.dup if $1
246
+ end
247
+ # ======================================================================= #
248
+ # Perform the conversion next:
249
+ # ======================================================================= #
250
+ this_curriculum = _[this_curriculum_number]
251
+ # ======================================================================= #
252
+ # We must ensure that the main encoding is used. This is no longer
253
+ # as important.
254
+ # ======================================================================= #
255
+ # this_curriculum = ensure_main_encoding(this_curriculum)
256
+ if this_curriculum.is_a? Array
257
+ this_curriculum = this_curriculum.first
258
+ end
259
+ return this_curriculum
260
+ end; self.instance_eval { alias return_name_of_this_curriculum map_curriculum_number_to_curriculum_name } # === Studium.return_name_of_this_curriculum
261
+ self.instance_eval { alias curriculum_id_to_curriculum_name map_curriculum_number_to_curriculum_name } # === Studium.curriculum_id_to_curriculum_name
262
+
263
+ # ========================================================================= #
264
+ # === Studium.is_a_master_lecture?
265
+ #
266
+ # This method is supposed to return true if the given input is a
267
+ # master course, and false otherwise.
268
+ # ========================================================================= #
269
+ def self.is_a_master_lecture?(this_lecture)
270
+ if ::Studium.main_dataset?
271
+ dataset_to_use = Studium.main_dataset?
272
+ else
273
+ dataset_to_use = Studium.return_sanitized_dataset_from_the_file_lecture_information
274
+ Studium.main_dataset = dataset_to_use
275
+ end
276
+ if dataset_to_use.has_key?(this_lecture)
277
+ # ===================================================================== #
278
+ # Ok we have found this lecture registered. Now we grab the entry
279
+ # and pass it into has_a_master_curriculum?().
280
+ # ===================================================================== #
281
+ pointer = dataset_to_use[this_lecture]
282
+ these_curricula = pointer['curricula']
283
+ has_a_master_curriculum?(these_curricula)
284
+ else
285
+ false
286
+ end
287
+ end
288
+
289
+ # ========================================================================= #
290
+ # === Studium.lectures_without_attribution_to_any_curriculum
291
+ #
292
+ # This method will return all entries in the file lecture_information.yml
293
+ # that have no attribution to any official curriculum.
294
+ # ========================================================================= #
295
+ def self.lectures_without_attribution_to_any_curriculum
296
+ dataset = Studium.return_sanitized_dataset_from_the_file_lecture_information
297
+ dataset.select! {|a, inner_hash|
298
+ curricula = inner_hash['curricula']
299
+ # ===================================================================== #
300
+ # Find empty curricula next:
301
+ # ===================================================================== #
302
+ curricula.any? {|entry|
303
+ entry.is_a?(String) and entry.empty?
304
+ }
305
+ }
306
+ end
307
+
308
+ # ========================================================================= #
309
+ # === Studium.return_lectures_belonging_to_this_curriculum
310
+ #
311
+ # Usage example:
312
+ #
313
+ # i = Studium.return_lectures_belonging_to_this_curriculum(:bachelor_vector)
314
+ #
315
+ # ========================================================================= #
316
+ def self.return_lectures_belonging_to_this_curriculum(
317
+ i = :bachelor_vector
318
+ )
319
+ if i.is_a? Array
320
+ i = i.first
321
+ end
322
+ if i.is_a? String
323
+ i = i.tr(' ','_').to_sym # We do not allow ' ' characters right now.
324
+ end
325
+ dataset = return_dataset_from_this_curriculum_file(i)
326
+ result = dataset.keys
327
+ return result
328
+ end
329
+
330
+ # ========================================================================= #
331
+ # === Studium.return_random_curriculum
332
+ #
333
+ # This method will return a random curriculum.
334
+ # ========================================================================= #
335
+ def self.return_random_curriculum
336
+ ARRAY_REGISTERED_CURRICULA_FILES.sample
337
+ end
338
+
339
+ # ========================================================================= #
340
+ # === Studium.return_this_curriculum_as_a_string
341
+ # ========================================================================= #
342
+ def self.return_this_curriculum_as_a_string(i)
343
+ require 'studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb'
344
+ i = i.join(' ').strip if i.is_a? Array
345
+ i = i.to_s.downcase.tr(' ','_')
346
+ _ = Studium::ShowLecturesOnTheCommandline.new(i) { :www }
347
+ string = _.html_string?
348
+ string
349
+ end
350
+
351
+ # ========================================================================= #
352
+ # === Studium.sanitize_dataset_derived_from_a_curriculum_file
353
+ #
354
+ # This method will sanitize the default dataset registered in a
355
+ # curriculum file. In particular, '#' comments will be removed.
356
+ #
357
+ # You should ideally use this method if you need to load up
358
+ # the dataset from a curriculum file.
359
+ # ========================================================================= #
360
+ def self.sanitize_dataset_derived_from_a_curriculum_file(dataset)
361
+ dataset.reject {|entry|
362
+ entry.strip.empty? or entry.strip.start_with?('#') # Remove comments as well.
363
+ }.map {|inner_entry|
364
+ if inner_entry.include? '#'
365
+ inner_entry = inner_entry[0 .. (inner_entry.index('#') - 1)].strip
366
+ end
367
+ inner_entry.strip.squeeze(' ')
368
+ }
369
+ end
370
+
371
+ # ========================================================================= #
372
+ # === Studium.return_dataset_from_this_curriculum_file
373
+ #
374
+ # This method will return the dataset of a curriculum file. This means
375
+ # that it will have all registered lectures already as-is, and return
376
+ # that complete dataset.
377
+ #
378
+ # The input should be the path to an existing file. Alternatively we
379
+ # will also sanitize a few special symbols given here, such as
380
+ # :default.
381
+ # ========================================================================= #
382
+ def self.return_dataset_from_this_curriculum_file(
383
+ i = :default_path
384
+ )
385
+ dataset_from_the_file_lecture_information =
386
+ return_sanitized_dataset_from_the_file_lecture_information
387
+ full_dataset = {}
388
+ if i.is_a? Array
389
+ i = i.first
390
+ end
391
+ i = return_file_for_this_curriculum(i)
392
+ unless i.is_a? Array
393
+ i = [i].flatten.compact
394
+ end
395
+ i.each {|file|
396
+ if file and File.exist?(file)
397
+ dataset = File.readlines(file, encoding: ::Studium.encoding?)
398
+ dataset = sanitize_dataset_derived_from_a_curriculum_file(dataset)
399
+ # =================================================================== #
400
+ # Next we'll have to obtain the proper dataset from the main Hash.
401
+ # This may fail, though, so we need to check for that and notify
402
+ # the user as well, in the event that failure will occur.
403
+ # =================================================================== #
404
+ dataset.each {|entry|
405
+ if dataset_from_the_file_lecture_information.has_key? entry
406
+ pointer = dataset_from_the_file_lecture_information[entry]
407
+ full_dataset[entry] = pointer
408
+ end
409
+ }
410
+ else
411
+ e "No file exists at `#{i}`."
412
+ end
413
+ }
414
+ return full_dataset
415
+ end
416
+
417
+ # ========================================================================= #
418
+ # === Studium.is_this_lecture_part_of_the_vector_curriculum
419
+ #
420
+ # This method will return true or false, depending on whether the
421
+ # lecture at hand is part of the Vector curriculum or whether it
422
+ # is not.
423
+ #
424
+ # The second argument determines whether this method will be strict,
425
+ # and return only true if the input-name (first argument) is exactly
426
+ # as registered; or whether it may :be_lenient, which means that
427
+ # it will try to find a similarly-named lecture. In the latter case,
428
+ # tokens such as ',' will be ignored.
429
+ #
430
+ # Presently leading numbers are ignored.
431
+ # ========================================================================= #
432
+ def self.is_this_lecture_part_of_the_vector_curriculum(
433
+ this_lecture = ARGV,
434
+ modus_operandi = :be_strict # The modus can be strict or lenient.
435
+ )
436
+ this_lecture = this_lecture.first if this_lecture.is_a? Array
437
+ this_lecture = this_lecture.to_s.rstrip # Don't want any ' ' characters on the right hand side.
438
+ # unless this_lecture.encoding.to_s.include? ::Studium.main_encoding?
439
+ # this_lecture = ensure_main_encoding(this_lecture)
440
+ # end
441
+ this_lecture.delete!('()')
442
+ # ======================================================================= #
443
+ # If the input starts with a number and has at the least one ' ', we chop
444
+ # the number part away.
445
+ # ======================================================================= #
446
+ if this_lecture.start_with?(/\d+/) and this_lecture.include?(' ')
447
+ this_lecture = this_lecture.split(' ')[1 .. -1].join(' ')
448
+ end
449
+ # ======================================================================= #
450
+ # First, load up the two .yml files of the individual curriculum.
451
+ # ======================================================================= #
452
+ dataset = Studium.read_dataset_from_a_curriculum_file(
453
+ :bachelor_vektor, :remove_comments_and_title
454
+ )+
455
+ Studium.read_dataset_from_a_curriculum_file(
456
+ :master_vektor, :remove_comments_and_title
457
+ )
458
+ dataset.flatten!
459
+ # ======================================================================= #
460
+ # Sanitize all lectures there. To simplify, we will also get rid of all
461
+ # '(' and ')' tokens.
462
+ # ======================================================================= #
463
+ dataset = dataset.map {|entry|
464
+ entry = entry.to_s
465
+ # unless entry.encoding.to_s.include? ::Studium.main_encoding?
466
+ # entry = ensure_main_encoding(entry)
467
+ # end
468
+ entry = entry.dup if entry.frozen?
469
+ entry.delete!('()') # Remove both '(' and ')' tokens.
470
+ case modus_operandi
471
+ when :be_lenient
472
+ entry.delete!(',:') # We get rid of ',' and ':' tokens.
473
+ end
474
+ entry.chop! if entry.end_with? '.' # Get rid of trailing '.'
475
+ if (entry =~ /^\d{1}/) and
476
+ entry.include?(' ')
477
+ entry = entry.split(' ')[1..-1].join(' ')
478
+ end
479
+ entry
480
+ }
481
+ # ======================================================================= #
482
+ # By default we do a "hard" check, without any lenience.
483
+ # ======================================================================= #
484
+ is_included_or_is_not_included = dataset.include? this_lecture
485
+ case modus_operandi
486
+ when :be_lenient
487
+ # ===================================================================== #
488
+ # In this case we will be more tolerant.
489
+ # ===================================================================== #
490
+ is_included_or_is_not_included = dataset.any? {|line|
491
+ line.start_with?(this_lecture) or (line =~ /#{this_lecture}$/)
492
+ }
493
+ end
494
+ return is_included_or_is_not_included
495
+ end; self.instance_eval { alias is_this_lecture_part_of_the_vektor_curriculum? is_this_lecture_part_of_the_vector_curriculum } # === Studium.is_this_lecture_part_of_the_vektor_curriculum?
496
+ self.instance_eval { alias is_part_of_the_vektor_curriculum? is_this_lecture_part_of_the_vector_curriculum } # === Studium.is_part_of_the_vektor_curriculum?
497
+
498
+ # ========================================================================= #
499
+ # === Studium.return_curriculum_of_this_lva_number
500
+ #
501
+ # This method will return the LVA number of a particular curriculum.
502
+ #
503
+ # Pass in the name of the curriculum.
504
+ #
505
+ # Invocation example:
506
+ #
507
+ # Studium.return_curriculum_of_this_lva_number '033521'
508
+ #
509
+ # ========================================================================= #
510
+ def self.return_curriculum_of_this_lva_number(i)
511
+ # ======================================================================= #
512
+ # First, sanitize strings if they include at the least two newlines:
513
+ # ======================================================================= #
514
+ if i.is_a?(String) and i.count("\n") > 1
515
+ i = i.split("\n").flatten
516
+ end
517
+ dataset = YAML.load_file(Studium.file_curricula)
518
+ _ = {}
519
+ dataset.each_pair {|key, value|
520
+ # key = Studium.ensure_main_encoding(key)
521
+ # value = Studium.ensure_main_encoding(value)
522
+ # ===================================================================== #
523
+ # Get rid of two words from the key.
524
+ # ===================================================================== #
525
+ _[key.sub(/Bachelorcurriculum /,'').sub(/Mastercurriculum /,'')] = value
526
+ }
527
+ dataset = _ # Re-assign it to our dataset.
528
+ if i.is_a? Array
529
+ i.each {|entry| return_curriculum_of_this_lva_number(entry) }
530
+ else
531
+ # ===================================================================== #
532
+ # Next, we must find the corresponding entries in the curriculum.yml
533
+ # file.
534
+ #
535
+ # The dataset from the curricula.yml file is a hash having
536
+ # key-value entries, with the value being an Array:
537
+ #
538
+ # (1) first comes the number of the curriculum, as key
539
+ # (2) the full and complete name of the curriculum, at
540
+ # hand comes as the first element of the Array
541
+ # (3) the university at which the lecture is held, comes
542
+ # as last element of the Array.
543
+ #
544
+ # ===================================================================== #
545
+ if dataset.has_key? i
546
+ name_of_the_curriculum = dataset[i]
547
+ if name_of_the_curriculum.is_a? Array
548
+ name_of_the_curriculum = name_of_the_curriculum.first
549
+ end
550
+ e ::Colours.rev+
551
+ 'The name of the curriculum associated with the LVA '\
552
+ 'ID '+Studium::Colours.simp(i)+' is '\
553
+ '`'+Studium::Colours.sfancy(name_of_the_curriculum)+'`.'
554
+ else
555
+ e 'The curriculum for '+Studium::Colours.sfancy(i)+' does not '\
556
+ 'appear to be registered.'
557
+ e ' '+Studium::Colours.sfile(Studium.file_curricula)
558
+ end
559
+ end
560
+ end
561
+
562
+ # ========================================================================= #
563
+ # === Studium.from_curriculum_id_to_university
564
+ #
565
+ # This method will translate from the curriculum-id to the corresponding
566
+ # university.
567
+ # ========================================================================= #
568
+ def self.from_curriculum_id_to_university(
569
+ i, report_unregistered_keys = true
570
+ )
571
+ if i.is_a? Array
572
+ i = i.flatten.join(' ').strip
573
+ end
574
+ result = nil
575
+ dataset_from_the_yaml_file = YAML.load_file(Studium.file_curricula)
576
+ i = i.to_s.dup
577
+ # i = ensure_main_encoding(i.to_s.dup)
578
+ if dataset_from_the_yaml_file.has_key? i
579
+ array_pointer = dataset_from_the_yaml_file[i]
580
+ # ===================================================================== #
581
+ # The name of the university is presently hardcoded at the second
582
+ # position. In the past the following code used .last, but since
583
+ # as of October 2019, the particular .yml file format was changed.
584
+ # ===================================================================== #
585
+ name_of_the_university = array_pointer[1]
586
+ result = name_of_the_university
587
+ else # Else report that the key is not registered.
588
+ if report_unregistered_keys
589
+ e "Key `#{i}` is not registered."
590
+ end
591
+ end
592
+ result
593
+ end; self.instance_eval { alias curriculum_id_to_university from_curriculum_id_to_university } # === Studium.curriculum_id_to_university
594
+
595
+ # ========================================================================= #
596
+ # === Studium.show_passed_ects_in_the_individual_bachelor_and_master_curricula
597
+ # ========================================================================= #
598
+ def self.show_passed_ects_in_the_individual_bachelor_and_master_curricula
599
+ hash = {}
600
+ hash.default = 0
601
+ dataset = return_dataset_from_file_lecture_information
602
+ dataset.select! {|name_of_the_lecture, inner_dataset|
603
+ inner_dataset.has_key?(:already_solved) and
604
+ (inner_dataset[:already_solved] == true)
605
+ }
606
+ # ======================================================================= #
607
+ # Next we can build up a Hash storing the n_ects.
608
+ # ======================================================================= #
609
+ dataset.each_pair {|name, inner_dataset|
610
+ n_ects = inner_dataset[:ects]
611
+ curricula = inner_dataset['curricula']
612
+ if has_a_master_curriculum?(curricula)
613
+ bachelor_or_master = :master
614
+ elsif has_a_bachelor_curriculum?(curricula)
615
+ bachelor_or_master = :bachelor
616
+ elsif has_a_bachelor_curriculum?(curricula) and
617
+ has_a_master_curriculum?(curricula)
618
+ bachelor_or_master = :bachelor
619
+ hash[bachelor_or_master] += n_ects
620
+ bachelor_or_master = :master # <- Will be set lateron.
621
+ else
622
+ bachelor_or_master = :bachelor
623
+ end
624
+ hash[bachelor_or_master] += n_ects
625
+ }
626
+ n_ects_in_total = hash.values.sum
627
+ sorted = hash.sort_by {|name, inner_dataset| name }
628
+ e
629
+ e ::Studium::Colours.lightgreen(
630
+ 'We passed this amount of ECTS in bachelor/master lectures:'
631
+ )
632
+ e; sorted.each {|bachelor_or_master, n_ects_points|
633
+ # ===================================================================== #
634
+ # Determine the percentage value as %.
635
+ # ===================================================================== #
636
+ percentage_value = (
637
+ (n_ects_points * 100) / n_ects_in_total
638
+ ).round(2).to_s+'%'
639
+ e ' '+
640
+ ::Studium::Colours.royalblue(
641
+ (bachelor_or_master.to_s+': ').ljust(12)
642
+ )+
643
+ ::Studium::Colours.slateblue(
644
+ n_ects_points.to_s+' ECTS points'
645
+ )+' '+::Studium::Colours.crimson(percentage_value)
646
+ }
647
+ e
648
+ e ::Studium::Colours.gold(
649
+ ' (Note that this will include lectures that are dual-registered'
650
+ )
651
+ e ::Studium::Colours.gold(
652
+ ' in both a bachelor and a master curriculum.)'
653
+ )
654
+ e
655
+ end
656
+
657
+ # ========================================================================= #
658
+ # === Studium.array_available_curricula
659
+ # ========================================================================= #
660
+ def self.array_available_curricula
661
+ ARRAY_ALL_AVAILABLE_CURRICULA.flatten.map {|entry|
662
+ result = File.basename(entry).sub(/\.yml$/,'')
663
+ if result =~ /_\d{6}$/
664
+ result[-7, 7] = ''
665
+ end
666
+ result
667
+ }
668
+ end
669
+
670
+ # ========================================================================= #
671
+ # === Studium.is_a_registered_curriculum?
672
+ #
673
+ # The input to this method must be as accurate as possible for the time
674
+ # being, as the _.any? check is very simplistic.
675
+ #
676
+ # The input to this method can be an Array.
677
+ #
678
+ # Usage example:
679
+ #
680
+ # Studium.is_a_registered_curriculum?('agrar')
681
+ #
682
+ # ========================================================================= #
683
+ def self.is_a_registered_curriculum?(i)
684
+ # ======================================================================= #
685
+ # If the input is an Array, such as:
686
+ #
687
+ # ["/usr/lib/ruby/site_ruby/3.1.0/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml",
688
+ # "/usr/lib/ruby/site_ruby/3.1.0/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml"]
689
+ #
690
+ # then we will need to make use of another check.
691
+ # ======================================================================= #
692
+ array = Studium.return_array_location_of_all_registered_curricula.
693
+ compact.uniq
694
+ if i.is_a? Array
695
+ i.each {|inner_entry|
696
+ return true if array.any? {|line| line.include?(inner_entry) }
697
+ }
698
+ return false
699
+ else
700
+ return array.any? {|line| line.include?(i) }
701
+ end
702
+ end
703
+
704
+ # ========================================================================= #
705
+ # === Studium.return_array_location_of_all_registered_curricula
706
+ #
707
+ # This method will return the location to the (local) curricula. On
708
+ # my home system, this means at the least 20 entries (Apr 2018).
709
+ #
710
+ # An Array will be returned.
711
+ # ========================================================================= #
712
+ def self.return_array_location_of_all_registered_curricula
713
+ ARRAY_ALL_AVAILABLE_CURRICULA
714
+ end; self.instance_eval { alias array_location_of_all_registered_curricula return_array_location_of_all_registered_curricula }
715
+
716
+ # ========================================================================= #
717
+ # === Studium.read_dataset_from_a_curriculum_file
718
+ #
719
+ # This method will read in a dataset from a curriculum file, without
720
+ # depending on YAML.load_file().
721
+ #
722
+ # It had to be added in February 2018 because I transitioned away from
723
+ # using YAML, into my own custom format, which is not only simpler but
724
+ # also more fault-tolerant - in the sense that fewers mistakes will
725
+ # happen. Plus - I get to easily control the Encoding in use as well.
726
+ #
727
+ # A symbol can also be passed into this method. This will then be
728
+ # expanded to the corresponding curriculum-file.
729
+ #
730
+ # Examples for this:
731
+ #
732
+ # Studium.read_dataset_from_a_curriculum_file(:bachelor_vektorx)
733
+ # Studium.read_dataset_from_a_curriculum_file(:bachelor_vektorx, :remove_comments)
734
+ #
735
+ # More usage examples:
736
+ #
737
+ # dataset = Studium.read_dataset_from_a_curriculum_file(:bachelor_genetik)
738
+ #
739
+ # ========================================================================= #
740
+ def self.read_dataset_from_a_curriculum_file(
741
+ i,
742
+ optional_commands = nil,
743
+ do_flatten_the_dataset = true
744
+ )
745
+ # ======================================================================= #
746
+ # === Handle blocks next
747
+ # ======================================================================= #
748
+ if block_given?
749
+ yielded = yield
750
+ case yielded
751
+ # ===================================================================== #
752
+ # === :remove_comments
753
+ # ===================================================================== #
754
+ when :remove_comments
755
+ optional_commands = :remove_comments # <- Sync towards this variable.
756
+ end
757
+ end
758
+ dataset = [i].flatten.compact
759
+ dataset.map! {|entry|
760
+ if entry.is_a?(Symbol) or
761
+ (entry.is_a?(String)) # and entry.start_with?('--')) # Commented this out in December 2022.
762
+ # =================================================================== #
763
+ # Next we will try to find the proper name, if a Symbol is used here.
764
+ # =================================================================== #
765
+ entry = ::Studium.return_file_for_this_curriculum(entry)
766
+ end
767
+ if entry.is_a? Array
768
+ entry = entry.map {|inner_line|
769
+ File.readlines(
770
+ inner_line, encoding: ::Studium.main_encoding?
771
+ )
772
+ }
773
+ else
774
+ if File.exist? entry.to_s
775
+ entry = File.readlines(
776
+ entry, encoding: ::Studium.main_encoding?
777
+ )
778
+ else
779
+ e 'From the '+
780
+ Colours.steelblue('file')+
781
+ ': '+
782
+ sfile('studium/toplevel_methods/curriculum_related_code.rb')
783
+ e "No file could be found at `#{sfile(entry)}`."
784
+ e
785
+ e 'The caller() backtrace was:'
786
+ e
787
+ pp caller()
788
+ e
789
+ end
790
+ end
791
+ # ===================================================================== #
792
+ # The .flatten operation has to be optional, since we may also have
793
+ # two different curricula combined, in a bachelor-master setup.
794
+ # ===================================================================== #
795
+ if entry.is_a? Array
796
+ entry.flatten! if do_flatten_the_dataset
797
+ entry.reject! {|line|
798
+ if line.is_a? String
799
+ line.strip.empty?
800
+ elsif line.is_a? Array
801
+ line.select {|inner_line| inner_line.strip.empty? }
802
+ end
803
+ }
804
+ unless optional_commands == :retain_comments
805
+ entry.reject! {|line|
806
+ line.strip.start_with?('#')
807
+ }
808
+ end
809
+ else
810
+ e 'The input is not an Array - this may indicate an error. '\
811
+ '(reported from the file '+__FILE__+')'
812
+ end
813
+ entry
814
+ }
815
+ dataset.flatten!
816
+ if optional_commands
817
+ case optional_commands
818
+ # ===================================================================== #
819
+ # === :remove_comments_and_title
820
+ #
821
+ # This entry point chops away any comments and also entries with
822
+ # @title.
823
+ # ===================================================================== #
824
+ when :remove_comments_and_title
825
+ dataset.map! {|line|
826
+ if line and line.include?('#')
827
+ line = line[0 .. (line.index('#') - 1)]
828
+ line.strip!
829
+ end
830
+ line = nil if line and line.include?('@title ') # Remove it here then.
831
+ line
832
+ }
833
+ dataset.compact!
834
+ # ===================================================================== #
835
+ # This entry point chops away any comments.
836
+ # ===================================================================== #
837
+ when :remove_comments
838
+ dataset.map! {|line|
839
+ if line.include? '#'
840
+ line = line[0 .. (line.index('#') - 1)]
841
+ line.strip!
842
+ end
843
+ line
844
+ }
845
+ end
846
+ end
847
+ return dataset # And return the dataset here finally.
848
+ end
849
+
850
+ # ========================================================================= #
851
+ # === Studium.return_title_from_this_curriculum_file
852
+ #
853
+ # Do note that for this method to work, the curriculum-file at hand
854
+ # has to exist locally.
855
+ #
856
+ # The special entries called :indi1, :indi2, :indi3 and at the least
857
+ # also :indi4 should remain single, individual entries in the following
858
+ # case/when menu. The reason for this is so that we can always pinpoint
859
+ # to the individual curriculum number 1, number 2, number 3 and so
860
+ # forth.
861
+ #
862
+ # Usage examples:
863
+ #
864
+ # Studium.return_title_from_this_curriculum_file(:bachelor_vektor) # => "Bachelorcurriculum Vector-based strategies in Life Sciences, (Bio)Informatics, Molecular Medicine and Biotechnology"
865
+ # Studium.return_title_from_this_curriculum_file(:indi2) # => "Bachelorcurriculum Informatik und Biotechnologie unter Berücksichtigung immunanalytisch-molekularmedizinischer Aspekte"
866
+ #
867
+ # ========================================================================= #
868
+ def self.return_title_from_this_curriculum_file(
869
+ i = :default_input_file,
870
+ also_remove_the_bachelor_master_attribution_at_the_start = false
871
+ )
872
+ if i.is_a? Array # Handle the situation when an Array is given here.
873
+ # ===================================================================== #
874
+ # Since as of December 2022 we will simply assume that the last
875
+ # element is the most important entry. This assumption may change
876
+ # at a later point in time, though.
877
+ # ===================================================================== #
878
+ i = i.last
879
+ end
880
+ case also_remove_the_bachelor_master_attribution_at_the_start
881
+ # ======================================================================= #
882
+ # === :shorter
883
+ # ======================================================================= #
884
+ when :shorter
885
+ also_remove_the_bachelor_master_attribution_at_the_start = true
886
+ end
887
+ # ======================================================================= #
888
+ # Handle nil-values given as input next.
889
+ # ======================================================================= #
890
+ i = :default_input_file if i.nil?
891
+ unless i.is_a?(String) and File.exist?(i)
892
+ i = ::Studium.return_file_for_this_curriculum(i.to_sym)
893
+ end
894
+ if i.is_a? Array
895
+ i = i.last
896
+ end
897
+ if i.is_a?(String) and File.exist?(i)
898
+ # ===================================================================== #
899
+ # If the file exists, we can read it in.
900
+ # ===================================================================== #
901
+ dataset = readlines_with_the_default_encoding(i)
902
+ if dataset[1].start_with? '# === '
903
+ title = dataset[1].strip.delete('#=').strip
904
+ if also_remove_the_bachelor_master_attribution_at_the_start
905
+ title.sub!(/^Bachelorcurriculum/,'')
906
+ title.sub!(/^Mastercurriculum/,'')
907
+ title.strip!
908
+ end
909
+ return title # We assume this to be the title, and hence return it.
910
+ end
911
+ else
912
+ # e "No file exists at `#{i}`. Thus, no title of "\
913
+ # "the curriculum can be determined."
914
+ end
915
+ nil # Default return-value.
916
+ end
917
+
918
+ # ========================================================================= #
919
+ # === Studium.has_a_bachelor_curriculum?
920
+ #
921
+ # A bachelor curriculum most commonly starts with the three numbers
922
+ # '033'.
923
+ # ========================================================================= #
924
+ def self.has_a_bachelor_curriculum?(array)
925
+ if array.is_a? String
926
+ array = [array] # Ad-hoc change here.
927
+ end
928
+ array.any? {|line|
929
+ line.to_s.start_with?('033') # or
930
+ # line.to_s.start_with?('196') # or # For diploma-curricula. Actually 196041 is Mastercurriculum Lehramt Biologie.
931
+ # line.to_s.start_with?('199') # This is incorrect, though. See: Master Lehramt UF Chemie (199 504)
932
+ } if array
933
+ end; self.instance_eval { alias is_a_bachelor_lecture? has_a_bachelor_curriculum? } # === Studium.is_a_bachelor_curriculum?
934
+ self.instance_eval { alias has_a_bachelor_curriculum_entry? has_a_bachelor_curriculum? } # === Studium.has_a_bachelor_curriculum_entry?
935
+ self.instance_eval { alias is_this_a_bachelor_curriculum? has_a_bachelor_curriculum? } # === Studium.is_this_a_bachelor_curriculum?
936
+
937
+ # ========================================================================= #
938
+ # === Studium.has_a_master_curriculum?
939
+ #
940
+ # This method expects the input-argument to be an Array.
941
+ #
942
+ # Since April 2020, if the input is a String then it will be converted
943
+ # into an Array.
944
+ # ========================================================================= #
945
+ def self.has_a_master_curriculum?(array)
946
+ if array.is_a? String
947
+ array = [array]
948
+ end
949
+ array.any? {|line|
950
+ line.to_s.start_with?('066') or
951
+ line.to_s.start_with?('196') or # For diploma-curricula.
952
+ line.to_s.start_with?('199')
953
+ }
954
+ end; self.instance_eval { alias has_a_master_lecture? has_a_master_curriculum? } # === Studium.has_a_master_lecture?
955
+ self.instance_eval { alias has_a_master_curriculum_entry? has_a_master_curriculum? } # === Studium.has_a_master_curriculum_entry?
956
+ self.instance_eval { alias is_this_lecture_registered_in_a_master_curriculum? has_a_master_curriculum? } # === Studium.is_this_lecture_registered_in_a_master_curriculum?
957
+ self.instance_eval { alias is_this_a_master_curriculum? has_a_master_curriculum? } # === Studium.is_this_a_master_curriculum?
958
+ self.instance_eval { alias is_a_master_curriculum? has_a_master_curriculum? } # === Studium.is_a_master_curriculum?
959
+
960
+ end
961
+
962
+ if __FILE__ == $PROGRAM_NAME
963
+ require 'colours/colours_e_autoinclude.rb'
964
+ require 'verbose_truth'
965
+ _ = '300019 Computational methods in microbial ecology'
966
+ e Colours.rev
967
+ unless ARGV.empty?
968
+ _ = ARGV.join(' ').strip
969
+ end
970
+ e "Is #{_} a master lecture? "\
971
+ "#{VerboseTruth[Studium.is_a_master_lecture?(_).to_s]}"
972
+ Studium.return_array_location_of_all_registered_curricula.each {|entry|
973
+ if entry.is_a? String
974
+ e entry
975
+ else
976
+ pp entry
977
+ end
978
+ }
979
+ # ========================================================================= #
980
+ # === From curriculum-ID to university:
981
+ # ========================================================================= #
982
+ e Studium.from_curriculum_id_to_university(ARGV)
983
+ e
984
+ pp Studium.read_dataset_from_a_curriculum_file
985
+ e
986
+ e Studium.map_curriculum_number_to_curriculum_name('033602')
987
+ e Studium.map_curriculum_name_to_curriculum_number('Bachelorcurriculum Pferdewissenschaften')
988
+ e Studium.map_curriculum_name_to_curriculum_number('Bachelorcurriculum Biologie')
989
+ e
990
+ pp Studium.return_lectures_belonging_to_this_curriculum
991
+ e
992
+ pp Studium.return_this_curriculum_as_a_string(ARGV)
993
+ e
994
+ pp Studium.return_dataset_from_this_curriculum_file # (ARGV)
995
+ e '(1) First showing the result of Studium.return_title_from_this_curriculum_file(ARGV)'
996
+ e
997
+ e steelblue(Studium.return_title_from_this_curriculum_file(ARGV))
998
+ e
999
+ e '(2) Next showing the result of Studium.return_title_from_this_curriculum_file(ARGV, true)'
1000
+ e ' which will be shorter.'
1001
+ e
1002
+ e steelblue(Studium.return_title_from_this_curriculum_file(ARGV, :shorter))
1003
+ e
1004
+ e Studium.return_curriculum_of_this_lva_number(ARGV)
1005
+ e
1006
+ if ARGV.empty?
1007
+ Studium.is_this_lecture_part_of_the_vector_curriculum(ARGV, :be_lenient)
1008
+ else
1009
+ e Studium.is_this_lecture_part_of_the_vector_curriculum(ARGV, :be_lenient)
1010
+ end
1011
+
1012
+ result = Studium.lectures_without_attribution_to_any_curriculum
1013
+ e
1014
+ result.each {|name, hash|
1015
+ remote_url = hash[:homepage].to_s
1016
+ e ' '+slateblue(name.ljust(25))+
1017
+ ' '+lightblue(remote_url)
1018
+ }
1019
+ e
1020
+ Studium.show_passed_ects_in_the_individual_bachelor_and_master_curricula
1021
+ e
1022
+ e Studium.name_of_this_curriculum(ARGV)
1023
+ end # no_attribution
1024
+ # hasamastercurriculum 301284 Biochemie
1025
+ # rb return_this_curriculum_as_a_string.rb Bachelor genetik
1026
+ # rb return_dataset_from_this_curriculum_file
1027
+ # returntitlefromthiscurriculumfile mvec
1028
+ # returncurriculumofthislvanumber 033521
1029
+ # isthislecturepartofthevectorcurriculum "Molekulare Medizin 2"
1030
+ # isthislecturepartofthevectorcurriculum "Molekulare Medizin 1"
1031
+ # isthislecturepartofthevectorcurriculum "Biochemie für Biologen"
1032
+ # isthislecturepartofthevectorcurriculum "Methods in ultrastructure research in Eng"
1033
+ # isthislecturepartofthevectorcurriculum "153.075 Chemie für TPH"
1034
+ # isthislecturepartofthevectorcurriculum "362.111 Biophysik"
1035
+ # isthislecturepartofthevectorcurriculum "Laboratory course in molecular biology II (in Eng.)"
1036
+ # isthislecturepartofthevectorcurriculum "Ausgewählte Kapitel aus der KTWW"
1037
+ # showpassedectsintheindividualbachelorandmastercurricula
1038
+ # nameofthiscurriculum indi2