107 lines
3.5 KiB
Diff
107 lines
3.5 KiB
Diff
|
|
github.com/pallets/click/issues/2939
|
|
github.com/pallets/click/pull/2940
|
|
|
|
|
|
From 93c6966eb3a575c2b600434d1cc9f4b3aee505ac Mon Sep 17 00:00:00 2001
|
|
From: Antoine Lambert <anlambert@softwareheritage.org>
|
|
Date: Thu, 22 May 2025 22:14:23 +0200
|
|
Subject: [PATCH] testing/CliRunner: Fix regression related to EOF introduced
|
|
in 262bdf0
|
|
|
|
Commit 262bdf0 ensured to raise an EOFError exception on end of input
|
|
to simulate tty behavior and avoid blocking prompt during tests when
|
|
no more input is available.
|
|
|
|
However the introduced implementation has a side effect when testing a
|
|
click command having a File type option or argument and when it is set
|
|
to stdin: the command ends up with error due to the Abort exception
|
|
being raised when the stdin EOFError exception is caught.
|
|
|
|
To prevent this undesirable side effect, prefer to raise the EOFError
|
|
exceptions directly from the prompts functions inside the CliRunner
|
|
class instead of doing it in the method overriding the iterator protcol
|
|
for the _NamedTextIOWrapper class.
|
|
|
|
Restore previous implementation of a test broken by changes of 262bdf0.
|
|
|
|
Fixes #2939.
|
|
---
|
|
CHANGES.rst | 5 +++++
|
|
src/click/testing.py | 17 ++++++++---------
|
|
tests/test_chain.py | 4 ++--
|
|
3 files changed, 15 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/CHANGES.rst b/CHANGES.rst
|
|
index 1b8af9a5f..decdc2d91 100644
|
|
--- a/CHANGES.rst
|
|
+++ b/CHANGES.rst
|
|
@@ -1,5 +1,10 @@
|
|
.. currentmodule:: click
|
|
|
|
+Version 8.2.2
|
|
+-------------
|
|
+
|
|
+- Fix regression related to EOF handling in CliRunner. :issue:`2939`
|
|
+
|
|
Version 8.2.1
|
|
-------------
|
|
|
|
diff --git a/src/click/testing.py b/src/click/testing.py
|
|
index 7c0e8741e..e57eacc5d 100644
|
|
--- a/src/click/testing.py
|
|
+++ b/src/click/testing.py
|
|
@@ -116,13 +116,6 @@ def name(self) -> str:
|
|
def mode(self) -> str:
|
|
return self._mode
|
|
|
|
- def __next__(self) -> str: # type: ignore
|
|
- try:
|
|
- line = super().__next__()
|
|
- except StopIteration as e:
|
|
- raise EOFError() from e
|
|
- return line
|
|
-
|
|
|
|
def make_input_stream(
|
|
input: str | bytes | t.IO[t.Any] | None, charset: str
|
|
@@ -348,7 +341,10 @@ def isolation(
|
|
@_pause_echo(echo_input) # type: ignore
|
|
def visible_input(prompt: str | None = None) -> str:
|
|
sys.stdout.write(prompt or "")
|
|
- val = next(text_input).rstrip("\r\n")
|
|
+ try:
|
|
+ val = next(text_input).rstrip("\r\n")
|
|
+ except StopIteration as e:
|
|
+ raise EOFError() from e
|
|
sys.stdout.write(f"{val}\n")
|
|
sys.stdout.flush()
|
|
return val
|
|
@@ -357,7 +353,10 @@ def visible_input(prompt: str | None = None) -> str:
|
|
def hidden_input(prompt: str | None = None) -> str:
|
|
sys.stdout.write(f"{prompt or ''}\n")
|
|
sys.stdout.flush()
|
|
- return next(text_input).rstrip("\r\n")
|
|
+ try:
|
|
+ return next(text_input).rstrip("\r\n")
|
|
+ except StopIteration as e:
|
|
+ raise EOFError() from e
|
|
|
|
@_pause_echo(echo_input) # type: ignore
|
|
def _getchar(echo: bool) -> str:
|
|
diff --git a/tests/test_chain.py b/tests/test_chain.py
|
|
index ba11b7e2a..702eaaa3e 100644
|
|
--- a/tests/test_chain.py
|
|
+++ b/tests/test_chain.py
|
|
@@ -163,8 +163,8 @@ def processor(iterator):
|
|
return processor
|
|
|
|
result = runner.invoke(cli, args, input=input)
|
|
- # last two lines are '' and 'Aborted!'
|
|
- assert result.output.splitlines()[:-2] == expect
|
|
+ assert not result.exception
|
|
+ assert result.output.splitlines() == expect
|
|
|
|
|
|
def test_args_and_chain(runner):
|