Skip to content

Commit 2cee81b

Browse files
Merge pull request #1216 from codeflash-ai/fix/nested-progress-bar-error
fix: avoid nested progress bars causing LiveError
2 parents e8989c2 + 7f7053c commit 2cee81b

2 files changed

Lines changed: 32 additions & 19 deletions

File tree

codeflash/cli_cmds/console.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ def code_print(
129129

130130
spinners = cycle(SPINNER_TYPES)
131131

132+
# Track whether a progress bar is already active to prevent nested Live displays
133+
_progress_bar_active = False
134+
132135

133136
@contextmanager
134137
def progress_bar(
@@ -138,28 +141,38 @@ def progress_bar(
138141
139142
If revert_to_print is True, falls back to printing a single logger.info message
140143
instead of showing a progress bar.
144+
145+
If a progress bar is already active, yields a dummy task ID to avoid Rich's
146+
LiveError from nested Live displays.
141147
"""
148+
global _progress_bar_active
149+
142150
if is_LSP_enabled():
143151
lsp_log(LspTextMessage(text=message, takes_time=True))
144152
yield
145153
return
146154

147-
if revert_to_print:
148-
logger.info(message)
155+
if revert_to_print or _progress_bar_active:
156+
if revert_to_print:
157+
logger.info(message)
149158

150159
# Create a fake task ID since we still need to yield something
151160
yield DummyTask().id
152161
else:
153-
progress = Progress(
154-
SpinnerColumn(next(spinners)),
155-
*Progress.get_default_columns(),
156-
TimeElapsedColumn(),
157-
console=console,
158-
transient=transient,
159-
)
160-
task = progress.add_task(message, total=None)
161-
with progress:
162-
yield task
162+
_progress_bar_active = True
163+
try:
164+
progress = Progress(
165+
SpinnerColumn(next(spinners)),
166+
*Progress.get_default_columns(),
167+
TimeElapsedColumn(),
168+
console=console,
169+
transient=transient,
170+
)
171+
task = progress.add_task(message, total=None)
172+
with progress:
173+
yield task
174+
finally:
175+
_progress_bar_active = False
163176

164177

165178
@contextmanager

tests/test_languages/test_js_code_replacer.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,12 @@ def test_convert_destructured_require(self):
167167
f"CJS to ESM conversion failed.\nInput: {code}\nExpected: {expected}\nGot: {result}"
168168
)
169169

170-
def test_convert_relative_require_adds_extension(self):
171-
"""Test that relative imports get .js extension added - exact output."""
170+
def test_convert_relative_require_preserves_path(self):
171+
"""Test that relative imports preserve the original path without adding extension."""
172172
code = "const { helper } = require('./utils');"
173173
result = convert_commonjs_to_esm(code)
174174

175-
expected = "import { helper } from './utils.js';"
175+
expected = "import { helper } from './utils';"
176176
assert result.strip() == expected, (
177177
f"CJS to ESM conversion failed.\nInput: {code}\nExpected: {expected}\nGot: {result}"
178178
)
@@ -182,7 +182,7 @@ def test_convert_property_access_require(self):
182182
code = "const myHelper = require('./utils').helperFunction;"
183183
result = convert_commonjs_to_esm(code)
184184

185-
expected = "import { helperFunction as myHelper } from './utils.js';"
185+
expected = "import { helperFunction as myHelper } from './utils';"
186186
assert result.strip() == expected, (
187187
f"CJS to ESM conversion failed.\nInput: {code}\nExpected: {expected}\nGot: {result}"
188188
)
@@ -192,7 +192,7 @@ def test_convert_default_property_access(self):
192192
code = "const MyClass = require('./class').default;"
193193
result = convert_commonjs_to_esm(code)
194194

195-
expected = "import MyClass from './class.js';"
195+
expected = "import MyClass from './class';"
196196
assert result.strip() == expected, (
197197
f"CJS to ESM conversion failed.\nInput: {code}\nExpected: {expected}\nGot: {result}"
198198
)
@@ -207,7 +207,7 @@ def test_convert_multiple_requires(self):
207207
result = convert_commonjs_to_esm(code)
208208

209209
expected = """\
210-
import { add, subtract } from './math.js';
210+
import { add, subtract } from './math';
211211
import lodash from 'lodash';
212212
import path from 'path';"""
213213

@@ -316,7 +316,7 @@ def test_convert_mixed_code_to_esm(self):
316316
result = ensure_module_system_compatibility(code, ModuleSystem.ES_MODULE)
317317

318318
# Should convert require to import
319-
assert "import { helper } from './helpers.js';" in result
319+
assert "import { helper } from './helpers';" in result
320320
assert "require" not in result, f"require should be converted to import. Got:\n{result}"
321321

322322
def test_convert_mixed_code_to_commonjs(self):

0 commit comments

Comments
 (0)