Skip to content

Commit fe82617

Browse files
authored
Merge pull request #818 from codeflash-ai/isort-disregard-skip
Don't crash when isort fails
2 parents 03361cc + 271b7ed commit fe82617

File tree

10 files changed

+30
-20
lines changed

10 files changed

+30
-20
lines changed

codeflash/benchmarking/instrument_codeflash_trace.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
from typing import TYPE_CHECKING, Optional, Union
44

5-
import isort
65
import libcst as cst
76

7+
from codeflash.code_utils.formatter import sort_imports
8+
89
if TYPE_CHECKING:
910
from pathlib import Path
1011

@@ -107,7 +108,7 @@ def instrument_codeflash_trace_decorator(file_to_funcs_to_optimize: dict[Path, l
107108
original_code = file_path.read_text(encoding="utf-8")
108109
new_code = add_codeflash_decorator_to_code(original_code, functions_to_optimize)
109110
# Modify the code
110-
modified_code = isort.code(code=new_code, float_to_top=True)
111+
modified_code = sort_imports(code=new_code, float_to_top=True)
111112

112113
# Write the modified code back to the file
113114
file_path.write_text(modified_code, encoding="utf-8")

codeflash/benchmarking/replay_test.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
from pathlib import Path
77
from typing import TYPE_CHECKING, Any
88

9-
import isort
10-
119
from codeflash.cli_cmds.console import logger
10+
from codeflash.code_utils.formatter import sort_imports
1211
from codeflash.discovery.functions_to_optimize import inspect_top_level_functions_or_methods
1312
from codeflash.verification.verification_utils import get_test_file_path
1413

@@ -299,7 +298,7 @@ def generate_replay_test(
299298
test_framework=test_framework,
300299
max_run_count=max_run_count,
301300
)
302-
test_code = isort.code(test_code)
301+
test_code = sort_imports(code=test_code)
303302
output_file = get_test_file_path(
304303
test_dir=Path(output_dir), function_name=benchmark_module_path, test_type="replay"
305304
)

codeflash/code_utils/code_replacer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
from functools import lru_cache
66
from typing import TYPE_CHECKING, Optional, TypeVar
77

8-
import isort
98
import libcst as cst
109
from libcst.metadata import PositionProvider
1110

1211
from codeflash.cli_cmds.console import logger
1312
from codeflash.code_utils.code_extractor import add_global_assignments, add_needed_imports_from_module
1413
from codeflash.code_utils.config_parser import find_conftest_files
14+
from codeflash.code_utils.formatter import sort_imports
1515
from codeflash.code_utils.line_profile_utils import ImportAdder
1616
from codeflash.models.models import FunctionParent
1717

@@ -226,7 +226,7 @@ def add_custom_marker_to_all_tests(test_paths: list[Path]) -> None:
226226
module = cst.parse_module(file_content)
227227
importadder = ImportAdder("import pytest")
228228
modified_module = module.visit(importadder)
229-
modified_module = cst.parse_module(isort.code(modified_module.code, float_to_top=True))
229+
modified_module = cst.parse_module(sort_imports(code=modified_module.code, float_to_top=True))
230230
pytest_mark_adder = PytestMarkAdder("codeflash_no_autouse")
231231
modified_module = modified_module.visit(pytest_mark_adder)
232232
test_path.write_text(modified_module.code, encoding="utf-8")

codeflash/code_utils/formatter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,11 @@ def format_code(
166166
return formatted_code
167167

168168

169-
def sort_imports(code: str) -> str:
169+
def sort_imports(code: str, *, float_to_top: bool = False) -> str:
170170
try:
171171
# Deduplicate and sort imports, modify the code in memory, not on disk
172-
sorted_code = isort.code(code)
173-
except Exception:
172+
sorted_code = isort.code(code=code, float_to_top=float_to_top)
173+
except Exception: # this will also catch the FileSkipComment exception, use this fn everywhere
174174
logger.exception("Failed to sort imports with isort.")
175175
return code # Fall back to original code if isort fails
176176

codeflash/code_utils/instrument_existing_tests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from codeflash.cli_cmds.console import logger
1212
from codeflash.code_utils.code_utils import get_run_tmp_file, module_name_from_file_path
13+
from codeflash.code_utils.formatter import sort_imports
1314
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
1415
from codeflash.models.models import FunctionParent, TestingMode, VerificationType
1516

@@ -1129,7 +1130,7 @@ def add_async_decorator_to_function(
11291130
import_transformer = AsyncDecoratorImportAdder(mode)
11301131
module = module.visit(import_transformer)
11311132

1132-
return isort.code(module.code, float_to_top=True), decorator_transformer.added_decorator
1133+
return sort_imports(code=module.code, float_to_top=True), decorator_transformer.added_decorator
11331134
except Exception as e:
11341135
logger.exception(f"Error adding async decorator to function {function.qualified_name}: {e}")
11351136
return source_code, False

codeflash/code_utils/line_profile_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from pathlib import Path
77
from typing import TYPE_CHECKING, Union
88

9-
import isort
109
import libcst as cst
1110

1211
from codeflash.code_utils.code_utils import get_run_tmp_file
12+
from codeflash.code_utils.formatter import sort_imports
1313

1414
if TYPE_CHECKING:
1515
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
@@ -213,7 +213,7 @@ def add_decorator_imports(function_to_optimize: FunctionToOptimize, code_context
213213
transformer = ImportAdder("from line_profiler import profile as codeflash_line_profile")
214214
# Apply the transformer to add the import
215215
module_node = module_node.visit(transformer)
216-
modified_code = isort.code(module_node.code, float_to_top=True)
216+
modified_code = sort_imports(code=module_node.code, float_to_top=True)
217217
# write to file
218218
with file_path.open("w", encoding="utf-8") as file:
219219
file.write(modified_code)

codeflash/optimization/function_optimizer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from pathlib import Path
1313
from typing import TYPE_CHECKING
1414

15-
import isort
1615
import libcst as cst
1716
from rich.console import Group
1817
from rich.panel import Panel
@@ -900,7 +899,7 @@ def reformat_code_and_helpers(
900899
optimized_context: CodeStringsMarkdown,
901900
) -> tuple[str, dict[Path, str]]:
902901
should_sort_imports = not self.args.disable_imports_sorting
903-
if should_sort_imports and isort.code(original_code) != original_code:
902+
if should_sort_imports and sort_imports(code=original_code) != original_code:
904903
should_sort_imports = False
905904

906905
optimized_code = ""

codeflash/tracing/tracing_new_process.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ def __exit__(
265265

266266
# These modules have been imported here now the tracer is done. It is safe to import codeflash and external modules here
267267

268+
from contextlib import suppress
269+
268270
import isort
269271

270272
from codeflash.tracing.replay_test import create_trace_replay_test
@@ -280,7 +282,8 @@ def __exit__(
280282
test_file_path = get_test_file_path(
281283
test_dir=Path(self.config["tests_root"]), function_name=function_path, test_type="replay"
282284
)
283-
replay_test = isort.code(replay_test)
285+
with suppress(Exception):
286+
replay_test = isort.code(replay_test)
284287

285288
with Path(test_file_path).open("w", encoding="utf8") as file:
286289
file.write(replay_test)

codeflash/verification/instrument_codeflash_capture.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
from pathlib import Path
55
from typing import TYPE_CHECKING
66

7-
import isort
8-
97
from codeflash.code_utils.code_utils import get_run_tmp_file
8+
from codeflash.code_utils.formatter import sort_imports
109

1110
if TYPE_CHECKING:
1211
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
@@ -70,7 +69,7 @@ def add_codeflash_capture_to_init(
7069
ast.fix_missing_locations(modified_tree)
7170

7271
# Convert back to source code
73-
return isort.code(code=ast.unparse(modified_tree), float_to_top=True)
72+
return sort_imports(code=ast.unparse(modified_tree), float_to_top=True)
7473

7574

7675
class InitDecorator(ast.NodeTransformer):

tests/test_formatter.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,4 +796,12 @@ def _is_valid(self, item):
796796
optimization_function = """def process(self,data):
797797
'''Single quote docstring with formatting issues.'''
798798
return{'result':[item for item in data if self._is_valid(item)]}"""
799-
_run_formatting_test(source_code, True, optimized_function=optimization_function, expected=expected)
799+
_run_formatting_test(source_code, True, optimized_function=optimization_function, expected=expected)
800+
801+
def test_sort_imports_skip_file():
802+
"""Test that isort skips files with # isort:skip_file."""
803+
code = """# isort:skip_file
804+
805+
import sys, os, json # isort will ignore this file completely"""
806+
new_code = sort_imports(code)
807+
assert new_code == code

0 commit comments

Comments
 (0)