Hello community, here is the log from the commit of package speedtest-cli for openSUSE:Factory checked in at 2019-10-23 15:50:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/speedtest-cli (Old) and /work/SRC/openSUSE:Factory/.speedtest-cli.new.2352 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "speedtest-cli" Wed Oct 23 15:50:59 2019 rev:11 rq:741881 version:2.1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/speedtest-cli/speedtest-cli.changes 2019-03-28 22:49:04.915050445 +0100 +++ /work/SRC/openSUSE:Factory/.speedtest-cli.new.2352/speedtest-cli.changes 2019-10-23 15:51:08.782713806 +0200 @@ -1,0 +2,8 @@ +Tue Oct 22 14:07:28 UTC 2019 - Martin Pluskal <[email protected]> + +- Update to version 2.1.2: + * Prevent warnings on Python3.8 + * Fix proxy support + * Fix --single to ensure threads are not started until a position in the queue is available + +------------------------------------------------------------------- Old: ---- speedtest-cli-2.1.1.tar.gz New: ---- speedtest-cli-2.1.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ speedtest-cli.spec ++++++ --- /var/tmp/diff_new_pack.Dw5H1E/_old 2019-10-23 15:51:09.714714813 +0200 +++ /var/tmp/diff_new_pack.Dw5H1E/_new 2019-10-23 15:51:09.718714818 +0200 @@ -1,7 +1,7 @@ # # spec file for package speedtest-cli # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,18 +12,18 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %define oname speedtest_cli Name: speedtest-cli -Version: 2.1.1 +Version: 2.1.2 Release: 0 Summary: Command line interface for testing internet bandwidth License: Apache-2.0 Group: System/Benchmark -Url: https://github.com/sivel/speedtest-cli +URL: https://github.com/sivel/speedtest-cli Source0: https://github.com/sivel/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz BuildRequires: python-rpm-macros BuildRequires: python3-base @@ -49,7 +49,8 @@ %{buildroot}%{_mandir}/man1/speedtest.1 %files -%doc LICENSE README.rst +%license LICENSE +%doc README.rst %{_bindir}/speedtest %{_bindir}/%{name} %{_mandir}/man1/speedtest.1%{ext_man} ++++++ speedtest-cli-2.1.1.tar.gz -> speedtest-cli-2.1.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/speedtest-cli-2.1.1/.travis.yml new/speedtest-cli-2.1.2/.travis.yml --- old/speedtest-cli-2.1.1/.travis.yml 2019-03-12 17:01:31.000000000 +0100 +++ new/speedtest-cli-2.1.2/.travis.yml 2019-08-22 16:48:18.000000000 +0200 @@ -1,4 +1,6 @@ language: python +sudo: required +dist: xenial addons: apt: @@ -33,8 +35,13 @@ env: TOXENV=py35 - python: 3.6 env: TOXENV=py36 + - python: 3.7 + env: TOXENV=py37 + - python: 3.8-dev + env: TOXENV=py38 - python: pypy env: TOXENV=pypy + dist: trusty before_install: - if [[ $(echo "$TOXENV" | egrep -c "py35") != 0 ]]; then pyenv global system 3.5; fi; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/speedtest-cli-2.1.1/speedtest.py new/speedtest-cli-2.1.2/speedtest.py --- old/speedtest-cli-2.1.1/speedtest.py 2019-03-12 17:01:31.000000000 +0100 +++ new/speedtest-cli-2.1.2/speedtest.py 2019-08-22 16:48:18.000000000 +0200 @@ -36,7 +36,7 @@ gzip = None GZIP_BASE = object -__version__ = '2.1.1' +__version__ = '2.1.2' class FakeShutdownEvent(object): @@ -53,6 +53,9 @@ # Some global variables we use DEBUG = False _GLOBAL_DEFAULT_TIMEOUT = object() +PY25PLUS = sys.version_info[:2] >= (2, 5) +PY26PLUS = sys.version_info[:2] >= (2, 6) +PY32PLUS = sys.version_info[:2] >= (3, 2) # Begin import game to handle Python 2 and Python 3 try: @@ -64,14 +67,15 @@ json = None try: - import xml.etree.cElementTree as ET -except ImportError: + import xml.etree.ElementTree as ET try: - import xml.etree.ElementTree as ET + from xml.etree.ElementTree import _Element as ET_Element except ImportError: - from xml.dom import minidom as DOM - from xml.parsers.expat import ExpatError - ET = None + pass +except ImportError: + from xml.dom import minidom as DOM + from xml.parsers.expat import ExpatError + ET = None try: from urllib2 import (urlopen, Request, HTTPError, URLError, @@ -262,6 +266,16 @@ write(arg) write(end) +if PY32PLUS: + etree_iter = ET.Element.iter +elif PY25PLUS: + etree_iter = ET_Element.getiterator + +if PY26PLUS: + thread_is_alive = threading.Thread.is_alive +else: + thread_is_alive = threading.Thread.isAlive + # Exception "constants" to support Python 2 through Python 3 try: @@ -399,6 +413,8 @@ source_address = kwargs.pop('source_address', None) timeout = kwargs.pop('timeout', 10) + self._tunnel_host = None + HTTPConnection.__init__(self, *args, **kwargs) self.source_address = source_address @@ -419,17 +435,23 @@ self.source_address ) + if self._tunnel_host: + self._tunnel() + if HTTPSConnection: - class SpeedtestHTTPSConnection(HTTPSConnection, - SpeedtestHTTPConnection): + class SpeedtestHTTPSConnection(HTTPSConnection): """Custom HTTPSConnection to support source_address across Python 2.4 - Python 3 """ + default_port = 443 + def __init__(self, *args, **kwargs): source_address = kwargs.pop('source_address', None) timeout = kwargs.pop('timeout', 10) + self._tunnel_host = None + HTTPSConnection.__init__(self, *args, **kwargs) self.timeout = timeout @@ -437,14 +459,30 @@ def connect(self): "Connect to a host on a given (SSL) port." + try: + self.sock = socket.create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) + except (AttributeError, TypeError): + self.sock = create_connection( + (self.host, self.port), + self.timeout, + self.source_address + ) - SpeedtestHTTPConnection.connect(self) + if self._tunnel_host: + self._tunnel() if ssl: try: kwargs = {} if hasattr(ssl, 'SSLContext'): - kwargs['server_hostname'] = self.host + if self._tunnel_host: + kwargs['server_hostname'] = self._tunnel_host + else: + kwargs['server_hostname'] = self.host self.sock = self._context.wrap_socket(self.sock, **kwargs) except AttributeError: self.sock = ssl.wrap_socket(self.sock) @@ -1262,7 +1300,7 @@ raise SpeedtestServersError( 'Malformed speedtest.net server list: %s' % e ) - elements = root.getiterator('server') + elements = etree_iter(root, 'server') except AttributeError: try: root = DOM.parseString(serversxml) @@ -1482,6 +1520,9 @@ build_request(url, bump=i, secure=self._secure) ) + max_threads = threads or self.config['threads']['download'] + in_flight = {'threads': 0} + def producer(q, requests, request_count): for i, request in enumerate(requests): thread = HTTPDownloader( @@ -1492,21 +1533,26 @@ opener=self._opener, shutdown_event=self._shutdown_event ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) thread.start() q.put(thread, True) + in_flight['threads'] += 1 callback(i, request_count, start=True) finished = [] def consumer(q, request_count): + _is_alive = thread_is_alive while len(finished) < request_count: thread = q.get(True) - while thread.isAlive(): - thread.join(timeout=0.1) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 finished.append(sum(thread.result)) callback(thread.i, request_count, end=True) - q = Queue(threads or self.config['threads']['download']) + q = Queue(max_threads) prod_thread = threading.Thread(target=producer, args=(q, requests, request_count)) cons_thread = threading.Thread(target=consumer, @@ -1514,10 +1560,11 @@ start = timeit.default_timer() prod_thread.start() cons_thread.start() - while prod_thread.isAlive(): - prod_thread.join(timeout=0.1) - while cons_thread.isAlive(): - cons_thread.join(timeout=0.1) + _is_alive = thread_is_alive + while _is_alive(prod_thread): + prod_thread.join(timeout=0.001) + while _is_alive(cons_thread): + cons_thread.join(timeout=0.001) stop = timeit.default_timer() self.results.bytes_received = sum(finished) @@ -1566,6 +1613,9 @@ ) ) + max_threads = threads or self.config['threads']['upload'] + in_flight = {'threads': 0} + def producer(q, requests, request_count): for i, request in enumerate(requests[:request_count]): thread = HTTPUploader( @@ -1577,17 +1627,22 @@ opener=self._opener, shutdown_event=self._shutdown_event ) + while in_flight['threads'] >= max_threads: + timeit.time.sleep(0.001) thread.start() q.put(thread, True) + in_flight['threads'] += 1 callback(i, request_count, start=True) finished = [] def consumer(q, request_count): + _is_alive = thread_is_alive while len(finished) < request_count: thread = q.get(True) - while thread.isAlive(): - thread.join(timeout=0.1) + while _is_alive(thread): + thread.join(timeout=0.001) + in_flight['threads'] -= 1 finished.append(thread.result) callback(thread.i, request_count, end=True) @@ -1599,9 +1654,10 @@ start = timeit.default_timer() prod_thread.start() cons_thread.start() - while prod_thread.isAlive(): + _is_alive = thread_is_alive + while _is_alive(prod_thread): prod_thread.join(timeout=0.1) - while cons_thread.isAlive(): + while _is_alive(cons_thread): cons_thread.join(timeout=0.1) stop = timeit.default_timer()
