Skip to content

Commit 2c6bf25

Browse files
committed
feat(vscode): add info to hover
1 parent 9cec846 commit 2c6bf25

4 files changed

Lines changed: 52 additions & 6 deletions

File tree

sqlmesh/lsp/description.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from sqlmesh.core.model.definition import (
2+
ExternalModel,
3+
PythonModel,
4+
SeedModel,
5+
SqlModel,
6+
)
7+
import typing as t
8+
9+
10+
def generate_markdown_description(
11+
model: t.Union[SqlModel, ExternalModel, PythonModel, SeedModel],
12+
) -> t.Optional[str]:
13+
columns = model.columns_to_types
14+
column_descriptions = model.column_descriptions
15+
16+
columns_table = (
17+
"\n".join(
18+
[
19+
f"| {column} | {column_type} | {column_descriptions.get(column, '')} |"
20+
for column, column_type in columns.items()
21+
]
22+
)
23+
if columns
24+
else ""
25+
)
26+
27+
table_header = "\n\n| Column | Type | Description |\n|--------|------|-------------|\n"
28+
return (
29+
f"{model.description}{table_header}{columns_table}" if columns_table else model.description
30+
)

sqlmesh/lsp/main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,12 @@ def hover(ls: LanguageServer, params: types.HoverParams) -> t.Optional[types.Hov
239239
if not references:
240240
return None
241241
reference = references[0]
242-
if not reference.description:
242+
if not reference.markdown_description:
243243
return None
244244
return types.Hover(
245245
contents=types.MarkupContent(
246-
kind=types.MarkupKind.Markdown, value=reference.description
246+
kind=types.MarkupKind.Markdown,
247+
value=reference.markdown_description,
247248
),
248249
range=reference.range,
249250
)

sqlmesh/lsp/reference.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from sqlmesh.core.model.definition import SqlModel
66
from sqlmesh.lsp.context import LSPContext, ModelTarget, AuditTarget
77
from sqlglot import exp
8+
from sqlmesh.lsp.description import generate_markdown_description
89
from sqlmesh.lsp.uri import URI
910
from sqlmesh.utils.pydantic import PydanticModel
1011

@@ -16,12 +17,12 @@ class Reference(PydanticModel):
1617
Attributes:
1718
range: The range of the reference in the source file
1819
uri: The uri of the referenced model
19-
description: The description of the referenced model
20+
markdown_description: The markdown description of the referenced model
2021
"""
2122

2223
range: Range
2324
uri: str
24-
description: t.Optional[str] = None
25+
markdown_description: t.Optional[str] = None
2526

2627

2728
def by_position(position: Position) -> t.Callable[[Reference], bool]:
@@ -176,11 +177,13 @@ def get_model_definitions_for_a_path(
176177
catalog_or_db_range = _range_from_token_position_details(catalog_or_db_meta, read_file)
177178
start_pos = catalog_or_db_range.start
178179

180+
description = generate_markdown_description(referenced_model)
181+
179182
references.append(
180183
Reference(
181184
uri=referenced_model_uri.value,
182185
range=Range(start=start_pos, end=end_pos),
183-
description=referenced_model.description,
186+
markdown_description=description,
184187
)
185188
)
186189

tests/lsp/test_reference.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,19 @@ def test_reference_with_alias() -> None:
6060

6161
assert references[0].uri.endswith("orders.py")
6262
assert get_string_from_range(read_file, references[0].range) == "sushi.orders"
63-
assert references[0].description == "Table of sushi orders."
63+
assert (
64+
references[0].markdown_description
65+
== """Table of sushi orders.
66+
67+
| Column | Type | Description |
68+
|--------|------|-------------|
69+
| id | INT | |
70+
| customer_id | INT | |
71+
| waiter_id | INT | |
72+
| start_ts | INT | |
73+
| end_ts | INT | |
74+
| event_date | DATE | |"""
75+
)
6476
assert references[1].uri.endswith("order_items.py")
6577
assert get_string_from_range(read_file, references[1].range) == "sushi.order_items"
6678
assert references[2].uri.endswith("items.py")

0 commit comments

Comments
 (0)