From 017aafea992ca1c6d7af45d3013af7ddb7fda12a Mon Sep 17 00:00:00 2001 From: simaki Date: Thu, 24 Jun 2021 04:11:23 +0900 Subject: [PATCH] Accept empty stdin (close #2337) (#2346) Commit history before merge: * Accept empty stdin (close #2337) * Update tests/test_black.py * Add changelog * Assert Black reformats an empty string to an empty string (#2337) (#2346) * fix --- CHANGES.md | 1 + src/black/__init__.py | 3 ++- tests/test_black.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 12e8fcc..ea5196e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Add primer support and test for code piped into black via STDIN (#2315) - Fix internal error when `FORCE_OPTIONAL_PARENTHESES` feature is enabled (#2332) +- Accept empty stdin (#2346) ## 21.6b0 diff --git a/src/black/__init__.py b/src/black/__init__.py index a985926..8e2123d 100644 --- a/src/black/__init__.py +++ b/src/black/__init__.py @@ -803,7 +803,8 @@ def format_stdin_to_stdout( ) if write_back == WriteBack.YES: # Make sure there's a newline after the content - dst += "" if dst[-1] == "\n" else "\n" + if dst and dst[-1] != "\n": + dst += "\n" f.write(dst) elif write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF): now = datetime.utcnow() diff --git a/tests/test_black.py b/tests/test_black.py index 5262c0e..42ac119 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -6,6 +6,7 @@ from concurrent.futures import ThreadPoolExecutor from contextlib import contextmanager from dataclasses import replace import inspect +import io from io import BytesIO import os from pathlib import Path @@ -1682,6 +1683,20 @@ class BlackTestCase(BlackBaseTestCase): # __BLACK_STDIN_FILENAME__ should have been stripped report.done.assert_called_with(expected, black.Changed.YES) + def test_reformat_one_with_stdin_empty(self) -> None: + output = io.StringIO() + with patch("io.TextIOWrapper", lambda *args, **kwargs: output): + try: + black.format_stdin_to_stdout( + fast=True, + content="", + write_back=black.WriteBack.YES, + mode=DEFAULT_MODE, + ) + except io.UnsupportedOperation: + pass # StringIO does not support detach + assert output.getvalue() == "" + def test_gitignore_exclude(self) -> None: path = THIS_DIR / "data" / "include_exclude_tests" include = re.compile(r"\.pyi?$") -- 2.39.5