diff --git a/src/databricks/labs/lsql/cli.py b/src/databricks/labs/lsql/cli.py index 0ac30416..fc50fe56 100644 --- a/src/databricks/labs/lsql/cli.py +++ b/src/databricks/labs/lsql/cli.py @@ -1,4 +1,5 @@ import webbrowser +from collections.abc import Iterable from pathlib import Path from databricks.labs.blueprint.cli import App @@ -43,12 +44,15 @@ def create_dashboard( @lsql.command(is_unauthenticated=True) -def fmt(folder: Path = Path.cwd(), *, normalize_case: str = "true"): +def fmt(folder: Path = Path.cwd(), *, normalize_case: str = "true", exclude: Iterable[str] = ()): """Format SQL files in a folder""" logger.debug("Formatting SQL files ...") folder = Path(folder) + exclusions = list(Path(folder, excluded) for excluded in exclude) should_normalize_case = normalize_case in STRING_AFFIRMATIVES for sql_file in folder.glob("**/*.sql"): + if any(sql_file.is_relative_to(exclusion) for exclusion in exclusions): + continue sql = sql_file.read_text() formatted_sql = QueryTile.format(sql, normalize_case=should_normalize_case) sql_file.write_text(formatted_sql) diff --git a/tests/unit/samples/with-line-comments.sql b/tests/unit/samples/with-line-comments.sql new file mode 100644 index 00000000..8752d537 --- /dev/null +++ b/tests/unit/samples/with-line-comments.sql @@ -0,0 +1,2 @@ +-- a comment +SELECT * FROM xyz_table \ No newline at end of file diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py index a4488511..c7a608b8 100644 --- a/tests/unit/test_cli.py +++ b/tests/unit/test_cli.py @@ -1,9 +1,13 @@ +import json +import sys from pathlib import Path +from unittest import mock from unittest.mock import create_autospec from databricks.sdk import WorkspaceClient from databricks.labs.lsql import cli +from databricks.labs.lsql.cli import lsql def test_cli_create_dashboard_invokes_deploy_dashboard(): @@ -13,3 +17,15 @@ def test_cli_create_dashboard_invokes_deploy_dashboard(): cli.create_dashboard(ws, dashboard_path, open_browser="f") ws.lakeview.create.assert_called_once() + + +def test_cli_fmt_excludes_directories(): + path = Path(__file__).parent.parent.parent + json_command = json.dumps( + { + "command": "fmt", + "flags": {"log_level": "disabled", "folder": path.as_posix(), "exclude": ["tests/unit/samples/"]}, + } + ) + with mock.patch.object(sys, "argv", [..., json_command]): + lsql()