[Python-modules-commits] [aiopg] 01/04: Import aiopg_0.10.0.orig.tar.gz

Piotr Ożarowski piotr at moszumanska.debian.org
Thu Jul 21 20:21:32 UTC 2016


This is an automated email from the git hooks/post-receive script.

piotr pushed a commit to branch master
in repository aiopg.

commit b3339dfb13845f2c528a33e0cdbb8e15a35aba44
Author: Piotr Ożarowski <piotr at debian.org>
Date:   Thu Jul 21 22:16:20 2016 +0200

    Import aiopg_0.10.0.orig.tar.gz
---
 CHANGES.txt             | 15 +++++++++++++++
 PKG-INFO                | 41 +++++++++++++++++++++++++++++++----------
 README.rst              | 22 ++++++++++++++--------
 aiopg.egg-info/PKG-INFO | 41 +++++++++++++++++++++++++++++++----------
 aiopg/__init__.py       |  2 +-
 aiopg/connection.py     | 18 +++++++++++-------
 aiopg/pool.py           | 21 ++++++++++++++++-----
 aiopg/sa/connection.py  |  6 +-----
 aiopg/sa/engine.py      |  4 ++--
 aiopg/utils.py          | 13 +++++++++++++
 setup.cfg               |  2 +-
 setup.py                |  6 +++---
 12 files changed, 139 insertions(+), 52 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 07bc8c4..c8da093 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,21 @@
 CHANGES
 -------
 
+0.10.0 (2016-07-16)
+^^^^^^^^^^^^^^^^^^^
+
+* Refactor tests to use dockerized Postgres server #107
+
+* Reduce default pool minsize to 1 #106
+
+* Explicitly enumerate packages in setup.py #85
+
+* Remove expired connections from pool on acquire #116
+
+* Don't crash when Connection is GC'ed #124
+
+* Use loop.create_future() if available
+
 0.9.2 (2016-01-31)
 ^^^^^^^^^^^^^^^^^^
 
diff --git a/PKG-INFO b/PKG-INFO
index ec5334c..7c28766 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,8 +1,8 @@
 Metadata-Version: 1.1
 Name: aiopg
-Version: 0.9.2
+Version: 0.10.0
 Summary: Postgres integration with asyncio.
-Home-page: http://aiopg.readthedocs.org
+Home-page: https://aiopg.readthedocs.io
 Author: Andrew Svetlov
 Author-email: andrew.svetlov at gmail.com
 License: BSD
@@ -43,13 +43,12 @@ Description: aiopg
         
         
         Example of SQLAlchemy optional integration
-        -------------------------------------------
+        ------------------------------------------
         
         ::
         
            import asyncio
            from aiopg.sa import create_engine
-           from sqlalchemy.schema import CreateTable
            import sqlalchemy as sa
         
            metadata = sa.MetaData()
@@ -58,6 +57,12 @@ Description: aiopg
                sa.Column('id', sa.Integer, primary_key=True),
                sa.Column('val', sa.String(255)))
         
+           async def create_table(engine):
+               async with engine.acquire() as conn:
+                   await conn.execute('DROP TABLE IF EXISTS tbl')
+                   await conn.execute('''CREATE TABLE tbl (
+                                             id serial PRIMARY KEY,
+                                             val varchar(255))''')
         
            async def go():
                async with create_engine(user='aiopg',
@@ -65,15 +70,16 @@ Description: aiopg
                                         host='127.0.0.1',
                                         password='passwd') as engine:
         
-               async with engine.acquire() as conn:
-                   await conn.execute(tbl.insert().values(val='abc'))
+                   async with engine.acquire() as conn:
+                       await conn.execute(tbl.insert().values(val='abc'))
         
-                   async for row in conn.execute(tbl.select()):
-                       print(row.id, row.val)
+                       async for row in conn.execute(tbl.select()):
+                           print(row.id, row.val)
         
-           asyncio.get_event_loop().run_until_complete(go())
+           loop = asyncio.get_event_loop()
+           loop.run_until_complete(go())
         
-        For ``yield from`` based code see ``./examples`` folder, files with
+        For ``yield from`` based code, see the ``./examples`` folder, files with
         ``old_style`` part in their names.
         
         .. _PostgreSQL: http://www.postgresql.org/
@@ -89,6 +95,21 @@ Description: aiopg
         CHANGES
         -------
         
+        0.10.0 (2016-07-16)
+        ^^^^^^^^^^^^^^^^^^^
+        
+        * Refactor tests to use dockerized Postgres server #107
+        
+        * Reduce default pool minsize to 1 #106
+        
+        * Explicitly enumerate packages in setup.py #85
+        
+        * Remove expired connections from pool on acquire #116
+        
+        * Don't crash when Connection is GC'ed #124
+        
+        * Use loop.create_future() if available
+        
         0.9.2 (2016-01-31)
         ^^^^^^^^^^^^^^^^^^
         
diff --git a/README.rst b/README.rst
index 704759c..5276407 100644
--- a/README.rst
+++ b/README.rst
@@ -34,13 +34,12 @@ Example
 
 
 Example of SQLAlchemy optional integration
--------------------------------------------
+------------------------------------------
 
 ::
 
    import asyncio
    from aiopg.sa import create_engine
-   from sqlalchemy.schema import CreateTable
    import sqlalchemy as sa
 
    metadata = sa.MetaData()
@@ -49,6 +48,12 @@ Example of SQLAlchemy optional integration
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('val', sa.String(255)))
 
+   async def create_table(engine):
+       async with engine.acquire() as conn:
+           await conn.execute('DROP TABLE IF EXISTS tbl')
+           await conn.execute('''CREATE TABLE tbl (
+                                     id serial PRIMARY KEY,
+                                     val varchar(255))''')
 
    async def go():
        async with create_engine(user='aiopg',
@@ -56,15 +61,16 @@ Example of SQLAlchemy optional integration
                                 host='127.0.0.1',
                                 password='passwd') as engine:
 
-       async with engine.acquire() as conn:
-           await conn.execute(tbl.insert().values(val='abc'))
+           async with engine.acquire() as conn:
+               await conn.execute(tbl.insert().values(val='abc'))
 
-           async for row in conn.execute(tbl.select()):
-               print(row.id, row.val)
+               async for row in conn.execute(tbl.select()):
+                   print(row.id, row.val)
 
-   asyncio.get_event_loop().run_until_complete(go())
+   loop = asyncio.get_event_loop()
+   loop.run_until_complete(go())
 
-For ``yield from`` based code see ``./examples`` folder, files with
+For ``yield from`` based code, see the ``./examples`` folder, files with
 ``old_style`` part in their names.
 
 .. _PostgreSQL: http://www.postgresql.org/
diff --git a/aiopg.egg-info/PKG-INFO b/aiopg.egg-info/PKG-INFO
index ec5334c..7c28766 100644
--- a/aiopg.egg-info/PKG-INFO
+++ b/aiopg.egg-info/PKG-INFO
@@ -1,8 +1,8 @@
 Metadata-Version: 1.1
 Name: aiopg
-Version: 0.9.2
+Version: 0.10.0
 Summary: Postgres integration with asyncio.
-Home-page: http://aiopg.readthedocs.org
+Home-page: https://aiopg.readthedocs.io
 Author: Andrew Svetlov
 Author-email: andrew.svetlov at gmail.com
 License: BSD
@@ -43,13 +43,12 @@ Description: aiopg
         
         
         Example of SQLAlchemy optional integration
-        -------------------------------------------
+        ------------------------------------------
         
         ::
         
            import asyncio
            from aiopg.sa import create_engine
-           from sqlalchemy.schema import CreateTable
            import sqlalchemy as sa
         
            metadata = sa.MetaData()
@@ -58,6 +57,12 @@ Description: aiopg
                sa.Column('id', sa.Integer, primary_key=True),
                sa.Column('val', sa.String(255)))
         
+           async def create_table(engine):
+               async with engine.acquire() as conn:
+                   await conn.execute('DROP TABLE IF EXISTS tbl')
+                   await conn.execute('''CREATE TABLE tbl (
+                                             id serial PRIMARY KEY,
+                                             val varchar(255))''')
         
            async def go():
                async with create_engine(user='aiopg',
@@ -65,15 +70,16 @@ Description: aiopg
                                         host='127.0.0.1',
                                         password='passwd') as engine:
         
-               async with engine.acquire() as conn:
-                   await conn.execute(tbl.insert().values(val='abc'))
+                   async with engine.acquire() as conn:
+                       await conn.execute(tbl.insert().values(val='abc'))
         
-                   async for row in conn.execute(tbl.select()):
-                       print(row.id, row.val)
+                       async for row in conn.execute(tbl.select()):
+                           print(row.id, row.val)
         
-           asyncio.get_event_loop().run_until_complete(go())
+           loop = asyncio.get_event_loop()
+           loop.run_until_complete(go())
         
-        For ``yield from`` based code see ``./examples`` folder, files with
+        For ``yield from`` based code, see the ``./examples`` folder, files with
         ``old_style`` part in their names.
         
         .. _PostgreSQL: http://www.postgresql.org/
@@ -89,6 +95,21 @@ Description: aiopg
         CHANGES
         -------
         
+        0.10.0 (2016-07-16)
+        ^^^^^^^^^^^^^^^^^^^
+        
+        * Refactor tests to use dockerized Postgres server #107
+        
+        * Reduce default pool minsize to 1 #106
+        
+        * Explicitly enumerate packages in setup.py #85
+        
+        * Remove expired connections from pool on acquire #116
+        
+        * Don't crash when Connection is GC'ed #124
+        
+        * Use loop.create_future() if available
+        
         0.9.2 (2016-01-31)
         ^^^^^^^^^^^^^^^^^^
         
diff --git a/aiopg/__init__.py b/aiopg/__init__.py
index 8458391..1892d93 100644
--- a/aiopg/__init__.py
+++ b/aiopg/__init__.py
@@ -10,7 +10,7 @@ from .pool import create_pool, Pool
 __all__ = ('connect', 'create_pool', 'Connection', 'Cursor', 'Pool',
            'version', 'version_info', 'DEFAULT_TIMEOUT')
 
-__version__ = '0.9.2'
+__version__ = '0.10.0'
 
 version = __version__ + ' , Python ' + sys.version
 
diff --git a/aiopg/connection.py b/aiopg/connection.py
index 864e8a4..a34874a 100644
--- a/aiopg/connection.py
+++ b/aiopg/connection.py
@@ -11,7 +11,7 @@ from psycopg2.extensions import (
 from psycopg2 import extras
 
 from .cursor import Cursor
-from .utils import _ContextManager, PY_35
+from .utils import _ContextManager, PY_35, create_future
 
 
 __all__ = ('connect',)
@@ -61,7 +61,7 @@ def _connect(dsn=None, *, timeout=TIMEOUT, loop=None, enable_json=True,
     if loop is None:
         loop = asyncio.get_event_loop()
 
-    waiter = asyncio.Future(loop=loop)
+    waiter = create_future(loop)
     conn = Connection(dsn, loop, timeout, waiter, bool(echo), **kwargs)
     try:
         yield from conn._poll(waiter, timeout)
@@ -170,7 +170,7 @@ class Connection:
         if self._waiter is not None:
             raise RuntimeError('%s() called while another coroutine is '
                                'already waiting for incoming data' % func_name)
-        self._waiter = asyncio.Future(loop=self._loop)
+        self._waiter = create_future(self._loop)
         return self._waiter
 
     @asyncio.coroutine
@@ -182,7 +182,7 @@ class Connection:
         def cancel():
             if not self._isexecuting():
                 return
-            self._waiter = asyncio.Future(loop=self._loop)
+            self._waiter = create_future(self._loop)
             self._conn.cancel()
             try:
                 yield from self._waiter
@@ -252,7 +252,7 @@ class Connection:
         if self._waiter is not None and not self._waiter.done():
             self._waiter.set_exception(
                 psycopg2.OperationalError("Connection closed"))
-        ret = asyncio.Future(loop=self._loop)
+        ret = create_future(self._loop)
         ret.set_result(None)
         return ret
 
@@ -325,7 +325,7 @@ class Connection:
 
         @asyncio.coroutine
         def cancel():
-            self._waiter = asyncio.Future(loop=self._loop)
+            self._waiter = create_future(self._loop)
             self._conn.cancel()
             try:
                 yield from self._waiter
@@ -449,7 +449,11 @@ class Connection:
 
     if PY_341:  # pragma: no branch
         def __del__(self):
-            if not self._conn.closed:
+            try:
+                _conn = self._conn
+            except AttributeError:
+                return
+            if _conn is not None and not _conn.closed:
                 self.close()
                 warnings.warn("Unclosed connection {!r}".format(self),
                               ResourceWarning)
diff --git a/aiopg/pool.py b/aiopg/pool.py
index bc2b93b..64b7591 100644
--- a/aiopg/pool.py
+++ b/aiopg/pool.py
@@ -9,13 +9,14 @@ from psycopg2.extensions import TRANSACTION_STATUS_IDLE
 from .connection import connect, TIMEOUT
 from .log import logger
 from .utils import (PY_35, _PoolContextManager, _PoolConnectionContextManager,
-                    _PoolCursorContextManager, _PoolAcquireContextManager)
+                    _PoolCursorContextManager, _PoolAcquireContextManager,
+                    ensure_future, create_future)
 
 
 PY_341 = sys.version_info >= (3, 4, 1)
 
 
-def create_pool(dsn=None, *, minsize=10, maxsize=10,
+def create_pool(dsn=None, *, minsize=1, maxsize=10,
                 loop=None, timeout=TIMEOUT,
                 enable_json=True, enable_hstore=True, enable_uuid=True,
                 echo=False,
@@ -28,7 +29,7 @@ def create_pool(dsn=None, *, minsize=10, maxsize=10,
 
 
 @asyncio.coroutine
-def _create_pool(dsn=None, *, minsize=10, maxsize=10,
+def _create_pool(dsn=None, *, minsize=1, maxsize=10,
                  loop=None, timeout=TIMEOUT,
                  enable_json=True, enable_hstore=True, enable_uuid=True,
                  echo=False,
@@ -176,6 +177,16 @@ class Pool(asyncio.AbstractServer):
 
     @asyncio.coroutine
     def _fill_free_pool(self, override_min):
+        # iterate over free connections and remove timeouted ones
+        n, free = 0, len(self._free)
+        while n < free:
+            conn = self._free[-1]
+            if conn.closed:
+                self._free.pop()
+            else:
+                self._free.rotate()
+            n += 1
+
         while self.size < self.minsize:
             self._acquiring += 1
             try:
@@ -218,7 +229,7 @@ class Pool(asyncio.AbstractServer):
     def release(self, conn):
         """Release free connection back to the connection pool.
         """
-        fut = asyncio.Future(loop=self._loop)
+        fut = create_future(self._loop)
         fut.set_result(None)
         if conn in self._terminated:
             assert conn.closed, conn
@@ -238,7 +249,7 @@ class Pool(asyncio.AbstractServer):
                 conn.close()
             else:
                 self._free.append(conn)
-            fut = asyncio.async(self._wakeup(), loop=self._loop)
+            fut = ensure_future(self._wakeup(), loop=self._loop)
         return fut
 
     @asyncio.coroutine
diff --git a/aiopg/sa/connection.py b/aiopg/sa/connection.py
index 0999b77..7897e89 100644
--- a/aiopg/sa/connection.py
+++ b/aiopg/sa/connection.py
@@ -1,5 +1,4 @@
 import asyncio
-import weakref
 
 from sqlalchemy.sql import ClauseElement
 from sqlalchemy.sql.dml import UpdateBase
@@ -18,7 +17,6 @@ class SAConnection:
         self._connection = connection
         self._transaction = None
         self._savepoint_seq = 0
-        self._weak_results = weakref.WeakSet()
         self._engine = engine
         self._dialect = engine.dialect
 
@@ -108,9 +106,7 @@ class SAConnection:
                                     "SQLAlchemy data "
                                     "selection/modification clause")
 
-        ret = ResultProxy(self, cursor, self._dialect)
-        self._weak_results.add(ret)
-        return ret
+        return ResultProxy(self, cursor, self._dialect)
 
     @asyncio.coroutine
     def scalar(self, query, *multiparams, **params):
diff --git a/aiopg/sa/engine.py b/aiopg/sa/engine.py
index 9f7b9c1..8987139 100644
--- a/aiopg/sa/engine.py
+++ b/aiopg/sa/engine.py
@@ -24,7 +24,7 @@ _dialect.supports_sane_multi_rowcount = True  # psycopg 2.0.9+
 _dialect._has_native_hstore = True
 
 
-def create_engine(dsn=None, *, minsize=10, maxsize=10, loop=None,
+def create_engine(dsn=None, *, minsize=1, maxsize=10, loop=None,
                   dialect=_dialect, timeout=TIMEOUT, **kwargs):
     """A coroutine for Engine creation.
 
@@ -40,7 +40,7 @@ def create_engine(dsn=None, *, minsize=10, maxsize=10, loop=None,
 
 
 @asyncio.coroutine
-def _create_engine(dsn=None, *, minsize=10, maxsize=10, loop=None,
+def _create_engine(dsn=None, *, minsize=1, maxsize=10, loop=None,
                    dialect=_dialect, timeout=TIMEOUT, **kwargs):
     if loop is None:
         loop = asyncio.get_event_loop()
diff --git a/aiopg/utils.py b/aiopg/utils.py
index 9e675ff..c22120c 100644
--- a/aiopg/utils.py
+++ b/aiopg/utils.py
@@ -10,6 +10,19 @@ else:
     base = object
 
 
+try:
+    ensure_future = asyncio.ensure_future
+except AttributeError:
+    ensure_future = asyncio.async
+
+
+def create_future(loop):
+    try:
+        return loop.create_future()
+    except AttributeError:
+        return asyncio.Future(loop=loop)
+
+
 class _ContextManager(base):
 
     __slots__ = ('_coro', '_obj')
diff --git a/setup.cfg b/setup.cfg
index 00bb0ae..861a9f5 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [egg_info]
+tag_build = 
 tag_date = 0
 tag_svn_revision = 0
-tag_build = 
 
diff --git a/setup.py b/setup.py
index 427bf4c..041ddf5 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 import os
 import re
 import sys
-from setuptools import setup, find_packages
+from setuptools import setup
 
 
 install_requires = ['psycopg2>=2.5.2']
@@ -56,10 +56,10 @@ setup(name='aiopg',
       platforms=['POSIX'],
       author='Andrew Svetlov',
       author_email='andrew.svetlov at gmail.com',
-      url='http://aiopg.readthedocs.org',
+      url='https://aiopg.readthedocs.io',
       download_url='https://pypi.python.org/pypi/aiopg',
       license='BSD',
-      packages=find_packages(),
+      packages=['aiopg', 'aiopg.sa'],
       install_requires=install_requires,
       extras_require=extras_require,
       include_package_data=True)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/aiopg.git



More information about the Python-modules-commits mailing list