studium 0.14.16

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

Potentially problematic release.


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

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