Skip to content

Commit

Permalink
Feat: allow different warning messages for logger and console (#3836)
Browse files Browse the repository at this point in the history
  • Loading branch information
treysp authored Feb 17, 2025
1 parent ddc8831 commit 8327fef
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 21 deletions.
40 changes: 26 additions & 14 deletions sqlmesh/core/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,13 @@ def log_error(self, message: str) -> None:
"""Display error info to the user."""

@abc.abstractmethod
def log_warning(self, message: str) -> None:
"""Display warning info to the user."""
def log_warning(self, short_message: str, long_message: t.Optional[str] = None) -> None:
"""Display warning info to the user.
Args:
short_message: The warning message to print to console.
long_message: The warning message to log to file. If not provided, `short_message` is used.
"""

@abc.abstractmethod
def log_success(self, message: str) -> None:
Expand Down Expand Up @@ -442,8 +447,8 @@ def log_destructive_change(
def log_error(self, message: str) -> None:
pass

def log_warning(self, message: str) -> None:
logger.warning(message)
def log_warning(self, short_message: str, long_message: t.Optional[str] = None) -> None:
logger.warning(long_message or short_message)

def log_success(self, message: str) -> None:
pass
Expand Down Expand Up @@ -1241,11 +1246,18 @@ def log_destructive_change(
def log_error(self, message: str) -> None:
self._print(f"[red]{message}[/red]")

def log_warning(self, message: str) -> None:
logger.warning(message)
def log_warning(self, short_message: str, long_message: t.Optional[str] = None) -> None:
logger.warning(long_message or short_message)
if not self.ignore_warnings:
message_lstrip = message.lstrip()
leading_ws = message[: -len(message_lstrip)]
if long_message:
for handler in logger.root.handlers:
if isinstance(handler, logging.FileHandler):
file_path = handler.baseFilename
break
file_path_msg = f" Learn more in logs: {file_path}\n" if file_path else ""
short_message = f"{short_message}{file_path_msg}"
message_lstrip = short_message.lstrip()
leading_ws = short_message[: -len(message_lstrip)]
message_formatted = f"{leading_ws}[yellow]\\[WARNING] {message_lstrip}[/yellow]"
self._print(message_formatted)

Expand Down Expand Up @@ -2078,9 +2090,9 @@ def log_failed_models(self, errors: t.List[NodeExecutionFailedError]) -> None:
def log_error(self, message: str) -> None:
super().log_error(f"```\n\\[ERROR] {message}```\n\n")

def log_warning(self, message: str) -> None:
logger.warning(message)
self._print(f"```\n\\[WARNING] {message}```\n\n")
def log_warning(self, short_message: str, long_message: t.Optional[str] = None) -> None:
logger.warning(long_message or short_message)
self._print(f"```\n\\[WARNING] {short_message}```\n\n")


class DatabricksMagicConsole(CaptureTerminalConsole):
Expand Down Expand Up @@ -2374,10 +2386,10 @@ def log_status_update(self, message: str) -> None:
def log_error(self, message: str) -> None:
self._write(message, style="bold red")

def log_warning(self, message: str) -> None:
logger.warning(message)
def log_warning(self, short_message: str, long_message: t.Optional[str] = None) -> None:
logger.warning(long_message or short_message)
if not self.ignore_warnings:
self._write(message, style="bold yellow")
self._write(short_message, style="bold yellow")

def log_success(self, message: str) -> None:
self._write(message, style="bold green")
Expand Down
3 changes: 2 additions & 1 deletion sqlmesh/core/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,8 @@ def evaluate(
audit_errors_to_raise.append(error)
else:
get_console().log_warning(
f"\n{error}. Audit is non-blocking so proceeding with execution. Audit query:\n{error.query.sql(error.adapter_dialect)}\n"
f"\n{error}.",
long_message=f"{error}. Audit query:\n{error.query.sql(error.adapter_dialect)}",
)

if audit_errors_to_raise:
Expand Down
8 changes: 2 additions & 6 deletions tests/core/test_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -464,11 +464,7 @@ def test_override_builtin_audit_blocking_mode():
plan = context.plan(auto_apply=True, no_prompts=True)
new_snapshot = next(iter(plan.context_diff.new_snapshots.values()))

version = new_snapshot.fingerprint.to_version()
assert (
mock_logger.call_args_list[0][0][0]
== f'\n\'not_null\' audit error: 1 row failed. Audit is non-blocking so proceeding with execution. Audit query:\nSELECT * FROM (SELECT * FROM "sqlmesh__db"."db__x__{version}" AS "db__x__{version}") AS "_q_0" WHERE "c" IS NULL AND TRUE\n'
)
assert mock_logger.call_args_list[0][0][0] == "\n'not_null' audit error: 1 row failed."

# Even though there are two builtin audits referenced in the above definition, we only
# store the one that overrides `blocking` in the snapshot; the other one isn't needed
Expand Down Expand Up @@ -1369,5 +1365,5 @@ def test_plan_runs_audits_on_dev_previews(sushi_context: Context, capsys, caplog
stdout = capsys.readouterr().out
log = caplog.text
assert "'not_null' audit error:" in log
assert "Audit is non-blocking so proceeding with execution" in log
assert "'at_least_one_non_blocking' audit error:" in log
assert "Target environment updated successfully" in stdout

0 comments on commit 8327fef

Please sign in to comment.