Skip to content

Commit 2551f8f

Browse files
davidberenstein1957cursoragent
authored andcommitted
fix(cli): use OfflineEmissionsTracker for offline monitor runs
Pass an explicit offline flag from monitor to run_and_monitor so tracker selection matches the non-delegate path instead of inferring from kwargs. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 5c3331a commit 2551f8f

4 files changed

Lines changed: 57 additions & 4 deletions

File tree

codecarbon/cli/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ def monitor(
377377

378378
# If extra args are provided (e.g. `codecarbon monitor -- my_script.py`), delegate to `run_and_monitor`
379379
if getattr(ctx, "args", None):
380-
return run_and_monitor(ctx, **tracker_args)
380+
return run_and_monitor(ctx, offline=offline, **tracker_args)
381381

382382
# Instantiate the tracker
383383
if offline:

codecarbon/cli/monitor.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rich import print
99
from typing_extensions import Annotated
1010

11-
from codecarbon.emissions_tracker import EmissionsTracker
11+
from codecarbon.emissions_tracker import EmissionsTracker, OfflineEmissionsTracker
1212

1313

1414
def run_and_monitor(
@@ -17,6 +17,7 @@ def run_and_monitor(
1717
str,
1818
typer.Option(help="Log level (critical, error, warning, info, debug)"),
1919
] = "error",
20+
offline: bool = False,
2021
**tracker_args,
2122
):
2223
"""
@@ -63,8 +64,8 @@ def run_and_monitor(
6364
)
6465
raise typer.Exit(1)
6566

66-
# Initialize tracker with specified logging level and shared args
67-
tracker = EmissionsTracker(
67+
tracker_cls = OfflineEmissionsTracker if offline else EmissionsTracker
68+
tracker = tracker_cls(
6869
log_level=log_level,
6970
save_to_logger=False,
7071
tracking_mode="process",

tests/cli/test_cli_main.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,27 @@ def stop(self):
303303
assert calls["kwargs"]["region"] == "IDF"
304304

305305

306+
def test_monitor_delegates_offline_flag_to_run_and_monitor(monkeypatch):
307+
captured = {}
308+
309+
def fake_run_and_monitor(ctx, offline=False, **kwargs):
310+
captured["offline"] = offline
311+
captured["kwargs"] = kwargs
312+
return "ok"
313+
314+
monkeypatch.setattr(cli_main, "run_and_monitor", fake_run_and_monitor)
315+
316+
ctx = SimpleNamespace(args=["python", "-c", "print(1)"])
317+
result = cli_main.monitor(
318+
ctx=ctx,
319+
offline=True,
320+
country_iso_code="FRA",
321+
)
322+
assert result == "ok"
323+
assert captured["offline"] is True
324+
assert captured["kwargs"]["country_iso_code"] == "FRA"
325+
326+
306327
def test_monitor_delegates_to_run_and_monitor_with_extra_args(monkeypatch):
307328
captured = {}
308329

tests/cli/test_monitor.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,37 @@ def __init__(self, command, text=True):
6060
assert exc_info.value.exit_code == 1
6161

6262

63+
def test_run_and_monitor_uses_offline_tracker_when_offline_mode(monkeypatch):
64+
captured = {}
65+
66+
class FakeOfflineTracker(FakeTracker):
67+
def __init__(self, **kwargs):
68+
captured["kwargs"] = kwargs
69+
super().__init__()
70+
71+
class FakePopen:
72+
def __init__(self, command, text=True):
73+
pass
74+
75+
def wait(self):
76+
return 0
77+
78+
monkeypatch.setattr(monitor_module, "OfflineEmissionsTracker", FakeOfflineTracker)
79+
monkeypatch.setattr(monitor_module, "EmissionsTracker", FakeTracker)
80+
monkeypatch.setattr(monitor_module.subprocess, "Popen", FakePopen)
81+
monkeypatch.setattr(monitor_module, "print", lambda *args, **kwargs: None)
82+
83+
with pytest.raises(typer.Exit) as exc_info:
84+
monitor_module.run_and_monitor(
85+
SimpleNamespace(args=["echo", "hi"]),
86+
offline=True,
87+
country_iso_code="FRA",
88+
)
89+
90+
assert exc_info.value.exit_code == 0
91+
assert captured["kwargs"]["country_iso_code"] == "FRA"
92+
93+
6394
def test_run_and_monitor_handles_keyboard_interrupt(monkeypatch):
6495
process_info = {"terminated": 0, "killed": 0}
6596

0 commit comments

Comments
 (0)