Skip to content

Commit 035c0dc

Browse files
committed
Glob pattern matching
1 parent 468a0e2 commit 035c0dc

File tree

4 files changed

+135
-18
lines changed

4 files changed

+135
-18
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cloggen"
3-
version = "1.2.1"
3+
version = "1.3.0"
44
edition = "2021"
55
license = "MIT"
66

@@ -11,3 +11,4 @@ encoding_rs = "0.8.35"
1111
serde_json = "1.0.132"
1212
csv = "1.3.0"
1313
rand = "0.8.5"
14+
glob = "0.3.2"

odzivi.json

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,50 @@
44
"4.5": [
55
"Kandidat svoje delo v celoti izvaja precej popolno; ocene študentskih anket so odlične.",
66
"Delo kandidata je v celoti odlično; kandidata k takem delu spodbujamo tudi v prihodnosti.",
7-
"Delo kandidata v celoti je odlične kakovosti."
7+
"Delo kandidata je v celoti odlične kakovosti."
88
],
99
"4": [
10-
"Delo kandidat v celoti opravlja zelo kakovostno.",
10+
"Kandidat delo v celoti opravlja zelo kakovostno.",
1111
"Kandidatovo delo je v celoti zelo kakovostno.",
1212
"Študenti menijo, da je kandidatovo delo v celoti zelo kakovostno."
1313
],
1414
"3": ["Delo kandidata v celoti bi se lahko izboljšalo. Delo je zadovoljivo."],
15-
"2": [],
15+
"2": [
16+
"Delo kandidata v celoti ne dosega pričakovanj in je pomanjkljivo.",
17+
"Študenti menijo, da delo kandidata potrebuje precej izboljšav.",
18+
"Celotna izvedba kandidata ima resne pomanjkljivosti, ki jih je potrebno odpraviti."
19+
],
1620
"1": [
1721
"Kandidatovo delo v celoti je \\textbf{nesprejemljivo}. Potrebne so nujne izboljšave, saj študentske ocene dvigajo resne pomisleke o kandidatove delu.",
1822
"V celoti kandidat delo opravlja izjemno pomanjkljivo. Na področju celotnega dela so potrebne resne izboljšave, saj povprečje študentskih anket predstavlja porazno stanje.",
1923
"Na področju celotnega dela študentske ankete nakazujejo potrebo po resnem premisleku o kandidatovem delu."
2024
]
2125
},
22-
"V predavalnico prihaja dobro pripravljen/a." : {
23-
"4.4": [
26+
"V predavalnico prihaja dobro pripravljen/a.": {
27+
"4.5": [
2428
"Kandidat v predavalnico prihaja odlično pripravljen.",
25-
"Na podlagi odličnih ocen anket je razvidno, da kandidat v predavalnico vstopa pripravljen.",
29+
"Na podlagi odličnih ocen anket je razvidno, da kandidat v predavalnico vstopa pripravljen.",
2630
"Ko kandidat vstopi v predavalnico je odlično pripravljen."
31+
],
32+
"4": [
33+
"Kandidat je večinoma zelo dobro pripravljen na predavanja.",
34+
"Študenti ocenjujejo, da kandidat v predavalnico prihaja dobro pripravljen.",
35+
"Kandidat je v predavalnici skoraj vedno ustrezno pripravljen."
36+
],
37+
"3": [
38+
"Kandidatovo pripravljenost na predavanja bi bilo mogoče izboljšati.",
39+
"Študenti menijo, da kandidat ni vedno popolnoma pripravljen na predavanja.",
40+
"Pripravljenost kandidata na predavanja je zadovoljiva, a ne brezhibna."
41+
],
42+
"2": [
43+
"Pripravljenost kandidata na predavanja je pomanjkljiva in potrebuje izboljšave.",
44+
"Študenti ocenjujejo, da kandidat pogosto ni ustrezno pripravljen na predavanja.",
45+
"Na predavanjih je opaziti nezadostno pripravljenost kandidata."
46+
],
47+
"1": [
48+
"Kandidat pogosto prihaja v predavalnico nepripravljen, kar negativno vpliva na predavanja.",
49+
"Študenti poročajo o izraziti nepripravljenosti kandidata na predavanja.",
50+
"Pripravljenost kandidata je na zelo nizki ravni in potrebuje takojšnjo izboljšavo."
2751
]
2852
},
2953
"Snov podaja na razumljiv način.": {
@@ -35,6 +59,21 @@
3559
"4.0": [
3660
"Snov kandidat podaja na zelo razumljiv način, z majhnim prostorom za izboljšanje.",
3761
"Kandidat snov na predavanjih oz. vajah podaja na precej razumljiv način."
62+
],
63+
"3": [
64+
"Podajanje snovi je zadovoljivo, vendar včasih težje razumljivo.",
65+
"Študenti ocenjujejo, da kandidat snov podaja razumljivo, a z možnostjo izboljšav.",
66+
"Kandidat snov pogosto podaja jasno, a včasih prehitro ali preveč kompleksno."
67+
],
68+
"2": [
69+
"Podajanje snovi kandidata je pogosto nejasno in težko sledljivo.",
70+
"Študenti opažajo pomanjkljivosti pri razumljivosti kandidatove razlage.",
71+
"Razlaga snovi je pogosto premalo strukturirana in otežuje razumevanje."
72+
],
73+
"1": [
74+
"Kandidat snov podaja na izjemno nerazumljiv način, kar zelo otežuje učenje.",
75+
"Razlaga snovi kandidata je nejasna in pogosto zavajajoča.",
76+
"Podajanje snovi je popolnoma neustrezno in povzroča zmedo med študenti."
3877
]
3978
},
4079
"Spodbuja me h kritičnemu razmišljanju.": {
@@ -47,6 +86,21 @@
4786
"Kandidat študente h kritičnem razmišljanju spodbuja v veliki meri.",
4887
"Študenti so s strani kandidata h kritičnem razmišljanju spodbujeni v veliki meri.",
4988
"Kritično razmišljanje študentov je s strani kandidata zelo spodbujeno."
89+
],
90+
"3": [
91+
"Kandidat občasno spodbuja kritično razmišljanje, vendar bi to lahko izboljšal.",
92+
"Študenti menijo, da je spodbujanje kritičnega razmišljanja povprečno.",
93+
"Kandidat včasih uspe spodbuditi kritično razmišljanje, vendar ne redno."
94+
],
95+
"2": [
96+
"Spodbujanje kritičnega razmišljanja je redko in nezadostno.",
97+
"Študenti opažajo, da jih kandidat le redko spodbudi h kritičnemu razmišljanju.",
98+
"Kandidat ne daje dovolj priložnosti za razvoj kritičnega razmišljanja."
99+
],
100+
"1": [
101+
"Študenti se strinjajo, da kandidat sploh ne spodbuja kritičnega razmišljanja.",
102+
"Kandidat popolnoma zanemarja spodbujanje kritičnega razmišljanja.",
103+
"Pedagoško delo kandidata ne vključuje nobenih elementov, ki bi spodbujali kritično razmišljanje."
50104
]
51105
},
52106
"Zna vzbuditi zanimanje za predmet.": {
@@ -58,14 +112,44 @@
58112
"4.0": [
59113
"Mnenje študentov je, da kandidat vzbuja zanimanje za predmet v veliki meri, vendar tu še vedno obstaja manjši prostor za izboljšavo.",
60114
"Pri vzbujanju zanimanja za predmet, ki ga predava ali asistira, je kandidatovo delo zelo dobro, z majhnim prostorom za izboljšanje."
115+
],
116+
"3": [
117+
"Kandidat včasih uspe vzbuditi zanimanje za predmet.",
118+
"Študenti menijo, da kandidatovo delo pri vzbujanju zanimanja za predmet ni stalno učinkovito.",
119+
"Vzbuditev zanimanja za predmet je pri kandidatu povprečna."
120+
],
121+
"2": [
122+
"Kandidat redko uspe vzbuditi zanimanje za predmet.",
123+
"Študenti opažajo pomanjkljivosti pri vzbujanju zanimanja za predmet.",
124+
"Vzbuditev zanimanja za predmet pri kandidatu je nezadostna."
125+
],
126+
"1": [
127+
"Kandidat popolnoma ne uspe vzbuditi zanimanja za predmet.",
128+
"Študenti poročajo o popolnem pomanjkanju motivacije zaradi kandidatovega pristopa.",
129+
"Kandidatov način poučevanja ne vzbuja nikakršnega zanimanja za predmet."
61130
]
62131
},
63132
"Korektno obravnava vse študente.": {
64133
"4.5": [
65134
"Kandidat korektno obravnava vse študente; na podlagi ocen anket se s tem strinja velika večina študentov.",
66135
"Kar se tiče obravnave študentov, te kandidat obravnava korektno, s čimer se strinja večina študentov.",
67136
"Pri vprašanju o korektni obravnavi študentov, ti v anketah skoraj vsi odgovorijo pritrdilno."
137+
],
138+
"3": [
139+
"Kandidat korektno obravnava večino študentov, vendar obstajajo izjeme.",
140+
"Študenti opažajo, da kandidat včasih obravnava nekatere študente neenakopravno.",
141+
"Obravnava študentov je v večini primerov korektna, vendar ne vedno."
142+
],
143+
"2": [
144+
"Kandidat pogosto ne obravnava študentov enakopravno.",
145+
"Študenti opažajo primere nekorektne obravnave s strani kandidata.",
146+
"Obravnava študentov s strani kandidata ima večje pomanjkljivosti."
147+
],
148+
"1": [
149+
"Kandidat se pri obravnavi študentov vede popolnoma nekorektno.",
150+
"Študenti poročajo o izrazito nepravični obravnavi s strani kandidata.",
151+
"Obravnava študentov s strani kandidata je nesprejemljiva."
68152
]
69153
}
70154
}
71-
}
155+
}

src/main.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,20 @@ enum Commands {
115115
tex_file: PathBuf
116116
},
117117

118-
/// Merges grades of multiple CSV grades
118+
/// Merges grades of multiple CSV files
119119
Merge {
120-
/// The CSV files to merge. At least two values.
121-
#[clap(num_args = 2.., required = true)]
122-
csv_files: Vec<PathBuf>,
120+
/// The CSV files to merge.
121+
/// Each item can be either a glob pattern or an individual file.
122+
/// Files matched by different patterns will all be combined as one.
123+
#[clap(num_args = 1.., required = true)]
124+
csv_file_patterns: Vec<PathBuf>,
123125

124126
/// Name of the grades section to use (e.g., "Anketa o izvajalcu")
125127
#[clap(short, long, default_value = "Anketa o izvajalcu")]
126128
section: String,
127129

128130
/// Path of the output (merged) file.
129-
#[clap(short, default_value = "./merged.csv")]
131+
#[clap(short, long, default_value = "./merged.csv")]
130132
output: PathBuf
131133
}
132134
}
@@ -158,8 +160,8 @@ fn main() {
158160
compiler::cmd_compile(tex_file);
159161
}
160162

161-
Commands::Merge { csv_files , section, output} => {
162-
merge::command_merge(csv_files, section, output);
163+
Commands::Merge { csv_file_patterns , section, output} => {
164+
merge::command_merge(csv_file_patterns, section, output);
163165
}
164166
}
165167
}

src/merge.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::collections::HashMap;
55
use std::path::PathBuf;
66
use std::io::Write;
77
use std::fs::File;
8+
use glob::glob;
89
use csv;
910

1011

@@ -37,13 +38,42 @@ fn csv_parse_question_means(file: &PathBuf, section: &String) -> HashMap<String,
3738

3839

3940
/// Command processing function for the ``merge`` command.
40-
pub fn command_merge(files: &Vec<PathBuf>, section: &String, output: &PathBuf) {
41+
pub fn command_merge(file_patterns: &Vec<PathBuf>, section: &String, output: &PathBuf) {
42+
/// Minimum number of files each pattern in `file_patterns` should match.
43+
/// If any matches less, a panic occurs.
44+
const MIN_FILES_TO_MATCH: usize = 2;
45+
4146
let mut qvalues: HashMap<String, Vec<f64>> = HashMap::new(); // Question values
4247

4348
// Iterate all files and create a mapping that maps a question to a vector of mean values.
44-
for file in files {
49+
let mut files = Vec::new();
50+
let mut matches;
51+
let mut p;
52+
53+
// Combine all the file patterns together
54+
for pattern in file_patterns {
55+
p = pattern.to_str().unwrap_or_else(|| panic!("{} contains invalid unicode!", pattern.display()));
56+
matches = glob(p).expect("invalid pattern was given");
57+
58+
for entry in matches {
59+
match entry {
60+
Ok(path) => files.push(path),
61+
Err(e) => println!("warning: an error occurred during glob iteration. Error: {:?}", e)
62+
}
63+
}
64+
}
65+
66+
if files.len() < MIN_FILES_TO_MATCH {
67+
panic!(
68+
"{file_patterns:?} together need to match at least {MIN_FILES_TO_MATCH} files, but they matched {}.",
69+
files.len()
70+
);
71+
}
72+
73+
// Create mean grade mapping that maps Question => [mean grade of each file]
74+
for file in &files {
4575
for (question, mean) in csv_parse_question_means(file, section) {
46-
qvalues.entry(question).or_insert(Vec::new()).push(mean);
76+
qvalues.entry(question).or_insert_with(Vec::new).push(mean);
4777
}
4878
}
4979

0 commit comments

Comments
 (0)