Skip to content

Commit e3ed581

Browse files
committed
feat(debugger): new setting for outputTimestamps in launch and workspace configuration to enable/disable timestamps in debug console
1 parent 248294f commit e3ed581

File tree

5 files changed

+52
-28
lines changed

5 files changed

+52
-28
lines changed

package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,12 @@
544544
"default": true,
545545
"scope": "resource"
546546
},
547+
"robotcode.debug.outputTimestamps": {
548+
"type": "boolean",
549+
"description": "Include timestamps in log and output messages.",
550+
"default": false,
551+
"scope": "resource"
552+
},
547553
"robotcode.debug.groupOutput": {
548554
"type": "boolean",
549555
"description": "Group start and stop suite/test/keyword messages in debug console.",
@@ -1001,6 +1007,11 @@
10011007
"description": "Output log messages from robotframework in debug console.",
10021008
"default": true
10031009
},
1010+
"outputTimestamps": {
1011+
"type": "boolean",
1012+
"description": "Include timestamps in log and output messages.",
1013+
"default": false
1014+
},
10041015
"groupOutput": {
10051016
"type": "boolean",
10061017
"description": "Group start and stop suite/test/keyword messages in debug console.",

robotcode/debugger/__main__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ async def run_robot(
138138
debugpy_port: int = 5678,
139139
output_messages: bool = False,
140140
output_log: bool = False,
141+
output_timestamps: bool = False,
141142
group_output: bool = False,
142143
stop_on_entry: bool = False,
143144
) -> Any:
@@ -199,6 +200,7 @@ async def run_robot(
199200
Debugger.instance().output_messages = output_messages
200201
Debugger.instance().output_log = output_log
201202
Debugger.instance().group_output = group_output
203+
Debugger.instance().output_timestamps = output_timestamps
202204
Debugger.instance().no_debug = no_debug
203205
Debugger.instance().set_main_thread(threading.current_thread())
204206
Debugger.instance().start()
@@ -331,6 +333,9 @@ def main() -> None:
331333
parser.add_argument(
332334
"-ol", "--output-log", action="store_true", help="Send log messages from robotframework to client."
333335
)
336+
parser.add_argument(
337+
"-ot", "--output-timestamps", action="store_true", help="Include timestamps in log and output messages."
338+
)
334339
parser.add_argument(
335340
"-og", "--group-output", action="store_true", help="Fold messages/log from robotframework to client."
336341
)
@@ -408,6 +413,7 @@ def main() -> None:
408413
args.debugpy_port,
409414
args.output_messages,
410415
args.output_log,
416+
args.output_timestamps,
411417
args.group_output,
412418
args.stop_on_entry,
413419
)

robotcode/debugger/debugger.py

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ def __init__(self) -> None:
243243
self._robot_output_file: Optional[str] = None
244244
self.output_messages: bool = False
245245
self.output_log: bool = False
246+
self.output_timestamps: bool = False
246247
self.group_output: bool = False
247248
self.hit_counts: Dict[HitCountEntry, int] = {}
248249
self.last_fail_message: Optional[str] = None
@@ -1013,53 +1014,52 @@ def log_message(self, message: Dict[str, Any]) -> None:
10131014
level = message["level"]
10141015
msg = message["message"]
10151016

1016-
if message["level"] == "FAIL":
1017+
if level == "FAIL":
10171018
self.last_fail_message = msg
10181019

1020+
if self.output_log:
1021+
self._send_log_event(message["timestamp"], level, msg, OutputCategory.CONSOLE)
1022+
1023+
def _send_log_event(self, timestamp: str, level: str, msg: str, category: Union[OutputCategory, str]) -> None:
10191024
current_frame = self.full_stack_frames[0] if self.full_stack_frames else None
10201025
source = (
10211026
Source(path=str(self.map_path_to_client(current_frame.source)))
1022-
if current_frame and current_frame.source
1027+
if current_frame and current_frame.is_file and current_frame.source
10231028
else None
10241029
)
10251030
line = current_frame.line if current_frame else None
10261031

1027-
if self.output_log:
1028-
self.send_event(
1029-
self,
1030-
OutputEvent(
1031-
body=OutputEventBody(
1032-
output=f"\u001b[38;5;237m{message['timestamp'].split(' ', 1)[1]}"
1033-
f" {self.MESSAGE_COLORS.get(level, '')}{level}\u001b[0m: {msg}\n",
1034-
category=OutputCategory.CONSOLE,
1035-
source=source,
1036-
line=line if line is not None else 0,
1037-
column=0 if source is not None else None,
1038-
)
1039-
),
1040-
)
1032+
self.send_event(
1033+
self,
1034+
OutputEvent(
1035+
body=OutputEventBody(
1036+
output=self._build_output(level, msg, timestamp),
1037+
category=category,
1038+
source=source,
1039+
line=line if line is not None else 0,
1040+
column=0 if source is not None else None,
1041+
)
1042+
),
1043+
)
1044+
1045+
def _build_output(self, level: str, msg: str, timestamp: str) -> str:
1046+
return (
1047+
(f"\u001b[38;5;237m{timestamp.split(' ', 1)[1]}\u001b[0m " if self.output_timestamps else "")
1048+
+ (f"[ {self.MESSAGE_COLORS.get(level, '')}{level}\u001b[0m ] " if level != "INFO" else "")
1049+
+ f"{msg}\n"
1050+
)
10411051

10421052
def message(self, message: Dict[str, Any]) -> None:
10431053
level = message["level"]
10441054
current_frame = self.full_stack_frames[0] if self.full_stack_frames else None
1055+
10451056
if (
10461057
self.output_messages
10471058
or current_frame is not None
10481059
and current_frame.type != "KEYWORD"
10491060
and level in ["FAIL", "ERROR", "WARN"]
10501061
):
1051-
msg = message["message"]
1052-
1053-
self.send_event(
1054-
self,
1055-
OutputEvent(
1056-
body=OutputEventBody(
1057-
output=f"\u001b[38;5;237m{message['timestamp'].split(' ', 1)[1]}"
1058-
f" {self.MESSAGE_COLORS.get(level, '')}{level}\u001b[0m: {msg}\n",
1059-
category=OutputCategory.CONSOLE,
1060-
)
1061-
),
1062-
)
1062+
self._send_log_event(message["timestamp"], level, message["message"], "messages")
10631063

10641064
def get_scopes(self, frame_id: int) -> List[Scope]:
10651065
result: List[Scope] = []

robotcode/debugger/launcher/server.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ async def _launch(
149149
outputDir: Optional[str] = None,
150150
outputMessages: Optional[bool] = False,
151151
outputLog: Optional[bool] = False,
152+
outputTimestamps: Optional[bool] = False,
152153
groupOutput: Optional[bool] = False,
153154
stopOnEntry: Optional[bool] = False, # noqa: N803
154155
dryRun: Optional[bool] = None,
@@ -190,6 +191,9 @@ async def _launch(
190191
if outputLog:
191192
run_args += ["-ol"]
192193

194+
if outputTimestamps:
195+
run_args += ["-ot"]
196+
193197
if groupOutput:
194198
run_args += ["-og"]
195199

vscode-client/debugmanager.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ class RobotCodeDebugConfigurationProvider implements vscode.DebugConfigurationPr
150150

151151
debugConfiguration.outputLog = debugConfiguration?.outputLog ?? config.get<boolean>("debug.outputLog");
152152

153+
debugConfiguration.outputTimestamps =
154+
debugConfiguration?.outputTimestamps ?? config.get<boolean>("debug.outputTimestamps");
155+
153156
debugConfiguration.groupOutput = debugConfiguration?.groupOutput ?? config.get<boolean>("debug.groupOutput");
154157

155158
if (!debugConfiguration.attachPython || debugConfiguration.noDebug) {

0 commit comments

Comments
 (0)