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 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.dev15'
21
- __version_tuple__ = version_tuple = (0, 189, 3, 'dev15')
20
+ __version__ = version = '0.189.3.dev16'
21
+ __version_tuple__ = version_tuple = (0, 189, 3, 'dev16')
@@ -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], file_uri: t.Optional[URI], content: t.Optional[str] = None
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
- def get_autocomplete(
180
- self, uri: t.Optional[URI], content: t.Optional[str] = None
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 autocomplete suggestions for a file.
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, content)
188
+ return get_sql_completions(self, uri, file_content)
sqlmesh/lsp/custom.py CHANGED
@@ -20,6 +20,7 @@ class AllModelsResponse(PydanticModel):
20
20
 
21
21
  models: t.List[str]
22
22
  keywords: t.List[str]
23
+ macros: t.List[str]
23
24
 
24
25
 
25
26
  RENDER_MODEL_FEATURE = "sqlmesh/render_model"
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 context.get_autocomplete(uri, content)
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(types.TEXT_DOCUMENT_COMPLETION)
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 = context.get_autocomplete(uri, content)
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 keyword completions
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlmesh
3
- Version: 0.189.3.dev15
3
+ Version: 0.189.3.dev16
4
4
  Summary: Next-generation data transformation framework
5
5
  Author-email: "TobikoData Inc." <engineering@tobikodata.com>
6
6
  License: Apache License
@@ -1,5 +1,5 @@
1
1
  sqlmesh/__init__.py,sha256=QjwaamJIdW7voXoS880yAx7tHm-Im4_mqGA-XJgafos,7631
2
- sqlmesh/_version.py,sha256=1eLtQgqb1L-uJQOiBtrfXfj7cI1FPqjuUvkYTjt35xQ,530
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=Y6zNKNne91tzRm5vRk82JmhIpo7dIBUoK8GGQesGlT8,5746
163
- sqlmesh/lsp/context.py,sha256=36bUTiMSyfX91bri_F1aivDvSllq0rKidIM_RGAtirs,6253
164
- sqlmesh/lsp/custom.py,sha256=f6-s5gJop6YjTmX7jfwTIqjYvinhMpv_T9v0H7g4DuM,2172
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=QojzsVkMxm3ZZmMwbIRkzS-RwxYSpXInp5owow16L_4,35410
168
- sqlmesh/lsp/reference.py,sha256=GKZw0TSvo6Y1FwV67jIliG1ofwDChyymF4yxVxzrEAQ,22026
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.dev15.dist-info/licenses/LICENSE,sha256=OlMefUjgWJdULtf84BLW0AZZcY8DwdgQqb_1j2862j8,11346
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.dev15.dist-info/METADATA,sha256=FhiDjFsrLh-IeiBxB5zemuzTieFkVC2210fZVgzTsQg,26541
396
- sqlmesh-0.189.3.dev15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
397
- sqlmesh-0.189.3.dev15.dist-info/entry_points.txt,sha256=pIYKtg-u-uO7BK_Y0qrdmfyj0bYrcMc3Xiqr5WE3VFk,121
398
- sqlmesh-0.189.3.dev15.dist-info/top_level.txt,sha256=bspjo5vjELQkuN0qKuTFIbsrUt3Zeo8D2mlKeHG1LdE,12
399
- sqlmesh-0.189.3.dev15.dist-info/RECORD,,
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,,