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,1359 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === Studium::Exams::MandatoryContinuousAssessment
6
+ #
7
+ # This class allows the user to determine how many exams that are
8
+ # "prüfungsimmanent" were passed already in a given curriculum. That
9
+ # word "mandatory continuous assessment" specifically refers to courses
10
+ # such as a seminar or a practical course that takes e. g. 1-3 weeks
11
+ # of daily, continuous participation.
12
+ #
13
+ # Usage example:
14
+ #
15
+ # Studium::Exams::MandatoryContinuousAssessment.new(ARGV)
16
+ #
17
+ # =========================================================================== #
18
+ # require 'studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb'
19
+ # =========================================================================== #
20
+ require 'studium/base/base.rb'
21
+
22
+ module Studium
23
+
24
+ module Exams
25
+
26
+ class MandatoryContinuousAssessment < Studium::Base
27
+
28
+ require 'studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb'
29
+ require 'studium/curricula/n_percent_solved_in_this_curriculum.rb'
30
+
31
+ # ========================================================================= #
32
+ # === N_TOKENS_FOR_THE_SPRINGREEN_SPACER
33
+ # ========================================================================= #
34
+ N_TOKENS_FOR_THE_SPRINGREEN_SPACER = 132
35
+
36
+ # ========================================================================= #
37
+ # === initialize
38
+ # ========================================================================= #
39
+ def initialize(
40
+ i = ARGV,
41
+ run_already = true
42
+ )
43
+ reset
44
+ set_commandline_arguments(i)
45
+ case run_already
46
+ # ======================================================================= #
47
+ # === :do_not_run_yet
48
+ # ======================================================================= #
49
+ when :do_not_run_yet,
50
+ :dont_run_yet
51
+ run_already = false
52
+ end
53
+ # ======================================================================= #
54
+ # === Handle blocks given to this class
55
+ # ======================================================================= #
56
+ if block_given?
57
+ yielded = yield
58
+ case yielded
59
+ # ===================================================================== #
60
+ # === :do_not_report_the_title
61
+ # ===================================================================== #
62
+ when :do_not_report_the_title
63
+ do_not_show_the_title_of_the_curriculum
64
+ # ===================================================================== #
65
+ # === :do_not_report_anything
66
+ # ===================================================================== #
67
+ when :do_not_report_anything
68
+ do_not_report_anything
69
+ end
70
+ end
71
+ run if run_already
72
+ end
73
+
74
+ # ========================================================================= #
75
+ # === reset (reset tag)
76
+ # ========================================================================= #
77
+ def reset
78
+ super()
79
+ infer_the_namespace
80
+ reset_this_instance
81
+ end
82
+
83
+ # ========================================================================= #
84
+ # === reset_this_instance
85
+ # ========================================================================= #
86
+ def reset_this_instance
87
+ # ======================================================================= #
88
+ # === @internal_hash
89
+ # ======================================================================= #
90
+ reset_the_internal_hash
91
+ # ======================================================================= #
92
+ # === :total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum
93
+ #
94
+ # The following ivar keeps track of how many ECTS points
95
+ # are "prüfungsimmanent" in that curriculum.
96
+ # ======================================================================= #
97
+ @internal_hash[:total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum] = 0
98
+ # ======================================================================= #
99
+ # === :dataset
100
+ # ======================================================================= #
101
+ @internal_hash[:dataset] = dataset_from_file_lecture_information
102
+ # ======================================================================= #
103
+ # === :show_the_title_of_the_curriculum
104
+ # ======================================================================= #
105
+ @internal_hash[:show_the_title_of_the_curriculum] = true
106
+ # ======================================================================= #
107
+ # === :total_amount_of_ECTS_points_in_the_curriculum
108
+ # ======================================================================= #
109
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = 180
110
+ # ======================================================================= #
111
+ # === :percentage
112
+ #
113
+ # This variable stores how much percentage from the ECTS was passed.
114
+ # ======================================================================= #
115
+ @internal_hash[:percentage] = 0.0
116
+ # ======================================================================= #
117
+ # === :use_spacer_to_separate_a_new_year
118
+ # ======================================================================= #
119
+ @internal_hash[:use_spacer_to_separate_a_new_year] = false
120
+ # ======================================================================= #
121
+ # === :result
122
+ #
123
+ # Store the result of this class in this instance variable.
124
+ # ======================================================================= #
125
+ @internal_hash[:result] = nil
126
+ # ======================================================================= #
127
+ # === @display_split_line
128
+ #
129
+ # The next instance variable may display a colourized line, if set to
130
+ # true, which will make it easier to visually distinguish between
131
+ # Bachelor and Master-curricula. I like this so I have set it to
132
+ # true, but others may want to not use it, hence why I made it a flag.
133
+ # ======================================================================= #
134
+ @internal_hash[:display_split_line] = true
135
+ end
136
+
137
+ # ========================================================================= #
138
+ # === obtain_default_dataset
139
+ #
140
+ # Simply assign the default dataset, from the file with the passed
141
+ # exams, to the instance variable @dataset.
142
+ # ========================================================================= #
143
+ def obtain_default_dataset
144
+ @internal_hash[:dataset] =
145
+ ::Studium.sanitized_dataset_from_file_passed_exams_per_month
146
+ end
147
+
148
+ # ========================================================================= #
149
+ # === display_split_line?
150
+ # ========================================================================= #
151
+ def display_split_line?
152
+ @internal_hash[:display_split_line]
153
+ end
154
+
155
+ # ========================================================================= #
156
+ # === display_this_array_including_only_mandatory_continuous_assessment_lectures
157
+ #
158
+ # The input to this method will be an Array of mandatory continuous
159
+ # assessment lectures.
160
+ # ========================================================================= #
161
+ def display_this_array_including_only_mandatory_continuous_assessment_lectures(
162
+ array,
163
+ be_verbose = be_verbose?
164
+ )
165
+ case be_verbose
166
+ # ======================================================================= #
167
+ # === nil
168
+ # ======================================================================= #
169
+ when nil
170
+ be_verbose = be_verbose?
171
+ # ======================================================================= #
172
+ # === :be_verbose
173
+ # ======================================================================= #
174
+ when :be_verbose
175
+ be_verbose = true
176
+ end
177
+ consider_displaying_the_title_of_the_curriculum
178
+ # ======================================================================= #
179
+ # Sometimes the input may be a String. In this case, split it up.
180
+ # ======================================================================= #
181
+ if array.is_a? String
182
+ array = return_entries_that_are_of_mandatory_continuous_assessment_type(
183
+ array.split(N)
184
+ )
185
+ end
186
+ # ======================================================================= #
187
+ # Next we can display the result.
188
+ # ======================================================================= #
189
+ sorted_array = array.map {|line|
190
+ line.delete('"')
191
+ }.sort
192
+ sorted_array.each {|line|
193
+ # ===================================================================== #
194
+ # Up to 05.11.2019 this code used to read in the content of a file,
195
+ # but since that day we will instead obtain the information from
196
+ # the file called "lecture_information.yml" instead. A useful
197
+ # side-effect of this is that this approach should be faster
198
+ # than using regexes.
199
+ # ===================================================================== #
200
+ line.strip!
201
+ if line.include? '#'
202
+ line = line[0 .. (line.index('#')-1)]
203
+ line.strip!
204
+ end
205
+ line.squeeze!(' ')
206
+ if dataset?[line].nil?
207
+ opnn; e 'A nil-value was found, for line '+steelblue(line)+'.'
208
+ opnn; e 'Continuing nonetheless.'
209
+ #exit
210
+ else
211
+ n_ects_points = dataset?[line][:ects]
212
+ type_of_the_lecture = dataset?[line][:type]
213
+ # ===================================================================== #
214
+ # Instantly ensure that we have a valid amount of ECTS points.
215
+ # ===================================================================== #
216
+ if n_ects_points == 0.0
217
+ opnn; e swarn('We encountered a problem, a 0.0 ECTS lecture, at: ')+
218
+ lightgreen(line)
219
+ end
220
+ # ===================================================================== #
221
+ # Left-pad the lecture ID.
222
+ # ===================================================================== #
223
+ if line.include? ' '
224
+ splitted = line.split(' ')
225
+ splitted[0] = splitted[0].ljust(7)
226
+ name = splitted.join(' ')
227
+ end
228
+ @internal_hash[:total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum] += n_ects_points
229
+ if be_verbose
230
+ e ' '+orange(
231
+ name.ljust(93)
232
+ )+' '+mediumpurple(
233
+ n_ects_points.to_s.rjust(4)
234
+ )+' ECTS points '+
235
+ seagreen(type_of_the_lecture.to_s.rjust(4)) # <- Last part is type of the lecture.
236
+ end
237
+ end
238
+ }
239
+ e if be_verbose
240
+ do_calculate_the_percentage
241
+ # ======================================================================= #
242
+ # Next, report the total amount of ECTS and some more information.
243
+ # ======================================================================= #
244
+ if be_verbose
245
+ e 'Total amount of ECTS points: '+
246
+ crimson(total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum?.to_s)+
247
+ lightblue(' (== ')+
248
+ seagreen(n_percent?.round(2).to_s+'%')+
249
+ lightblue(' of '+total_amount_of_ECTS_points_in_the_curriculum?.to_s+
250
+ ' ECTS points in total)')
251
+ end
252
+ end
253
+
254
+ # ========================================================================= #
255
+ # === consider_displaying_the_title_of_the_curriculum
256
+ # ========================================================================= #
257
+ def consider_displaying_the_title_of_the_curriculum
258
+ if show_the_title_of_the_curriculum? and be_verbose?
259
+ _ = title?
260
+ if _
261
+ e sfancy(_)
262
+ e
263
+ end
264
+ end
265
+ end
266
+
267
+ # ========================================================================= #
268
+ # === return_entries_that_are_of_mandatory_continuous_assessment_type
269
+ #
270
+ # The input to this method is assumed to come from a file, but you
271
+ # can also load up a String. In that case, the method will split on
272
+ # newlines.
273
+ # ========================================================================= #
274
+ def return_entries_that_are_of_mandatory_continuous_assessment_type(i)
275
+ if i.is_a? String
276
+ i = i.split(N) # Split on newlines.
277
+ end
278
+ i.flatten! if i.is_a? Array
279
+ i.reject! {|line|
280
+ line.strip.start_with?('#') or
281
+ line.strip.empty?
282
+ }
283
+ i.map!(&:strip)
284
+ i.select! {|line|
285
+ line.strip!
286
+ # ===================================================================== #
287
+ # We need to be careful here, because the line may either end with e.
288
+ # g. "VO", or it may end with "VO, BOKU WIEN". The latter would then
289
+ # cause the follow-up code to fail, so we have to filter way such
290
+ # parts first.
291
+ # ===================================================================== #
292
+ if line.end_with? 'BOKU'
293
+ line.sub!(/BOKU$/,'')
294
+ line.strip!
295
+ end
296
+ if line.end_with?('WIEN') or line.end_with?('Wien')
297
+ # =================================================================== #
298
+ # First remove "WIEN" at the end of the line, then strip on the line.
299
+ # =================================================================== #
300
+ line.sub!(/WIEN$/,'')
301
+ line.sub!(/Wien$/,'') if line.end_with? 'Wien'
302
+ line.strip!
303
+ line.sub!(/Uni$/,'') if line.end_with? 'Uni'
304
+ line.strip!
305
+ # =================================================================== #
306
+ # Still have TU, BOKU, VETMED and MEDUNI
307
+ # =================================================================== #
308
+ line.sub!(/BOKU$/,'') if line.end_with? 'BOKU'
309
+ line.sub!(/TU$/,'') if line.end_with? 'TU'
310
+ line.sub!(/VETMED$/,'') if line.end_with? 'VETMED'
311
+ line.sub!(/MEDUNI$/,'') if line.include? 'MEDUNI' # Must come before "UNI".
312
+ line.sub!(/UNI$/,'') if line.end_with? 'UNI'
313
+ line.strip!
314
+ end
315
+ line.chop! if line.end_with? ','
316
+ last_two_characters = line[-2,2]
317
+ ARRAY_LECTURE_TYPES_THAT_ARE_MANDATORY_CONTINUOUS_ASSESSMENT.include? last_two_characters
318
+ }
319
+ return i
320
+ end
321
+
322
+ # ========================================================================= #
323
+ # === show_coloured_spacer
324
+ #
325
+ # This method will show a little coloured spacer. It can also display
326
+ # the number of ECTS for that particular curriculum.
327
+ # ========================================================================= #
328
+ def show_coloured_spacer(
329
+ n_times = 112,
330
+ &block
331
+ )
332
+ if be_verbose?
333
+ result = steelblue('-' * n_times)
334
+ if block_given?
335
+ yielded = yield
336
+ if yielded.is_a? Hash
337
+ if yielded.has_key? :n_ects
338
+ n_ects = yielded.delete(:n_ects)
339
+ result = result.dup if result.frozen?
340
+ result << slateblue(
341
+ ("#{n_ects} ECTS").rjust(12)
342
+ )
343
+ end
344
+ end
345
+ end
346
+ e result
347
+ end
348
+ end
349
+
350
+ # ========================================================================= #
351
+ # === do_not_report_any_findings
352
+ # ========================================================================= #
353
+ def do_not_report_any_findings
354
+ set_be_quiet
355
+ end; alias do_not_report_anything do_not_report_any_findings # === do_not_report_anything
356
+
357
+ # ========================================================================= #
358
+ # === use_spacer_to_separate_a_new_year?
359
+ # ========================================================================= #
360
+ def use_spacer_to_separate_a_new_year?
361
+ @internal_hash[:use_spacer_to_separate_a_new_year]
362
+ end
363
+
364
+ # ========================================================================= #
365
+ # === show_the_title_of_the_curriculum?
366
+ # ========================================================================= #
367
+ def show_the_title_of_the_curriculum?
368
+ @internal_hash[:show_the_title_of_the_curriculum]
369
+ end
370
+
371
+ # ========================================================================= #
372
+ # === do_show_the_title_of_the_curriculum
373
+ # ========================================================================= #
374
+ def do_show_the_title_of_the_curriculum
375
+ @internal_hash[:show_the_title_of_the_curriculum] = true
376
+ end
377
+
378
+ # ========================================================================= #
379
+ # === do_not_show_the_title_of_the_curriculum
380
+ # ========================================================================= #
381
+ def do_not_show_the_title_of_the_curriculum
382
+ @internal_hash[:show_the_title_of_the_curriculum] = false
383
+ end
384
+
385
+ # ========================================================================= #
386
+ # === available_curricula?
387
+ # ========================================================================= #
388
+ def available_curricula?
389
+ ARRAY_REGISTERED_CURRICULA
390
+ end
391
+
392
+ # ========================================================================= #
393
+ # === dataset
394
+ # ========================================================================= #
395
+ def dataset?
396
+ @internal_hash[:dataset]
397
+ end
398
+
399
+ # ========================================================================= #
400
+ # === title?
401
+ # ========================================================================= #
402
+ def title?(i = nil)
403
+ i = map_input_to_this_curriculum_filename(i)
404
+ return_title_from_this_curriculum_file(i)+' '
405
+ end
406
+
407
+ # ========================================================================= #
408
+ # === padded_display_this_array_including_only_mandatory_continuous_assessment_lectures
409
+ # ========================================================================= #
410
+ def padded_display_this_array_including_only_mandatory_continuous_assessment_lectures(
411
+ array, be_verbose_in_the_subsequent_method_call = nil
412
+ )
413
+ e if be_verbose?
414
+ display_this_array_including_only_mandatory_continuous_assessment_lectures(
415
+ array, be_verbose_in_the_subsequent_method_call
416
+ )
417
+ e if be_verbose?
418
+ end
419
+
420
+ # ========================================================================= #
421
+ # === display_these_lectures_sorted_by_priority
422
+ #
423
+ # Do note that we will actually sort in two ways in this method:
424
+ #
425
+ # - First, by priority, which can have values from 1 up to 5
426
+ # - Second, by the amount of ECTS points. Lectures that have
427
+ # more ECTS points will be displayed first.
428
+ #
429
+ # ========================================================================= #
430
+ def display_these_lectures_sorted_by_priority(
431
+ i, priority_to_use = [5,4,3,2,1]
432
+ )
433
+ if priority_to_use.is_a? Array
434
+ priority_to_use.each {|entry|
435
+ # =================================================================== #
436
+ # Call this method recursively.
437
+ # =================================================================== #
438
+ display_these_lectures_sorted_by_priority(i, entry)
439
+ }
440
+ else
441
+ if be_verbose?
442
+ # =================================================================== #
443
+ # Show a little header, to notify the user which Priority-setting
444
+ # is currently shown.
445
+ # =================================================================== #
446
+ smiley_face = ''
447
+ if use_unicode_symbols? and Object.const_defined?(:Roebe)
448
+ smiley_face = lightseagreen(Roebe.smiley_face)
449
+ end
450
+ e sfancy("Priority #{priority_to_use.to_s}: #{smiley_face}")
451
+ e
452
+ end
453
+ matching_priority = i.select {|a, b| b[:priority] == priority_to_use }
454
+ counter = 0
455
+ sorted_by_n_ECTS_points_of_matching_priority = matching_priority.sort_by {|a, b|
456
+ b[:ects]
457
+ }.reverse
458
+ sorted_by_n_ECTS_points_of_matching_priority.each {|name, inner_hash| counter += 1
459
+ name = name.first if name.is_a? Array
460
+ n_ects_points = inner_hash[:ects]
461
+ university = inner_hash[:university]
462
+ lecture_type = inner_hash[:type]
463
+ summer_or_winter = inner_hash[:semester]
464
+ outdated_lecture = inner_hash[:outdated_lecture]
465
+ next if outdated_lecture == true
466
+ curricula_entries = obtain(:curricula_entries, inner_hash)
467
+ currently_participating_in_this_course = inner_hash[:currently_participating_in_this_course]
468
+ if currently_participating_in_this_course
469
+ # ================================================================= #
470
+ # Lectures that we are presently doing in the current semester
471
+ # will be shown in skyblue rather than slateblue.
472
+ # ================================================================= #
473
+ colourized_name_of_the_lecture = skyblue(name)
474
+ else
475
+ colourized_name_of_the_lecture = slateblue(name)
476
+ end
477
+ # =================================================================== #
478
+ # Colourize the ECTS points, in seagreen and lightseeagreen.
479
+ # Also show the lecture type and the university.
480
+ # =================================================================== #
481
+ colourized_n_ects_points = seagreen('(n ECTS: '+n_ects_points.to_s+', ')+
482
+ lightseagreen(lecture_type)+ # <- Display the lecture type here.
483
+ seagreen(', ')
484
+ unless summer_or_winter.nil?
485
+ colourized_summer_or_winter = mediumseagreen(summer_or_winter.to_s)
486
+ colourized_n_ects_points << colourized_summer_or_winter+
487
+ seagreen(', ')
488
+ end
489
+ colourized_n_ects_points << olivedrab(university)
490
+ colourized_n_ects_points << seagreen(', ')
491
+ colourized_n_ects_points << crimson(bachelor_or_master(curricula_entries))
492
+ # =================================================================== #
493
+ # Add the closing ')' next.
494
+ # =================================================================== #
495
+ colourized_n_ects_points << seagreen(')')
496
+ if be_verbose?
497
+ e slategray(counter.to_s.rjust(2))+' '+
498
+ colourized_name_of_the_lecture+' '+
499
+ colourized_n_ects_points
500
+ end
501
+ }
502
+ e if be_verbose?
503
+ end
504
+ end
505
+
506
+ # ========================================================================= #
507
+ # === bachelor_or_master
508
+ #
509
+ # This method will return a String, either "Bachelor" or "Master" or
510
+ # "Bachelor/Master".
511
+ # ========================================================================= #
512
+ def bachelor_or_master(i)
513
+ result = ''.dup
514
+ if is_a_bachelor_lecture?(i)
515
+ result << 'Bachelor'
516
+ end
517
+ if has_a_master_curriculum?(i) # is_a_master_lecture?(i) # ← Changed this in January 2023.
518
+ unless result.empty?
519
+ result << '/'
520
+ end
521
+ result << 'Master'
522
+ end
523
+ return result
524
+ end
525
+
526
+ # ========================================================================= #
527
+ # === total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum?
528
+ # ========================================================================= #
529
+ def total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum?
530
+ @internal_hash[:total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum]
531
+ end; alias n_prüfungsimmanente_ECTS? total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum? # === n_prüfungsimmanente_ECTS?
532
+ alias n_mandatory_ects_points_in_this_curriculum? total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum? # === n_mandatory_ects_points_in_this_curriculum?
533
+ alias n_mandatory_ects_points_in_this_curriculum total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum? # === n_mandatory_ects_points_in_this_curriculum?
534
+
535
+ # ========================================================================= #
536
+ # === total_amount_of_ects_points_in_the_curriculum
537
+ # ========================================================================= #
538
+ def total_amount_of_ects_points_in_the_curriculum?
539
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum]
540
+ end; alias n_total_ects_points total_amount_of_ects_points_in_the_curriculum? # === n_total_ects_points
541
+ alias total_amount_of_ECTS_points_in_the_curriculum? total_amount_of_ects_points_in_the_curriculum? # === total_amount_of_ECTS_points_in_the_curriculum?
542
+
543
+ # ========================================================================= #
544
+ # === do_assume_180_ects_points
545
+ # ========================================================================= #
546
+ def do_assume_180_ects_points
547
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = 180
548
+ end
549
+
550
+ # ========================================================================= #
551
+ # === do_compare_the_registered_curricula_quickly
552
+ # ========================================================================= #
553
+ def do_compare_the_registered_curricula_quickly(
554
+ i = :show_more_details_but_without_the_title
555
+ )
556
+ cliner { :mediumaquamarine }
557
+ Studium.return_registered_standalone_curricula.each {|this_curriculum|
558
+ do_determine_the_prüfungsimmanente_ECTS_of_this_curriculum(this_curriculum)
559
+ }
560
+ cliner { :mediumaquamarine }
561
+ end
562
+
563
+ # ========================================================================= #
564
+ # === do_compare_the_registered_curricula
565
+ #
566
+ # This method can be used to compare different curricula for their
567
+ # mandatory ECTS points, in a batch-processive manner.
568
+ #
569
+ # To invoke this method from the commandline, do:
570
+ #
571
+ # mandatory --compare
572
+ #
573
+ # ========================================================================= #
574
+ def do_compare_the_registered_curricula(
575
+ show_details = false
576
+ )
577
+ do_not_report_any_findings
578
+ # ======================================================================= #
579
+ # Do not use the combined bachelor-master vector curriculum though.
580
+ # The following method-call ensures that.
581
+ # ======================================================================= #
582
+ report_these_curricula = ::Studium.return_registered_standalone_curricula
583
+ report_these_curricula << :indi1
584
+ report_these_curricula << :indi2
585
+ report_these_curricula << :indi3
586
+ report_these_curricula << :indi4
587
+ e
588
+ e "#{rev} Comparing the number of ECTS points assigned to "\
589
+ "mandatory-presence"
590
+ e ' courses in different curricula:'
591
+ e
592
+ # ======================================================================= #
593
+ # Iterate over these curricula next:
594
+ # ======================================================================= #
595
+ report_these_curricula.each_with_index {|this_curriculum, index| index += 1
596
+ # ===================================================================== #
597
+ # We will next delegate towards class MandatoryContinuousAssessment,
598
+ # which will tell us how many ECTS points are mandatory.
599
+ #
600
+ # bl MandatoryContinuousAssessment
601
+ #
602
+ # ===================================================================== #
603
+ _ = Studium::Exams::MandatoryContinuousAssessment.new(this_curriculum) { :do_not_report_anything }
604
+ n_ects_points_that_are_mandatory = _.n_mandatory_ects_points_in_this_curriculum?.to_s.rjust(5)
605
+ n_ects_points_in_total_in_this_curriculum = _.n_total_ects_points
606
+ title_of_the_curriculum = _.title?(this_curriculum)
607
+ if title_of_the_curriculum.nil?
608
+ # =================================================================== #
609
+ # Report missing title next:
610
+ # =================================================================== #
611
+ e "This curriculum (#{sfancy(this_curriculum)}) has no title."
612
+ e 'This is currently not allowed. Please correct this error in that .yml file.'
613
+ exit
614
+ end
615
+ if title_of_the_curriculum and title_of_the_curriculum.is_a?(String)
616
+ title_of_the_curriculum = title_of_the_curriculum.dup if title_of_the_curriculum.frozen?
617
+ title_of_the_curriculum.strip!
618
+ end
619
+ # ===================================================================== #
620
+ # If the title of the curriculum is too long, chop it down.
621
+ # ===================================================================== #
622
+ threshold_value = 55
623
+ title_of_the_curriculum = ''.dup if title_of_the_curriculum.nil?
624
+ if title_of_the_curriculum.size > threshold_value
625
+ title_of_the_curriculum = "#{title_of_the_curriculum[0 .. threshold_value]} [...]"
626
+ end
627
+ if title_of_the_curriculum.include? 'Master'
628
+ if display_split_line?
629
+ # ================================================================= #
630
+ # Display a horizontal-line next, coloured in springgreen, as
631
+ # visual separator:
632
+ # ================================================================= #
633
+ e springgreen(
634
+ ' '+('-' * N_TOKENS_FOR_THE_SPRINGREEN_SPACER)
635
+ )
636
+ @internal_hash[:display_split_line] = false # We already displayed it once.
637
+ end
638
+ end
639
+ padded_index = " (#{index}".rjust(4)+') '
640
+ colourized_and_padded_index = mediumpurple(padded_index)
641
+ formatted_percentage_value = _.percentage?.round(2).to_s.ljust(5,'0')
642
+ # ===================================================================== #
643
+ # Pad the title of the curriculum a little next:
644
+ # ===================================================================== #
645
+ padded_title_of_the_curriculum = title_of_the_curriculum.ljust(threshold_value+7)
646
+ n_percent_solved = Studium.n_percent_solved_in_this_curriculum(this_curriculum)
647
+ # ===================================================================== #
648
+ # We will display the two major individual curricula, about "Vektorsysteme",
649
+ # in a slightly brighter colour:
650
+ # ===================================================================== #
651
+ if padded_title_of_the_curriculum.include? 'Vektor'
652
+ colourized_and_padded_title_of_the_curriculum = mediumturquoise(padded_title_of_the_curriculum)
653
+ else
654
+ colourized_and_padded_title_of_the_curriculum = sfancy(padded_title_of_the_curriculum)
655
+ end
656
+ # ===================================================================== #
657
+ # First comes the index, then the title of the curriculum at hand.
658
+ # The index is presently colourized in 'mediumpurple'.
659
+ # ===================================================================== #
660
+ e colourized_and_padded_index+ # <- First show the colourized and padded index.
661
+ colourized_and_padded_title_of_the_curriculum+
662
+ powderblue(n_ects_points_that_are_mandatory)+' ECTS in '+
663
+ seagreen('mandatory-courses')+' (total ECTS: '+
664
+ powderblue(n_ects_points_in_total_in_this_curriculum.to_s)+
665
+ ', '+slateblue(formatted_percentage_value+'%')+' share'+
666
+ ', '+seagreen(n_percent_solved.round(1).to_s.rjust(4)+'%')+' solved'+
667
+ ')'
668
+ # ===================================================================== #
669
+ # Enter this clause if the user wants to show some more details.
670
+ # ===================================================================== #
671
+ case show_details
672
+ # ===================================================================== #
673
+ # === :show_more_details_but_without_the_title
674
+ #
675
+ # This variant will show more details, that is, every course will be
676
+ # shown on a new line each.
677
+ # ===================================================================== #
678
+ when :show_more_details_but_without_the_title
679
+ Studium::Exams::MandatoryContinuousAssessment.new(this_curriculum) { :do_not_report_the_title }
680
+ # ===================================================================== #
681
+ # === :show_details
682
+ # ===================================================================== #
683
+ when :show_details,
684
+ :show_more_details
685
+ Studium::Exams::MandatoryContinuousAssessment.new(this_curriculum)
686
+ end
687
+ }; e
688
+ end
689
+
690
+ # ========================================================================= #
691
+ # === do_assume_300_ects_points
692
+ # ========================================================================= #
693
+ def do_assume_300_ects_points
694
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = 300
695
+ end; alias do_assume_300_points do_assume_300_ects_points # === do_assume_300_points
696
+
697
+ # ========================================================================= #
698
+ # === do_assume_120_ects_points
699
+ # ========================================================================= #
700
+ def do_assume_120_ects_points
701
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = 120
702
+ end
703
+
704
+ # ========================================================================= #
705
+ # === show_help (help tag)
706
+ #
707
+ # Display the following help-instructions like so from the commandline:
708
+ #
709
+ # mandatory --help
710
+ #
711
+ # ========================================================================= #
712
+ def show_help
713
+ e
714
+ e "These options are available for "\
715
+ "#{orange('class Studium::Exams::MandatoryContinuousAssessment')}:"
716
+ e
717
+ eparse ' --all # show all mandatory continuous assessment '\
718
+ 'lectures that were already completed successfully'
719
+ eparse ' --available # show the available curricula for '\
720
+ 'use with this class'
721
+ e
722
+ e "The other way to use this class is to pass in the "\
723
+ "#{powderblue('name of a specific curriculum')}."
724
+ e
725
+ e 'The class will then figure out how much, in percent and '\
726
+ 'amount of ECTS numbers,'
727
+ e 'that particular curriculum will have "prüfungsimmanente '\
728
+ 'Lehrveranstaltungen".'
729
+ e
730
+ e 'Usage examples:'
731
+ e
732
+ e lightseagreen(' mandatory vectorx')+' '\
733
+ '# vectorx ist Bachelor und Master kombiniert.'
734
+ e "#{lightseagreen(' mandatory master-vectorx')} "\
735
+ "# Only show the master-lectures here"
736
+ e lightseagreen(' mandatory --bachelor-genetics')+' '\
737
+ '# the genetics curriculum at '\
738
+ 'the university of vienna'
739
+ e
740
+ e 'To show all curricula, do:'
741
+ e
742
+ epowderblue(' --all_curricula')
743
+ e
744
+ e 'To show passed exams per (specific) year, do:'
745
+ e
746
+ epowderblue(' --2017')
747
+ epowderblue(' --2016')
748
+ e
749
+ e 'To show which mandatory lectures may be upcoming, you '\
750
+ 'can use any of the following:'
751
+ e
752
+ e ' mandatory --upcoming'
753
+ e ' mandatory --todo'
754
+ e ' mandatory --next'
755
+ e
756
+ e 'These will be sorted based on priority; higher priority '\
757
+ 'comes first'
758
+ e
759
+ e 'If you want to compare all registered (thus, available) '\
760
+ 'curricula, then use the following command:'
761
+ e
762
+ epowderblue(' mandatory --compare')
763
+ e
764
+ e 'And if you want more details:'
765
+ e
766
+ epowderblue(' mandatory --compare-detail')
767
+ e
768
+ e 'To only show master-lectures, try:'
769
+ e
770
+ epowderblue(' mandatory --only-master')
771
+ e
772
+ e 'If you only want lectures in the winter-semester, use this:'
773
+ e
774
+ epowderblue(' mandatory --wintersemester')
775
+ e
776
+ e 'To select only courses for summer or winter term, use either of the following:'
777
+ e
778
+ epowderblue(' mandatory --summer')
779
+ epowderblue(' mandatory --winter')
780
+ e
781
+ end
782
+
783
+ # ========================================================================= #
784
+ # === filter_for_lectures_at_the_BOKU
785
+ # ========================================================================= #
786
+ def filter_for_lectures_at_the_BOKU
787
+ dataset?.select! {|name_of_the_lecture, hash_inner_dataset|
788
+ hash_inner_dataset[:university] == 'BOKU'
789
+ }
790
+ end
791
+
792
+ # ========================================================================= #
793
+ # === filter_for_lectures_at_the_TU_Vienna
794
+ # ========================================================================= #
795
+ def filter_for_lectures_at_the_TU_Vienna
796
+ dataset?.select! {|name_of_the_lecture, hash_inner_dataset|
797
+ hash_inner_dataset[:university] == 'TU Vienna'
798
+ }
799
+ end
800
+
801
+ # ========================================================================= #
802
+ # === set_result
803
+ # ========================================================================= #
804
+ def set_result(i)
805
+ @internal_hash[:result] = i
806
+ end
807
+
808
+ # ========================================================================= #
809
+ # === do_show_all_passed_mandatory_continuous_assessments_from_this_year
810
+ #
811
+ # The input argument denotes the year. If the exam was passed in that
812
+ # year, then it will be shown.
813
+ #
814
+ # Invocation example:
815
+ #
816
+ # mandatory --2017
817
+ #
818
+ # ========================================================================= #
819
+ def do_show_all_passed_mandatory_continuous_assessments_from_this_year(the_year)
820
+ obtain_default_dataset
821
+ set_result dataset?.select {|line|
822
+ splitted = line.split('|').map(&:strip)
823
+ year = splitted.first.strip.split('.').last
824
+ lecture_type = splitted[6] # <- This is the right entry.
825
+ ARRAY_LECTURE_TYPES_THAT_ARE_MANDATORY_CONTINUOUS_ASSESSMENT.include?(lecture_type) &&
826
+ (the_year == year) # Make the year-check here.
827
+ }
828
+ report_result # Report it as we assigned the result above.
829
+ end
830
+
831
+ # ========================================================================= #
832
+ # === n_ects_points
833
+ #
834
+ # This method can be used to directly set the amount of
835
+ # ECTS points in the given curriculum.
836
+ # ========================================================================= #
837
+ def n_ects_points(i = 120)
838
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = i.to_i
839
+ end
840
+
841
+ # ========================================================================= #
842
+ # === menu (menu tag)
843
+ # ========================================================================= #
844
+ def menu(
845
+ i = commandline_arguments?
846
+ )
847
+ if i.is_a? Array
848
+ i.each {|entry| menu(entry) }
849
+ else
850
+ case i # (case tag)
851
+ # ===================================================================== #
852
+ # === mandatory --summer
853
+ # ===================================================================== #
854
+ when /^-?-?s(u|o)?mmer$/i
855
+ filter_for_lectures_during_the_summer
856
+ # ===================================================================== #
857
+ # === mandatory --winter
858
+ # ===================================================================== #
859
+ when /^-?-?winter$/i
860
+ filter_for_lectures_during_the_winter
861
+ # ===================================================================== #
862
+ # === mandatory --do-compare-the-registered-curricula-quickly
863
+ #
864
+ # This entry point was added in December 2022.
865
+ # ===================================================================== #
866
+ when /^-?-?do(-|_)?compare(-|_)?the(-|_)?registered(-|_)?curricula(-|_)?quickly$/i
867
+ do_compare_the_registered_curricula_quickly
868
+ exit
869
+ # ===================================================================== #
870
+ # === mandatory --upcoming
871
+ # ===================================================================== #
872
+ when /^-?-?upcoming$/i,
873
+ /^-?-?todo$/i,
874
+ /^-?-?next$/i,
875
+ /^-?-?show(-|_)?all$/i
876
+ show_upcoming_mandatory_continuous_assessments { commandline_arguments? }
877
+ exit
878
+ # ===================================================================== #
879
+ # === mandatory --compare
880
+ # ===================================================================== #
881
+ when /^-?-?compare$/i
882
+ do_compare_the_registered_curricula
883
+ exit
884
+ # ===================================================================== #
885
+ # === mandatory --show-all-passed-mandatory-continuous-assessments
886
+ # ===================================================================== #
887
+ when /^-?-?show(-|_)?all(-|_)?passed(-|_)?mandatory(-|_)?continuous(-|_)?assessments$/i,
888
+ /^-?-?all$/i
889
+ do_show_all_passed_mandatory_continuous_assessments
890
+ # ===================================================================== #
891
+ # === mandatory --boku --summer
892
+ # ===================================================================== #
893
+ when /^-?-?BOKU$/i
894
+ filter_for_lectures_at_the_BOKU
895
+ # ===================================================================== #
896
+ # === mandatory --tuwien --summer
897
+ # ===================================================================== #
898
+ when /^-?-?tuwien$/i,
899
+ /^-?-?tuvienna$/i
900
+ filter_for_lectures_at_the_TU_Vienna
901
+ # ===================================================================== #
902
+ # === mandatory_assessment --all
903
+ #
904
+ # Show all the mandatory continuous assessment lectures that were
905
+ # passed so far.
906
+ # ===================================================================== #
907
+ when /-?-?all$/i,
908
+ /-?-?everything$/i,
909
+ /-?-?default$/i
910
+ @internal_hash[:use_spacer_to_separate_a_new_year] = true
911
+ :show_all_passed_mandatory_continuous_assessments
912
+ # ===================================================================== #
913
+ # === mandatory --only-wintersemester
914
+ # ===================================================================== #
915
+ when /^-?-?only(-|_)?wintersemester$/i,
916
+ /^-?-?wintersemester$/i
917
+ dataset?.select! {|a,b|
918
+ semester = obtain(:semester, b, :be_quiet)
919
+ semester == 'winter'
920
+ }
921
+ show_upcoming_mandatory_continuous_assessments(
922
+ dataset?
923
+ )
924
+ # ===================================================================== #
925
+ # === mandatory_assessment --all_curricula
926
+ #
927
+ # Show all the different curricula - at the least those that were
928
+ # registered in the main Array.
929
+ # ===================================================================== #
930
+ when /-?-?all(_|-)?curricula$/i
931
+ show_all_available_curricula
932
+ # ===================================================================== #
933
+ # === mandatory_assignment --2018
934
+ # ===================================================================== #
935
+ when /^-?-?(\d{4})$/
936
+ the_year = $1.to_s.dup
937
+ do_show_all_passed_mandatory_continuous_assessments_from_this_year(the_year)
938
+ exit
939
+ # ===================================================================== #
940
+ # === mandatory_assessment --available
941
+ # ===================================================================== #
942
+ when /-?-?available/
943
+ e; available_curricula?.each {|entry| e " - #{sfancy(entry)}" }; e
944
+ # ===================================================================== #
945
+ # === mandatory_assessment --help
946
+ # ===================================================================== #
947
+ when /help/
948
+ show_help
949
+ exit
950
+ # ===================================================================== #
951
+ # === mandatory --compare-details
952
+ #
953
+ # This variant is different to --compare in that we will get a good
954
+ # overview of the individual lectures as well.
955
+ # ===================================================================== #
956
+ when /^-?-?compare(-|_)?details?$/i,
957
+ /^-?-?compare(-|_)?stats$/i,
958
+ /^-?-?details$/i
959
+ do_compare_the_registered_curricula(
960
+ :show_more_details_but_without_the_title
961
+ )
962
+ exit
963
+ end
964
+ end
965
+ end
966
+
967
+ # ========================================================================= #
968
+ # === run (run tag)
969
+ # ========================================================================= #
970
+ def run
971
+ _ = first_argument?
972
+ menu
973
+ if _.is_a?(String) and _.include?('# ') # Assume that the user passed in a String with all the lectures here.
974
+ e if be_verbose?
975
+ display_this_array_including_only_mandatory_continuous_assessment_lectures(_)
976
+ e if be_verbose?
977
+ else
978
+ # =================================================================== #
979
+ # Else we will try to find that particular curriculum at hand.
980
+ # =================================================================== #
981
+ do_determine_the_prüfungsimmanente_ECTS_of_this_curriculum(_)
982
+ end
983
+ end
984
+
985
+ # ========================================================================= #
986
+ # === epowderblue
987
+ # ========================================================================= #
988
+ def epowderblue(i)
989
+ e powderblue(i) if be_verbose?
990
+ end
991
+
992
+ # ========================================================================= #
993
+ # === set_percentage
994
+ # ========================================================================= #
995
+ def set_percentage(i)
996
+ @internal_hash[:percentage] = i.to_f
997
+ end
998
+
999
+ # ========================================================================= #
1000
+ # === percentage?
1001
+ # ========================================================================= #
1002
+ def percentage?
1003
+ @internal_hash[:percentage]
1004
+ end; alias n_percent? percentage? # === n_percent?
1005
+
1006
+ # ========================================================================= #
1007
+ # === do_show_all_passed_mandatory_continuous_assessments
1008
+ #
1009
+ # This method will show all "prüfungsimmanente" Lehrveranstaltungen.
1010
+ # ========================================================================= #
1011
+ def do_show_all_passed_mandatory_continuous_assessments
1012
+ obtain_default_dataset
1013
+ # ======================================================================= #
1014
+ # Next, grab all entries that are "prüfungsimmanent". These are those
1015
+ # types that are part of the array-constant, so, UE, PS, SE, LU and
1016
+ # so forth. These all have mandatory continuous assessment parts.
1017
+ # ======================================================================= #
1018
+ set_result dataset?.select {|line|
1019
+ splitted = line.split('|').map(&:strip)
1020
+ lecture_type = splitted[6] # <- This is the right entry.
1021
+ is_included = ARRAY_LECTURE_TYPES_THAT_ARE_MANDATORY_CONTINUOUS_ASSESSMENT.include? lecture_type
1022
+ is_included
1023
+ }
1024
+ report_result # Report it as we assigned the result above.
1025
+ end
1026
+
1027
+ # ========================================================================= #
1028
+ # === show_all_available_curricula
1029
+ #
1030
+ # This is a powerhorse method - it will simply show all curricula and
1031
+ # the respective "prüfungsimmanente Lehrveranstaltungen" in these
1032
+ # curricula.
1033
+ #
1034
+ # Invocation example:
1035
+ #
1036
+ # mandatory --all_curricula
1037
+ #
1038
+ # ========================================================================= #
1039
+ def show_all_available_curricula
1040
+ do_not_be_verbose
1041
+ _ = available_curricula?
1042
+ _.each_with_index {|curriculum, index| index += 1
1043
+ reset_this_instance
1044
+ try_to_find_this_curriculum(curriculum, index) { :be_verbose }
1045
+ }
1046
+ end
1047
+
1048
+ # ========================================================================= #
1049
+ # === report_result
1050
+ #
1051
+ # Note that by default, this works on the variable @result. So if you
1052
+ # modify that variable, you are already half-way done. Otherwise, if
1053
+ # you need another dataset, you can pass in another dataset as an
1054
+ # argument to this method.
1055
+ # ========================================================================= #
1056
+ def report_result(
1057
+ _ = result?
1058
+ )
1059
+ if be_verbose?
1060
+ if _
1061
+ total_ects = 0
1062
+ n_ects_in_this_year = 0
1063
+ last_year = Time.now.year
1064
+ e; _.each_with_index {|line, index|
1065
+ # =================================================================== #
1066
+ # A line may look like this:
1067
+ # 21.04.2015 | 2.0 | 2.0 | 1 | UniWien | B | UE | 300632 | 2016S | Übungen zu Grundlagen in der Bioinformatik\n
1068
+ # =================================================================== #
1069
+ index += 1
1070
+ splitted = line.split('|').map(&:strip)
1071
+ name = splitted.last # The name of the lecture.
1072
+ exam_date = splitted.first
1073
+ the_year = exam_date.split('.').last.to_i
1074
+ lecture_type = splitted[6]
1075
+ n_ects = splitted[2].to_f # Amount of ECTS points.
1076
+ n_ects_in_this_year += n_ects
1077
+ total_ects += n_ects
1078
+ padded_name = name.ljust(90)
1079
+ if @internal_hash[:use_spacer_to_separate_a_new_year] and
1080
+ !(the_year == last_year)
1081
+ # =============================================================== #
1082
+ # Show a little coloured spacer next:
1083
+ # =============================================================== #
1084
+ show_coloured_spacer {{ n_ects: n_ects_in_this_year }}
1085
+ n_ects_in_this_year = 0 # And reset it again.
1086
+ last_year = the_year
1087
+ end
1088
+ # ================================================================= #
1089
+ # Report our findings finally. This begins with a leading
1090
+ # index in orange colour.
1091
+ # ================================================================= #
1092
+ e orange((index.to_s+')').rjust(4))+' '+
1093
+ padded_name+
1094
+ turquoise(' ('+exam_date.to_s+')')+' '+
1095
+ crimson(lecture_type.center(5))+' '+
1096
+ royalblue(n_ects.to_s.rjust(4)+' ECTS')
1097
+ }; e
1098
+ e "In total we completed #{violet(total_ects.to_s)} ECTS "\
1099
+ "points in #{orange(_.size.to_s)} different courses."
1100
+ e
1101
+ end
1102
+ end
1103
+ end; alias report report_result # === report
1104
+
1105
+ # ========================================================================= #
1106
+ # === show_upcoming_mandatory_continuous_assessments
1107
+ #
1108
+ # This method will show upcoming courses that have a mandatory
1109
+ # assessment/attendance component ("prüfungsimmanente Lehrveranstaltungen").
1110
+ #
1111
+ # To invoke this method from the commandline, do:
1112
+ #
1113
+ # mandatory --upcoming
1114
+ #
1115
+ # ========================================================================= #
1116
+ def show_upcoming_mandatory_continuous_assessments(
1117
+ use_this_dataset = dataset?
1118
+ )
1119
+ _ = use_this_dataset
1120
+ # ======================================================================= #
1121
+ # First check if the commandline includes "master".
1122
+ # ======================================================================= #
1123
+ joined = commandline?.join(' ')
1124
+ if joined.include?('master') and joined.include?('only')
1125
+ _.select! {|name_of_the_lecture, inner_hash|
1126
+ curricula = obtain(:curricula, inner_hash)
1127
+ has_a_master_lecture?(curricula)
1128
+ }
1129
+ end
1130
+ # ======================================================================= #
1131
+ # Next, select only "prüfungsimmanente" courses that were NOT yet
1132
+ # solved:
1133
+ # ======================================================================= #
1134
+ _.select! {|name_of_the_lecture, inner_hash|
1135
+ lecture_type = inner_hash[:type]
1136
+ already_solved = inner_hash[:already_solved]
1137
+ case lecture_type
1138
+ when *ARRAY_LECTURE_TYPES_THAT_ARE_MANDATORY_CONTINUOUS_ASSESSMENT
1139
+ keep_or_discard = true
1140
+ else
1141
+ keep_or_discard = false
1142
+ end
1143
+ # ======================================================================= #
1144
+ # Next, ignore the lectures that were already solved.
1145
+ # ======================================================================= #
1146
+ if already_solved
1147
+ keep_or_discard = false
1148
+ end
1149
+ keep_or_discard
1150
+ }
1151
+ # ======================================================================= #
1152
+ # Next, scan for filters. This is a bit hack-ish but for now it works.
1153
+ # ======================================================================= #
1154
+ if block_given?
1155
+ yielded = yield
1156
+ if yielded.is_a? Array
1157
+ joined = yielded.join(' ').strip
1158
+ # =================================================================== #
1159
+ # === übungen --summer
1160
+ # =================================================================== #
1161
+ if joined.include? '--summer'
1162
+ _.select! {|name_of_the_lecture, inner_hash|
1163
+ inner_hash[:semester].to_s.downcase == 'summer'
1164
+ }
1165
+ end
1166
+ # =================================================================== #
1167
+ # === übungen --winter
1168
+ # =================================================================== #
1169
+ if joined.include? '--winter'
1170
+ _.select! {|name_of_the_lecture, inner_hash|
1171
+ inner_hash[:semester].to_s.downcase == 'winter'
1172
+ }
1173
+ end
1174
+ end
1175
+ end
1176
+ # ======================================================================= #
1177
+ # Ok, we now have the courses that are "prüfungsimmanent" and NOT yet
1178
+ # solved.
1179
+ # ======================================================================= #
1180
+ display_these_lectures_sorted_by_priority(_)
1181
+ end
1182
+
1183
+ # ========================================================================= #
1184
+ # === do_determine_the_prüfungsimmanente_ECTS_of_this_curriculum
1185
+ # ========================================================================= #
1186
+ def do_determine_the_prüfungsimmanente_ECTS_of_this_curriculum(
1187
+ i,
1188
+ optional_index = nil,
1189
+ be_verbose = be_verbose?
1190
+ )
1191
+ i = i.to_s # To avoid Symbols.
1192
+ dataset = dataset?
1193
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] = 0
1194
+ curriculum_dataset = fetch_this_curriculum(i) { :be_quiet }
1195
+ @internal_hash[:total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum] = 0
1196
+ # ======================================================================= #
1197
+ # === Handle blocks next
1198
+ # ======================================================================= #
1199
+ if block_given?
1200
+ yielded = yield
1201
+ case yielded
1202
+ when :be_verbose
1203
+ be_verbose = true
1204
+ end
1205
+ end
1206
+ if optional_index and be_verbose
1207
+ # ===================================================================== #
1208
+ # Report the curriculum number in this case as well.
1209
+ # ===================================================================== #
1210
+ e
1211
+ e springgreen('Curriculum number: ')+
1212
+ slateblue(optional_index.to_s)+
1213
+ limegreen(" (#{name_of_the_curriculum?})")
1214
+ e
1215
+ end
1216
+ if curriculum_dataset
1217
+ if be_verbose and show_the_title_of_the_curriculum?
1218
+ print steelblue(
1219
+ (
1220
+ return_title_from_this_curriculum_file(i)+' '
1221
+ ).ljust(58)
1222
+ )
1223
+ end
1224
+ curriculum_dataset.each {|name_of_the_lecture|
1225
+ pointer = dataset[name_of_the_lecture]
1226
+ if pointer.nil?
1227
+ e tomato('Nil value for ')+
1228
+ steelblue(name_of_the_lecture)
1229
+ else
1230
+ n_ECTS = pointer[:ects]
1231
+ type = pointer[:type]
1232
+ if is_this_a_prüfungsimmanent_course?(type)
1233
+ @internal_hash[:total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum] += n_ECTS
1234
+ end
1235
+ @internal_hash[:total_amount_of_ECTS_points_in_the_curriculum] += n_ECTS
1236
+ end
1237
+ }
1238
+ do_calculate_the_percentage
1239
+ formatted_percentage_value = percentage?.round(2).to_s.ljust(5,'0')
1240
+ n_percent_solved = Studium.n_percent_solved_in_this_curriculum(i)
1241
+ if be_verbose?
1242
+ e "#{lightblue(n_prüfungsimmanente_ECTS?)}"\
1243
+ " #{lightblue('ECTS')} "+
1244
+ moccasin('out of')+
1245
+ " "+
1246
+ royalblue(@internal_hash[:total_amount_of_ECTS_points_in_the_curriculum].to_s.rjust(5))+" "+
1247
+ moccasin('ECTS - ')+
1248
+ (
1249
+ slateblue(formatted_percentage_value+'%')+
1250
+ moccasin(' mandatory-presence share ')+
1251
+ moccasin('and ')+
1252
+ seagreen(
1253
+ n_percent_solved.round(1).to_s.rjust(4)
1254
+ )+
1255
+ moccasin('% solved already.')
1256
+ )
1257
+ end
1258
+ else
1259
+ opne "Could not find anything for the given input `#{steelblue(i)}`."
1260
+ end
1261
+ end; alias try_to_find_this_curriculum do_determine_the_prüfungsimmanente_ECTS_of_this_curriculum # === try_to_find_this_curriculum
1262
+
1263
+ # ========================================================================= #
1264
+ # === do_calculate_the_percentage
1265
+ #
1266
+ # This method will calculate the percentage of ects points in
1267
+ # courses with mandatory-attendance.
1268
+ # ========================================================================= #
1269
+ def do_calculate_the_percentage(
1270
+ n_ects_in_mandatory_courses = total_amount_of_mandatory_continuous_assessment_ECTS_points_in_this_curriculum?,
1271
+ n_total_ects_points_in_the_curriculum = total_amount_of_ECTS_points_in_the_curriculum?
1272
+ )
1273
+ n_percent = (
1274
+ n_ects_in_mandatory_courses.to_f * 100
1275
+ ) / n_total_ects_points_in_the_curriculum
1276
+ # ======================================================================= #
1277
+ # Note that this method will also set the percentage.
1278
+ # ======================================================================= #
1279
+ set_percentage(n_percent) # Set the percentage here as well.
1280
+ end
1281
+
1282
+ # ========================================================================= #
1283
+ # === filter_for_lectures_during_the_summer
1284
+ #
1285
+ # This method will filter for lectures during summer - in other words,
1286
+ # lectures that are during winter, will specifically be excluded.
1287
+ # ========================================================================= #
1288
+ def filter_for_lectures_during_the_summer(
1289
+ this_semester = 'summer'
1290
+ )
1291
+ dataset?.select! {|name_of_the_lecture, hash_inner_dataset|
1292
+ (hash_inner_dataset[:semester] == this_semester) or
1293
+ (hash_inner_dataset[:semester] == 'both') # Allowed since as of February 2023.
1294
+ }
1295
+ end
1296
+
1297
+ # ========================================================================= #
1298
+ # === filter_for_lectures_during_the_winter
1299
+ #
1300
+ # This method will filter for lectures during winter - in other words,
1301
+ # lectures that are during summer, will specifically be excluded.
1302
+ # ========================================================================= #
1303
+ def filter_for_lectures_during_the_winter(
1304
+ this_semester = 'winter'
1305
+ )
1306
+ dataset?.select! {|name_of_the_lecture, hash_inner_dataset|
1307
+ (hash_inner_dataset[:semester] == this_semester) or
1308
+ (hash_inner_dataset[:semester] == 'both') # Allowed since as of February 2023.
1309
+ }
1310
+ end
1311
+
1312
+ # ========================================================================= #
1313
+ # === Studium::Exams::MandatoryContinuousAssessment[]
1314
+ # ========================================================================= #
1315
+ def self.[](i = ARGV)
1316
+ new(i)
1317
+ end
1318
+
1319
+ end; end
1320
+
1321
+ # =========================================================================== #
1322
+ # === Studium.percentage_mandatory_continues_assessment
1323
+ #
1324
+ # This method will simply return the percentage of the mandatory,
1325
+ # continuous assessment practical courses, as a Float. It will
1326
+ # be quiet, that is, it will not output anything else BUT
1327
+ # that percentage number.
1328
+ #
1329
+ # In german: "Diese Methode gibt einem den prozentualen Anteil
1330
+ # an prüfungsimmanenten Lehrveranstaltungen aus."
1331
+ #
1332
+ # Invocation examples:
1333
+ #
1334
+ # percentage = Studium.percentage_mandatory_continuous_assessment('bachelor-genetic') # => 36.666666666666664
1335
+ # percentage = Studium.percentage_mandatory_continuous_assessment('bachelor-vektor') # => 37.22222222222222
1336
+ # percentage = Studium.percentage_mandatory_continuous_assessment('bachelor_agrarwissenschaften') # => 23.333333333333332
1337
+ # percentage = Studium.percentage_mandatory_continuous_assessment('bachelor_agrarwissenschaften',2) # => 23.33
1338
+ #
1339
+ # =========================================================================== #
1340
+ def self.percentage_mandatory_continuous_assessment(
1341
+ in_this_curriculum,
1342
+ round_to = nil
1343
+ )
1344
+ in_this_curriculum = in_this_curriculum.to_s.sub(/curriculum/,'')
1345
+ _ = Studium::Exams::MandatoryContinuousAssessment.new(in_this_curriculum, :do_not_run_yet)
1346
+ _.be_quiet
1347
+ _.run
1348
+ result = _.percentage?
1349
+ if round_to
1350
+ result = result.round(round_to)
1351
+ end
1352
+ return result
1353
+ end
1354
+
1355
+ end
1356
+
1357
+ if __FILE__ == $PROGRAM_NAME
1358
+ Studium::Exams::MandatoryContinuousAssessment.new(ARGV)
1359
+ end # rb mandatory* agrar