From 7703cb648335a1295356ddac541ac772fcc9fe90 Mon Sep 17 00:00:00 2001 From: nyancient Date: Fri, 25 Aug 2023 20:34:42 +0200 Subject: [PATCH 1/5] Don't write beep to non-tty output. --- click_spinner/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py index 3152d44..4e8daf3 100644 --- a/click_spinner/__init__.py +++ b/click_spinner/__init__.py @@ -13,11 +13,12 @@ def __init__(self, beep=False, disable=False, force=False, stream=sys.stdout): self.stream = stream self.stop_running = None self.spin_thread = None + self.tty_output = self.stream.isatty() or self.force def start(self): if self.disable: return - if self.stream.isatty() or self.force: + if self.tty_output: self.stop_running = threading.Event() self.spin_thread = threading.Thread(target=self.init_spin) self.spin_thread.start() @@ -43,7 +44,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): if self.disable: return False self.stop() - if self.beep: + if self.beep and self.tty_output: self.stream.write('\7') self.stream.flush() return False From 474a77a315b54fc58724d9f367311b6aab837b8b Mon Sep 17 00:00:00 2001 From: nyancient Date: Fri, 25 Aug 2023 21:00:16 +0200 Subject: [PATCH 2/5] Add test. --- tests/test_spinner.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_spinner.py b/tests/test_spinner.py index 3f6d1ed..7e1568a 100644 --- a/tests/test_spinner.py +++ b/tests/test_spinner.py @@ -58,6 +58,19 @@ def cli(): result = runner.invoke(cli, []) assert result.exception is None +def test_spinner_redirect_with_beep(): + @click.command() + def cli(): + stdout_io = StringIO() + with click_spinner.Spinner(beep=True, stream=stdout_io): + time.sleep(1) # allow time for a few spins + stdout_str = stdout_io.getvalue() + assert len(stdout_str) == 0 + + runner = CliRunner() + result = runner.invoke(cli, []) + assert result.exception is None + def test_spinner_redirect_force(): @click.command() From ba078158f6fd2cb8959c1358c84e4686724dc951 Mon Sep 17 00:00:00 2001 From: nyancient Date: Fri, 25 Aug 2023 21:14:13 +0200 Subject: [PATCH 3/5] Make sure the spinner is always erased. --- click_spinner/__init__.py | 7 +++++-- tests/test_spinner.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py index 4e8daf3..e8f1f7d 100644 --- a/click_spinner/__init__.py +++ b/click_spinner/__init__.py @@ -44,8 +44,11 @@ def __exit__(self, exc_type, exc_val, exc_tb): if self.disable: return False self.stop() - if self.beep and self.tty_output: - self.stream.write('\7') + if self.tty_output: + if self.beep: + self.stream.write('\7') + self.stream.flush() + self.stream.write('\b \b') self.stream.flush() return False diff --git a/tests/test_spinner.py b/tests/test_spinner.py index 7e1568a..cbdb091 100644 --- a/tests/test_spinner.py +++ b/tests/test_spinner.py @@ -72,6 +72,21 @@ def cli(): assert result.exception is None +def test_spinner_erase(): + @click.command() + def cli(): + stdout_io = StringIO() + stdout_io.isatty = lambda: True + with click_spinner.Spinner(stream=stdout_io): + time.sleep(1) # allow time for a few spins + stdout_str = stdout_io.getvalue() + assert stdout_str[-3:] == '\b \b' + + runner = CliRunner() + result = runner.invoke(cli, []) + assert result.exception is None + + def test_spinner_redirect_force(): @click.command() def cli(): From f91e6caf138802054baaa03621ba297b399f95c2 Mon Sep 17 00:00:00 2001 From: nyancient Date: Fri, 25 Aug 2023 21:54:21 +0200 Subject: [PATCH 4/5] Document stream argument to spinner. --- click_spinner/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py index e8f1f7d..9e70eb9 100644 --- a/click_spinner/__init__.py +++ b/click_spinner/__init__.py @@ -68,6 +68,8 @@ def spinner(beep=False, disable=False, force=False, stream=sys.stdout): Hide spinner. force : bool Force creation of spinner even when stdout is redirected. + stream : IO + Stream to write the spinner to. Example ------- From 88177a4a217126fd7f84d165c4141358e4cc811b Mon Sep 17 00:00:00 2001 From: nyancient Date: Fri, 25 Aug 2023 21:58:21 +0200 Subject: [PATCH 5/5] Don't write unnecessary \b when erasing spinner. --- click_spinner/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/click_spinner/__init__.py b/click_spinner/__init__.py index 9e70eb9..47bb309 100644 --- a/click_spinner/__init__.py +++ b/click_spinner/__init__.py @@ -48,7 +48,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): if self.beep: self.stream.write('\7') self.stream.flush() - self.stream.write('\b \b') + self.stream.write(' \b') self.stream.flush() return False