Skip to content

Commit

Permalink
Merge pull request #6319 from pquentin/progress1.5
Browse files Browse the repository at this point in the history
Update progress to 1.5
  • Loading branch information
dstufft authored Apr 23, 2019
2 parents dddd28b + dbce821 commit 627eeec
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 127 deletions.
1 change: 1 addition & 0 deletions news/6319.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
When downloading a package, the ETA and average speed now only update once per second for better legibility.
1 change: 1 addition & 0 deletions news/progress.vendor
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update progress to 1.5
4 changes: 2 additions & 2 deletions src/pip/_internal/utils/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from signal import SIGINT, default_int_handler, signal

from pip._vendor import six
from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR
from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar
from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin
from pip._vendor.progress.spinner import Spinner

from pip._internal.utils.compat import WINDOWS
Expand Down Expand Up @@ -224,7 +224,7 @@ class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore


class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin,
DownloadProgressMixin, WritelnMixin, Spinner):
DownloadProgressMixin, Spinner):

file = sys.stdout
suffix = "%(downloaded)s %(download_speed)s"
Expand Down
80 changes: 65 additions & 15 deletions src/pip/_vendor/progress/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,73 +12,125 @@
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

from __future__ import division
from __future__ import division, print_function

from collections import deque
from datetime import timedelta
from math import ceil
from sys import stderr
from time import time
try:
from time import monotonic
except ImportError:
from time import time as monotonic


__version__ = '1.4'
__version__ = '1.5'

HIDE_CURSOR = '\x1b[?25l'
SHOW_CURSOR = '\x1b[?25h'


class Infinite(object):
file = stderr
sma_window = 10 # Simple Moving Average window
check_tty = True
hide_cursor = True

def __init__(self, *args, **kwargs):
def __init__(self, message='', **kwargs):
self.index = 0
self.start_ts = time()
self.start_ts = monotonic()
self.avg = 0
self._avg_update_ts = self.start_ts
self._ts = self.start_ts
self._xput = deque(maxlen=self.sma_window)
for key, val in kwargs.items():
setattr(self, key, val)

self._width = 0
self.message = message

if self.file and self.is_tty():
if self.hide_cursor:
print(HIDE_CURSOR, end='', file=self.file)
print(self.message, end='', file=self.file)
self.file.flush()

def __getitem__(self, key):
if key.startswith('_'):
return None
return getattr(self, key, None)

@property
def elapsed(self):
return int(time() - self.start_ts)
return int(monotonic() - self.start_ts)

@property
def elapsed_td(self):
return timedelta(seconds=self.elapsed)

def update_avg(self, n, dt):
if n > 0:
xput_len = len(self._xput)
self._xput.append(dt / n)
self.avg = sum(self._xput) / len(self._xput)
now = monotonic()
# update when we're still filling _xput, then after every second
if (xput_len < self.sma_window or
now - self._avg_update_ts > 1):
self.avg = sum(self._xput) / len(self._xput)
self._avg_update_ts = now

def update(self):
pass

def start(self):
pass

def clearln(self):
if self.file and self.is_tty():
print('\r\x1b[K', end='', file=self.file)

def write(self, s):
if self.file and self.is_tty():
line = self.message + s.ljust(self._width)
print('\r' + line, end='', file=self.file)
self._width = max(self._width, len(s))
self.file.flush()

def writeln(self, line):
if self.file and self.is_tty():
self.clearln()
print(line, end='', file=self.file)
self.file.flush()

def finish(self):
pass
if self.file and self.is_tty():
print(file=self.file)
if self.hide_cursor:
print(SHOW_CURSOR, end='', file=self.file)

def is_tty(self):
return self.file.isatty() if self.check_tty else True

def next(self, n=1):
now = time()
now = monotonic()
dt = now - self._ts
self.update_avg(n, dt)
self._ts = now
self.index = self.index + n
self.update()

def iter(self, it):
try:
with self:
for x in it:
yield x
self.next()
finally:
self.finish()

def __enter__(self):
self.start()
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.finish()


class Progress(Infinite):
Expand Down Expand Up @@ -119,9 +171,7 @@ def iter(self, it):
except TypeError:
pass

try:
with self:
for x in it:
yield x
self.next()
finally:
self.finish()
5 changes: 1 addition & 4 deletions src/pip/_vendor/progress/bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,15 @@
import sys

from . import Progress
from .helpers import WritelnMixin


class Bar(WritelnMixin, Progress):
class Bar(Progress):
width = 32
message = ''
suffix = '%(index)d/%(max)d'
bar_prefix = ' |'
bar_suffix = '| '
empty_fill = ' '
fill = '#'
hide_cursor = True

def update(self):
filled_length = int(self.width * self.progress)
Expand Down
13 changes: 3 additions & 10 deletions src/pip/_vendor/progress/counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,20 @@

from __future__ import unicode_literals
from . import Infinite, Progress
from .helpers import WriteMixin


class Counter(WriteMixin, Infinite):
message = ''
hide_cursor = True

class Counter(Infinite):
def update(self):
self.write(str(self.index))


class Countdown(WriteMixin, Progress):
hide_cursor = True

class Countdown(Progress):
def update(self):
self.write(str(self.remaining))


class Stack(WriteMixin, Progress):
class Stack(Progress):
phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█')
hide_cursor = True

def update(self):
nphases = len(self.phases)
Expand Down
91 changes: 0 additions & 91 deletions src/pip/_vendor/progress/helpers.py

This file was deleted.

7 changes: 3 additions & 4 deletions src/pip/_vendor/progress/spinner.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@

from __future__ import unicode_literals
from . import Infinite
from .helpers import WriteMixin


class Spinner(WriteMixin, Infinite):
message = ''
class Spinner(Infinite):
phases = ('-', '\\', '|', '/')
hide_cursor = True

Expand All @@ -40,5 +38,6 @@ class MoonSpinner(Spinner):
class LineSpinner(Spinner):
phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻']


class PixelSpinner(Spinner):
phases = ['⣾','⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽']
phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽']
2 changes: 1 addition & 1 deletion src/pip/_vendor/vendor.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ lockfile==0.12.2
msgpack==0.5.6
packaging==19.0
pep517==0.5.0
progress==1.4
progress==1.5
pyparsing==2.3.1
pytoml==0.1.20
requests==2.21.0
Expand Down

0 comments on commit 627eeec

Please sign in to comment.