Skip to content

Commit 96dd559

Browse files
committed
temp
[ci skip]
1 parent 9ac2cf5 commit 96dd559

2 files changed

Lines changed: 61 additions & 38 deletions

File tree

sqlmesh/core/linter/rules/builtin.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ def _standard_error_message(
215215
"Please register them in the external models file. This can be done by running 'sqlmesh create_external_models'.",
216216
)
217217

218-
def create_fix(self, model_name: str) -> t.Optional[TextEdit]:
218+
def create_fix(self, model_name: str) -> t.Optional[Fix]:
219219
"""
220220
Add an external model to the external models file.
221221
- If no external models file exists, it will create one with the model.
@@ -227,30 +227,40 @@ def create_fix(self, model_name: str) -> t.Optional[TextEdit]:
227227

228228
external_models_path = root / EXTERNAL_MODELS_YAML
229229
if not external_models_path.exists():
230-
return TextEdit(
231-
path=external_models_path,
232-
range=Range(start=Position(0, 0), end=Position(0, 0)),
233-
new_text=f"- name: {model_name}\n",
230+
return Fix(
231+
title="Add external model",
232+
edits=[
233+
TextEdit(
234+
path=external_models_path,
235+
range=Range(start=Position(0, 0), end=Position(0, 0)),
236+
new_text=f"- name: {model_name}\n",
237+
)
238+
],
234239
)
235240

236241
# Figure out the position to insert the new external model at the end of the file, whether
237242
# needs new line or not.
238243
with open(external_models_path, "r", encoding="utf-8") as file:
239-
lines = file.readlines()
244+
lines = file.read()
240245

241-
if lines and lines[-1].strip():
242-
# If the last line is not empty, we need to add a new line before adding the new model.
243-
position = Position(line=len(lines), character=0)
244-
new_text = f'\n- name: "{model_name}"\n'
246+
# If file ends in newline, we can add the new model directly.
247+
if not lines.endswith("\n"):
248+
new_text = f"\n- name: {model_name}\n"
245249
else:
246-
# If the last line is empty, we can add the new model directly.
247-
position = Position(line=len(lines) - 1, character=0)
248-
new_text = f'- name: "{model_name}"\n'
249-
250-
return TextEdit(
251-
path=external_models_path,
252-
range=Range(start=position, end=position),
253-
new_text=new_text,
250+
new_text = f"- name: {model_name}\n"
251+
252+
split_lines = lines.splitlines()
253+
position = Position(line=len(split_lines) - 1, character=len(split_lines[-1]))
254+
255+
return Fix(
256+
title="Add external model",
257+
edits=[
258+
TextEdit(
259+
path=external_models_path,
260+
range=Range(start=position, end=position),
261+
new_text=new_text,
262+
)
263+
],
254264
)
255265

256266

tests/core/linter/test_builtin.py

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,27 @@ def test_no_missing_external_models(tmp_path, copy_to_temp_path) -> None:
5353
)
5454
assert len(lint.fixes) == 1
5555
fix = lint.fixes[0]
56-
fix_path = sushi_path / "external_models.yaml"
57-
assert fix.path == fix_path
58-
assert fix.new_text == '- name: "memory"."raw"."demographics"\n'
59-
assert fix.range == Range(
56+
assert len(fix.edits) == 1
57+
edit = fix.edits[0]
58+
assert edit.new_text == '- name: "memory"."raw"."demographics"\n'
59+
assert edit.range == Range(
6060
start=Position(line=0, character=0),
6161
end=Position(line=0, character=0),
6262
)
63+
fix_path = sushi_path / "external_models.yaml"
64+
assert edit.path == fix_path
6365

6466

65-
def test_no_missing_external_models_with_existing_file_ending_in_newline(tmp_path, copy_to_temp_path) -> None:
67+
def test_no_missing_external_models_with_existing_file_ending_in_newline(
68+
tmp_path, copy_to_temp_path
69+
) -> None:
6670
sushi_paths = copy_to_temp_path("examples/sushi")
6771
sushi_path = sushi_paths[0]
6872

6973
# Overwrite the external_models.yaml file to end with a random file and a newline
74+
os.remove(sushi_path / "external_models.yaml")
7075
with open(sushi_path / "external_models.yaml", "w") as f:
71-
f.write("- name: \"memory\".\"raw\".\"test\"\n")
76+
f.write("- name: memory.raw.test\n")
7277

7378
# Override the config.py to turn on lint
7479
with open(sushi_path / "config.py", "r") as f:
@@ -105,21 +110,27 @@ def test_no_missing_external_models_with_existing_file_ending_in_newline(tmp_pat
105110
)
106111
assert len(lint.fixes) == 1
107112
fix = lint.fixes[0]
108-
fix_path = sushi_path / "external_models.yaml"
109-
assert fix.path == fix_path
110-
assert fix.new_text == '- name: "memory"."raw"."demographics"\n'
111-
assert fix.range == Range(
112-
start=Position(line=0, character=0),
113-
end=Position(line=0, character=0),
113+
assert len(fix.edits) == 1
114+
edit = fix.edits[0]
115+
assert edit.new_text == '- name: "memory"."raw"."demographics"\n'
116+
assert edit.range == Range(
117+
start=Position(line=0, character=23),
118+
end=Position(line=0, character=23),
114119
)
120+
fix_path = sushi_path / "external_models.yaml"
121+
assert edit.path == fix_path
115122

116-
def test_no_missing_external_models_with_existing_file_not_ending_in_newline(tmp_path, copy_to_temp_path) -> None:
123+
124+
def test_no_missing_external_models_with_existing_file_not_ending_in_newline(
125+
tmp_path, copy_to_temp_path
126+
) -> None:
117127
sushi_paths = copy_to_temp_path("examples/sushi")
118128
sushi_path = sushi_paths[0]
119129

120130
# Overwrite the external_models.yaml file to end with a random file and a newline
131+
os.remove(sushi_path / "external_models.yaml")
121132
with open(sushi_path / "external_models.yaml", "w") as f:
122-
f.write("- name: \"memory\".\"raw\".\"test\"")
133+
f.write("- name: memory.raw.test")
123134

124135
# Override the config.py to turn on lint
125136
with open(sushi_path / "config.py", "r") as f:
@@ -156,10 +167,12 @@ def test_no_missing_external_models_with_existing_file_not_ending_in_newline(tmp
156167
)
157168
assert len(lint.fixes) == 1
158169
fix = lint.fixes[0]
159-
fix_path = sushi_path / "external_models.yaml"
160-
assert fix.path == fix_path
161-
assert fix.new_text == '- name: "memory"."raw"."demographics"\n'
162-
assert fix.range == Range(
163-
start=Position(line=0, character=0),
164-
end=Position(line=0, character=0),
170+
assert len(fix.edits) == 1
171+
edit = fix.edits[0]
172+
assert edit.new_text == '\n- name: "memory"."raw"."demographics"\n'
173+
assert edit.range == Range(
174+
start=Position(line=0, character=23),
175+
end=Position(line=0, character=23),
165176
)
177+
fix_path = sushi_path / "external_models.yaml"
178+
assert edit.path == fix_path

0 commit comments

Comments
 (0)