{ "info": { "author": "Erick Almeida", "author_email": "ephillipe@gmail.com", "bugtrack_url": null, "classifiers": [ "Topic :: Database" ], "description": "pypgwrap - efficient PostgreSQL database wrapper\n-------------------------------------------\n\nThe 'efficient' module provides a efficient wrapper over psycopg2 supporting a\nPython API for common sql functions, explicit and implicit transactions mechanism and\nconnection pooling.\n\nThis is not intended to provide ORM-like functionality, just to make it\neasier to interact with PostgreSQL from python code for simple use-cases\nand allow direct SQL access for more complex operations.\n\nThe module wraps the excellent 'psycopg2' library and most of the\nfunctionality is provided by this behind the scenes, except for pooling.\n\nThe module provides:\n\n * Simplified handling of connections/cursor\n * Connection pool, single or multithreaded (inherited by psycopg2.pool)\n * Cursor context handler\n * Context Manager for explicit transactions\n * Python API to wrap basic SQL functionality\n * Simple select,update,delete,join methods extending the cursor\n context handler (also available as stand-alone methods which\n create an implicit cursor for simple queries) (from pgwrap)\n * Query results as dict (using psycopg2.extras.DictCursor)\n * Callable prepared statements\n * Logging support\n\nBasic usage\n-----------\n\n >>> import pypgwrap\n >>> pypgwrap.config_pool(max_pool=10, pool_expiration=1, url='postgres://localhost/', pool_manager=SimpleConnectionPool)\n >>> db = pypgwrap.connection()\n >>> with db.cursor() as c:\n ... c.query('select version()')\n [['PostgreSQL...']]\n >>> v = db.query_one('select version()')\n >>> v\n ['PostgreSQL...']\n >>> v.items()\n [('version', 'PostgreSQL...')]\n >>> v['version']\n 'PostgreSQL...'\n\n\nBasic usage, with transaction\n-----------\n Init pool at application start:\n\n >>> import pypgwrap\n >>> pypgwrap.config_pool(max_pool=10, pool_expiration=1, url='postgres://localhost/', pool_manager=SimpleConnectionPool)\n\n Explicit transactions:\n\n >>> db = pypgwrap.connection()\n >>> db.create_table('t1', '''id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n active BOOLEAN NOT NULL DEFAULT true''')\n >>> id0 = db.insert('doctest_t1', {'name': 'name_one'}, returning='id')['id']\n >>> id1 = db.insert('doctest_t1', {'name': 'name_two'}, returning='id')['id']\n >>> db.commit()\n\n Implicity transactions:\n\n >>> with pypgwrap.connection() as db:\n >>> db.create_table('t1', '''id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n active BOOLEAN NOT NULL DEFAULT true''')\n >>> id0 = db.insert('doctest_t1', {'name': 'name_one'}, returning='id')['id']\n >>> id1 = db.insert('doctest_t1', {'name': 'name_two'}, returning='id')['id']\n\n Distributed transactions:\n\n >>> import uuid\n >>> key = uuid.uuid4()\n\n >>> with pypgwrap.connection(key=key) as db:\n >>> db.create_table('t1', '''id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n active BOOLEAN NOT NULL DEFAULT true''')\n >>> id0 = db.insert('doctest_t1', {'name': 'name_one'}, returning='id')['id']\n >>> id1 = db.insert('doctest_t1', {'name': 'name_two'}, returning='id')['id']\n\n >>> db2 = pypgwrap.connection(key=key)\n >>> id3 = db.insert('doctest_t1', {'name': 'name_three'}, returning='id')['id']\n >>> id4 = db.insert('doctest_t1', {'name': 'name_four'}, returning='id')['id']\n\n >>> db3 = pypgwrap.connection(key=key)\n >>> db3.commit()\n\n Distributed transactions, with ContextManager:\n\n >>> with pypgwrap.ContextManager() as context:\n\n >>> with pypgwrap.connection(key=context.key) as db:\n >>> db.create_table('t1', '''id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n active BOOLEAN NOT NULL DEFAULT true''')\n >>> id0 = db.insert('doctest_t1', {'name': 'name_one'}, returning='id')['id']\n >>> id1 = db.insert('doctest_t1', {'name': 'name_two'}, returning='id')['id']\n\n >>> db2 = pypgwrap.connection(key)\n >>> id3 = db.insert('doctest_t1', {'name': 'name_three'}, returning='id')['id']\n >>> id4 = db.insert('doctest_t1', {'name': 'name_four'}, returning='id')['id']\n\n\nConnection\n----------\n\nThe config_pool need some parameters:\n - max_pool: Maximum of connections created and mainteined in memory\n - pool_expiration: Idle time (in minutes) for close and destroy memory connection\n - url: Url with connection parameters\n\nThe intention of this method is to call at application start up, only!\n\nThe connection class provides methods to return a cursor object or execute SQL queries\ndirectly (using an implicit cursor).\n\nThe connection context provides the following basic methods:\n\n cursor - create a new instance of cursor class\n commit - Commit transaction (called implicitly on exiting context handler)\n rollback - Rollback transaction\n\nCursor\n------\n\nThe module provides a cursor context handler wrapping the psycopg2 cursor.\n\nThe cursor object uses the psycopg2 'DictCursor' by default (which\nreturns rows as a pseudo python dictionary) however this can be overridden\nby providing a 'cursor_factory' parameter to the constructor.\n\n>>> db = pypgwrap.connection()\n>>> with db.cursor() as c:\n... c.query('select version()')\n[['PostgreSQL...']]\n\nThe cursor context provides the following basic methods:\n\n execute - execute SQL query and return rowcount\n query - execute SQL query and fetch results\n query_one - execute SQL query and fetch first result\n query_dict - execute SQL query and return results as dict\n keyed on specified key (which should be unique)\n\nIn addition the cursor can use the SQL API methods described below or\naccess the underlying psycopg2 cursor (via the self.cursor attribute).\n\nThe cursor methods are also available as standalone functions which\nrun inside an implicit cursor object.\n\nSQL API\n-------\n\nThe cursor class also provides a simple Python API for common SQL\noperations. The basic methods provides are:\n\n select - single table select (with corresponding select_one, select_dict methods)\n join - two table join (with corresponding join_one, join_dict methods)\n insert - SQL insert\n update - SQL update\n delete - SQL delete\n\nThe methods can be parameterised to customise the associated query\n(see db module for detail):\n\n where - 'where' clause as dict (column operators can be\n specified using the colunm__operator format)\n\n where = {'name':'abc','status__in':(1,2,3)}\n\n columns - list of columns to be returned - these can\n be real columns or expressions. If spefified\n as a tuple the column is explicitly named\n using the AS operator\n\n columns = ('name',('status > 1','updated'))\n\n order - sort order as list (use 'column__desc' to\n reverse order)\n\n order = ('name__desc',)\n\n limit - row limit (int)\n\n offset - offset (int)\n\n on - join columns (as tuple)\n\n values - insert data as dict\n\n returning - columns to return (string)\n\nThe methods are also available as standalone functions which create an\nimplicit cursor object.\n\nBasic usage:\n\n >>> db.create_table('t1','id serial,name text,count int')\n >>> db.create_table('t2','id serial,t1_id int,value text')\n >>> db.log = sys.stdout\n >>> db.insert('t1',{'name':'abc','count':0},returning='id,name')\n INSERT INTO t1 (name) VALUES ('abc') RETURNING id,name\n [1, 'abc']\n >>> db.insert('t2',{'t1_id':1,'value':'t2'})\n INSERT INTO t2 (t1_id,value) VALUES (1,'t2')\n 1\n >>> db.select('t1')\n SELECT * FROM t1\n [[1, 'abc', 0]]\n >>> db.select_one('t1',where={'name':'abc'},columns=('name','count'))\n SELECT name, count FROM t1 WHERE name = 'abc'\n ['abc', 0]\n >>> db.join(('t1','t2'),columns=('t1.id','t2.value'))\n SELECT t1.id, t2.value FROM t1 JOIN t2 ON t1.id = t2.t1_id\n [[1, 't2']]\n >>> db.insert('t1',{'name':'abc'},returning='id')\n INSERT INTO t1 (name) VALUES ('abc') RETURNING id\n [2]\n >>> db.update('t1',{'name':'xyz'},where={'name':'abc'})\n UPDATE t1 SET name = 'xyz' WHERE name = 'abc'\n 2\n >>> db.update('t1',{'count__func':'count + 1'},where={'count__lt':10},returning=\"id,count\")\n UPDATE t1 SET count = count + 1 WHERE count < 10 RETURNING id,count\n [[1, 1]]\n\nPrepared Statements\n-------------------\n\n Prepared statements can be created using the\n\n connection.prepare(stmt,params,name,call_type)\n\n stmt : prepared statement (with parameters identified\n in the statement using the psql $1,$2... notation)\n params : list of optional parameter types (usually not\n needed - infered by psql)\n name : name for the prepared statement (usually\n autogenerated)\n call_type : method used when instance called as method\n (defaults to 'query')\n\n The constructor returns a PreparedStatement object which can be used\n instead of an sql statement in the connection.execute and\n connection.query_xxx methods.\n\n >>> p = db.prepare('UPDATE t1 SET name = $2 WHERE id = $1')\n PREPARE _pstmt_001 AS UPDATE t1 SET name = $2 WHERE id = $1\n >>> with db.cursor() as c:\n ... c.execute(p,(1,'xxx'))\n EXECUTE _pstmt_001 (1,'xxx')\n\n The PreparedStatement object can also be called directly using the\n execute/query/query_one/query_dict methods. The instance is also\n directly callable using the method type identified in 'call_type'\n\n >>> p = db.prepare('UPDATE t1 SET name = $2 WHERE id = $1')\n PREPARE _pstmt_001 AS UPDATE t1 SET name = $2 WHERE id = $1\n >>> p.execute(1,'xxx')\n EXECUTE _pstmt_001 (1,'xxx')\n >>> p(1,'xxx')\n EXECUTE _pstmt_001 (1,'xxx')\n\nLogging\n-------\n\n To enable logging the connection.log attribute can be set to either an\n instance of logging.Logger or a file-like object (supporting the write\n method).\n\n The log message is generated using the self.logf function (called with\n the cursor object as a parameter). By default this just returns the\n query string however can be customised as needed. A cursor.timestamp\n attribute is available to allow execution time to be tracked.\n\n >>> db.log = sys.stdout\n >>> db.logf = lambda c : '[%f] %s' % (time.time() - c.timestamp,c.query)\n >>> db.query('SELECT * FROM t1')\n [0.000536] SELECT * FROM t1\n\nChangelog\n---------\n\n * 0.1.0 03-06-2013 Initial import\n * 0.1.1 10-06-2013 Transaction context issues\n * 0.1.2 11-06-2013 ContextManager commit issues\n * 0.1.3 07-08-2013 ContextManager __exit__ fail on TypeError exception\n * 0.1.4 07-08-2013 ContextManager __exit__ fail on TypeError exception\n * 0.1.5 08-10-2013 - ThreadedConnectionPool fix when pool is exausted or max_con of Postgres is reached.\n - Created a param [pool_manager] in config_pool method. Params: SimpleConnectionPool,\n ThreadedConnectionPool. In Multthread enviroments must use ThreadedConnectionPool.\n * 0.1.6 14-10-2014 - Bugfix. Fix import of OperationalError. Avoid use protected member of psycopg2.\n - Change \"from psycopg2._psycopg import OperationalError\" to\n \"from psycopg2 import OperationalError\"\n * 0.1.11 04-09-2015 Non Threaded AutoCloseConnectionPool to use with pgpool\n * 0.1.12 04-09-2015 Deleted class AutoCloseConnectionPool.\n - Create configuration in env PYPGWRAP_CLOSE_CONNECTION_ON_EXIT to control\n when pypgwrap disable pool. When this env variable is True, all connections\n is discarded when execution is finished. No pooling is persisted. Util to use with\n PgPool or external pooling tools.\n * 0.1.13 17-09-2015 Fix use of ast.literal_eval to read Environment variable\n * 0.1.14 27-10-2015 Change setup to remove install requirement to Psycopg2\n * 0.1.15 18-03-2016 Create configuration in env PYPGWRAP_AUTOCOMMIT to avoid problems with PgBouncer\n * 0.1.16 18-03-2016 Idem last version with bugfixes\n\nAuthor\n------\n\n * Erick Phillipe R. de Almeida (ephillipe@gmail.com)\n\nMaster Repository/Issues\n------------------------\n\n * https://github.com/ephillipe/pypgwrap\n\nCredits\n------------------------\n pypgwrap is inherited from pgwrap, an excelent wraper for Postgres but with lacks\n * https://github.com/paulchakravarti/pgwrap\n\n Pooling is iherited from Psycopg2\n * https://github.com/psycopg/psycopg2/\n\nAbout me\n------------------------\n * http://about.me/erick.almeida\n * http://erickalmeida.brandyourself.com", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ephillipe/pypgwrap", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "pypgwrap", "package_url": "https://pypi.org/project/pypgwrap/", "platform": "any", "project_url": "https://pypi.org/project/pypgwrap/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/ephillipe/pypgwrap" }, "release_url": "https://pypi.org/project/pypgwrap/0.1.16/", "requires_dist": null, "requires_python": null, "summary": "PostgreSQL database wrapper - provides wrapper over psycopg2 supporting a Python API for common sql functions, transaction and pooling", "version": "0.1.16" }, "last_serial": 2014919, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "2a9eaf73706d1242a84d63f8dfd1ed46", "sha256": "23808177bf1c287727ffdc846d38406d77c77bd61bd0fa961f1ade63e4748c46" }, "downloads": -1, "filename": "pypgwrap-0.1.zip", "has_sig": false, "md5_digest": "2a9eaf73706d1242a84d63f8dfd1ed46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24650, "upload_time": "2013-06-07T12:41:43", "url": "https://files.pythonhosted.org/packages/6b/1b/ac5937d5ce9d98012920e0e6bb62411e1924ce39caa7e5297b94560fad22/pypgwrap-0.1.zip" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "77dc4a42cc751b147342b0484eab20e2", "sha256": "0363a94f466960a5bc8b5b5f45254c963a98472030714120ab75bf1d8734c000" }, "downloads": -1, "filename": "pypgwrap-0.1.1.zip", "has_sig": false, "md5_digest": "77dc4a42cc751b147342b0484eab20e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24856, "upload_time": "2013-06-10T12:43:57", "url": "https://files.pythonhosted.org/packages/a9/a8/13d33e5eb6d99272903ce1e9102b2a27ddd8c84ff1493a6492390aab5db0/pypgwrap-0.1.1.zip" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "097bd83adca447ff061b7572c0aec8f5", "sha256": "dcc1cd88210bdcfd5cac91b73b5f914e17247e87c81e1ff37c6ec52d28cc57d9" }, "downloads": -1, "filename": "pypgwrap-0.1.10.tar.gz", "has_sig": false, "md5_digest": "097bd83adca447ff061b7572c0aec8f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15755, "upload_time": "2015-09-04T18:40:24", "url": "https://files.pythonhosted.org/packages/6a/b5/2bc8685fbaf54ce1a6cbd426c713fc1c897b08aab4e316fe6be1f2554491/pypgwrap-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "906c1571bc7d5734cf73a7420eb9391e", "sha256": "6c71361003e2351fdc51772f81503117be40f03ed1bef9ec40817cb96cecbbc0" }, "downloads": -1, "filename": "pypgwrap-0.1.11.tar.gz", "has_sig": false, "md5_digest": "906c1571bc7d5734cf73a7420eb9391e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15756, "upload_time": "2015-09-10T17:04:48", "url": "https://files.pythonhosted.org/packages/66/86/5302a91f0927672255b8a7f6b81a60e6875ba24657e1a761cca9b41bca4d/pypgwrap-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "b18d35e51fb8f7943540761841314336", "sha256": "35ed48d56d57f6b0213f6c952641628694e702080b9c469af0e7d55b09254980" }, "downloads": -1, "filename": "pypgwrap-0.1.12.tar.gz", "has_sig": false, "md5_digest": "b18d35e51fb8f7943540761841314336", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16199, "upload_time": "2015-09-15T20:47:25", "url": "https://files.pythonhosted.org/packages/ae/c1/84a688ea95e648a4542744b982c77c2f82ec606b3cba8b11f39e1c20d0ef/pypgwrap-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "8b83fa990d5ef95eee5a65271ac85bf2", "sha256": "b72d04600e4724850ae1d2869436ad3517fba1bcc6535cd518ec325949b72320" }, "downloads": -1, "filename": "pypgwrap-0.1.13.tar.gz", "has_sig": false, "md5_digest": "8b83fa990d5ef95eee5a65271ac85bf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16279, "upload_time": "2015-09-17T17:11:38", "url": "https://files.pythonhosted.org/packages/90/8c/50a66f5f4e5685dfceb2ec4c6639fa70699901e295735a68d2b870c3a097/pypgwrap-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "32ab3b3cf3e1bf439f8de24f34ee34d3", "sha256": "9c9d9e5774bb244aba9ddd0df0a4e46e2ebd3d66b935c105b49daca5fb20a27e" }, "downloads": -1, "filename": "pypgwrap-0.1.14.tar.gz", "has_sig": false, "md5_digest": "32ab3b3cf3e1bf439f8de24f34ee34d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16328, "upload_time": "2015-10-27T16:29:02", "url": "https://files.pythonhosted.org/packages/8e/71/dec3db2474b5bc4a47726c4b4cc1a5f4973cf00f6a1bfa0c05005725caa2/pypgwrap-0.1.14.tar.gz" } ], "0.1.15": [ { "comment_text": "", "digests": { "md5": "1c4d6a40f76a157a21ae7b6f0abe7fc3", "sha256": "3d08bdfd40763245ffe1795387ba92cc1cb3427b4b91e1ed03fd0dd9f76465ca" }, "downloads": -1, "filename": "pypgwrap-0.1.15.tar.gz", "has_sig": false, "md5_digest": "1c4d6a40f76a157a21ae7b6f0abe7fc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16497, "upload_time": "2016-03-18T16:14:07", "url": "https://files.pythonhosted.org/packages/e0/cd/58d422075efa79b137f7060bc8dd35f747ddab8f59429ec673905a670276/pypgwrap-0.1.15.tar.gz" } ], "0.1.16": [ { "comment_text": "", "digests": { "md5": "fe060fb29df3cd67f48f5257502d0a97", "sha256": "6332e4f7873091f6547dc55bd1f6daf32870087ffb6e8d02f726b1ab6c2eca7f" }, "downloads": -1, "filename": "pypgwrap-0.1.16.tar.gz", "has_sig": false, "md5_digest": "fe060fb29df3cd67f48f5257502d0a97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16592, "upload_time": "2016-03-18T19:46:44", "url": "https://files.pythonhosted.org/packages/57/5e/c729210520769e7eb67230df8a9b91ace1a7ebecb79c148f3ca1af576e21/pypgwrap-0.1.16.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b21d07f6a8662c184c97954039999df8", "sha256": "a3bc8ede31cc65e1e5e878a11100ef88107e01cc5a1d970c67e4e2f4d0b1f102" }, "downloads": -1, "filename": "pypgwrap-0.1.2.zip", "has_sig": false, "md5_digest": "b21d07f6a8662c184c97954039999df8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24944, "upload_time": "2013-06-11T15:01:48", "url": "https://files.pythonhosted.org/packages/f4/19/2376f8ac00b5161410a74fe8426a132b47623def44c2fd846dffa98958d1/pypgwrap-0.1.2.zip" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "b734f15bf62f7c80394489e6acb83f84", "sha256": "b312030819ed62f2e5022171f3cb33e02ab8baa3db72a37f65458e129eaa1b2c" }, "downloads": -1, "filename": "pypgwrap-0.1.3.zip", "has_sig": false, "md5_digest": "b734f15bf62f7c80394489e6acb83f84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25073, "upload_time": "2013-08-07T14:27:35", "url": "https://files.pythonhosted.org/packages/23/a4/83573be7aafd3d72c1057037382612d9ddce6d9ab9184ff99f7021bf5c80/pypgwrap-0.1.3.zip" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "0cd8c0af50e4f8b9fd64bac68b00e2d6", "sha256": "611e26c0b8b092df8a47b98472421c169f38174da08dd1dd218841afdde0c92d" }, "downloads": -1, "filename": "pypgwrap-0.1.4.zip", "has_sig": false, "md5_digest": "0cd8c0af50e4f8b9fd64bac68b00e2d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25124, "upload_time": "2013-08-07T16:39:14", "url": "https://files.pythonhosted.org/packages/3f/ef/81f51d3866b0d26d57490c08ed5c37b29cfaba24bf56f05b5d6707db5cd6/pypgwrap-0.1.4.zip" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "0d8d9841dee71e32fe8d26719ac2846e", "sha256": "2e27c8241ce1118f557187b984a8c06d88e6607d872c6e3882cf87c5b5db6ca4" }, "downloads": -1, "filename": "pypgwrap-0.1.5.zip", "has_sig": false, "md5_digest": "0d8d9841dee71e32fe8d26719ac2846e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25829, "upload_time": "2013-10-08T13:23:28", "url": "https://files.pythonhosted.org/packages/bb/68/cf892493e911b3cd1ea04d316bd3be760794c67e7c8d58111b489e915014/pypgwrap-0.1.5.zip" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "832cc553d03b8afaaed62f067379240f", "sha256": "57f11d8f8e48555c59fd9ca843adfd538b9743ed5e48741a8fe2a9306ea63e4f" }, "downloads": -1, "filename": "pypgwrap-0.1.6.zip", "has_sig": false, "md5_digest": "832cc553d03b8afaaed62f067379240f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26112, "upload_time": "2014-10-14T18:03:12", "url": "https://files.pythonhosted.org/packages/01/33/ec881c190cb638d97b006d8b4fa0930b911f67e42737191b7072e24569ec/pypgwrap-0.1.6.zip" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "e3f73d332bf5589c21f7391a93bf1f06", "sha256": "3a10f5dce6e239a0de940ffc1b5e3791bb08219a5410e8a3ca47af62bcccc4c4" }, "downloads": -1, "filename": "pypgwrap-0.1.7.tar.gz", "has_sig": false, "md5_digest": "e3f73d332bf5589c21f7391a93bf1f06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15646, "upload_time": "2015-09-04T12:53:01", "url": "https://files.pythonhosted.org/packages/ec/3c/49b5ac2e97db57b3849a3df2781636292152d53827afddfd0a21f717549b/pypgwrap-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "18438d4b55dda55f1b03917a7eeabe60", "sha256": "0d3e6e7515cdbc4f46d94dc2431332ff90e252e4f79177de99e2d076bf7bf39f" }, "downloads": -1, "filename": "pypgwrap-0.1.8.tar.gz", "has_sig": false, "md5_digest": "18438d4b55dda55f1b03917a7eeabe60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15692, "upload_time": "2015-09-04T17:20:08", "url": "https://files.pythonhosted.org/packages/5c/14/61054e1160d94b8c8cf35538861f469b5beff16ca804af57b973768cedfe/pypgwrap-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "57d1fcc9d4268dc05841b60a0113ec8c", "sha256": "38306e07cc0d4bc68aa2d2b3d48f78e3539ad92c322828609b5d428c922ee6be" }, "downloads": -1, "filename": "pypgwrap-0.1.9.tar.gz", "has_sig": false, "md5_digest": "57d1fcc9d4268dc05841b60a0113ec8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15750, "upload_time": "2015-09-04T17:23:46", "url": "https://files.pythonhosted.org/packages/7c/e0/350efc37b429f15777eac3f7da3c5a37cfa0325a321a1977005e73424d84/pypgwrap-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fe060fb29df3cd67f48f5257502d0a97", "sha256": "6332e4f7873091f6547dc55bd1f6daf32870087ffb6e8d02f726b1ab6c2eca7f" }, "downloads": -1, "filename": "pypgwrap-0.1.16.tar.gz", "has_sig": false, "md5_digest": "fe060fb29df3cd67f48f5257502d0a97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16592, "upload_time": "2016-03-18T19:46:44", "url": "https://files.pythonhosted.org/packages/57/5e/c729210520769e7eb67230df8a9b91ace1a7ebecb79c148f3ca1af576e21/pypgwrap-0.1.16.tar.gz" } ] }