Skip to content

Commit 81e359c

Browse files
authored
Merge pull request #29 from tiangolo/configurable-stream
Add support for configurable streams
2 parents 5cd0805 + f070890 commit 81e359c

File tree

2 files changed

+12
-14
lines changed

2 files changed

+12
-14
lines changed

click_spinner/__init__.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
class Spinner(object):
88
spinner_cycle = itertools.cycle(['-', '/', '|', '\\'])
99

10-
def __init__(self, beep=False, disable=False, force=False):
10+
def __init__(self, beep=False, disable=False, force=False, stream=sys.stdout):
1111
self.disable = disable
1212
self.beep = beep
1313
self.force = force
14+
self.stream = stream
1415
self.stop_running = None
1516
self.spin_thread = None
1617

1718
def start(self):
1819
if self.disable:
1920
return
20-
if sys.stdout.isatty() or self.force:
21+
if self.stream.isatty() or self.force:
2122
self.stop_running = threading.Event()
2223
self.spin_thread = threading.Thread(target=self.init_spin)
2324
self.spin_thread.start()
@@ -29,11 +30,11 @@ def stop(self):
2930

3031
def init_spin(self):
3132
while not self.stop_running.is_set():
32-
sys.stdout.write(next(self.spinner_cycle))
33-
sys.stdout.flush()
33+
self.stream.write(next(self.spinner_cycle))
34+
self.stream.flush()
3435
time.sleep(0.25)
35-
sys.stdout.write('\b')
36-
sys.stdout.flush()
36+
self.stream.write('\b')
37+
self.stream.flush()
3738

3839
def __enter__(self):
3940
self.start()
@@ -44,12 +45,12 @@ def __exit__(self, exc_type, exc_val, exc_tb):
4445
return False
4546
self.stop()
4647
if self.beep:
47-
sys.stdout.write('\7')
48-
sys.stdout.flush()
48+
self.stream.write('\7')
49+
self.stream.flush()
4950
return False
5051

5152

52-
def spinner(beep=False, disable=False, force=False):
53+
def spinner(beep=False, disable=False, force=False, stream=sys.stdout):
5354
"""This function creates a context manager that is used to display a
5455
spinner on stdout as long as the context has not exited.
5556
@@ -73,7 +74,7 @@ def spinner(beep=False, disable=False, force=False):
7374
do_something_else()
7475
7576
"""
76-
return Spinner(beep, disable, force)
77+
return Spinner(beep, disable, force, stream)
7778

7879

7980
from ._version import get_versions

tests/test_spinner.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,10 @@ def test_spinner_redirect_force():
6363
@click.command()
6464
def cli():
6565
stdout_io = StringIO()
66-
saved_stdout = sys.stdout
67-
sys.stdout = stdout_io # redirect stdout to a string buffer
68-
spinner = click_spinner.Spinner(force=True)
66+
spinner = click_spinner.Spinner(force=True, stream=stdout_io)
6967
spinner.start()
7068
time.sleep(1) # allow time for a few spins
7169
spinner.stop()
72-
sys.stdout = saved_stdout
7370
stdout_io.flush()
7471
stdout_str = stdout_io.getvalue()
7572
assert len(stdout_str) > 0

0 commit comments

Comments
 (0)