Skip to content

Commit 0b18bca

Browse files
Merge branch 'main' into fix/cicular-imports-in-helper-context
2 parents 190d593 + 132b92d commit 0b18bca

File tree

6 files changed

+55
-13
lines changed

6 files changed

+55
-13
lines changed

codeflash.code-workspace

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
1010
}
1111
],
1212
"settings": {
13-
"python.defaultInterpreterPath": "~/miniforge3/envs/codeflash312/bin/python",
1413
"python.terminal.activateEnvironment": true,
1514
"python.testing.pytestEnabled": true,
16-
"python.testing.pytestArgs": ["tests/", "-vv"],
15+
"python.testing.pytestArgs": [
16+
"tests/",
17+
"-vv",
18+
"--ignore",
19+
"tests/benchmarks/"
20+
],
1721
},
1822
"launch": {
19-
"version": "0.2.0",
2023
"configurations": [
2124
{
2225
"name": "bubble_sort",
@@ -62,19 +65,26 @@
6265
},
6366
},
6467
{
65-
"name": "bubble_sort --file bubble_sort.py (MBR)",
68+
"name": "run codeflash in custom directory",
6669
"type": "debugpy",
6770
"request": "launch",
6871
"program": "${workspaceFolder:codeflash}/codeflash/main.py",
6972
"args": [
7073
"--all",
7174
],
72-
"cwd": "/Users/krrt7/Desktop/work/my-best-repo",
75+
"cwd": "${input:chooseCwd}",
7376
"console": "integratedTerminal",
7477
"env": {
7578
"PYTHONUNBUFFERED": "1"
76-
},
79+
}
80+
}
81+
],
82+
"inputs": [
83+
{
84+
"id": "chooseCwd",
85+
"type": "promptString",
86+
"description": "Enter the working directory for codeflash",
7787
}
7888
]
79-
}
89+
},
8090
}

codeflash/api/aiservice.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from pydantic.json import pydantic_encoder
1111

1212
from codeflash.cli_cmds.console import console, logger
13-
from codeflash.code_utils.env_utils import get_codeflash_api_key
13+
from codeflash.code_utils.env_utils import get_codeflash_api_key, is_LSP_enabled
1414
from codeflash.code_utils.git_utils import get_last_commit_author_if_pr_exists, get_repo_owner_and_name
1515
from codeflash.models.models import OptimizedCandidate
1616
from codeflash.telemetry.posthog_cf import ph
@@ -182,6 +182,7 @@ def optimize_python_code_line_profiler( # noqa: D417
182182
"python_version": platform.python_version(),
183183
"experiment_metadata": experiment_metadata,
184184
"codeflash_version": codeflash_version,
185+
"lsp_mode": is_LSP_enabled(),
185186
}
186187

187188
logger.info("Generating optimized candidates…")

codeflash/code_utils/env_utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pathlib import Path
88
from typing import Any, Optional
99

10-
from codeflash.cli_cmds.console import logger
10+
from codeflash.cli_cmds.console import console, logger
1111
from codeflash.code_utils.code_utils import exit_with_message
1212
from codeflash.code_utils.formatter import format_code
1313
from codeflash.code_utils.shell_utils import read_api_key_from_shell_config
@@ -110,3 +110,8 @@ def get_cached_gh_event_data() -> dict[str, Any] | None:
110110
return None
111111
with Path(event_path).open() as f:
112112
return json.load(f) # type: ignore # noqa
113+
114+
115+
@lru_cache(maxsize=1)
116+
def is_LSP_enabled() -> bool:
117+
return console.quiet

codeflash/lsp/server.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,6 @@ def initialize_optimizer(self, config_file: Path) -> None:
5252

5353
args = parse_args()
5454
args.config_file = config_file
55+
args.no_pr = True # LSP server should not create PRs
5556
args = process_pyproject_config(args)
5657
self.optimizer = Optimizer(args)

codeflash/optimization/optimizer.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from codeflash.api.aiservice import AiServiceClient, LocalAiServiceClient
1313
from codeflash.cli_cmds.console import console, logger, progress_bar
1414
from codeflash.code_utils import env_utils
15+
from codeflash.code_utils.code_utils import cleanup_paths
1516
from codeflash.code_utils.env_utils import get_pr_number
1617
from codeflash.either import is_successful
1718
from codeflash.models.models import ValidCode
@@ -248,10 +249,10 @@ def run(self) -> None:
248249
return
249250
if not env_utils.check_formatter_installed(self.args.formatter_cmds):
250251
return
251-
252252
if self.args.no_draft and is_pr_draft():
253253
logger.warning("PR is in draft mode, skipping optimization")
254254
return
255+
cleanup_paths(Optimizer.find_leftover_instrumented_test_files(self.test_cfg.tests_root))
255256

256257
function_optimizer = None
257258
file_to_funcs_to_optimize, num_optimizable_functions = self.get_optimizable_functions()
@@ -326,9 +327,27 @@ def run(self) -> None:
326327

327328
self.cleanup_temporary_paths()
328329

329-
def cleanup_temporary_paths(self) -> None:
330-
from codeflash.code_utils.code_utils import cleanup_paths
330+
@staticmethod
331+
def find_leftover_instrumented_test_files(test_root: Path) -> list[Path]:
332+
"""Search for all paths within the test_root that match the following patterns.
331333
334+
- 'test.*__perf_test_{0,1}.py'
335+
- 'test_.*__unit_test_{0,1}.py'
336+
- 'test_.*__perfinstrumented.py'
337+
- 'test_.*__perfonlyinstrumented.py'
338+
Returns a list of matching file paths.
339+
"""
340+
import re
341+
342+
pattern = re.compile(
343+
r"(?:test.*__perf_test_\d?\.py|test_.*__unit_test_\d?\.py|test_.*__perfinstrumented\.py|test_.*__perfonlyinstrumented\.py)$"
344+
)
345+
346+
return [
347+
file_path for file_path in test_root.rglob("*") if file_path.is_file() and pattern.match(file_path.name)
348+
]
349+
350+
def cleanup_temporary_paths(self) -> None:
332351
if self.current_function_optimizer:
333352
self.current_function_optimizer.cleanup_generated_files()
334353

codeflash/verification/concolic_testing.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from codeflash.cli_cmds.console import console, logger
1111
from codeflash.code_utils.compat import SAFE_SYS_EXECUTABLE
1212
from codeflash.code_utils.concolic_utils import clean_concolic_tests
13+
from codeflash.code_utils.env_utils import is_LSP_enabled
1314
from codeflash.code_utils.static_analysis import has_typed_parameters
1415
from codeflash.discovery.discover_unit_tests import discover_unit_tests
1516
from codeflash.telemetry.posthog_cf import ph
@@ -28,6 +29,11 @@ def generate_concolic_tests(
2829
start_time = time.perf_counter()
2930
function_to_concolic_tests = {}
3031
concolic_test_suite_code = ""
32+
33+
if is_LSP_enabled():
34+
logger.debug("Skipping concolic test generation in LSP mode")
35+
return function_to_concolic_tests, concolic_test_suite_code
36+
3137
if (
3238
test_cfg.concolic_test_root_dir
3339
and isinstance(function_to_optimize_ast, (ast.FunctionDef, ast.AsyncFunctionDef))
@@ -43,7 +49,7 @@ def generate_concolic_tests(
4349
"crosshair",
4450
"cover",
4551
"--example_output_format=pytest",
46-
"--per_condition_timeout=64",
52+
"--per_condition_timeout=20",
4753
".".join(
4854
[
4955
function_to_optimize.file_path.relative_to(args.project_root)

0 commit comments

Comments
 (0)