Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-greenlet for openSUSE:Factory checked in at 2022-09-15 22:57:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-greenlet (Old) and /work/SRC/openSUSE:Factory/.python-greenlet.new.2083 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-greenlet" Thu Sep 15 22:57:30 2022 rev:39 rq:1003047 version:1.1.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-greenlet/python-greenlet.changes 2021-10-20 20:24:11.245374487 +0200 +++ /work/SRC/openSUSE:Factory/.python-greenlet.new.2083/python-greenlet.changes 2022-09-15 22:57:32.320935590 +0200 @@ -1,0 +2,6 @@ +Mon Sep 12 20:13:22 UTC 2022 - Dirk M??ller <dmuel...@suse.com> + +- update to 1.1.3: + * Add support for Python 3.11. + +------------------------------------------------------------------- Old: ---- greenlet-1.1.2.tar.gz New: ---- greenlet-1.1.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-greenlet.spec ++++++ --- /var/tmp/diff_new_pack.9EN8Fp/_old 2022-09-15 22:57:32.836937046 +0200 +++ /var/tmp/diff_new_pack.9EN8Fp/_new 2022-09-15 22:57:32.840937058 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-greenlet # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # Copyright (c) 2010 B1 Systems GmbH, Vohburg, Germany. # # All modifications and additions to the file contributed by third parties @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-greenlet -Version: 1.1.2 +Version: 1.1.3 Release: 0 Summary: Lightweight in-process concurrent programming License: MIT ++++++ greenlet-1.1.2.tar.gz -> greenlet-1.1.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/.github/workflows/tests.yml new/greenlet-1.1.3/.github/workflows/tests.yml --- old/greenlet-1.1.2/.github/workflows/tests.yml 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/.github/workflows/tests.yml 2022-08-25 12:22:46.000000000 +0200 @@ -24,7 +24,7 @@ runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10.0-rc.1] + python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9, "3.10", "3.11.0-rc.1"] os: [ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/.gitignore new/greenlet-1.1.3/.gitignore --- old/greenlet-1.1.2/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/greenlet-1.1.3/.gitignore 2022-08-25 12:22:46.000000000 +0200 @@ -0,0 +1,13 @@ +*.so +*.pyd +*.pyc +*.pyo +build/ +dist/ +.tox/ +wheelhouse/ +greenlet.egg-info/ +/docs/_build +__pycache__/ +/.ropeproject/ +/MANIFEST diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/CHANGES.rst new/greenlet-1.1.3/CHANGES.rst --- old/greenlet-1.1.2/CHANGES.rst 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/CHANGES.rst 2022-08-25 12:22:46.000000000 +0200 @@ -2,6 +2,12 @@ Changes ========= +1.1.3 (2022-08-25) +================== + +- Add support for Python 3.11. Please note that Windows binary wheels + are not available at this time. + 1.1.2 (2021-09-29) ================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/PKG-INFO new/greenlet-1.1.3/PKG-INFO --- old/greenlet-1.1.2/PKG-INFO 2021-09-29 12:35:47.783776500 +0200 +++ new/greenlet-1.1.3/PKG-INFO 2022-08-25 12:22:47.529386800 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: greenlet -Version: 1.1.2 +Version: 1.1.3 Summary: Lightweight in-process concurrent programming Home-page: https://greenlet.readthedocs.io/ Author: Alexey Borzenkov @@ -11,68 +11,6 @@ Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ Project-URL: Documentation, https://greenlet.readthedocs.io/ -Description: .. This file is included into docs/history.rst - - .. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg - :target: https://github.com/python-greenlet/greenlet/actions - - Greenlets are lightweight coroutines for in-process concurrent - programming. - - The "greenlet" package is a spin-off of `Stackless`_, a version of - CPython that supports micro-threads called "tasklets". Tasklets run - pseudo-concurrently (typically in a single or a few OS-level threads) - and are synchronized with data exchanges on "channels". - - A "greenlet", on the other hand, is a still more primitive notion of - micro-thread with no implicit scheduling; coroutines, in other words. - This is useful when you want to control exactly when your code runs. - You can build custom scheduled micro-threads on top of greenlet; - however, it seems that greenlets are useful on their own as a way to - make advanced control flow structures. For example, we can recreate - generators; the difference with Python's own generators is that our - generators can call nested functions and the nested functions can - yield values too. (Additionally, you don't need a "yield" keyword. See - the example in `test_generator.py - <https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_). - - Greenlets are provided as a C extension module for the regular unmodified - interpreter. - - .. _`Stackless`: http://www.stackless.com - - - Who is using Greenlet? - ====================== - - There are several libraries that use Greenlet as a more flexible - alternative to Python's built in coroutine support: - - - `Concurrence`_ - - `Eventlet`_ - - `Gevent`_ - - .. _Concurrence: http://opensource.hyves.org/concurrence/ - .. _Eventlet: http://eventlet.net/ - .. _Gevent: http://www.gevent.org/ - - Getting Greenlet - ================ - - The easiest way to get Greenlet is to install it with pip:: - - pip install greenlet - - - Source code archives and binary distributions are vailable on the - python package index at https://pypi.org/project/greenlet - - The source code repository is hosted on github: - https://github.com/python-greenlet/greenlet - - Documentation is available on readthedocs.org: - https://greenlet.readthedocs.io - Keywords: greenlet coroutine concurrency threads cooperative Platform: any Classifier: Development Status :: 5 - Production/Stable @@ -90,9 +28,75 @@ Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Operating System :: OS Independent Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* Description-Content-Type: text/x-rst Provides-Extra: docs Provides-Extra: test +License-File: LICENSE +License-File: LICENSE.PSF +License-File: AUTHORS + +.. This file is included into docs/history.rst + +.. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg + :target: https://github.com/python-greenlet/greenlet/actions + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +The "greenlet" package is a spin-off of `Stackless`_, a version of +CPython that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other words. +This is useful when you want to control exactly when your code runs. +You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. (Additionally, you don't need a "yield" keyword. See +the example in `test_generator.py +<https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_). + +Greenlets are provided as a C extension module for the regular unmodified +interpreter. + +.. _`Stackless`: http://www.stackless.com + + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip:: + + pip install greenlet + + +Source code archives and binary distributions are vailable on the +python package index at https://pypi.org/project/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/appveyor.yml new/greenlet-1.1.3/appveyor.yml --- old/greenlet-1.1.2/appveyor.yml 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/appveyor.yml 2022-08-25 12:22:46.000000000 +0200 @@ -35,7 +35,7 @@ matrix: # http://www.appveyor.com/docs/installed-software#python - PYTHON: "C:\\Python310-x64" - PYTHON_VERSION: "3.10.0rc2" + PYTHON_VERSION: "3.10.4" PYTHON_ARCH: "64" PYTHON_EXE: python APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/make-manylinux new/greenlet-1.1.3/make-manylinux --- old/greenlet-1.1.2/make-manylinux 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/make-manylinux 2022-08-25 12:22:46.000000000 +0200 @@ -27,7 +27,7 @@ mkdir -p /greenlet/wheelhouse OPATH="$PATH" which auditwheel - for variant in `ls -d /opt/python/cp{27,35,36,37,38,39,310}*`; do + for variant in `ls -d /opt/python/cp{27,35,36,37,38,39,310,311}*`; do export PATH="$variant/bin:$OPATH" echo "Building $variant $(python --version)" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/setup.py new/greenlet-1.1.3/setup.py --- old/greenlet-1.1.2/setup.py 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/setup.py 2022-08-25 12:22:46.000000000 +0200 @@ -145,6 +145,7 @@ 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', 'Operating System :: OS Independent', 'Topic :: Software Development :: Libraries :: Python Modules' ], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/src/greenlet/__init__.py new/greenlet-1.1.3/src/greenlet/__init__.py --- old/greenlet-1.1.2/src/greenlet/__init__.py 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/src/greenlet/__init__.py 2022-08-25 12:22:46.000000000 +0200 @@ -25,7 +25,7 @@ ### # Metadata ### -__version__ = '1.1.2' +__version__ = '1.1.3' from ._greenlet import _C_API # pylint:disable=no-name-in-module ### diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/src/greenlet/greenlet.c new/greenlet-1.1.3/src/greenlet/greenlet.c --- old/greenlet-1.1.2/src/greenlet/greenlet.c 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/src/greenlet/greenlet.c 2022-08-25 12:22:46.000000000 +0200 @@ -170,9 +170,11 @@ { #if GREENLET_PY37 g->exc_info = NULL; - g->exc_state.exc_type = NULL; g->exc_state.exc_value = NULL; +#if !GREENLET_PY311 + g->exc_state.exc_type = NULL; g->exc_state.exc_traceback = NULL; +#endif g->exc_state.previous_item = NULL; #else g->exc_type = NULL; @@ -525,8 +527,13 @@ { /* save state */ PyGreenlet* current = ts_current; PyThreadState* tstate = PyThreadState_GET(); +#if GREENLET_PY311 + current->recursion_depth = (tstate->recursion_limit + - tstate->recursion_remaining); +#else current->recursion_depth = tstate->recursion_depth; current->top_frame = tstate->frame; +#endif #if GREENLET_PY37 current->context = tstate->context; #endif @@ -551,6 +558,15 @@ */ current->cframe = tstate->cframe; ts__g_switchstack_use_tracing = tstate->cframe->use_tracing; +#if GREENLET_PY311 + current->current_frame = tstate->cframe->current_frame; + current->datastack_chunk = tstate->datastack_chunk; + current->datastack_top = tstate->datastack_top; + current->datastack_limit = tstate->datastack_limit; + PyFrameObject *frame = PyThreadState_GetFrame(tstate); + Py_XDECREF(frame); /* PyThreadState_GetFrame gives us a new reference. */ + current->top_frame = frame; +#endif #endif } @@ -574,9 +590,6 @@ PyGreenlet* target = ts_target; PyGreenlet* origin = ts_current; PyThreadState* tstate = PyThreadState_GET(); - tstate->recursion_depth = target->recursion_depth; - tstate->frame = target->top_frame; - target->top_frame = NULL; #if GREENLET_PY37 tstate->context = target->context; @@ -607,7 +620,18 @@ */ tstate->cframe->use_tracing = ts__g_switchstack_use_tracing; #endif - +#if GREENLET_PY311 + tstate->recursion_remaining = (tstate->recursion_limit + - target->recursion_depth); + tstate->cframe->current_frame = target->current_frame; + tstate->datastack_chunk = target->datastack_chunk; + tstate->datastack_top = target->datastack_top; + tstate->datastack_limit = target->datastack_limit; +#else + tstate->recursion_depth = target->recursion_depth; + tstate->frame = target->top_frame; +#endif + target->top_frame = NULL; assert(ts_origin == NULL); Py_INCREF(target); ts_current = target; @@ -810,7 +834,7 @@ We want to defer copying the state info until we're sure we need it and are in a stable place to do so. */ - CFrame trace_info; + _PyCFrame trace_info; #endif /* save exception in case getattr clears it */ PyErr_Fetch(&exc, &val, &tb); @@ -875,7 +899,12 @@ } self->top_frame = NULL; green_clear_exc(self); +#if GREENLET_PY311 + self->recursion_depth = (PyThreadState_GET()->recursion_limit + - PyThreadState_GET()->recursion_remaining); +#else self->recursion_depth = PyThreadState_GET()->recursion_depth; +#endif /* restore arguments in case they are clobbered */ ts_target = self; @@ -1006,13 +1035,13 @@ it uses the ``root_cframe`` just to have something to put there. However, once the greenlet is actually switched to for the first time, ``g_initialstub`` (which doesn't actually "return" while the - greenlet is running) stores a new CFrame on its local stack, and + greenlet is running) stores a new _PyCFrame on its local stack, and copies the appropriate values from the currently running CFrame; - this is then made the CFrame for the newly-minted greenlet. + this is then made the _PyCFrame for the newly-minted greenlet. ``g_initialstub`` then proceeds to call ``glet.run()``, which - results in ``PyEval_...`` adding the CFrame to the list. Switches + results in ``PyEval_...`` adding the _PyCFrame to the list. Switches continue as normal. Finally, when the greenlet finishes, the call to - ``glet.run()`` returns and the CFrame is taken out of the linked + ``glet.run()`` returns and the _PyCFrame is taken out of the linked list and the stack value is now unused and free to expire. */ ((PyGreenlet*)o)->cframe = &PyThreadState_GET()->root_cframe; @@ -1121,9 +1150,11 @@ Py_VISIT(self->context); #endif #if GREENLET_PY37 - Py_VISIT(self->exc_state.exc_type); Py_VISIT(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_VISIT(self->exc_state.exc_type); Py_VISIT(self->exc_state.exc_traceback); +#endif #else Py_VISIT(self->exc_type); Py_VISIT(self->exc_value); @@ -1159,9 +1190,11 @@ Py_CLEAR(self->context); #endif #if GREENLET_PY37 - Py_CLEAR(self->exc_state.exc_type); Py_CLEAR(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_CLEAR(self->exc_state.exc_type); Py_CLEAR(self->exc_state.exc_traceback); +#endif #else Py_CLEAR(self->exc_type); Py_CLEAR(self->exc_value); @@ -1253,9 +1286,11 @@ Py_CLEAR(self->context); #endif #if GREENLET_PY37 - Py_CLEAR(self->exc_state.exc_type); Py_CLEAR(self->exc_state.exc_value); +#if !GREENLET_PY311 + Py_CLEAR(self->exc_state.exc_type); Py_CLEAR(self->exc_state.exc_traceback); +#endif #else Py_CLEAR(self->exc_type); Py_CLEAR(self->exc_value); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/src/greenlet/greenlet.h new/greenlet-1.1.3/src/greenlet/greenlet.h --- old/greenlet-1.1.2/src/greenlet/greenlet.h 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/src/greenlet/greenlet.h 2022-08-25 12:22:46.000000000 +0200 @@ -14,6 +14,15 @@ /* This is deprecated and undocumented. It does not change. */ #define GREENLET_VERSION "1.0.0" +#if PY_VERSION_HEX >= 0x30B00A6 +# define GREENLET_PY311 1 + /* _PyInterpreterFrame moved to the internal C API in Python 3.11 */ +# include <internal/pycore_frame.h> +#else +# define GREENLET_PY311 0 +# define _PyCFrame CFrame +#endif + typedef struct _greenlet { PyObject_HEAD char* stack_start; @@ -25,6 +34,12 @@ PyObject* run_info; struct _frame* top_frame; int recursion_depth; +#if GREENLET_PY311 + _PyInterpreterFrame *current_frame; + _PyStackChunk *datastack_chunk; + PyObject **datastack_top; + PyObject **datastack_limit; +#endif PyObject* weakreflist; #if PY_VERSION_HEX >= 0x030700A3 _PyErr_StackItem* exc_info; @@ -39,7 +54,7 @@ PyObject* context; #endif #if PY_VERSION_HEX >= 0x30A00B1 - CFrame* cframe; + _PyCFrame* cframe; #endif } PyGreenlet; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/src/greenlet.egg-info/PKG-INFO new/greenlet-1.1.3/src/greenlet.egg-info/PKG-INFO --- old/greenlet-1.1.2/src/greenlet.egg-info/PKG-INFO 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/src/greenlet.egg-info/PKG-INFO 2022-08-25 12:22:47.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: greenlet -Version: 1.1.2 +Version: 1.1.3 Summary: Lightweight in-process concurrent programming Home-page: https://greenlet.readthedocs.io/ Author: Alexey Borzenkov @@ -11,68 +11,6 @@ Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ Project-URL: Documentation, https://greenlet.readthedocs.io/ -Description: .. This file is included into docs/history.rst - - .. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg - :target: https://github.com/python-greenlet/greenlet/actions - - Greenlets are lightweight coroutines for in-process concurrent - programming. - - The "greenlet" package is a spin-off of `Stackless`_, a version of - CPython that supports micro-threads called "tasklets". Tasklets run - pseudo-concurrently (typically in a single or a few OS-level threads) - and are synchronized with data exchanges on "channels". - - A "greenlet", on the other hand, is a still more primitive notion of - micro-thread with no implicit scheduling; coroutines, in other words. - This is useful when you want to control exactly when your code runs. - You can build custom scheduled micro-threads on top of greenlet; - however, it seems that greenlets are useful on their own as a way to - make advanced control flow structures. For example, we can recreate - generators; the difference with Python's own generators is that our - generators can call nested functions and the nested functions can - yield values too. (Additionally, you don't need a "yield" keyword. See - the example in `test_generator.py - <https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_). - - Greenlets are provided as a C extension module for the regular unmodified - interpreter. - - .. _`Stackless`: http://www.stackless.com - - - Who is using Greenlet? - ====================== - - There are several libraries that use Greenlet as a more flexible - alternative to Python's built in coroutine support: - - - `Concurrence`_ - - `Eventlet`_ - - `Gevent`_ - - .. _Concurrence: http://opensource.hyves.org/concurrence/ - .. _Eventlet: http://eventlet.net/ - .. _Gevent: http://www.gevent.org/ - - Getting Greenlet - ================ - - The easiest way to get Greenlet is to install it with pip:: - - pip install greenlet - - - Source code archives and binary distributions are vailable on the - python package index at https://pypi.org/project/greenlet - - The source code repository is hosted on github: - https://github.com/python-greenlet/greenlet - - Documentation is available on readthedocs.org: - https://greenlet.readthedocs.io - Keywords: greenlet coroutine concurrency threads cooperative Platform: any Classifier: Development Status :: 5 - Production/Stable @@ -90,9 +28,75 @@ Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Operating System :: OS Independent Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* Description-Content-Type: text/x-rst Provides-Extra: docs Provides-Extra: test +License-File: LICENSE +License-File: LICENSE.PSF +License-File: AUTHORS + +.. This file is included into docs/history.rst + +.. image:: https://github.com/python-greenlet/greenlet/workflows/tests/badge.svg + :target: https://github.com/python-greenlet/greenlet/actions + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +The "greenlet" package is a spin-off of `Stackless`_, a version of +CPython that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other words. +This is useful when you want to control exactly when your code runs. +You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. (Additionally, you don't need a "yield" keyword. See +the example in `test_generator.py +<https://github.com/python-greenlet/greenlet/blob/adca19bf1f287b3395896a8f41f3f4fd1797fdc7/src/greenlet/tests/test_generator.py#L1>`_). + +Greenlets are provided as a C extension module for the regular unmodified +interpreter. + +.. _`Stackless`: http://www.stackless.com + + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip:: + + pip install greenlet + + +Source code archives and binary distributions are vailable on the +python package index at https://pypi.org/project/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/src/greenlet.egg-info/SOURCES.txt new/greenlet-1.1.3/src/greenlet.egg-info/SOURCES.txt --- old/greenlet-1.1.2/src/greenlet.egg-info/SOURCES.txt 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/src/greenlet.egg-info/SOURCES.txt 2022-08-25 12:22:47.000000000 +0200 @@ -1,4 +1,5 @@ .clang-format +.gitignore .readthedocs.yml AUTHORS CHANGES.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/greenlet-1.1.2/tox.ini new/greenlet-1.1.3/tox.ini --- old/greenlet-1.1.2/tox.ini 2021-09-29 12:35:47.000000000 +0200 +++ new/greenlet-1.1.3/tox.ini 2022-08-25 12:22:46.000000000 +0200 @@ -1,6 +1,6 @@ [tox] envlist = - py27,py35,py36,py37,py38,py39,py310,docs + py27,py35,py36,py37,py38,py39,py310,py311,docs [testenv] commands =