fix(python): handle recursive python imports with loop

This commit is contained in:
Ruben Fiszel
2024-02-20 19:42:05 +01:00
parent 7d4162d0d8
commit bf3e417acc
4 changed files with 41 additions and 4 deletions
@@ -145,6 +145,7 @@ pub async fn parse_python_imports(
w_id: &str,
path: &str,
db: &Pool<Postgres>,
already_visited: &mut Vec<String>,
) -> error::Result<Vec<String>> {
let find_requirements = code
.lines()
@@ -192,7 +193,12 @@ pub async fn parse_python_imports(
.fetch_optional(db)
.await?
.unwrap_or_else(|| "".to_string());
parse_python_imports(&code, w_id, &rpath, db).await?
if already_visited.contains(&rpath) {
vec![]
} else {
already_visited.push(rpath.clone());
parse_python_imports(&code, w_id, &rpath, db, already_visited).await?
}
} else {
vec![replace_import(n.to_string())]
};
@@ -18,7 +18,15 @@ def main():
pass
";
let r = parse_python_imports(code, "test-workspace", "f/foo/bar", &db).await?;
let mut already_visited = vec![];
let r = parse_python_imports(
code,
"test-workspace",
"f/foo/bar",
&db,
&mut already_visited,
)
.await?;
// println!("{}", serde_json::to_string(&r)?);
assert_eq!(r, vec!["matplotlib", "wmill", "zanzibar"]);
Ok(())
@@ -42,7 +50,15 @@ def main():
pass
";
let r = parse_python_imports(code, "test-workspace", "f/foo/bar", &db).await?;
let mut already_visited = vec![];
let r = parse_python_imports(
code,
"test-workspace",
"f/foo/bar",
&db,
&mut already_visited,
)
.await?;
println!("{}", serde_json::to_string(&r)?);
assert_eq!(r, vec!["burkina=0.4", "nigeria"]);
@@ -63,7 +79,16 @@ def main():
pass
";
let r = parse_python_imports(code, "test-workspace", "f/foo/bar", &db).await?;
let mut already_visited = vec![];
let r = parse_python_imports(
code,
"test-workspace",
"f/foo/bar",
&db,
&mut already_visited,
)
.await?;
println!("{}", serde_json::to_string(&r)?);
assert_eq!(
r,
@@ -631,11 +631,14 @@ async fn handle_python_deps(
let requirements = match requirements_o {
Some(r) => r,
None => {
let mut already_visited = vec![];
let requirements = windmill_parser_py_imports::parse_python_imports(
inner_content,
w_id,
script_path,
db,
&mut already_visited,
)
.await?
.join("\n");
+3
View File
@@ -3964,11 +3964,14 @@ async fn capture_dependency_job(
let reqs = if raw_deps {
job_raw_code.to_string()
} else {
let mut already_visited = vec![];
windmill_parser_py_imports::parse_python_imports(
job_raw_code,
&w_id,
script_path,
&db,
&mut already_visited,
)
.await?
.join("\n")