Hello community, here is the log from the commit of package python-aioeventlet for openSUSE:Factory checked in at 2018-05-15 10:15:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-aioeventlet (Old) and /work/SRC/openSUSE:Factory/.python-aioeventlet.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-aioeventlet" Tue May 15 10:15:32 2018 rev:2 rq:607031 version:0.5.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-aioeventlet/python-aioeventlet.changes 2015-08-13 18:10:20.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-aioeventlet.new/python-aioeventlet.changes 2018-05-15 10:34:14.154350496 +0200 @@ -1,0 +2,16 @@ +Mon May 14 11:53:13 UTC 2018 - tchva...@suse.com + +- Require only trollus on py2 the asyncio is for py3 < 3.4 + +------------------------------------------------------------------- +Thu May 10 13:52:56 UTC 2018 - tchva...@suse.com + +- Version update to 0.5.2 + * No obvious changelog or SCM present + +------------------------------------------------------------------- +Thu Aug 24 13:32:39 UTC 2017 - jmate...@suse.com + +- singlespec auto-conversion + +------------------------------------------------------------------- Old: ---- aioeventlet-0.4.tar.gz New: ---- aioeventlet-0.5.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-aioeventlet.spec ++++++ --- /var/tmp/diff_new_pack.FKlfZS/_old 2018-05-15 10:34:14.930321996 +0200 +++ /var/tmp/diff_new_pack.FKlfZS/_new 2018-05-15 10:34:14.934321850 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-aioeventlet # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 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 @@ -16,23 +16,25 @@ # +# versioning fun +%define intver 0.5.1 +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-aioeventlet -Version: 0.4 +Version: 0.5.2 Release: 0 -Summary: asyncio event loop scheduling callbacks in eventlet +Summary: Asyncio event loop scheduling callbacks in eventlet License: Apache-2.0 Group: Development/Languages/Python -Url: http://aioeventlet.readthedocs.org/ -Source: https://pypi.python.org/packages/source/a/aioeventlet/aioeventlet-%{version}.tar.gz -BuildRequires: python-devel +URL: https://pypi.org/project/aioeventlet/ +Source: https://files.pythonhosted.org/packages/source/a/aioeventlet/aioeventlet-%{version}.tar.gz +BuildRequires: %{python_module setuptools} +BuildRequires: python-rpm-macros Requires: python-eventlet -Requires: python-trollius >= 0.3 -BuildRoot: %{_tmppath}/%{name}-%{version}-build -%if 0%{?suse_version} && 0%{?suse_version} <= 1110 -%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} -%else BuildArch: noarch +%ifpython2 +Requires: python-trollius >= 0.3 %endif +%python_subpackages %description aioeventlet implements the asyncio API (PEP 3156) on top of eventlet. It makes @@ -49,17 +51,17 @@ parallel. %prep -%setup -q -n aioeventlet-%{version} +%setup -q -n aioeventlet-%{intver} %build -python setup.py build +%python_build %install -python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%python_install -%files -%defattr(-,root,root,-) -%doc README COPYING +%files %{python_files} +%license COPYING +%doc README %{python_sitelib}/* %changelog ++++++ aioeventlet-0.4.tar.gz -> aioeventlet-0.5.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/MANIFEST.in new/aioeventlet-0.5.1/MANIFEST.in --- old/aioeventlet-0.4/MANIFEST.in 2014-11-21 21:23:33.000000000 +0100 +++ new/aioeventlet-0.5.1/MANIFEST.in 2016-02-22 14:11:25.000000000 +0100 @@ -1,6 +1,7 @@ include COPYING include Makefile include runtests.py +include run_aiotest.py include tests/*.py include tox.ini diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/PKG-INFO new/aioeventlet-0.5.1/PKG-INFO --- old/aioeventlet-0.4/PKG-INFO 2014-12-03 00:56:38.000000000 +0100 +++ new/aioeventlet-0.5.1/PKG-INFO 2016-02-22 17:41:03.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: aioeventlet -Version: 0.4 +Version: 0.5.1 Summary: asyncio event loop scheduling callbacks in eventlet. Home-page: http://aioeventlet.readthedocs.org/ Author: Victor Stinner diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/aioeventlet.egg-info/PKG-INFO new/aioeventlet-0.5.1/aioeventlet.egg-info/PKG-INFO --- old/aioeventlet-0.4/aioeventlet.egg-info/PKG-INFO 2014-12-03 00:56:38.000000000 +0100 +++ new/aioeventlet-0.5.1/aioeventlet.egg-info/PKG-INFO 2016-02-22 17:41:02.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: aioeventlet -Version: 0.4 +Version: 0.5.1 Summary: asyncio event loop scheduling callbacks in eventlet. Home-page: http://aioeventlet.readthedocs.org/ Author: Victor Stinner diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/aioeventlet.egg-info/SOURCES.txt new/aioeventlet-0.5.1/aioeventlet.egg-info/SOURCES.txt --- old/aioeventlet-0.4/aioeventlet.egg-info/SOURCES.txt 2014-12-03 00:56:38.000000000 +0100 +++ new/aioeventlet-0.5.1/aioeventlet.egg-info/SOURCES.txt 2016-02-22 17:41:03.000000000 +0100 @@ -3,6 +3,7 @@ Makefile README aioeventlet.py +run_aiotest.py runtests.py setup.py tox.ini @@ -21,11 +22,5 @@ doc/status.rst doc/using.rst tests/__init__.py -tests/test_add_reader.py -tests/test_callback.py -tests/test_coroutine.py tests/test_eventlet.py -tests/test_greenlet.py -tests/test_network.py -tests/test_thread.py -tests/test_timer.py \ No newline at end of file +tests/test_greenlet.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/aioeventlet.egg-info/requires.txt new/aioeventlet-0.5.1/aioeventlet.egg-info/requires.txt --- old/aioeventlet-0.4/aioeventlet.egg-info/requires.txt 2014-12-03 00:56:38.000000000 +0100 +++ new/aioeventlet-0.5.1/aioeventlet.egg-info/requires.txt 2016-02-22 17:41:02.000000000 +0100 @@ -1,2 +1,2 @@ eventlet -trollius>=0.3 \ No newline at end of file +trollius>=0.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/aioeventlet.py new/aioeventlet-0.5.1/aioeventlet.py --- old/aioeventlet-0.4/aioeventlet.py 2014-12-03 00:24:35.000000000 +0100 +++ new/aioeventlet-0.5.1/aioeventlet.py 2016-02-22 17:20:44.000000000 +0100 @@ -28,6 +28,12 @@ # Examples: socket.socket(), socket.socketpair(), # threading.current_thread(). asyncio.base_events.socket = socket + asyncio.base_events.threading = threading + if hasattr(threading, 'get_ident'): + asyncio.base_events._get_thread_ident = threading.get_ident + else: + # Python 2 + asyncio.base_events._get_thread_ident = threading._get_ident asyncio.events.threading = threading if sys.platform == 'win32': asyncio.windows_events.socket = socket @@ -200,6 +206,12 @@ if eventlet.patcher.is_monkey_patched('thread'): self._default_executor = _TpoolExecutor(self) + def stop(self): + super(EventLoop, self).stop() + # selector.select() is running: write into the self-pipe to wake up + # the selector + self._write_to_self() + def call_soon(self, callback, *args): handle = super(EventLoop, self).call_soon(callback, *args) if self._selector is not None and self._selector._event: @@ -315,7 +327,7 @@ Return the result or raise the exception of the future. The function must not be called from the greenthread - of the aioeventlet event loop. + running the aioeventlet event loop. """ future = asyncio.async(future, loop=loop) if future._loop._greenthread == eventlet.getcurrent(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/changelog.rst new/aioeventlet-0.5.1/doc/changelog.rst --- old/aioeventlet-0.4/doc/changelog.rst 2014-12-03 00:55:03.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/changelog.rst 2016-02-22 17:23:28.000000000 +0100 @@ -1,11 +1,32 @@ Changelog ========= +2016-02-22: Version 0.5.1 +------------------------- + +* Fix EventLoop.stop() for the new semantics of stop() introduced + in Python 3.4.4 and Python 3.5.1. The method now writes into the self-pipe + to wake-up the event loop. Otherwise, the stop() may not be taken in account + immediatly, and even block forever. + +2016-02-22: Version 0.5 +----------------------- + +* Unit tests now use the aiotest library. +* Fix for eventlet used with monkey-patching: inject the original threading + module and the original threading.get_ident() function in + asyncio.base_events. +* Drop support for Python 2.6 and Python 3.2. aioeventlet depends on trollius + and pip which don't support these Python versions anymore. + 2014-12-03: Version 0.4 ----------------------- +* Add run_aiotest.py +* tox now also run the aiotest test suite * Rename the project from ``aiogreen`` to ``aioeventlet`` * Rename the ``link_future()`` function to :func:`yield_future` +* Running tests with eventlet monkey-patching now works with Python 3. 2014-11-23: version 0.3 ----------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/conf.py new/aioeventlet-0.5.1/doc/conf.py --- old/aioeventlet-0.4/doc/conf.py 2014-12-03 00:29:23.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/conf.py 2016-02-22 17:21:25.000000000 +0100 @@ -51,9 +51,8 @@ # built documents. # # The short X.Y version. -version = '0.4' # The full version, including alpha/beta/rc tags. -release = '0.4' +version = release = '0.5.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/index.rst new/aioeventlet-0.5.1/doc/index.rst --- old/aioeventlet-0.4/doc/index.rst 2014-12-03 00:26:31.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/index.rst 2016-02-22 14:51:37.000000000 +0100 @@ -14,8 +14,8 @@ coroutines, tasks and futures in greenthreads: see :func:`yield_future` and :func:`wrap_greenthread` functions. -The main visible difference between aioeventlet and trollius is the behaviour of -``run_forever()``: ``run_forever()`` blocks with trollius, whereas it runs in a +The main visible difference between aioeventlet and asyncio is the behaviour of +``run_forever()``: ``run_forever()`` blocks with asyncio, whereas it runs in a greenthread with aioeventlet. It means that aioeventlet event loop can run in an greenthread while the Python main thread runs other greenthreads in parallel. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/openstack.rst new/aioeventlet-0.5.1/doc/openstack.rst --- old/aioeventlet-0.4/doc/openstack.rst 2014-12-03 00:27:06.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/openstack.rst 2016-02-22 14:51:01.000000000 +0100 @@ -1,6 +1,12 @@ asyncio in OpenStack ==================== +.. warning:: + The project of replacing eventlet with trollius using aioeventlet in + OpenStack is abandonned. It might done "later" when Python 2 support + will be removed from OpenStack which is not going to happen in a near + future. + First part (in progress): add support for trollius coroutines ------------------------------------------------------------- @@ -107,12 +113,61 @@ parallel tasks (ex: send multiple requests to a database) -History -------- +openstack-dev mailing list +-------------------------- + +* `[oslo] Progress of the port to Python 3 + <http://lists.openstack.org/pipermail/openstack-dev/2015-January/053846.html>`_ + (Victor Stinner, Jan 6 2015) + +* `[oslo] Add a new aiogreen executor for Oslo Messaging + <http://lists.openstack.org/pipermail/openstack-dev/2014-November/051337.html>`_ + (Victor Stinner, Nov 23 2014) + +* `[oslo] Asyncio and oslo.messaging + <http://lists.openstack.org/pipermail/openstack-dev/2014-July/039291.html>`_ + (Mark McLoughlin, Jul 3 2014) + + * `SQLAlchemy and asynchronous programming + <http://lists.openstack.org/pipermail/openstack-dev/2014-July/039480.html>`_ + by Mike Bayer (author and maintainer of SQLAlchemy) + +* `[Solum][Oslo] Next Release of oslo.messaging? + <http://lists.openstack.org/pipermail/openstack-dev/2014-March/030304.html>`_ + (Victor Stinner, Mar 18 2014) + +* `[solum] async / threading for python 2 and 3 + <http://lists.openstack.org/pipermail/openstack-dev/2014-February/027685.html>`_ + (Victor Stinner, Feb 20 2014) + +* `Asynchrounous programming: replace eventlet with asyncio + <http://lists.openstack.org/pipermail/openstack-dev/2014-February/026237.html>`_ + (Victor Stinner, Feb 4 2014) + + +History of asyncio in OpenStack +------------------------------- + +Threads and asyncio specs: + +* `Cross-project meeting: 2015-03-02 + <http://eavesdrop.openstack.org/meetings/crossproject/2015/crossproject.2015-03-03-21.02.log.html>`_ +* `Cross-project meeting: 2015-02-24T21:44:05 + <http://eavesdrop.openstack.org/meetings/crossproject/2015/crossproject.2015-02-24-21.03.log.html>`_ Maybe the good one, aioeventlet project: -* Novembre 23, two patches posted to Oslo Messaging: +* March 13, 2015: Joshua Harlow wrote the spec `Replace eventlet + + monkey-patching with ?? <https://review.openstack.org/#/c/164035/>`_ +* February 17, 2015: Joshua Harlow wrote a different spec, + `Sew over eventlet + patching with threads + <https://review.openstack.org/#/c/156711/>`_ +* February 5, 2015: new cross-project spec `Replace eventlet with asyncio + <https://review.openstack.org/#/c/153298/>`_ +* December 3, 2014: two patches posted to requirements: + `Add aioeventlet dependency <https://review.openstack.org/#/c/138750/>`_ + and `Drop greenio dependency <https://review.openstack.org/#/c/138748/>`_. +* Novembre 23, 2014: two patches posted to Oslo Messaging: `Add a new aioeventlet executor <https://review.openstack.org/#/c/136653/>`_ and `Add an optional executor callback to dispatcher <https://review.openstack.org/#/c/136652/>`_ @@ -148,7 +203,7 @@ <https://review.openstack.org/#/c/104792/>`_ merged into openstack/oslo-specs. * July 7, 2014: Patch `Fix AMQPListener for polling with timeout <https://review.openstack.org/#/c/104964/>`_ merged into Oslo Messaging -* July: greenio executor, `[openstack-dev] [oslo] Asyncio and oslo.messaging +* July 2014: greenio executor, `[openstack-dev] [oslo] Asyncio and oslo.messaging <http://lists.openstack.org/pipermail/openstack-dev/2014-July/039291.html>`_ First try with a trollius executor for Oslo Messaging: @@ -186,3 +241,11 @@ <https://blueprints.launchpad.net/oslo.messaging/+spec/asyncio-executor>`_ proposed by Flavio Percoco and accepted for OpenStack Icehouse by Mark McLoughlin + + +History of asynchronous programming in OpenStack +------------------------------------------------ + +In the past, the Nova project used Tornado, then Twisted and it is now using +eventlet which also became the defacto standard in OpenStack + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/status.rst new/aioeventlet-0.5.1/doc/status.rst --- old/aioeventlet-0.4/doc/status.rst 2014-12-03 00:27:14.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/status.rst 2016-02-22 14:49:21.000000000 +0100 @@ -1,6 +1,7 @@ To do ===== +* support monkey-patching enabled after loading the aioeventlet module * register signals in eventlet hub, only needed for pyevent hub? * port greenio examples to aioeventlet * write unit tests for, and maybe also examples for: @@ -13,22 +14,6 @@ - subprocesses * experiment running an event loop in a thread different than the main thread -* tox.ini: test Python 3.3 with monkey-patching, see eventlet bug: - https://github.com/eventlet/eventlet/pull/168 - - -eventlet issues -=============== - -* eventlet monkey patching on Python 3 is incomplete. The most blocking issue - is in the importlib: the thread module is patched to use greenthreads, but - importlib really need to work on real threads. Pull request: - https://github.com/eventlet/eventlet/pull/168 -* eventlet.tpool.setup() seems to be broken on Windows in eventlet 0.15. - Pull request: - https://github.com/eventlet/eventlet/pull/167 -* hub.debug_blocking is implemented with signal.alarm() which is is not - available on Windows. .. _eventlet-py3: @@ -36,24 +21,5 @@ eventlet and Python 3 ===================== -eventlet 0.15 is the first release supporting Python 3. Python 3 is only -supported if monkey-patching is not used. - -Python 3 pull requests: - -* Pull request #160: `Python 3 compat; Improve WSGI, WS, threading and tests - <https://github.com/eventlet/eventlet/pull/160>`_ (sent the Nov 5, 2014): not - merged yet -* Pull request #99, `Fix several issues with python3 thread patching - <https://github.com/eventlet/eventlet/pull/99>`_ (sent the July 3, 2014): not - merged yet, see the `commit - <https://github.com/therve/eventlet/commit/9c3118162cf1ca1e50be330ba2a289f054c48d3c>`_ - -Python 3 issues: - -* Issue #157: `eventlet hanging - <https://github.com/eventlet/eventlet/issues/157>`_ (open since Oct 30, 2014) -* Issue #153: `py3: green.threading.local is not green - <https://github.com/eventlet/eventlet/issues/153>`_ (closed the Nov 5, 2014) -* Issue #6: `Support Python 3.3 - <https://github.com/eventlet/eventlet/issues/6>`_ (open since Jan 2013) +eventlet 0.17 or newer is recommanded for Python 3 when monkey-patching is +enabled. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/doc/using.rst new/aioeventlet-0.5.1/doc/using.rst --- old/aioeventlet-0.4/doc/using.rst 2014-12-03 00:53:23.000000000 +0100 +++ new/aioeventlet-0.5.1/doc/using.rst 2016-02-22 14:47:51.000000000 +0100 @@ -1,26 +1,26 @@ Usage ===== -Use aioeventlet with trollius ------------------------------ - -aioeventlet can be used with trollius, coroutines written with ``yield -From(...)``. Using aioeventlet with trollius is a good start to port project -written for eventlet to trollius. +Use aioeventlet with asyncio +---------------------------- -To use aioeventlet with trollius, set the event loop policy before using an event -loop, example:: +aioeventlet can be used with asyncio, coroutines written with ``yield from ...``. +To use aioeventlet with asyncio, set the event loop policy before using an event +loop. Example:: import aioeventlet - import trollius + import asyncio - trollius.set_event_loop_policy(aioeventlet.EventLoopPolicy()) + asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) # .... +Setting the event loop policy should be enough to examples of the asyncio +documentation with the aioeventlet event loop. + Hello World:: import aioeventlet - import trollius as asyncio + import asyncio def hello_world(): print("Hello World") @@ -33,36 +33,35 @@ loop.close() .. seealso:: - `Trollius documentation <http://trollius.readthedocs.org/>`_. + The `asyncio documentation + <https://docs.python.org/dev/library/asyncio.html>`_. -Use aioeventlet with asyncio ----------------------------- +Use aioeventlet with trollius +----------------------------- -aioeventlet can be used with asyncio, coroutines written with ``yield from ...``. -To use aioeventlet with asyncio, set the event loop policy before using an event -loop. Example:: +.. warning:: + The `trollius project is now deprecated + <http://trollius.readthedocs.org/deprecated.html>`_. It's now recommended to + use aioeventlet with asyncio. - import aioeventlet - import asyncio +aioeventlet can be used with trollius, coroutines written with ``yield +From(...)``. Using aioeventlet with trollius is a good start to port project +written for eventlet to trollius. - asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) - # .... +To use aioeventlet with trollius, set the event loop policy before using an event +loop, example:: -Setting the event loop policy should be enough to examples of the asyncio -documentation with the aioeventlet event loop. + import aioeventlet + import trollius -.. warning:: - Since aioeventlet relies on eventlet, eventlet port to Python 3 is not complete - and asyncio requires Python 3.3 or newer: using aioeventlet with asyncio is not - recommended yet. *Using aioeventlet with trollius should be preferred right - now*. See the :ref:`status of the eventlet port to Python 3 - <eventlet-py3>`. + trollius.set_event_loop_policy(aioeventlet.EventLoopPolicy()) + # .... Hello World:: import aioeventlet - import asyncio + import trollius as asyncio def hello_world(): print("Hello World") @@ -75,8 +74,7 @@ loop.close() .. seealso:: - The `asyncio documentation - <https://docs.python.org/dev/library/asyncio.html>`_. + `Trollius documentation <http://trollius.readthedocs.org/>`_. Threads @@ -126,6 +124,7 @@ .. warning:: aioeventlet API is not considered as stable yet. + yield_future ------------ @@ -135,8 +134,8 @@ Return the result or raise the exception of the future. - The function must not be called from the greenthread of the aioeventlet event - loop. + The function must not be called from the greenthread running the aioeventlet + event loop. .. versionchanged:: 0.4 @@ -168,9 +167,7 @@ def green_sum(): loop.call_soon(progress) - task = asyncio.async(coro_slow_sum(1, 2)) - - value = aioeventlet.yield_future(task) + value = aioeventlet.yield_future(coro_slow_sum(1, 2)) print("1 + 2 = %s" % value) loop.stop() @@ -287,7 +284,7 @@ needed) * Python 3.3: need Tulip 0.4.1 or newer (``pip install asyncio``), but Tulip 3.4.1 or newer is recommended - * Python 2.6-3.2: need Trollius 0.3 or newer (``pip install trollius``), + * Python 2.7: need Trollius 0.3 or newer (``pip install trollius``), but Trollius 1.0 or newer is recommended Type:: @@ -303,7 +300,7 @@ The `tox project <http://testrun.org/tox/latest/>`_ can be used to build a virtual environment with all runtime and test dependencies and run tests -against different Python versions (2.6, 2.7, 3.2, 3.3, 3.4). +against different Python versions (2.7, 3.3, 3.4, 3.5). To test all Python versions, just type:: @@ -315,16 +312,16 @@ To run tests against other Python versions: -* ``py26``: Python 2.6 * ``py27``: Python 2.7 * ``py27_patch``: Python 2.7 with eventlet monkey patching * ``py27_old``: Python 2.7 with the oldest supported versions of eventlet and trollius -* ``py32``: Python 3.2 * ``py33``: Python 3.3 -* ``py33_old``: Python 3.3 with the oldest supported versions of eventlet and +* ``py3_patch``: Python 3 with eventlet monkey patching +* ``py3_old``: Python 3 with the oldest supported versions of eventlet and tulip * ``py34``: Python 3.4 +* ``py35``: Python 3.5 Run tests manually ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/run_aiotest.py new/aioeventlet-0.5.1/run_aiotest.py --- old/aioeventlet-0.4/run_aiotest.py 1970-01-01 01:00:00.000000000 +0100 +++ new/aioeventlet-0.5.1/run_aiotest.py 2016-02-22 17:36:50.000000000 +0100 @@ -0,0 +1,19 @@ +import eventlet +import sys + +if '-m' in sys.argv: + print("Enable eventlet monkey patching") + eventlet.monkey_patch() + sys.argv.remove('-m') + +import aioeventlet +import aiotest.run + +config = aiotest.TestConfig() +config.asyncio = aioeventlet.asyncio +config.socket = eventlet.patcher.original('socket') +config.threading = eventlet.patcher.original('threading') +config.sleep = eventlet.sleep +config.socketpair = aioeventlet.socketpair +config.new_event_pool_policy = aioeventlet.EventLoopPolicy +aiotest.run.main(config) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/setup.py new/aioeventlet-0.5.1/setup.py --- old/aioeventlet-0.4/setup.py 2014-12-03 00:25:40.000000000 +0100 +++ new/aioeventlet-0.5.1/setup.py 2016-02-22 17:21:17.000000000 +0100 @@ -1,4 +1,5 @@ -# Release procedure: +# Prepare a release: +# # - fill the changelog # - run unit tests on Linux: run "tox" # - run unit tests on Windows, run:: @@ -7,15 +8,26 @@ # \Python27\python.exe runtest.py -r -m # # - update the version in setup.py and doc/conf.py to X.Y -# - set release date in doc/changelog.rst # - check that "python setup.py sdist" contains all files tracked by # the SCM (Mercurial): update MANIFEST.in if needed +# - set release date in doc/changelog.rst # - hg ci +# - hg push +# +# Release a new version: +# # - hg tag X.Y # - hg push -# - python setup.py sdist bdist_wheel register upload +# - python setup.py sdist register upload +# WARNING: don't publish binary wheel packages, since setup.py +# hardcodes dependencies depending on the Python version. # - increment version in setup.py and doc/conf.py # - hg ci && hg push +# +# After the release: +# +# - increment version in setup.py and doc/conf.py +# - hg ci -m "post-release" && hg push import sys try: @@ -35,7 +47,7 @@ # Python 3.3: use Tulip requirements.append('asyncio>=0.4.1') else: - # Python 2.6-3.2: use Trollius + # Python 2.7: use Trollius requirements.append('trollius>=0.3') with open("README") as fp: @@ -43,7 +55,7 @@ install_options = { "name": "aioeventlet", - "version": "0.4", + "version": "0.5.1", "license": "Apache License 2.0", "author": 'Victor Stinner', "author_email": 'victor.stin...@gmail.com', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/__init__.py new/aioeventlet-0.5.1/tests/__init__.py --- old/aioeventlet-0.4/tests/__init__.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/__init__.py 2016-02-22 17:07:02.000000000 +0100 @@ -1,13 +1,10 @@ import aioeventlet +import sys try: import asyncio except ImportError: import trollius as asyncio -try: - # On Python 2.6, unittest2 is needed to get new features like addCleanup() - import unittest2 as unittest -except ImportError: - import unittest +import unittest try: from unittest import mock except ImportError: @@ -22,3 +19,7 @@ self.loop = policy.get_event_loop() self.addCleanup(self.loop.close) self.addCleanup(asyncio.set_event_loop, None) + + if sys.version_info < (3,): + def assertRaisesRegex(self, *args): + return self.assertRaisesRegexp(*args) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_add_reader.py new/aioeventlet-0.5.1/tests/test_add_reader.py --- old/aioeventlet-0.4/tests/test_add_reader.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_add_reader.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,81 +0,0 @@ -from __future__ import absolute_import -from aioeventlet import socketpair -import eventlet -import tests -socket = eventlet.patcher.original('socket') - - -class AddReaderTests(tests.TestCase): - def test_add_reader(self): - result = {'received': None} - rsock, wsock = socketpair() - self.addCleanup(rsock.close) - self.addCleanup(wsock.close) - - def reader(): - data = rsock.recv(100) - result['received'] = data - self.loop.remove_reader(rsock) - self.loop.stop() - - def writer(): - self.loop.remove_writer(wsock) - self.loop.call_soon(wsock.send, b'abc') - - self.loop.add_reader(rsock, reader) - self.loop.add_writer(wsock, writer) - - self.loop.run_forever() - self.assertEqual(result['received'], b'abc') - - def check_add_replace(self, event): - selector = self.loop._selector - if event == 'reader': - add_sock = self.loop.add_reader - remove_sock = self.loop.remove_reader - def get_handle(fileobj): - return selector.get_key(fileobj).data[0] - else: - add_sock = self.loop.add_writer - remove_sock = self.loop.remove_writer - def get_handle(fileobj): - return selector.get_key(fileobj).data[1] - - sock = socket.socket() - self.addCleanup(sock.close) - - def func(): - pass - - def func2(): - pass - - self.assertRaises(KeyError, get_handle, sock) - - add_sock(sock, func) - handle1 = get_handle(sock) - self.assertFalse(handle1._cancelled) - - add_sock(sock, func2) - handle2 = get_handle(sock) - self.assertIsNot(handle1, handle2) - self.assertTrue(handle1._cancelled) - self.assertFalse(handle2._cancelled) - - removed = remove_sock(sock) - self.assertTrue(removed) - self.assertTrue(handle2._cancelled) - - removed = remove_sock(sock) - self.assertFalse(removed) - - def test_add_reader_replace(self): - self.check_add_replace("reader") - - def test_add_writer_replace(self): - self.check_add_replace("writer") - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_callback.py new/aioeventlet-0.5.1/tests/test_callback.py --- old/aioeventlet-0.4/tests/test_callback.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_callback.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,48 +0,0 @@ -import tests - -class CallbackTests(tests.TestCase): - def test_hello_world(self): - result = [] - - def hello_world(loop): - result.append('Hello World') - loop.stop() - - self.loop.call_soon(hello_world, self.loop) - self.loop.run_forever() - self.assertEqual(result, ['Hello World']) - - def test_soon_stop_soon(self): - result = [] - - def hello(): - result.append("Hello") - - def world(): - result.append("World") - self.loop.stop() - - self.loop.call_soon(hello) - self.loop.stop() - self.loop.call_soon(world) - - self.loop.run_forever() - self.assertEqual(result, ["Hello"]) - - self.loop.run_forever() - self.assertEqual(result, ["Hello", "World"]) - - def test_close_soon(self): - def func(): - pass - - self.loop.close() - # FIXME: calling call_soon() on a closed event loop should raise an - # exception: - # http://bugs.python.org/issue22922 - self.loop.call_soon(func) - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_coroutine.py new/aioeventlet-0.5.1/tests/test_coroutine.py --- old/aioeventlet-0.4/tests/test_coroutine.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_coroutine.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ -import tests - -try: - import asyncio - - exec('''if 1: - def hello_world(result, delay): - result.append("Hello") - # retrieve the event loop from the policy - yield from asyncio.sleep(delay) - result.append('World') - return "." - - def waiter(result): - loop = asyncio.get_event_loop() - fut = asyncio.Future(loop=loop) - loop.call_soon(fut.set_result, "Future") - - value = yield from fut - result.append(value) - - value = yield from hello_world(result, 0.001) - result.append(value) - ''') -except ImportError: - import trollius as asyncio - from trollius import From, Return - - def hello_world(result, delay): - result.append("Hello") - # retrieve the event loop from the policy - yield From(asyncio.sleep(delay)) - result.append('World') - raise Return(".") - - def waiter(result): - loop = asyncio.get_event_loop() - fut = asyncio.Future(loop=loop) - loop.call_soon(fut.set_result, "Future") - - value = yield From(fut) - result.append(value) - - value = yield From(hello_world(result, 0.001)) - result.append(value) - - -class CallbackTests(tests.TestCase): - def test_hello_world(self): - result = [] - self.loop.run_until_complete(hello_world(result, 0.001)) - self.assertEqual(result, ['Hello', 'World']) - - def test_waiter(self): - result = [] - self.loop.run_until_complete(waiter(result)) - self.assertEqual(result, ['Future', 'Hello', 'World', '.']) - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_eventlet.py new/aioeventlet-0.5.1/tests/test_eventlet.py --- old/aioeventlet-0.4/tests/test_eventlet.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_eventlet.py 2016-02-22 17:20:58.000000000 +0100 @@ -292,7 +292,7 @@ self.loop.set_debug(False) gt = eventlet.spawn(func) msg = "wrap_greenthread: the greenthread is running" - self.assertRaisesRegexp(RuntimeError, msg, gt.wait) + self.assertRaisesRegex(RuntimeError, msg, gt.wait) def test_wrap_greenthread_dead(self): def func(): @@ -303,8 +303,8 @@ self.assertEqual(result, 'ok') msg = "wrap_greenthread: the greenthread already finished" - self.assertRaisesRegexp(RuntimeError, msg, - aioeventlet.wrap_greenthread, gt) + self.assertRaisesRegex(RuntimeError, msg, + aioeventlet.wrap_greenthread, gt) def test_coro_wrap_greenthread(self): result = self.loop.run_until_complete(coro_wrap_greenthread()) @@ -358,7 +358,7 @@ eventlet.spawn_n(func) msg = "wrap_greenthread: the greenthread is running" - self.assertRaisesRegexp(RuntimeError, msg, event.wait) + self.assertRaisesRegex(RuntimeError, msg, event.wait) def test_wrap_greenlet_dead(self): event = eventlet.event.Event() @@ -368,7 +368,7 @@ gt = eventlet.spawn_n(func) event.wait() msg = "wrap_greenthread: the greenthread already finished" - self.assertRaisesRegexp(RuntimeError, msg, aioeventlet.wrap_greenthread, gt) + self.assertRaisesRegex(RuntimeError, msg, aioeventlet.wrap_greenthread, gt) if __name__ == '__main__': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_greenlet.py new/aioeventlet-0.5.1/tests/test_greenlet.py --- old/aioeventlet-0.4/tests/test_greenlet.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_greenlet.py 2016-02-22 14:11:25.000000000 +0100 @@ -26,8 +26,8 @@ def test_wrap_greenlet_no_run_attr(self): gl = greenlet.greenlet() msg = "wrap_greenthread: the run attribute of the greenlet is not set" - self.assertRaisesRegexp(RuntimeError, msg, - aioeventlet.wrap_greenthread, gl) + self.assertRaisesRegex(RuntimeError, msg, + aioeventlet.wrap_greenthread, gl) def test_wrap_greenlet_running(self): def func(value): @@ -36,7 +36,7 @@ gl = greenlet.greenlet(func) msg = "wrap_greenthread: the greenthread is running" - self.assertRaisesRegexp(RuntimeError, msg, gl.switch, 5) + self.assertRaisesRegex(RuntimeError, msg, gl.switch, 5) def test_wrap_greenlet_dead(self): def func(value): @@ -45,7 +45,7 @@ gl = greenlet.greenlet(func) gl.switch(5) msg = "wrap_greenthread: the greenthread already finished" - self.assertRaisesRegexp(RuntimeError, msg, aioeventlet.wrap_greenthread, gl) + self.assertRaisesRegex(RuntimeError, msg, aioeventlet.wrap_greenthread, gl) if __name__ == '__main__': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_network.py new/aioeventlet-0.5.1/tests/test_network.py --- old/aioeventlet-0.4/tests/test_network.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_network.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,84 +0,0 @@ -import eventlet -import tests -socket = eventlet.patcher.original('socket') -threading = eventlet.patcher.original('threading') - -class TcpEchoClientProtocol(tests.asyncio.Protocol): - def __init__(self, message, loop): - self.message = message - self.loop = loop - self.state = 'new' - self.received = None - - def connection_made(self, transport): - self.state = 'ping' - transport.write(self.message) - - def data_received(self, data): - self.state = 'pong' - self.received = data - - def connection_lost(self, exc): - self.state = 'closed' - self.loop.stop() - - -class TcpServer(threading.Thread): - def __init__(self, host, port, event): - super(TcpServer, self).__init__() - self.host = host - self.port = port - self.event = event - self.sock = None - self.client = None - - def run(self): - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock = sock - try: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind((self.host, self.port)) - sock.listen(1) - - self.event.set() - client, addr = sock.accept() - self.client = client - try: - message = client.recv(100) - client.sendall(message) - finally: - client.close() - self.client = None - finally: - sock.close() - self.sock = None - - def stop(self): - self.join() - - -class NetworkTests(tests.TestCase): - def test_tcp_hello(self): - port = 8888 - host = '127.0.0.1' - message = b'Hello World!' - - event = threading.Event() - server = TcpServer(host, port, event) - server.start() - self.addCleanup(server.stop) - event.wait() - - proto = TcpEchoClientProtocol(message, self.loop) - coro = self.loop.create_connection(lambda: proto, host, port) - self.loop.run_until_complete(coro) - self.assertNotEqual(proto.state, 'new') - - self.loop.run_forever() - self.assertEqual(proto.state, 'closed') - self.assertEqual(proto.received, message) - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_thread.py new/aioeventlet-0.5.1/tests/test_thread.py --- old/aioeventlet-0.4/tests/test_thread.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_thread.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,101 +0,0 @@ -import eventlet -import tests -threading = eventlet.patcher.original('threading') -try: - import asyncio -except ImportError: - import trollius as asyncio - -try: - get_ident = threading.get_ident # Python 3 -except AttributeError: - get_ident = threading._get_ident # Python 2 - -class ThreadTests(tests.TestCase): - def test_ident(self): - result = {'ident': None} - - def work(): - result['ident'] = get_ident() - - fut = self.loop.run_in_executor(None, work) - self.loop.run_until_complete(fut) - - # ensure that work() was executed in a different thread - work_ident = result['ident'] - self.assertIsNotNone(work_ident) - self.assertNotEqual(work_ident, get_ident()) - - def test_run_twice(self): - result = [] - - def work(): - result.append("run") - - fut = self.loop.run_in_executor(None, work) - self.loop.run_until_complete(fut) - self.assertEqual(result, ["run"]) - - # ensure that run_in_executor() can be called twice - fut = self.loop.run_in_executor(None, work) - self.loop.run_until_complete(fut) - self.assertEqual(result, ["run", "run"]) - - def test_policy(self): - result = {'loop': 'not set'} # sentinel, different than None - - def work(): - try: - result['loop'] = asyncio.get_event_loop() - except AssertionError as exc: - result['loop'] = exc - - # get_event_loop() must return None in a different thread - fut = self.loop.run_in_executor(None, work) - self.loop.run_until_complete(fut) - self.assertIsInstance(result['loop'], AssertionError) - - def test_run_in_thread(self): - class LoopThread(threading.Thread): - def __init__(self, event): - super(LoopThread, self).__init__() - self.loop = None - self.event = event - - def run(self): - self.loop = asyncio.new_event_loop() - try: - self.loop.set_debug(True) - asyncio.set_event_loop(self.loop) - - self.event.set() - self.loop.run_forever() - finally: - self.loop.close() - asyncio.set_event_loop(None) - - result = [] - - # start an event loop in a thread - event = threading.Event() - thread = LoopThread(event) - thread.start() - event.wait() - loop = thread.loop - - def func(loop): - result.append(threading.current_thread().ident) - loop.stop() - - # call func() in a different thread using the event loop - tid = thread.ident - loop.call_soon_threadsafe(func, loop) - - # stop the event loop - thread.join() - self.assertEqual(result, [tid]) - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tests/test_timer.py new/aioeventlet-0.5.1/tests/test_timer.py --- old/aioeventlet-0.4/tests/test_timer.py 2014-12-03 00:24:56.000000000 +0100 +++ new/aioeventlet-0.5.1/tests/test_timer.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,48 +0,0 @@ -import datetime -import eventlet -import tests - -class TimerTests(tests.TestCase): - def test_display_date(self): - result = [] - delay = 0.050 - count = 3 - - def display_date(end_time, loop): - result.append(datetime.datetime.now()) - if (loop.time() + delay) < end_time: - loop.call_later(delay, display_date, end_time, loop) - else: - loop.stop() - - end_time = self.loop.time() + delay * count - self.loop.call_soon(display_date, end_time, self.loop) - self.loop.run_forever() - - self.assertEqual(len(result), count, result) - - def test_later_stop_later(self): - result = [] - - def hello(): - result.append("Hello") - - def world(loop): - result.append("World") - loop.stop() - - self.loop.call_later(0.001, hello) - self.loop.call_later(0.025, self.loop.stop) - self.loop.call_later(0.050, world, self.loop) - self.loop.run_forever() - - eventlet.sleep(0.100) - self.assertEqual(result, ["Hello"]) - - self.loop.run_forever() - self.assertEqual(result, ["Hello", "World"]) - - -if __name__ == '__main__': - import unittest - unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aioeventlet-0.4/tox.ini new/aioeventlet-0.5.1/tox.ini --- old/aioeventlet-0.4/tox.ini 2014-11-24 20:44:00.000000000 +0100 +++ new/aioeventlet-0.5.1/tox.ini 2016-02-22 14:28:45.000000000 +0100 @@ -1,84 +1,85 @@ [tox] minversion = 1.4 -envlist = py26,py27,py27_old,py27_patch,py32,py33,py33_old,py34,py35 +envlist = py27,py27_old,py27_patch,py33,py3_patch,py3_old,py34,py35 -[testenv:py26] -setenv = - TROLLIUSDEBUG = 1 -deps= - eventlet - mock - trollius - unittest2 -commands=python runtests.py -r +[testenv] +commands= + python runtests.py -r + python run_aiotest.py -r [testenv:py27] setenv = TROLLIUSDEBUG = 1 deps= - eventlet - mock - trollius -commands=python runtests.py -r + aiotest + eventlet + mock + trollius [testenv:py27_old] basepython = python2.7 setenv = TROLLIUSDEBUG = 1 deps= - eventlet==0.14.0 - mock - trollius==0.3 -commands=python runtests.py -r + aiotest + eventlet==0.14.0 + mock + trollius==0.3 [testenv:py27_patch] basepython = python2.7 setenv = TROLLIUSDEBUG = 1 deps= - eventlet - mock - trollius -commands=python runtests.py -r -m + aiotest + eventlet + mock + trollius +commands= + python runtests.py -r -m + python run_aiotest.py -r -m -[testenv:py32] +[testenv:py33] setenv = - TROLLIUSDEBUG = 1 + PYTHONASYNCIODEBUG = 1 deps= - eventlet - mock - trollius -commands=python runtests.py -r + aiotest + asyncio + eventlet -[testenv:py33] +[testenv:py3_patch] +basepython = python3 setenv = PYTHONASYNCIODEBUG = 1 deps= - asyncio - eventlet -commands=python runtests.py -r + aiotest + asyncio + eventlet +commands= + python runtests.py -r -m + python run_aiotest.py -r -m -[testenv:py33_old] -basepython = python3.3 +[testenv:py3_old] +basepython = python3 setenv = PYTHONASYNCIODEBUG = 1 deps= - asyncio==0.4.1 - eventlet==0.15.0 -commands=python runtests.py -r + aiotest + asyncio==0.4.1 + eventlet==0.15.0 [testenv:py34] basepython = python3.4 setenv = PYTHONASYNCIODEBUG = 1 deps= - eventlet -commands=python runtests.py -r + aiotest + eventlet [testenv:py35] basepython = python3.5 setenv = PYTHONASYNCIODEBUG = 1 deps= - eventlet -commands=python runtests.py -r + aiotest + eventlet