diff --git a/rope/contrib/autoimport/parse.py b/rope/contrib/autoimport/parse.py index 58ee8fcb..d468fe90 100644 --- a/rope/contrib/autoimport/parse.py +++ b/rope/contrib/autoimport/parse.py @@ -47,7 +47,7 @@ def get_names_from_file( try: root_node = ast.parse(module.read_bytes()) except SyntaxError as error: - print(error) + logger.debug("Skipping invalid source file %s: %s", module, error) return for node in ast.iter_child_nodes(root_node): if isinstance(node, ast.Assign): diff --git a/ropetest/contrib/autoimport/parsetest.py b/ropetest/contrib/autoimport/parsetest.py index 2f59c91d..cbc9a16e 100644 --- a/ropetest/contrib/autoimport/parsetest.py +++ b/ropetest/contrib/autoimport/parsetest.py @@ -1,3 +1,5 @@ +import logging + from rope.contrib.autoimport import parse from rope.contrib.autoimport.defs import Name, NameType, PartialName, Source @@ -7,6 +9,17 @@ def test_typing_names(typing_path): assert PartialName("Text", NameType.Variable) in names +def test_invalid_source_file_is_skipped_without_writing_to_stdout(tmp_path, caplog, capsys): + source = tmp_path / "invalid.py" + source.write_text("€ = 2\n", encoding="utf-8") + + with caplog.at_level(logging.DEBUG, logger=parse.__name__): + assert list(parse.get_names_from_file(source)) == [] + + assert capsys.readouterr().out == "" + assert f"Skipping invalid source file {source}" in caplog.text + + def test_find_sys(): names = list(parse.get_names_from_compiled("sys", Source.BUILTIN)) assert Name("exit", "sys", "sys", Source.BUILTIN, NameType.Function) in names