Skip to content

Commit 239112e

Browse files
authored
handle pylint output format ocrrectly (#16)
1 parent 807d549 commit 239112e

File tree

2 files changed

+43
-29
lines changed

2 files changed

+43
-29
lines changed

src/cycle_detection.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fn get_cycles_from_vertex<'a>(
6969
Some(vertex_index) => {
7070
cycles.insert(super::minimize_cycles::minimize_cycle(
7171
graph,
72-
super::minimize_cycles::canonical_cycle(&path[vertex_index..]),
72+
&super::minimize_cycles::canonical_cycle(&path[vertex_index..]),
7373
));
7474
}
7575
None => {

src/minimize_cycles.rs

+42-28
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn sub_cycle<'a>(c: &[&'a str], i: usize, j: usize) -> Vec<&'a str> {
4242

4343
pub(crate) fn minimize_cycle<'a>(
4444
graph: &HashMap<String, HashSet<String>>,
45-
cycle: Vec<&'a str>,
45+
cycle: &[&'a str],
4646
) -> Vec<&'a str> {
4747
// all the None cases can be simplified with a base case of
4848
// embiggen = (-1, 0, cycle.len())
@@ -63,8 +63,8 @@ pub(crate) fn minimize_cycle<'a>(
6363
}
6464
}
6565
match emsmallen {
66-
Some((i, j, _)) => sub_cycle(&cycle, i, j),
67-
None => cycle,
66+
Some((i, j, _)) => sub_cycle(cycle, i, j),
67+
None => cycle.to_vec(),
6868
}
6969
}
7070
pub(crate) fn minimize_cycles(cycles_results_file: String) {
@@ -74,26 +74,28 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
7474
fs::read_to_string(cycles_results_file).expect("Should have been able to read the file");
7575
let mut cycles = contents
7676
.split("\n")
77-
.filter_map(|l| l.find(" -> ").map(|_| l.split(" -> ").collect()))
77+
.filter_map(|l| {
78+
// pylint's format is
79+
// file_name:lno:cno: R0401: Cyclic import(<cycle details>) (cyclic-import)
80+
l.find(" -> ").map(|_| {
81+
l.split("(")
82+
.nth(1)
83+
.unwrap()
84+
.split(")")
85+
.next()
86+
.unwrap()
87+
.split(" -> ")
88+
.collect()
89+
})
90+
})
7891
.collect::<Vec<Vec<&str>>>();
7992

80-
println!("Pre-minimization");
81-
println!("# cycles : {}", cycles.len());
82-
println!(
83-
"total cycle length: {}",
84-
cycles.iter().map(|c| c.len()).sum::<usize>()
85-
);
86-
87-
println!(
88-
"longest cycle : {}",
89-
cycles.iter().map(|c| c.len()).max().unwrap()
90-
);
9193
// sort cycles by length, since larger cycles are likelier to be minimized, and this
9294
// makes it easier to grok the results and logs
9395
cycles.sort_by_key(|a| a.len());
9496

9597
let mut minimal_cycles = Vec::<Vec<&str>>::new();
96-
for cycle in cycles {
98+
for cycle in &cycles {
9799
minimal_cycles.push(minimize_cycle(&graph, cycle));
98100
}
99101

@@ -103,7 +105,19 @@ pub(crate) fn minimize_cycles(cycles_results_file: String) {
103105
println!("{}", cycle.join(" -> "));
104106
}
105107

106-
println!("\nPost-minimization");
108+
println!();
109+
println!("Pre-minimization");
110+
println!("# cycles : {}", cycles.len());
111+
println!(
112+
"total cycle length: {}",
113+
cycles.iter().map(|c| c.len()).sum::<usize>()
114+
);
115+
println!(
116+
"longest cycle : {}",
117+
cycles.iter().map(|c| c.len()).max().unwrap()
118+
);
119+
println!();
120+
println!("Post-minimization");
107121
println!("# cycles : {}", unique_minimal_cycles.len());
108122
println!(
109123
"total cycle length: {}",
@@ -172,16 +186,16 @@ mod tests {
172186
fn test_minimize_cycle_simple() {
173187
let graph = HashMap::from([("b".to_string(), HashSet::from(["a".to_string()]))]);
174188
// unchanged cycle
175-
assert_eq!(minimize_cycle(&graph, vec!["j", "k", "l"]), ["j", "k", "l"]);
176-
assert_eq!(minimize_cycle(&graph, vec!["a", "j", "b"]), ["a", "j", "b"]);
189+
assert_eq!(minimize_cycle(&graph, &["j", "k", "l"]), ["j", "k", "l"]);
190+
assert_eq!(minimize_cycle(&graph, &["a", "j", "b"]), ["a", "j", "b"]);
177191
// should shortcut
178-
assert_eq!(minimize_cycle(&graph, vec!["a", "b", "c"]), ["a", "b"]);
192+
assert_eq!(minimize_cycle(&graph, &["a", "b", "c"]), ["a", "b"]);
179193
assert_eq!(
180-
minimize_cycle(&graph, vec!["b", "c", "e", "a", "d"]),
194+
minimize_cycle(&graph, &["b", "c", "e", "a", "d"]),
181195
["a", "d", "b"]
182196
);
183197
// should get contained cycle
184-
assert_eq!(minimize_cycle(&graph, vec!["c", "a", "b", "d"]), ["a", "b"]);
198+
assert_eq!(minimize_cycle(&graph, &["c", "a", "b", "d"]), ["a", "b"]);
185199

186200
// these have multiple options, and should find the best one
187201
}
@@ -201,32 +215,32 @@ mod tests {
201215
]);
202216
// three shortcuts: j -> a (cuts 3), b -> a (cuts 1)
203217
assert_eq!(
204-
minimize_cycle(&graph, vec!["a", "j", "k", "b", "l"]),
218+
minimize_cycle(&graph, &["a", "j", "k", "b", "l"]),
205219
["a", "j"]
206220
);
207221
// two shortcuts: k -> j (cuts 1), n -> l (cuts 2)
208222
assert_eq!(
209-
minimize_cycle(&graph, vec!["a", "k", "m", "n", "b1", "b2", "l"]),
223+
minimize_cycle(&graph, &["a", "k", "m", "n", "b1", "b2", "l"]),
210224
["a", "k", "m", "n", "l"]
211225
);
212226
// two contained cycles: l -> r -> j, and a -> b
213227
assert_eq!(
214-
minimize_cycle(&graph, vec!["q", "d", "l", "r", "j", "a", "b"]),
228+
minimize_cycle(&graph, &["q", "d", "l", "r", "j", "a", "b"]),
215229
["a", "b"]
216230
);
217231
// two contained cycles: l -> j, and a -> r -> b
218232
assert_eq!(
219-
minimize_cycle(&graph, vec!["q", "d", "l", "j", "a", "r", "b"]),
233+
minimize_cycle(&graph, &["q", "d", "l", "j", "a", "r", "b"]),
220234
["j", "l"]
221235
);
222236
// one shortcut: q -> a (cuts 6), one contained cycle: l -> l1 -> l2 -> j (cuts 2)
223237
assert_eq!(
224-
minimize_cycle(&graph, vec!["a", "q", "b", "l", "l1", "l2", "j"]),
238+
minimize_cycle(&graph, &["a", "q", "b", "l", "l1", "l2", "j"]),
225239
["a", "q", "b"]
226240
);
227241
// one shortcut: q -> a (cuts 3), one contained cycle: l -> l1 -> j (cuts 4)
228242
assert_eq!(
229-
minimize_cycle(&graph, vec!["a", "q1", "q", "b", "l", "l1", "j"]),
243+
minimize_cycle(&graph, &["a", "q1", "q", "b", "l", "l1", "j"]),
230244
["j", "l", "l1"]
231245
);
232246
}

0 commit comments

Comments
 (0)