mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-21 16:02:28 +00:00
fix(python): handle recursive python imports with loop
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user