From 9030a3861a47f77838ec3133ee845f25a04bb011 Mon Sep 17 00:00:00 2001 From: liufeng Date: Fri, 25 Jun 2021 10:15:52 +0800 Subject: [PATCH] Initial package --- 0001-fixup-moving-average-window.patch | 161 +++++++++++++++++++++++++ LICENSE | 13 ++ progress-1.5.tar.gz | Bin 0 -> 5842 bytes python-progress.spec | 53 ++++++++ 4 files changed, 227 insertions(+) create mode 100644 0001-fixup-moving-average-window.patch create mode 100644 LICENSE create mode 100644 progress-1.5.tar.gz create mode 100644 python-progress.spec diff --git a/0001-fixup-moving-average-window.patch b/0001-fixup-moving-average-window.patch new file mode 100644 index 0000000..94635b0 --- /dev/null +++ b/0001-fixup-moving-average-window.patch @@ -0,0 +1,161 @@ +From: Pavel Raiskup +Subject: [PATCH] Fix fast upload avg calculation + + +Upstream verigak/progress is broken for very fast uploads; e.g. +with 'copr build' command, the next() call is called so often that +the avg() calculation probably suffers from some small +floating-point numbers problems: + + With 15MB/s => next() called for each 8096B => ~2000 calls/s + +Since the upstream default window size is only of size 10 items +(by default), it calculates the average speed only for the last +~0.005s. We could enlarge the size of window (sma_window param), +but the algorithm is so naive that it would decrease the +performance. + +This has been discussed very extensively with upstream (PR 24 and +friends) but I neither was not able to explain the problem, nor I +was able to convince upstream to accept my patches. + +This downstream patch - while it keeps the backward API +compatibility - changes the algorithm so the average speed is +calculation is fast enough, and much more stable (by default it +calculates speed for window of 2 seconds). + +We also don't seem to have the monotonic() mess, since we don't seem +to suffer from the same issues. + +Fork with this patch backported is maintained in +https://github.com/python-progress/python-progress + +diff --git a/MANIFEST.in b/MANIFEST.in +index ef7c4cb..0c73842 100644 +--- a/MANIFEST.in ++++ b/MANIFEST.in +@@ -1,2 +1 @@ + include README.rst LICENSE +-include test_*.py +diff --git a/progress/__init__.py b/progress/__init__.py +index e434c25..1cbdce6 100644 +--- a/progress/__init__.py ++++ b/progress/__init__.py +@@ -18,10 +18,7 @@ from collections import deque + from datetime import timedelta + from math import ceil + from sys import stderr +-try: +- from time import monotonic +-except ImportError: +- from time import time as monotonic ++from time import time + + + __version__ = '1.5' +@@ -30,19 +27,55 @@ HIDE_CURSOR = '\x1b[?25l' + SHOW_CURSOR = '\x1b[?25h' + + ++class _Window(object): ++ max_seconds = 2 ++ max_items = None ++ ++ def __init__(self, max_seconds=2, max_items=None): ++ self.max_seconds = max_seconds ++ self.max_items = max_items ++ ++ stamp = time() ++ self.last = stamp - 0.001 ++ self.counter = 0 ++ self.deque = deque() ++ self.next(0, stamp) ++ ++ def pop(self): ++ item = self.deque.popleft() ++ self.counter -= item[1] ++ ++ def clean(self): ++ if self.max_items: ++ while len(self.deque) > self.max_items: ++ self.pop() ++ while len(self.deque) > 2 and self.last - self.deque[0][0] > float(self.max_seconds): ++ self.pop() ++ ++ def next(self, n, t): ++ self.clean() ++ self.deque.append((self.last, n)) ++ self.last = t ++ self.counter += n ++ ++ @property ++ def avg(self): ++ return self.counter / (self.last - self.deque[0][0]) ++ ++ + class Infinite(object): + file = stderr +- sma_window = 10 # Simple Moving Average window ++ # Maximum number of next() calls to be held in Simple Moving Average ++ # window structure (in memory), default is unlimited. ++ sma_window_seconds = 2 ++ sma_window = None + check_tty = True + hide_cursor = True + + def __init__(self, message='', **kwargs): + self.index = 0 +- 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) ++ self.start_ts = time() ++ self.window = _Window(self.sma_window_seconds, self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + +@@ -62,23 +95,19 @@ class Infinite(object): + + @property + def elapsed(self): +- return int(monotonic() - self.start_ts) ++ return int(time() - self.start_ts) ++ ++ @property ++ def avg(self): ++ speed = self.window.avg ++ if speed: ++ return 1/speed ++ return 3600 # better constant? + + @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) +- 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 + +@@ -112,10 +141,7 @@ class Infinite(object): + return self.file.isatty() if self.check_tty else True + + def next(self, n=1): +- now = monotonic() +- dt = now - self._ts +- self.update_avg(n, dt) +- self._ts = now ++ self.window.next(n, time()) + self.index = self.index + n + self.update() + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..059cc05 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +# Copyright (c) 2012 Giorgos Verigakis +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/progress-1.5.tar.gz b/progress-1.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..77f5fa8c62f862d9ed0bc8fe7a06e9ec70e66109 GIT binary patch literal 5842 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 - 1.5-1 +- Initial package. -- Gitee