Skip to content

Commit eb17580

Browse files
authored
Merge pull request #52 from remisalmon/add-format-lines
Use new `lines` option in Black 23.11 to format range
2 parents 89216e7 + fbbe9c6 commit eb17580

File tree

5 files changed

+50
-18
lines changed

5 files changed

+50
-18
lines changed

pylsp_black/plugin.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,29 +64,34 @@ def pylsp_settings():
6464

6565

6666
def format_document(client_config, document, range=None):
67+
text = document.source
68+
config = load_config(document.path, client_config)
69+
# Black lines indices are "1-based and inclusive on both ends"
70+
lines = [(range["start"]["line"] + 1, range["end"]["line"])] if range else ()
71+
72+
try:
73+
formatted_text = format_text(text=text, config=config, lines=lines)
74+
except black.NothingChanged:
75+
# raised when the file is already formatted correctly
76+
return []
77+
6778
if range:
79+
formatted_lines = formatted_text.splitlines(True)
80+
6881
start = range["start"]["line"]
69-
end = range["end"]["line"]
70-
text = "".join(document.lines[start:end])
82+
end = range["end"]["line"] + (len(formatted_lines) - len(document.lines))
83+
84+
formatted_text = "".join(formatted_lines[start:end])
7185
else:
72-
text = document.source
7386
range = {
7487
"start": {"line": 0, "character": 0},
7588
"end": {"line": len(document.lines), "character": 0},
7689
}
7790

78-
config = load_config(document.path, client_config)
79-
80-
try:
81-
formatted_text = format_text(text=text, config=config)
82-
except black.NothingChanged:
83-
# raised when the file is already formatted correctly
84-
return []
85-
8691
return [{"range": range, "newText": formatted_text}]
8792

8893

89-
def format_text(*, text, config):
94+
def format_text(*, text, config, lines):
9095
mode = black.FileMode(
9196
target_versions=config["target_version"],
9297
line_length=config["line_length"],
@@ -107,7 +112,7 @@ def format_text(*, text, config):
107112

108113
# Will raise black.NothingChanged, we want to bubble that exception up
109114
formatted_text = black.format_file_contents(
110-
text, fast=config["fast"], mode=mode
115+
text, fast=config["fast"], mode=mode, lines=lines
111116
)
112117

113118
# Restore eols if necessary.

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ classifiers =
2020
packages = find:
2121
install_requires =
2222
python-lsp-server>=1.4.0
23-
black>=22.3.0
23+
black>=23.11.0
2424
tomli; python_version<'3.11'
2525
python_requires = >= 3.8
2626

tests/fixtures/formatted.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,15 @@
11
a = "hello"
2-
b = 42
2+
b = [
3+
"a",
4+
"very",
5+
"very",
6+
"very",
7+
"very",
8+
"very",
9+
"very",
10+
"very",
11+
"very",
12+
"long",
13+
"line",
14+
]
15+
c = 42

tests/fixtures/unformatted.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
a = 'hello'
2-
b = 42
2+
b = ["a", "very", "very", "very", "very", "very", "very", "very", "very", "long", "line"]
3+
c = 42

tests/test_plugin.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def test_pylsp_format_document(config, unformatted_document, formatted_document)
140140
{
141141
"range": {
142142
"start": {"line": 0, "character": 0},
143-
"end": {"line": 2, "character": 0},
143+
"end": {"line": 3, "character": 0},
144144
},
145145
"newText": formatted_document.source,
146146
}
@@ -205,7 +205,20 @@ def test_pylsp_format_document_with_config(config, config_document):
205205

206206
@pytest.mark.parametrize(
207207
("start", "end", "expected"),
208-
[(0, 0, 'a = "hello"\n'), (1, 1, "b = 42\n"), (0, 1, 'a = "hello"\nb = 42\n')],
208+
[
209+
(0, 0, 'a = "hello"\n'),
210+
(
211+
1,
212+
1,
213+
'b = [\n "a",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "long",\n "line",\n]\n', # noqa: E501
214+
),
215+
(2, 2, "c = 42\n"),
216+
(
217+
0,
218+
2,
219+
'a = "hello"\nb = [\n "a",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "very",\n "long",\n "line",\n]\nc = 42\n', # noqa: E501
220+
),
221+
],
209222
)
210223
def test_pylsp_format_range(config, unformatted_document, start, end, expected):
211224
range = {

0 commit comments

Comments
 (0)