From 367557ef612c6bd99cc56f068dd27d3c2c7b1bf0 Mon Sep 17 00:00:00 2001 From: Remi Salmon Date: Fri, 1 Dec 2023 22:47:43 -0700 Subject: [PATCH 1/5] Use lines from range to format text --- pylsp_black/plugin.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/pylsp_black/plugin.py b/pylsp_black/plugin.py index 07c0d51..d7d6af0 100644 --- a/pylsp_black/plugin.py +++ b/pylsp_black/plugin.py @@ -64,29 +64,33 @@ def pylsp_settings(): def format_document(client_config, document, range=None): + text = document.source + config = load_config(document.path, client_config) + lines = [(range["start"]["line"] + 1, range["end"]["line"])] if range else () + + try: + formatted_text = format_text(text=text, config=config, lines=lines) + except black.NothingChanged: + # raised when the file is already formatted correctly + return [] + if range: + formatted_lines = formatted_text.splitlines(True) + start = range["start"]["line"] - end = range["end"]["line"] - text = "".join(document.lines[start:end]) + end = range["end"]["line"] + (len(formatted_lines) - len(document.lines)) + + formatted_text = "".join(formatted_lines[start:end]) else: - text = document.source range = { "start": {"line": 0, "character": 0}, "end": {"line": len(document.lines), "character": 0}, } - config = load_config(document.path, client_config) - - try: - formatted_text = format_text(text=text, config=config) - except black.NothingChanged: - # raised when the file is already formatted correctly - return [] - return [{"range": range, "newText": formatted_text}] -def format_text(*, text, config): +def format_text(*, text, config, lines): mode = black.FileMode( target_versions=config["target_version"], line_length=config["line_length"], @@ -107,7 +111,7 @@ def format_text(*, text, config): # Will raise black.NothingChanged, we want to bubble that exception up formatted_text = black.format_file_contents( - text, fast=config["fast"], mode=mode + text, fast=config["fast"], mode=mode, lines=lines ) # Restore eols if necessary. From 9d406adbd7581ddd7315c602ae51c78dbe0962da Mon Sep 17 00:00:00 2001 From: Remi Salmon Date: Fri, 1 Dec 2023 22:47:52 -0700 Subject: [PATCH 2/5] Bump black requirement to 23.11.0 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d2ad1a7..a4f0533 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,7 +20,7 @@ classifiers = packages = find: install_requires = python-lsp-server>=1.4.0 - black>=22.3.0 + black>=23.11.0 tomli; python_version<'3.11' python_requires = >= 3.7 From c8cfa53a18508408bbac59b29fe6a2300fd920ce Mon Sep 17 00:00:00 2001 From: Remi Salmon Date: Fri, 1 Dec 2023 22:48:06 -0700 Subject: [PATCH 3/5] Update range tests --- tests/fixtures/formatted.txt | 15 ++++++++++++++- tests/fixtures/unformatted.txt | 3 ++- tests/test_plugin.py | 17 +++++++++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/tests/fixtures/formatted.txt b/tests/fixtures/formatted.txt index 88403bb..3fb840a 100644 --- a/tests/fixtures/formatted.txt +++ b/tests/fixtures/formatted.txt @@ -1,2 +1,15 @@ a = "hello" -b = 42 +b = [ + "a", + "very", + "very", + "very", + "very", + "very", + "very", + "very", + "very", + "long", + "line", +] +c = 42 diff --git a/tests/fixtures/unformatted.txt b/tests/fixtures/unformatted.txt index c308120..bf77b8c 100644 --- a/tests/fixtures/unformatted.txt +++ b/tests/fixtures/unformatted.txt @@ -1,2 +1,3 @@ a = 'hello' -b = 42 +b = ["a", "very", "very", "very", "very", "very", "very", "very", "very", "long", "line"] +c = 42 diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 4c2a28e..1ffeac7 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -139,7 +139,7 @@ def test_pylsp_format_document(config, unformatted_document, formatted_document) { "range": { "start": {"line": 0, "character": 0}, - "end": {"line": 2, "character": 0}, + "end": {"line": 3, "character": 0}, }, "newText": formatted_document.source, } @@ -204,7 +204,20 @@ def test_pylsp_format_document_with_config(config, config_document): @pytest.mark.parametrize( ("start", "end", "expected"), - [(0, 0, 'a = "hello"\n'), (1, 1, "b = 42\n"), (0, 1, 'a = "hello"\nb = 42\n')], + [ + (0, 0, 'a = "hello"\n'), + ( + 1, + 1, + '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', + ), + (2, 2, "c = 42\n"), + ( + 0, + 2, + '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', + ), + ], ) def test_pylsp_format_range(config, unformatted_document, start, end, expected): range = { From 526ec12f5bc5390dff0fea6cf0593da11d2bdfc0 Mon Sep 17 00:00:00 2001 From: Remi Salmon Date: Mon, 4 Dec 2023 18:00:57 -0700 Subject: [PATCH 4/5] Add comment on lines indices --- pylsp_black/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pylsp_black/plugin.py b/pylsp_black/plugin.py index d7d6af0..76b49a6 100644 --- a/pylsp_black/plugin.py +++ b/pylsp_black/plugin.py @@ -66,6 +66,7 @@ def pylsp_settings(): def format_document(client_config, document, range=None): text = document.source config = load_config(document.path, client_config) + # Black lines indices are "1-based and inclusive on both ends" lines = [(range["start"]["line"] + 1, range["end"]["line"])] if range else () try: From fbbe9c6681bf956499b5ca1f7ecc5fa2e360ae34 Mon Sep 17 00:00:00 2001 From: Remi Salmon Date: Tue, 12 Dec 2023 17:55:30 -0700 Subject: [PATCH 5/5] Ignore flake8 E501 on long line test --- tests/test_plugin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 86ab1ee..f9d3548 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -209,13 +209,13 @@ def test_pylsp_format_document_with_config(config, config_document): ( 1, 1, - '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', + '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 ), (2, 2, "c = 42\n"), ( 0, 2, - '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', + '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 ), ], )