sqlmesh 0.189.3.dev15__py3-none-any.whl → 0.189.3.dev16__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sqlmesh/_version.py +2 -2
- sqlmesh/lsp/completions.py +18 -2
- sqlmesh/lsp/context.py +7 -12
- sqlmesh/lsp/custom.py +1 -0
- sqlmesh/lsp/helpers.py +27 -0
- sqlmesh/lsp/main.py +26 -4
- sqlmesh/lsp/reference.py +2 -23
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/METADATA +1 -1
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/RECORD +13 -12
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/WHEEL +0 -0
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/entry_points.txt +0 -0
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/licenses/LICENSE +0 -0
- {sqlmesh-0.189.3.dev15.dist-info → sqlmesh-0.189.3.dev16.dist-info}/top_level.txt +0 -0
sqlmesh/_version.py
CHANGED
|
@@ -17,5 +17,5 @@ __version__: str
|
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
|
18
18
|
version_tuple: VERSION_TUPLE
|
|
19
19
|
|
|
20
|
-
__version__ = version = '0.189.3.
|
|
21
|
-
__version_tuple__ = version_tuple = (0, 189, 3, '
|
|
20
|
+
__version__ = version = '0.189.3.dev16'
|
|
21
|
+
__version_tuple__ = version_tuple = (0, 189, 3, 'dev16')
|
sqlmesh/lsp/completions.py
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
from functools import lru_cache
|
|
2
2
|
from sqlglot import Dialect, Tokenizer
|
|
3
3
|
from sqlmesh.lsp.custom import AllModelsResponse
|
|
4
|
+
from sqlmesh import macro
|
|
4
5
|
import typing as t
|
|
5
6
|
from sqlmesh.lsp.context import AuditTarget, LSPContext, ModelTarget
|
|
6
7
|
from sqlmesh.lsp.uri import URI
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def get_sql_completions(
|
|
10
|
-
context: t.Optional[LSPContext]
|
|
11
|
+
context: t.Optional[LSPContext] = None,
|
|
12
|
+
file_uri: t.Optional[URI] = None,
|
|
13
|
+
content: t.Optional[str] = None,
|
|
11
14
|
) -> AllModelsResponse:
|
|
12
15
|
"""
|
|
13
16
|
Return a list of completions for a given file.
|
|
@@ -26,6 +29,7 @@ def get_sql_completions(
|
|
|
26
29
|
return AllModelsResponse(
|
|
27
30
|
models=list(get_models(context, file_uri)),
|
|
28
31
|
keywords=all_keywords,
|
|
32
|
+
macros=list(get_macros(context, file_uri)),
|
|
29
33
|
)
|
|
30
34
|
|
|
31
35
|
|
|
@@ -56,6 +60,17 @@ def get_models(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t.
|
|
|
56
60
|
return all_models
|
|
57
61
|
|
|
58
62
|
|
|
63
|
+
def get_macros(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t.Set[str]:
|
|
64
|
+
"""Return a set of all macros with the ``@`` prefix."""
|
|
65
|
+
names = set(macro.get_registry())
|
|
66
|
+
try:
|
|
67
|
+
if context is not None:
|
|
68
|
+
names.update(context.context._macros)
|
|
69
|
+
except Exception:
|
|
70
|
+
pass
|
|
71
|
+
return names
|
|
72
|
+
|
|
73
|
+
|
|
59
74
|
def get_keywords(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t.Set[str]:
|
|
60
75
|
"""
|
|
61
76
|
Return a list of sql keywords for a given file.
|
|
@@ -138,6 +153,7 @@ def get_dialect(context: t.Optional[LSPContext], file_uri: t.Optional[URI]) -> t
|
|
|
138
153
|
def extract_keywords_from_content(content: str, dialect: t.Optional[str] = None) -> t.Set[str]:
|
|
139
154
|
"""
|
|
140
155
|
Extract identifiers from SQL content using the tokenizer.
|
|
156
|
+
|
|
141
157
|
Only extracts identifiers (variable names, table names, column names, etc.)
|
|
142
158
|
that are not SQL keywords.
|
|
143
159
|
"""
|
|
@@ -155,7 +171,7 @@ def extract_keywords_from_content(content: str, dialect: t.Optional[str] = None)
|
|
|
155
171
|
keywords.add(token.text)
|
|
156
172
|
|
|
157
173
|
except Exception:
|
|
158
|
-
# If tokenization fails, return empty set
|
|
174
|
+
# If tokenization fails, return an empty set
|
|
159
175
|
pass
|
|
160
176
|
|
|
161
177
|
return keywords
|
sqlmesh/lsp/context.py
CHANGED
|
@@ -176,18 +176,13 @@ class LSPContext:
|
|
|
176
176
|
if audit._path is not None
|
|
177
177
|
]
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
@staticmethod
|
|
180
|
+
def get_completions(
|
|
181
|
+
self: t.Optional["LSPContext"] = None,
|
|
182
|
+
uri: t.Optional[URI] = None,
|
|
183
|
+
file_content: t.Optional[str] = None,
|
|
181
184
|
) -> AllModelsResponse:
|
|
182
|
-
"""Get
|
|
183
|
-
|
|
184
|
-
Args:
|
|
185
|
-
uri: The URI of the file to get autocomplete suggestions for.
|
|
186
|
-
content: The content of the file (optional).
|
|
187
|
-
|
|
188
|
-
Returns:
|
|
189
|
-
AllModelsResponse containing models and keywords.
|
|
190
|
-
"""
|
|
185
|
+
"""Get completion suggestions for a file"""
|
|
191
186
|
from sqlmesh.lsp.completions import get_sql_completions
|
|
192
187
|
|
|
193
|
-
return get_sql_completions(self, uri,
|
|
188
|
+
return get_sql_completions(self, uri, file_content)
|
sqlmesh/lsp/custom.py
CHANGED
sqlmesh/lsp/helpers.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from lsprotocol.types import Range, Position
|
|
2
|
+
|
|
3
|
+
from sqlmesh.core.linter.helpers import (
|
|
4
|
+
Range as SQLMeshRange,
|
|
5
|
+
Position as SQLMeshPosition,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def to_lsp_range(
|
|
10
|
+
range: SQLMeshRange,
|
|
11
|
+
) -> Range:
|
|
12
|
+
"""
|
|
13
|
+
Converts a SQLMesh Range to an LSP Range.
|
|
14
|
+
"""
|
|
15
|
+
return Range(
|
|
16
|
+
start=Position(line=range.start.line, character=range.start.character),
|
|
17
|
+
end=Position(line=range.end.line, character=range.end.character),
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def to_lsp_position(
|
|
22
|
+
position: SQLMeshPosition,
|
|
23
|
+
) -> Position:
|
|
24
|
+
"""
|
|
25
|
+
Converts a SQLMesh Position to an LSP Position.
|
|
26
|
+
"""
|
|
27
|
+
return Position(line=position.line, character=position.character)
|
sqlmesh/lsp/main.py
CHANGED
|
@@ -145,7 +145,7 @@ class SQLMeshLanguageServer:
|
|
|
145
145
|
|
|
146
146
|
try:
|
|
147
147
|
context = self._context_get_or_load(uri)
|
|
148
|
-
return
|
|
148
|
+
return LSPContext.get_completions(context, uri, content)
|
|
149
149
|
except Exception as e:
|
|
150
150
|
from sqlmesh.lsp.completions import get_sql_completions
|
|
151
151
|
|
|
@@ -565,7 +565,10 @@ class SQLMeshLanguageServer:
|
|
|
565
565
|
)
|
|
566
566
|
return types.WorkspaceDiagnosticReport(items=[])
|
|
567
567
|
|
|
568
|
-
@self.server.feature(
|
|
568
|
+
@self.server.feature(
|
|
569
|
+
types.TEXT_DOCUMENT_COMPLETION,
|
|
570
|
+
types.CompletionOptions(trigger_characters=["@"]), # advertise "@" for macros
|
|
571
|
+
)
|
|
569
572
|
def completion(
|
|
570
573
|
ls: LanguageServer, params: types.CompletionParams
|
|
571
574
|
) -> t.Optional[types.CompletionList]:
|
|
@@ -583,7 +586,7 @@ class SQLMeshLanguageServer:
|
|
|
583
586
|
pass
|
|
584
587
|
|
|
585
588
|
# Get completions using the existing completions module
|
|
586
|
-
completion_response =
|
|
589
|
+
completion_response = LSPContext.get_completions(context, uri, content)
|
|
587
590
|
|
|
588
591
|
completion_items = []
|
|
589
592
|
# Add model completions
|
|
@@ -595,7 +598,26 @@ class SQLMeshLanguageServer:
|
|
|
595
598
|
detail="SQLMesh Model",
|
|
596
599
|
)
|
|
597
600
|
)
|
|
598
|
-
# Add
|
|
601
|
+
# Add macro completions
|
|
602
|
+
triggered_by_at = (
|
|
603
|
+
params.context is not None
|
|
604
|
+
and getattr(params.context, "trigger_character", None) == "@"
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
for macro_name in completion_response.macros:
|
|
608
|
+
insert_text = macro_name if triggered_by_at else f"@{macro_name}"
|
|
609
|
+
|
|
610
|
+
completion_items.append(
|
|
611
|
+
types.CompletionItem(
|
|
612
|
+
label=f"@{macro_name}",
|
|
613
|
+
insert_text=insert_text,
|
|
614
|
+
insert_text_format=types.InsertTextFormat.PlainText,
|
|
615
|
+
filter_text=macro_name,
|
|
616
|
+
kind=types.CompletionItemKind.Function,
|
|
617
|
+
detail="SQLMesh Macro",
|
|
618
|
+
)
|
|
619
|
+
)
|
|
620
|
+
|
|
599
621
|
for keyword in completion_response.keywords:
|
|
600
622
|
completion_items.append(
|
|
601
623
|
types.CompletionItem(
|
sqlmesh/lsp/reference.py
CHANGED
|
@@ -7,14 +7,14 @@ from sqlmesh.core.audit import StandaloneAudit
|
|
|
7
7
|
from sqlmesh.core.dialect import normalize_model_name
|
|
8
8
|
from sqlmesh.core.linter.helpers import (
|
|
9
9
|
TokenPositionDetails,
|
|
10
|
-
Range as SQLMeshRange,
|
|
11
|
-
Position as SQLMeshPosition,
|
|
12
10
|
)
|
|
13
11
|
from sqlmesh.core.model.definition import SqlModel
|
|
14
12
|
from sqlmesh.lsp.context import LSPContext, ModelTarget, AuditTarget
|
|
15
13
|
from sqlglot import exp
|
|
16
14
|
from sqlmesh.lsp.description import generate_markdown_description
|
|
17
15
|
from sqlglot.optimizer.scope import build_scope
|
|
16
|
+
|
|
17
|
+
from sqlmesh.lsp.helpers import to_lsp_range, to_lsp_position
|
|
18
18
|
from sqlmesh.lsp.uri import URI
|
|
19
19
|
from sqlmesh.utils.pydantic import PydanticModel
|
|
20
20
|
from sqlglot.optimizer.normalize_identifiers import normalize_identifiers
|
|
@@ -624,24 +624,3 @@ def _position_within_range(position: Position, range: Range) -> bool:
|
|
|
624
624
|
range.end.line > position.line
|
|
625
625
|
or (range.end.line == position.line and range.end.character >= position.character)
|
|
626
626
|
)
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
def to_lsp_range(
|
|
630
|
-
range: SQLMeshRange,
|
|
631
|
-
) -> Range:
|
|
632
|
-
"""
|
|
633
|
-
Converts a SQLMesh Range to an LSP Range.
|
|
634
|
-
"""
|
|
635
|
-
return Range(
|
|
636
|
-
start=Position(line=range.start.line, character=range.start.character),
|
|
637
|
-
end=Position(line=range.end.line, character=range.end.character),
|
|
638
|
-
)
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
def to_lsp_position(
|
|
642
|
-
position: SQLMeshPosition,
|
|
643
|
-
) -> Position:
|
|
644
|
-
"""
|
|
645
|
-
Converts a SQLMesh Position to an LSP Position.
|
|
646
|
-
"""
|
|
647
|
-
return Position(line=position.line, character=position.character)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
|
|
2
|
-
sqlmesh/_version.py,sha256=
|
|
2
|
+
sqlmesh/_version.py,sha256=KfgTUJjeG5ywaHgAjhP6EdeZuF4EZOqNtxrzAhc-txM,530
|
|
3
3
|
sqlmesh/magics.py,sha256=gjzoxREb1XT8Yho_PQMlMqhhkLq_sEfBM8S3PTgxvWE,40337
|
|
4
4
|
sqlmesh/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
sqlmesh/cicd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -159,13 +159,14 @@ sqlmesh/integrations/github/cicd/command.py,sha256=rNWb-aMOA9R23YumD5vPwR0PgPGGj
|
|
|
159
159
|
sqlmesh/integrations/github/cicd/config.py,sha256=tRhMZaLf1p6AWXvi67n85Q-lptJNGt1Wk_Jr61ytpiM,2104
|
|
160
160
|
sqlmesh/integrations/github/cicd/controller.py,sha256=IgUWK9orYSMiElO3GaL6Ja-osFgA7je3RDcLChWUi5s,43769
|
|
161
161
|
sqlmesh/lsp/api.py,sha256=LJdECSaEZoPbu_Xl4KscVG-WLt7_g4dY-zKGO68dH14,2162
|
|
162
|
-
sqlmesh/lsp/completions.py,sha256=
|
|
163
|
-
sqlmesh/lsp/context.py,sha256=
|
|
164
|
-
sqlmesh/lsp/custom.py,sha256=
|
|
162
|
+
sqlmesh/lsp/completions.py,sha256=dsGE8f6RWNjOPvs80QdTvv1YaKo1bbTJ5ZzQmnNcpbA,6184
|
|
163
|
+
sqlmesh/lsp/context.py,sha256=QGbNL0sifxzVJ7T1U5oWcJ5FXrOrLrVKt1jtH1qM_50,6099
|
|
164
|
+
sqlmesh/lsp/custom.py,sha256=40ekRrcsJ-lsF4-uPs4mo8CFegTWK_zKzi4am_NO9oo,2196
|
|
165
165
|
sqlmesh/lsp/description.py,sha256=4QIGC9ix8IzmWF6DVUNhY4m1Crk3sNQA6hZ1RbyqU78,827
|
|
166
|
+
sqlmesh/lsp/helpers.py,sha256=igzUgeYAO3LUZFr3qN4l9hzztOy66lRubX93KtCMduY,654
|
|
166
167
|
sqlmesh/lsp/hints.py,sha256=j-blccBUil94yRoDjWfkSM0HqMmsKD6hP2TaWdWWVk4,3734
|
|
167
|
-
sqlmesh/lsp/main.py,sha256=
|
|
168
|
-
sqlmesh/lsp/reference.py,sha256=
|
|
168
|
+
sqlmesh/lsp/main.py,sha256=QpwMayubrXIgapAWuiGtkW_RTrcvvo_8qA8-IpGVG0I,36375
|
|
169
|
+
sqlmesh/lsp/reference.py,sha256=hHkSdnlcdoMO5nAhrpY1Ui-hRJ_SqX_5YqRGV192nPQ,21525
|
|
169
170
|
sqlmesh/lsp/uri.py,sha256=mvSLbZGmMTHPpliThOtVWiFcHnfJzp1w39q9l-xD2SI,802
|
|
170
171
|
sqlmesh/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
171
172
|
sqlmesh/migrations/v0001_init.py,sha256=h8FwMYJj9_O8yGpk12guaSaGwX5A3we2GiKeHrXi15o,2048
|
|
@@ -274,7 +275,7 @@ sqlmesh/utils/pydantic.py,sha256=I898jAFqa3qU6lG2uPpRebVFncOUo8ZrLWM_R3K3DHU,116
|
|
|
274
275
|
sqlmesh/utils/rich.py,sha256=xNZyPCqEc4TAlJlsEthg-5eYUWpaizz0QjBzO7a1Yv4,1509
|
|
275
276
|
sqlmesh/utils/windows.py,sha256=r7Yin4WEwbvH7sKA3hOJtRsclmscNuBeCklCfVPvtQs,611
|
|
276
277
|
sqlmesh/utils/yaml.py,sha256=np-WVcwmwsKghCgAj1OBBMsK1SXSRn4wR-H37cGiFr8,2282
|
|
277
|
-
sqlmesh-0.189.3.
|
|
278
|
+
sqlmesh-0.189.3.dev16.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
|
|
278
279
|
web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
279
280
|
web/client/dist/index.html,sha256=OVPMTMsqC8zy0qnBcMb7PpVcqTHdIJoCmJLYh7gC1Xs,5472
|
|
280
281
|
web/client/dist/assets/Audits-Bvr7M5Cg.js,sha256=GrigkyEVYbM5zy0PAjOXdqmVV0kL-STP5gFQmx35vhw,1041
|
|
@@ -392,8 +393,8 @@ web/server/api/endpoints/models.py,sha256=ud-lRwriyI_OYg9tZchrBgeiXELiRTLNEodraf
|
|
|
392
393
|
web/server/api/endpoints/modules.py,sha256=8hqqgonGay_mJmpCw0IdbjsPhWlQH2VLdKAqha-myac,468
|
|
393
394
|
web/server/api/endpoints/plan.py,sha256=OYuQ_4dgbhG9ibTcX1a8mvYgH3ANxw9Fhbb4wg6QWqc,9222
|
|
394
395
|
web/server/api/endpoints/table_diff.py,sha256=SCy3-pr5x6bEEiOaZGCDbiHQhpgxwmnz3Acqa2Ie6jI,2090
|
|
395
|
-
sqlmesh-0.189.3.
|
|
396
|
-
sqlmesh-0.189.3.
|
|
397
|
-
sqlmesh-0.189.3.
|
|
398
|
-
sqlmesh-0.189.3.
|
|
399
|
-
sqlmesh-0.189.3.
|
|
396
|
+
sqlmesh-0.189.3.dev16.dist-info/METADATA,sha256=v0_guwqYg2fdwDYdVgmVV6SBmXvvr-AWIJ_LuVA8mQY,26541
|
|
397
|
+
sqlmesh-0.189.3.dev16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
398
|
+
sqlmesh-0.189.3.dev16.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
|
|
399
|
+
sqlmesh-0.189.3.dev16.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
|
|
400
|
+
sqlmesh-0.189.3.dev16.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|