diff --git a/docs/_data/pypi.json b/docs/_data/pypi.json index 717136e..3e6cdc4 100644 --- a/docs/_data/pypi.json +++ b/docs/_data/pypi.json @@ -1 +1 @@ -{"info":{"author":"Dan McKinley","author_email":"mcfunley@gmail.com","bugtrack_url":null,"classifiers":["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: Apache Software License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Topic :: Database :: Front-Ends"],"description":"[PugSQL](https://pugsql.org) is a simple Python interface for using parameterized SQL, in files, with [any SQLAlchemy-supported database](https://docs.sqlalchemy.org/en/13/dialects/index.html).\n\nFor more information and full documentation, visit [pugsql.org](https://pugsql.org).\n\n```\nimport pugsql\n\n# Create a module of database functions from a set of sql files on disk.\nqueries = pugsql.module('resources/sql')\n\n# Point the module at your database.\nqueries.connect('sqlite:///foo.db')\n\n# Invoke parameterized queries, receive dicts!\nuser = queries.find_user(user_id=42)\n\n# -> { 'user_id': 42, 'username': 'mcfunley' }\n```\n\nIn the example above, the query would be specified like this:\n\n```\n--- :name find_user :one\nselect * from users where user_id = :user_id\n```\n\nSo _throw away_ your bulky ORM and talk to your database the way the gods intended! Install PugSQL today!\n","description_content_type":"text/markdown","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page":"https://pugsql.org","keywords":"","license":"Apache-2.0","maintainer":"","maintainer_email":"","name":"pugsql","package_url":"https://pypi.org/project/pugsql/","platform":null,"project_url":"https://pypi.org/project/pugsql/","project_urls":{"Homepage":"https://pugsql.org","Repository":"https://github.com/mcfunley/pugsql"},"release_url":"https://pypi.org/project/pugsql/0.2.4/","requires_dist":["sqlalchemy (>=1.3,<2.0)"],"requires_python":">=3.7","summary":"PugSQL is an anti-ORM that facilitates interacting with databases using SQL in files.","version":"0.2.4","yanked":false,"yanked_reason":null},"last_serial":13165145,"releases":{"0.1.0":[{"comment_text":"","digests":{"md5":"e538debc11970078530d1581d87d304f","sha256":"ad07a3df558c01d7cddec40cf43a91ac32306577bcabfcc62cbc387596e415f1"},"downloads":-1,"filename":"pugsql-0.1.0-py3-none-any.whl","has_sig":false,"md5_digest":"e538debc11970078530d1581d87d304f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":3325,"upload_time":"2019-05-23T20:25:03","upload_time_iso_8601":"2019-05-23T20:25:03.058254Z","url":"https://files.pythonhosted.org/packages/2c/af/7fe81eecef83fcaecaf8cf5a74471ae638703cfae24cf63ee85e17793229/pugsql-0.1.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"ba337eeb0cf7ab6d07826d79e9b4128f","sha256":"faab0faea0f579adff91a049ff7071ff726083b7d73e253749f20d996dda7640"},"downloads":-1,"filename":"pugsql-0.1.0.tar.gz","has_sig":false,"md5_digest":"ba337eeb0cf7ab6d07826d79e9b4128f","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":2371,"upload_time":"2019-05-23T20:25:05","upload_time_iso_8601":"2019-05-23T20:25:05.039118Z","url":"https://files.pythonhosted.org/packages/c0/07/26145447d59b0f3efe39333b829fd5c3154b99b187d3687f54ea29739d47/pugsql-0.1.0.tar.gz","yanked":false,"yanked_reason":null}],"0.1.1":[{"comment_text":"","digests":{"md5":"e637edc85b200691f57d39eb37a10276","sha256":"b477a0cc2a5b8e27cd10f9f68cc153251bb62293cca5c922fc753b9d0121c2f7"},"downloads":-1,"filename":"pugsql-0.1.1-py3-none-any.whl","has_sig":false,"md5_digest":"e637edc85b200691f57d39eb37a10276","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":7440,"upload_time":"2019-05-24T05:12:30","upload_time_iso_8601":"2019-05-24T05:12:30.298929Z","url":"https://files.pythonhosted.org/packages/a3/05/c47cf0a0372694a6965fcd7a93daa97da343da3f119e92e4fe6c0e0e08b1/pugsql-0.1.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"3be281dc16a7c32cd863e34da08a1b4b","sha256":"95d49af0f70228d4b85fa76218c02342c21ce13f42e1af9542a9c9bd5f92186b"},"downloads":-1,"filename":"pugsql-0.1.1.tar.gz","has_sig":false,"md5_digest":"3be281dc16a7c32cd863e34da08a1b4b","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":6424,"upload_time":"2019-05-24T05:12:31","upload_time_iso_8601":"2019-05-24T05:12:31.530744Z","url":"https://files.pythonhosted.org/packages/da/51/cb6e8832c60a2615b4b7ecabe405f20ca5db75e3169c7ed85ee0dce072b7/pugsql-0.1.1.tar.gz","yanked":false,"yanked_reason":null}],"0.1.10":[{"comment_text":"","digests":{"md5":"36e7bbcf3770e872d287371207509b20","sha256":"1ac4464134c1b8aa2febaf87d857e6fd40fb4108863a74ea9545cf52cde46e17"},"downloads":-1,"filename":"pugsql-0.1.10-py3-none-any.whl","has_sig":false,"md5_digest":"36e7bbcf3770e872d287371207509b20","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12929,"upload_time":"2019-06-11T16:24:26","upload_time_iso_8601":"2019-06-11T16:24:26.713809Z","url":"https://files.pythonhosted.org/packages/f2/97/64b8e4800f84f90e19eb78c1468080e0adb6dd9f7556fb6818ec8a2681d2/pugsql-0.1.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"6ec1c13fd0363057faab5a50cd051d48","sha256":"4c458307c7a129dafc932aa67b8960eba7f0f1f8a8225b7821820bf6b6686b1a"},"downloads":-1,"filename":"pugsql-0.1.10.tar.gz","has_sig":false,"md5_digest":"6ec1c13fd0363057faab5a50cd051d48","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11052,"upload_time":"2019-06-11T16:24:27","upload_time_iso_8601":"2019-06-11T16:24:27.900028Z","url":"https://files.pythonhosted.org/packages/52/40/33644f7fd32af14ca94db9e5291326ba6839a365927292f97addb7a4644e/pugsql-0.1.10.tar.gz","yanked":false,"yanked_reason":null}],"0.1.11":[{"comment_text":"","digests":{"md5":"05ad814184737d0b025d464973772ec4","sha256":"717d07021d23421a7675aa600f725ff603f79f6f298005617b1e09476bcbf01e"},"downloads":-1,"filename":"pugsql-0.1.11-py3-none-any.whl","has_sig":false,"md5_digest":"05ad814184737d0b025d464973772ec4","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13000,"upload_time":"2019-06-14T16:25:28","upload_time_iso_8601":"2019-06-14T16:25:28.653213Z","url":"https://files.pythonhosted.org/packages/5e/38/610dab3625e1dc8d20ea26c1f8d6b0ebbb2525d87c5b2e512713963b6bc0/pugsql-0.1.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"a0ec3ef4903ceefdb3afc42c34c67c5f","sha256":"93e46cb50d26cc919c17521fb6aaaece2c9a084115bdcece8a007623bef6ae63"},"downloads":-1,"filename":"pugsql-0.1.11.tar.gz","has_sig":false,"md5_digest":"a0ec3ef4903ceefdb3afc42c34c67c5f","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11161,"upload_time":"2019-06-14T16:25:29","upload_time_iso_8601":"2019-06-14T16:25:29.938623Z","url":"https://files.pythonhosted.org/packages/96/49/02efcea5998f82100089265a780717cf80eb818f12173637ecce7b3a32f7/pugsql-0.1.11.tar.gz","yanked":false,"yanked_reason":null}],"0.1.12":[{"comment_text":"","digests":{"md5":"50abda1166dddbccacc0c14ccd3f617f","sha256":"2ce4b30c861d3b6e38b2696b50407511f29bb7b034b3467eba0e9dfee69c89e1"},"downloads":-1,"filename":"pugsql-0.1.12-py3-none-any.whl","has_sig":false,"md5_digest":"50abda1166dddbccacc0c14ccd3f617f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13124,"upload_time":"2019-06-23T01:58:28","upload_time_iso_8601":"2019-06-23T01:58:28.668770Z","url":"https://files.pythonhosted.org/packages/19/35/e65e1ad5f64e90d63fb93a6936897e1a0555c7d6f4461ab4aecda6d30944/pugsql-0.1.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1d6ec45a76aeb0dc5da44c608dbe1630","sha256":"0bd3c9b13c22a175377a99ff4821e54532ed3795c7fec3ca9333af51b9e76aca"},"downloads":-1,"filename":"pugsql-0.1.12.tar.gz","has_sig":false,"md5_digest":"1d6ec45a76aeb0dc5da44c608dbe1630","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11275,"upload_time":"2019-06-23T01:58:30","upload_time_iso_8601":"2019-06-23T01:58:30.209892Z","url":"https://files.pythonhosted.org/packages/5f/d5/7517111ebf4c21b164eb99d0c0faeb3504219c080c1402a0b9228d3dad91/pugsql-0.1.12.tar.gz","yanked":false,"yanked_reason":null}],"0.1.13":[{"comment_text":"","digests":{"md5":"d47628ac6248bbdbbeed54785e237916","sha256":"3619b31c4ef859bf3d36e2f00a339b41989ca40bc3cb5c0d7714582386382824"},"downloads":-1,"filename":"pugsql-0.1.13-py3-none-any.whl","has_sig":false,"md5_digest":"d47628ac6248bbdbbeed54785e237916","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13404,"upload_time":"2019-06-28T21:11:33","upload_time_iso_8601":"2019-06-28T21:11:33.395341Z","url":"https://files.pythonhosted.org/packages/a5/d7/7c0f264e63ed03a056cb265aba9860ff651000347be5548957731540df7b/pugsql-0.1.13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d7f92487da2010dcbc7d14055de95a34","sha256":"831787c81353c0450b16fd10c76e522a01cd1a30e2604f35af33ad07882b5e26"},"downloads":-1,"filename":"pugsql-0.1.13.tar.gz","has_sig":false,"md5_digest":"d7f92487da2010dcbc7d14055de95a34","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11499,"upload_time":"2019-06-28T21:11:35","upload_time_iso_8601":"2019-06-28T21:11:35.138362Z","url":"https://files.pythonhosted.org/packages/9a/72/a6aa98e791383272199220c224a14b60f85d76a087cc58f8e25328dcf47e/pugsql-0.1.13.tar.gz","yanked":false,"yanked_reason":null}],"0.1.14":[{"comment_text":"","digests":{"md5":"a82ba389e3abb02194bad494243d96db","sha256":"01a8eb8bf989bbdfb44915ec800005c66fe438d36bd030ba504dc773316a2222"},"downloads":-1,"filename":"pugsql-0.1.14-py3-none-any.whl","has_sig":false,"md5_digest":"a82ba389e3abb02194bad494243d96db","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13495,"upload_time":"2019-06-29T16:49:50","upload_time_iso_8601":"2019-06-29T16:49:50.101019Z","url":"https://files.pythonhosted.org/packages/2f/39/602618c0348130b41f31d7435e024a40a7a9264b618b3cd5f15f26854897/pugsql-0.1.14-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"dbc524fd7ecc0e3c46325ca23168905c","sha256":"81711de248661e26607fae72ed74ce62e0ac2e6342f56deb562b7813d6c44b06"},"downloads":-1,"filename":"pugsql-0.1.14.tar.gz","has_sig":false,"md5_digest":"dbc524fd7ecc0e3c46325ca23168905c","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11591,"upload_time":"2019-06-29T16:49:51","upload_time_iso_8601":"2019-06-29T16:49:51.409170Z","url":"https://files.pythonhosted.org/packages/3c/de/ac9b67693d0086b19c7944a420a4e57d71061a757389becda2aea426e747/pugsql-0.1.14.tar.gz","yanked":false,"yanked_reason":null}],"0.1.15":[{"comment_text":"","digests":{"md5":"e977c791555939b68f5284c366f3bf51","sha256":"fe65d07a901a5faab9786b175fd7641f2691edf093f014af6ef9171fcefcc8c8"},"downloads":-1,"filename":"pugsql-0.1.15-py3-none-any.whl","has_sig":false,"md5_digest":"e977c791555939b68f5284c366f3bf51","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13542,"upload_time":"2019-06-29T17:14:16","upload_time_iso_8601":"2019-06-29T17:14:16.671824Z","url":"https://files.pythonhosted.org/packages/61/42/1e4bc6e4fccbfd2f7e7546578a8ae661980afd68377889bc9dcd20f15588/pugsql-0.1.15-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"58e586ed3044a490035ed7f9a884ec19","sha256":"169c1f3007970c62e1556b3d451b8526615662ede00d939ea4e1e89a39c00ce9"},"downloads":-1,"filename":"pugsql-0.1.15.tar.gz","has_sig":false,"md5_digest":"58e586ed3044a490035ed7f9a884ec19","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11633,"upload_time":"2019-06-29T17:14:18","upload_time_iso_8601":"2019-06-29T17:14:18.043651Z","url":"https://files.pythonhosted.org/packages/36/09/de60e9173b1f40bfe1c551f2000bad1a850876170bdb8136b38a02f4b69b/pugsql-0.1.15.tar.gz","yanked":false,"yanked_reason":null}],"0.1.16":[{"comment_text":"","digests":{"md5":"ca25b3111edc67b07f5d002c50361422","sha256":"883b1e59615cd848fb64929bbd0458ec2bd9685a4d50021bc1f4759ba0b7b042"},"downloads":-1,"filename":"pugsql-0.1.16-py3-none-any.whl","has_sig":false,"md5_digest":"ca25b3111edc67b07f5d002c50361422","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13626,"upload_time":"2020-01-12T04:52:28","upload_time_iso_8601":"2020-01-12T04:52:28.526777Z","url":"https://files.pythonhosted.org/packages/df/a1/9c25a2b801388eb609118babeabac338acffa32655d922b1e529f70236fe/pugsql-0.1.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"3e5f875b646981d00a85c347d9946495","sha256":"d5e462313463e30311d62dbf4def5fe035381c2d9ee5ce5a7d9586ff053d4160"},"downloads":-1,"filename":"pugsql-0.1.16.tar.gz","has_sig":false,"md5_digest":"3e5f875b646981d00a85c347d9946495","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11723,"upload_time":"2020-01-12T04:52:30","upload_time_iso_8601":"2020-01-12T04:52:30.294719Z","url":"https://files.pythonhosted.org/packages/06/b6/06af0b71496b2ba47ea87d549933ce10955471ea5716744811230c2825e5/pugsql-0.1.16.tar.gz","yanked":false,"yanked_reason":null}],"0.1.17":[{"comment_text":"","digests":{"md5":"10ed9a7deab752c9502eaa11ae3ee43c","sha256":"7b9b835c8b4b1216c8881413b9db1269ce2c9153ecf19e12b4a52a9a24b7261d"},"downloads":-1,"filename":"pugsql-0.1.17-py3-none-any.whl","has_sig":false,"md5_digest":"10ed9a7deab752c9502eaa11ae3ee43c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13702,"upload_time":"2020-02-09T18:57:23","upload_time_iso_8601":"2020-02-09T18:57:23.844489Z","url":"https://files.pythonhosted.org/packages/d9/40/41d1c78d222648be4631dc29a19d56c441a29fa47084a7008919bb1bd64c/pugsql-0.1.17-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"f9437e3357e43949cef548ef4f71fa3a","sha256":"2e33fa6906037af060f7f9ef3326156b53fd61c05fd4612248ed05097ad13e63"},"downloads":-1,"filename":"pugsql-0.1.17.tar.gz","has_sig":false,"md5_digest":"f9437e3357e43949cef548ef4f71fa3a","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11789,"upload_time":"2020-02-09T18:57:25","upload_time_iso_8601":"2020-02-09T18:57:25.203471Z","url":"https://files.pythonhosted.org/packages/01/eb/66294d0b1c339e0c8885905689dc2a557826238b448ed8bfbb4406a90b78/pugsql-0.1.17.tar.gz","yanked":false,"yanked_reason":null}],"0.1.18":[{"comment_text":"","digests":{"md5":"c90f088e7608d99e38f3aed530dc586f","sha256":"39667ca3df3db88f33077e51965e5dc4419cd1e85882b3b70a49b8bf07ced456"},"downloads":-1,"filename":"pugsql-0.1.18-py3-none-any.whl","has_sig":false,"md5_digest":"c90f088e7608d99e38f3aed530dc586f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13707,"upload_time":"2020-02-09T19:04:07","upload_time_iso_8601":"2020-02-09T19:04:07.439569Z","url":"https://files.pythonhosted.org/packages/33/4e/de73076973b5a012aeb0567531a6c29f08a6200b83ec835f0c41084f8434/pugsql-0.1.18-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"234cf99600efdd55cb8da611111f04cd","sha256":"1cba41ef8eba8ade3441d817e7555774f39f6334412cee16ecec9404f26ede29"},"downloads":-1,"filename":"pugsql-0.1.18.tar.gz","has_sig":false,"md5_digest":"234cf99600efdd55cb8da611111f04cd","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11794,"upload_time":"2020-02-09T19:04:09","upload_time_iso_8601":"2020-02-09T19:04:09.014269Z","url":"https://files.pythonhosted.org/packages/2f/0a/87bc5ab209afa1e4bc2757389ff2c308ef8520312a7d3c54e754a152f49d/pugsql-0.1.18.tar.gz","yanked":false,"yanked_reason":null}],"0.1.19":[{"comment_text":"","digests":{"md5":"4440fc445dd717e2a6487ed1ef6cc73d","sha256":"fbdc9713f653ab50d76fc1fbd2ec35e8d65a2d2ab635347f43ed40876fae92a3"},"downloads":-1,"filename":"pugsql-0.1.19-py3-none-any.whl","has_sig":false,"md5_digest":"4440fc445dd717e2a6487ed1ef6cc73d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13917,"upload_time":"2020-08-27T17:41:04","upload_time_iso_8601":"2020-08-27T17:41:04.674698Z","url":"https://files.pythonhosted.org/packages/e3/8f/fa5fad4064736ecabdfdb1d4cf260c69d1c1dc60a8c4c799f185e1724e91/pugsql-0.1.19-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1b38c88c3f91dbb7b98a5e2c80afe8ec","sha256":"1ed46b182edf8f23f56a828663b8f2e9863d4ab082d59e8415a4d558e4947748"},"downloads":-1,"filename":"pugsql-0.1.19.tar.gz","has_sig":false,"md5_digest":"1b38c88c3f91dbb7b98a5e2c80afe8ec","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11925,"upload_time":"2020-08-27T17:41:05","upload_time_iso_8601":"2020-08-27T17:41:05.855451Z","url":"https://files.pythonhosted.org/packages/74/69/d538c9e64c7c2d1f4327713441934d5f3b4aa0443d0488b13a6acb5aba52/pugsql-0.1.19.tar.gz","yanked":false,"yanked_reason":null}],"0.1.2":[{"comment_text":"","digests":{"md5":"e47315e93b4bd3ba30ea808344a6f168","sha256":"e66ff40484f78343ae9dee0e70ec34d52b769e369891c49a7d021d5b063eac77"},"downloads":-1,"filename":"pugsql-0.1.2-py3-none-any.whl","has_sig":false,"md5_digest":"e47315e93b4bd3ba30ea808344a6f168","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":7441,"upload_time":"2019-05-24T06:04:37","upload_time_iso_8601":"2019-05-24T06:04:37.119216Z","url":"https://files.pythonhosted.org/packages/6f/2f/64be5238997e32d4c2e8b4b04dde8807e080536d63d2ce9a83e8fb4f17ee/pugsql-0.1.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"65949698da2131b209529d9bfb0f1763","sha256":"475030180853a8a87c9c784e8bdd4c1960d0ec61b9fa586d19975171343eca52"},"downloads":-1,"filename":"pugsql-0.1.2.tar.gz","has_sig":false,"md5_digest":"65949698da2131b209529d9bfb0f1763","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":6425,"upload_time":"2019-05-24T06:04:38","upload_time_iso_8601":"2019-05-24T06:04:38.438538Z","url":"https://files.pythonhosted.org/packages/5f/fe/3c86dfc2044d3633d986cd2d096afd0e68e238dc507771c5861a4f7bbc0d/pugsql-0.1.2.tar.gz","yanked":false,"yanked_reason":null}],"0.1.3":[{"comment_text":"","digests":{"md5":"4552a34831d4eb20d49c8ec64e53e63e","sha256":"8eb84438534e37b8e37ca3e43d57bcc24e0b55fb0223d7eb5e55dcdec9a79899"},"downloads":-1,"filename":"pugsql-0.1.3-py3-none-any.whl","has_sig":false,"md5_digest":"4552a34831d4eb20d49c8ec64e53e63e","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":7459,"upload_time":"2019-05-25T01:10:16","upload_time_iso_8601":"2019-05-25T01:10:16.288154Z","url":"https://files.pythonhosted.org/packages/db/6e/7db97d728830e90e09d5a3eae0fe1e63fbd475c3ee31610d647e5745d732/pugsql-0.1.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"f2e67b4498e65d51a7473050630113c0","sha256":"6076bdbcc869bebf8e01d317c023f626e0986504eae2848232bd15e3fe05bf3c"},"downloads":-1,"filename":"pugsql-0.1.3.tar.gz","has_sig":false,"md5_digest":"f2e67b4498e65d51a7473050630113c0","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":6460,"upload_time":"2019-05-25T01:10:17","upload_time_iso_8601":"2019-05-25T01:10:17.637160Z","url":"https://files.pythonhosted.org/packages/da/da/448a977f1d427343ad8152b0bc19751f10180bb7ae0e34cb2e5573f3e6c3/pugsql-0.1.3.tar.gz","yanked":false,"yanked_reason":null}],"0.1.4":[{"comment_text":"","digests":{"md5":"191bf41c5cc1131fdbdecbd825f5dde0","sha256":"37fc84e1d372c06e36745e45de687be31e2460a0ee97d07acabfc9dea1ff7687"},"downloads":-1,"filename":"pugsql-0.1.4-py3-none-any.whl","has_sig":false,"md5_digest":"191bf41c5cc1131fdbdecbd825f5dde0","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":8564,"upload_time":"2019-05-25T20:21:56","upload_time_iso_8601":"2019-05-25T20:21:56.590487Z","url":"https://files.pythonhosted.org/packages/b5/b6/00825a3b82e8c71e5d40504efabf6f254a4d00b19dd799d76e104798c203/pugsql-0.1.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"8ff1a7a73f7ba6ae541fe04ead6d3436","sha256":"3a420e18c2125fb31eaa80b27c23f8e12068a147d0355a714f47d47a798eaa06"},"downloads":-1,"filename":"pugsql-0.1.4.tar.gz","has_sig":false,"md5_digest":"8ff1a7a73f7ba6ae541fe04ead6d3436","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":7456,"upload_time":"2019-05-25T20:21:57","upload_time_iso_8601":"2019-05-25T20:21:57.815569Z","url":"https://files.pythonhosted.org/packages/26/cc/387001b3869af5671416c15f19849ff7aa4addab8ff6e392432e0556129d/pugsql-0.1.4.tar.gz","yanked":false,"yanked_reason":null}],"0.1.5":[{"comment_text":"","digests":{"md5":"b9abec274e171fc06789b11681c82468","sha256":"0fea82a4cd8ff560fd628e6c329650684f99946952bd13e2f1b34815245b24db"},"downloads":-1,"filename":"pugsql-0.1.5-py3-none-any.whl","has_sig":false,"md5_digest":"b9abec274e171fc06789b11681c82468","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":8567,"upload_time":"2019-05-25T20:39:06","upload_time_iso_8601":"2019-05-25T20:39:06.132238Z","url":"https://files.pythonhosted.org/packages/ad/e3/4f9f2d02e81f21777d00df673894f5e7417acd04290adb21aaccc742f7fc/pugsql-0.1.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"bf8481961bb42ad9288d838f163cb1c0","sha256":"e52aecd583fc6a598d08125ec0b8c2727babfa01b239959776525c5f6267d6fc"},"downloads":-1,"filename":"pugsql-0.1.5.tar.gz","has_sig":false,"md5_digest":"bf8481961bb42ad9288d838f163cb1c0","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":7472,"upload_time":"2019-05-25T20:39:07","upload_time_iso_8601":"2019-05-25T20:39:07.329349Z","url":"https://files.pythonhosted.org/packages/75/28/5ab871b90ed02c624f4fc977f1af951cd718b78cf281fba34eb14a0e851f/pugsql-0.1.5.tar.gz","yanked":false,"yanked_reason":null}],"0.1.6":[{"comment_text":"","digests":{"md5":"eadef40d23dd5df907aa86706d44a95c","sha256":"87f1dfb3affe35754e18c4fae8c1b59a518693b7ff74efc74e5364befa6e5328"},"downloads":-1,"filename":"pugsql-0.1.6-py3-none-any.whl","has_sig":false,"md5_digest":"eadef40d23dd5df907aa86706d44a95c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":10050,"upload_time":"2019-05-26T17:25:58","upload_time_iso_8601":"2019-05-26T17:25:58.982271Z","url":"https://files.pythonhosted.org/packages/2e/2a/abe4f60e1cf43f66a54624e04bdafd226bf0b9de6a7293b251314633fbe1/pugsql-0.1.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0539b6a63340e9fd06524f3c81d3c448","sha256":"15d8e5f4563e27a99c941d015b718c63ea3ba28c2fe225672b434c2ddd0f0f0d"},"downloads":-1,"filename":"pugsql-0.1.6.tar.gz","has_sig":false,"md5_digest":"0539b6a63340e9fd06524f3c81d3c448","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":8521,"upload_time":"2019-05-26T17:26:00","upload_time_iso_8601":"2019-05-26T17:26:00.247528Z","url":"https://files.pythonhosted.org/packages/c8/3a/f5c3fe16421876c8de9d0b40638a6db0b3d2df445a00c0f4922b4faef9cf/pugsql-0.1.6.tar.gz","yanked":false,"yanked_reason":null}],"0.1.7":[{"comment_text":"","digests":{"md5":"2a3f5f7912ee0f8d484e8a6caa293c8a","sha256":"6276ecdbaa1f8a47d54a90c66d52111563db1e7a8be01ae8793d435f7e0265b1"},"downloads":-1,"filename":"pugsql-0.1.7-py3-none-any.whl","has_sig":false,"md5_digest":"2a3f5f7912ee0f8d484e8a6caa293c8a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":11914,"upload_time":"2019-05-28T03:52:35","upload_time_iso_8601":"2019-05-28T03:52:35.203485Z","url":"https://files.pythonhosted.org/packages/99/9c/15ffff9b0d980b8fa82eb91878d7ecded188c87cf85f7c958dcf043fc051/pugsql-0.1.7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"741c82f150230f78ae42d81ae62857ee","sha256":"ecc26e37ba28e880e59d2ba37e72786417ba6af72cba4466317dafc61eb6d460"},"downloads":-1,"filename":"pugsql-0.1.7.tar.gz","has_sig":false,"md5_digest":"741c82f150230f78ae42d81ae62857ee","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":10084,"upload_time":"2019-05-28T03:52:36","upload_time_iso_8601":"2019-05-28T03:52:36.580080Z","url":"https://files.pythonhosted.org/packages/5b/a0/640985789fd1ce7cea6b3779ba01f2cfbf2fbe6e1fd37d1ccaf4729d9976/pugsql-0.1.7.tar.gz","yanked":false,"yanked_reason":null}],"0.1.8":[{"comment_text":"","digests":{"md5":"6830e8a699d657b032bccc461dcc6cb9","sha256":"b9d7f88c1237ac3168071edbae078661337213b4ea04e932dff4ffd7e3470bb1"},"downloads":-1,"filename":"pugsql-0.1.8-py3-none-any.whl","has_sig":false,"md5_digest":"6830e8a699d657b032bccc461dcc6cb9","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12166,"upload_time":"2019-06-08T01:37:26","upload_time_iso_8601":"2019-06-08T01:37:26.005113Z","url":"https://files.pythonhosted.org/packages/b2/bb/456644c3c0063ccfe783ef511e1873d328f36cfd831e4fbe64796fa30b56/pugsql-0.1.8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"e86e91d50523a8d258583c5ed2d754fb","sha256":"9dbd2e26f263ba39f5801352e80966b821093f8b805077edbbc8e98cb999f314"},"downloads":-1,"filename":"pugsql-0.1.8.tar.gz","has_sig":false,"md5_digest":"e86e91d50523a8d258583c5ed2d754fb","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":10387,"upload_time":"2019-06-08T01:37:27","upload_time_iso_8601":"2019-06-08T01:37:27.462643Z","url":"https://files.pythonhosted.org/packages/d6/ee/1819b940aad72ad1c30781e20f7c5325adecdcd1bbbb3199382f9550d407/pugsql-0.1.8.tar.gz","yanked":false,"yanked_reason":null}],"0.1.9":[{"comment_text":"","digests":{"md5":"e227bd9d3e0fe886f67e2f58fdec1f39","sha256":"c1596017fc40cb6f763c4f747eab33aefa39580c2981baa648741c1e78f0aef0"},"downloads":-1,"filename":"pugsql-0.1.9-py3-none-any.whl","has_sig":false,"md5_digest":"e227bd9d3e0fe886f67e2f58fdec1f39","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12909,"upload_time":"2019-06-10T22:27:36","upload_time_iso_8601":"2019-06-10T22:27:36.832728Z","url":"https://files.pythonhosted.org/packages/f2/74/ee5e7e55c5a73de3499c5b83d0f852aacc2e8b91b254b9d1d684567fe0fb/pugsql-0.1.9-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"25d400ec852669f2db2a8ab8a8bd6357","sha256":"0d3cf1a454edd5a0387fbd1e436be738498ee22f102a28a0215884d2264d03de"},"downloads":-1,"filename":"pugsql-0.1.9.tar.gz","has_sig":false,"md5_digest":"25d400ec852669f2db2a8ab8a8bd6357","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11039,"upload_time":"2019-06-10T22:27:38","upload_time_iso_8601":"2019-06-10T22:27:38.079608Z","url":"https://files.pythonhosted.org/packages/62/e3/818903ed838fb260fdddd97e970962b2e76c0c27439e5a95e029b7ac14cf/pugsql-0.1.9.tar.gz","yanked":false,"yanked_reason":null}],"0.2.0":[{"comment_text":"","digests":{"md5":"845e4d16651445a0052ac9c6764671e7","sha256":"338bb24716ef43a7e787a43c15903bb988135d5f9a3cbe89480ea1292a8e98cd"},"downloads":-1,"filename":"pugsql-0.2.0-py3-none-any.whl","has_sig":false,"md5_digest":"845e4d16651445a0052ac9c6764671e7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13598,"upload_time":"2020-09-03T17:21:02","upload_time_iso_8601":"2020-09-03T17:21:02.006780Z","url":"https://files.pythonhosted.org/packages/b9/8d/bafe2c3964a325c02aa94e6608ebfb981f7e5e8039c75b391419746072cc/pugsql-0.2.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d4adee25c75e99dd3c2cf51ddef65ce5","sha256":"cd315bd2168cb572a3e6e20b9450b56692e5f3378fd6f821d12086b786449dc4"},"downloads":-1,"filename":"pugsql-0.2.0.tar.gz","has_sig":false,"md5_digest":"d4adee25c75e99dd3c2cf51ddef65ce5","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11676,"upload_time":"2020-09-03T17:21:03","upload_time_iso_8601":"2020-09-03T17:21:03.426780Z","url":"https://files.pythonhosted.org/packages/b7/46/5bde8040c5a667f8892917096ebd71467029e2f0e26f9c57d1aa20c63b3d/pugsql-0.2.0.tar.gz","yanked":false,"yanked_reason":null}],"0.2.1":[{"comment_text":"","digests":{"md5":"7ff59a4575e8ae916b8607c0fc188dc2","sha256":"4274b72948b3dbad1d7acc2a73287c7d41c1043de95b4f66ffa58d25dc301de6"},"downloads":-1,"filename":"pugsql-0.2.1-py3-none-any.whl","has_sig":false,"md5_digest":"7ff59a4575e8ae916b8607c0fc188dc2","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13719,"upload_time":"2020-09-03T22:44:19","upload_time_iso_8601":"2020-09-03T22:44:19.643081Z","url":"https://files.pythonhosted.org/packages/95/ef/801b3f722c0870fa3db8d7e96553bce18e065f30f91ecd1551f2af851f3b/pugsql-0.2.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"befa305c8b7840fa4f6d9686f0d3d77a","sha256":"1cf541af32c8b1b030c3d60803b0463a0490fb6cea9e3f373861984fff7375ec"},"downloads":-1,"filename":"pugsql-0.2.1.tar.gz","has_sig":false,"md5_digest":"befa305c8b7840fa4f6d9686f0d3d77a","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11795,"upload_time":"2020-09-03T22:44:20","upload_time_iso_8601":"2020-09-03T22:44:20.786099Z","url":"https://files.pythonhosted.org/packages/b7/90/9a2fd37bae313856b5bdb0ee0706f7789d8c0729a6dc7bbc194585623ba7/pugsql-0.2.1.tar.gz","yanked":false,"yanked_reason":null}],"0.2.2":[{"comment_text":"","digests":{"md5":"f28adb85fe0ad5337b6fecfdc19fa1bc","sha256":"adadcc015ba59b17887cf7fa72fc2aa0bbf22faf993a10761930e2294546828e"},"downloads":-1,"filename":"pugsql-0.2.2-py3-none-any.whl","has_sig":false,"md5_digest":"f28adb85fe0ad5337b6fecfdc19fa1bc","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13781,"upload_time":"2020-09-13T05:35:42","upload_time_iso_8601":"2020-09-13T05:35:42.119859Z","url":"https://files.pythonhosted.org/packages/15/33/4ec36b431229ee7607f199650a0a81d0fd0a3eeefbff6423b7b09b9ca387/pugsql-0.2.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"b5cf74cebcf3e77a5c52a267f9dfd3ab","sha256":"f61c596215412969e06662b6ba073e5697949f420b2797c20db08a38f6a19ab4"},"downloads":-1,"filename":"pugsql-0.2.2.tar.gz","has_sig":false,"md5_digest":"b5cf74cebcf3e77a5c52a267f9dfd3ab","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11848,"upload_time":"2020-09-13T05:35:43","upload_time_iso_8601":"2020-09-13T05:35:43.121082Z","url":"https://files.pythonhosted.org/packages/82/97/73dce9b4a9a0e49c9913ed30f8588dff981dffa0c72545327dd0b8741f1c/pugsql-0.2.2.tar.gz","yanked":false,"yanked_reason":null}],"0.2.3":[{"comment_text":"","digests":{"md5":"7772435f7525343f545d22bf7ab89840","sha256":"8970a421388bf7d6277517d361e0e1a4bf7d5b0ffaa7c77123aabfec9f3f58b6"},"downloads":-1,"filename":"pugsql-0.2.3-py3-none-any.whl","has_sig":false,"md5_digest":"7772435f7525343f545d22bf7ab89840","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13781,"upload_time":"2020-09-13T06:06:09","upload_time_iso_8601":"2020-09-13T06:06:09.234448Z","url":"https://files.pythonhosted.org/packages/f4/85/742aff5b46e2f7415d485a46516b79bcbce13a199d94bebe3b32ab3be5a1/pugsql-0.2.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"3f7f47a4d9086fd4f59cb6c0c6f6de92","sha256":"b3caf1a0c9fee25529761c0b3bad75cf22e775720e4a60ea189fa5c30ec0fc8b"},"downloads":-1,"filename":"pugsql-0.2.3.tar.gz","has_sig":false,"md5_digest":"3f7f47a4d9086fd4f59cb6c0c6f6de92","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11877,"upload_time":"2020-09-13T06:06:10","upload_time_iso_8601":"2020-09-13T06:06:10.324371Z","url":"https://files.pythonhosted.org/packages/4e/5b/2459568d9bbb08c2837ce83e73aa35a7c772e4cf5a1fd8b0f93e5ee83c27/pugsql-0.2.3.tar.gz","yanked":false,"yanked_reason":null}],"0.2.4":[{"comment_text":"","digests":{"md5":"caed0f3850aea87f2e2f7c5bb27a87c7","sha256":"fb0a7c64cbcc8990cb37673cfc85ee2d2acd3786889948eb848ae168af784781"},"downloads":-1,"filename":"pugsql-0.2.4-py3-none-any.whl","has_sig":false,"md5_digest":"caed0f3850aea87f2e2f7c5bb27a87c7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14021,"upload_time":"2022-03-13T23:32:45","upload_time_iso_8601":"2022-03-13T23:32:45.020017Z","url":"https://files.pythonhosted.org/packages/70/2a/969b4ef1f2d350f33263ba874f0cc2ab0a6ae757b5de6a0d9420ccc53061/pugsql-0.2.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"4c5293dfbf74c292876d19c0fc94fc76","sha256":"5c7ef34ad08a929b3a93bf4e675d65fc8952732161b37d52fa8adff0cae978ba"},"downloads":-1,"filename":"pugsql-0.2.4.tar.gz","has_sig":false,"md5_digest":"4c5293dfbf74c292876d19c0fc94fc76","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":12075,"upload_time":"2022-03-13T23:32:47","upload_time_iso_8601":"2022-03-13T23:32:47.442289Z","url":"https://files.pythonhosted.org/packages/04/13/528ad70afccad1b83c61c1629444f351660eafca1c287602e9bcab842d20/pugsql-0.2.4.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"md5":"caed0f3850aea87f2e2f7c5bb27a87c7","sha256":"fb0a7c64cbcc8990cb37673cfc85ee2d2acd3786889948eb848ae168af784781"},"downloads":-1,"filename":"pugsql-0.2.4-py3-none-any.whl","has_sig":false,"md5_digest":"caed0f3850aea87f2e2f7c5bb27a87c7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14021,"upload_time":"2022-03-13T23:32:45","upload_time_iso_8601":"2022-03-13T23:32:45.020017Z","url":"https://files.pythonhosted.org/packages/70/2a/969b4ef1f2d350f33263ba874f0cc2ab0a6ae757b5de6a0d9420ccc53061/pugsql-0.2.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"4c5293dfbf74c292876d19c0fc94fc76","sha256":"5c7ef34ad08a929b3a93bf4e675d65fc8952732161b37d52fa8adff0cae978ba"},"downloads":-1,"filename":"pugsql-0.2.4.tar.gz","has_sig":false,"md5_digest":"4c5293dfbf74c292876d19c0fc94fc76","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":12075,"upload_time":"2022-03-13T23:32:47","upload_time_iso_8601":"2022-03-13T23:32:47.442289Z","url":"https://files.pythonhosted.org/packages/04/13/528ad70afccad1b83c61c1629444f351660eafca1c287602e9bcab842d20/pugsql-0.2.4.tar.gz","yanked":false,"yanked_reason":null}],"vulnerabilities":[]} \ No newline at end of file +{"info":{"author":"Dan McKinley","author_email":"mcfunley@gmail.com","bugtrack_url":null,"classifiers":["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: Apache Software License","Operating System :: OS Independent","Programming Language :: Python :: 3","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.9","Topic :: Database :: Front-Ends"],"description":"[PugSQL](https://pugsql.org) is a simple Python interface for using parameterized SQL, in files, with [any SQLAlchemy-supported database](https://docs.sqlalchemy.org/en/13/dialects/index.html).\n\nFor more information and full documentation, visit [pugsql.org](https://pugsql.org).\n\n```\nimport pugsql\n\n# Create a module of database functions from a set of sql files on disk.\nqueries = pugsql.module('resources/sql')\n\n# Point the module at your database.\nqueries.connect('sqlite:///foo.db')\n\n# Invoke parameterized queries, receive dicts!\nuser = queries.find_user(user_id=42)\n\n# -> { 'user_id': 42, 'username': 'mcfunley' }\n```\n\nIn the example above, the query would be specified like this:\n\n```\n--- :name find_user :one\nselect * from users where user_id = :user_id\n```\n\nSo _throw away_ your bulky ORM and talk to your database the way the gods intended! Install PugSQL today!\n","description_content_type":"text/markdown","docs_url":null,"download_url":null,"downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"dynamic":null,"home_page":"https://pugsql.org","keywords":null,"license":"Apache-2.0","maintainer":null,"maintainer_email":null,"name":"pugsql","package_url":"https://pypi.org/project/pugsql/","platform":null,"project_url":"https://pypi.org/project/pugsql/","project_urls":{"Homepage":"https://pugsql.org","Repository":"https://github.com/mcfunley/pugsql"},"provides_extra":null,"release_url":"https://pypi.org/project/pugsql/0.3.0/","requires_dist":["sqlalchemy>=2.0"],"requires_python":">=3.8.1","summary":"PugSQL is an anti-ORM that facilitates interacting with databases using SQL in files.","version":"0.3.0","yanked":false,"yanked_reason":null},"last_serial":23680285,"releases":{"0.1.0":[{"comment_text":"","digests":{"blake2b_256":"2caf7fe81eecef83fcaecaf8cf5a74471ae638703cfae24cf63ee85e17793229","md5":"e538debc11970078530d1581d87d304f","sha256":"ad07a3df558c01d7cddec40cf43a91ac32306577bcabfcc62cbc387596e415f1"},"downloads":-1,"filename":"pugsql-0.1.0-py3-none-any.whl","has_sig":false,"md5_digest":"e538debc11970078530d1581d87d304f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":3325,"upload_time":"2019-05-23T20:25:03","upload_time_iso_8601":"2019-05-23T20:25:03.058254Z","url":"https://files.pythonhosted.org/packages/2c/af/7fe81eecef83fcaecaf8cf5a74471ae638703cfae24cf63ee85e17793229/pugsql-0.1.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c00726145447d59b0f3efe39333b829fd5c3154b99b187d3687f54ea29739d47","md5":"ba337eeb0cf7ab6d07826d79e9b4128f","sha256":"faab0faea0f579adff91a049ff7071ff726083b7d73e253749f20d996dda7640"},"downloads":-1,"filename":"pugsql-0.1.0.tar.gz","has_sig":false,"md5_digest":"ba337eeb0cf7ab6d07826d79e9b4128f","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":2371,"upload_time":"2019-05-23T20:25:05","upload_time_iso_8601":"2019-05-23T20:25:05.039118Z","url":"https://files.pythonhosted.org/packages/c0/07/26145447d59b0f3efe39333b829fd5c3154b99b187d3687f54ea29739d47/pugsql-0.1.0.tar.gz","yanked":false,"yanked_reason":null}],"0.1.1":[{"comment_text":"","digests":{"blake2b_256":"a305c47cf0a0372694a6965fcd7a93daa97da343da3f119e92e4fe6c0e0e08b1","md5":"e637edc85b200691f57d39eb37a10276","sha256":"b477a0cc2a5b8e27cd10f9f68cc153251bb62293cca5c922fc753b9d0121c2f7"},"downloads":-1,"filename":"pugsql-0.1.1-py3-none-any.whl","has_sig":false,"md5_digest":"e637edc85b200691f57d39eb37a10276","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":7440,"upload_time":"2019-05-24T05:12:30","upload_time_iso_8601":"2019-05-24T05:12:30.298929Z","url":"https://files.pythonhosted.org/packages/a3/05/c47cf0a0372694a6965fcd7a93daa97da343da3f119e92e4fe6c0e0e08b1/pugsql-0.1.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"da51cb6e8832c60a2615b4b7ecabe405f20ca5db75e3169c7ed85ee0dce072b7","md5":"3be281dc16a7c32cd863e34da08a1b4b","sha256":"95d49af0f70228d4b85fa76218c02342c21ce13f42e1af9542a9c9bd5f92186b"},"downloads":-1,"filename":"pugsql-0.1.1.tar.gz","has_sig":false,"md5_digest":"3be281dc16a7c32cd863e34da08a1b4b","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":6424,"upload_time":"2019-05-24T05:12:31","upload_time_iso_8601":"2019-05-24T05:12:31.530744Z","url":"https://files.pythonhosted.org/packages/da/51/cb6e8832c60a2615b4b7ecabe405f20ca5db75e3169c7ed85ee0dce072b7/pugsql-0.1.1.tar.gz","yanked":false,"yanked_reason":null}],"0.1.10":[{"comment_text":"","digests":{"blake2b_256":"f29764b8e4800f84f90e19eb78c1468080e0adb6dd9f7556fb6818ec8a2681d2","md5":"36e7bbcf3770e872d287371207509b20","sha256":"1ac4464134c1b8aa2febaf87d857e6fd40fb4108863a74ea9545cf52cde46e17"},"downloads":-1,"filename":"pugsql-0.1.10-py3-none-any.whl","has_sig":false,"md5_digest":"36e7bbcf3770e872d287371207509b20","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12929,"upload_time":"2019-06-11T16:24:26","upload_time_iso_8601":"2019-06-11T16:24:26.713809Z","url":"https://files.pythonhosted.org/packages/f2/97/64b8e4800f84f90e19eb78c1468080e0adb6dd9f7556fb6818ec8a2681d2/pugsql-0.1.10-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"524033644f7fd32af14ca94db9e5291326ba6839a365927292f97addb7a4644e","md5":"6ec1c13fd0363057faab5a50cd051d48","sha256":"4c458307c7a129dafc932aa67b8960eba7f0f1f8a8225b7821820bf6b6686b1a"},"downloads":-1,"filename":"pugsql-0.1.10.tar.gz","has_sig":false,"md5_digest":"6ec1c13fd0363057faab5a50cd051d48","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11052,"upload_time":"2019-06-11T16:24:27","upload_time_iso_8601":"2019-06-11T16:24:27.900028Z","url":"https://files.pythonhosted.org/packages/52/40/33644f7fd32af14ca94db9e5291326ba6839a365927292f97addb7a4644e/pugsql-0.1.10.tar.gz","yanked":false,"yanked_reason":null}],"0.1.11":[{"comment_text":"","digests":{"blake2b_256":"5e38610dab3625e1dc8d20ea26c1f8d6b0ebbb2525d87c5b2e512713963b6bc0","md5":"05ad814184737d0b025d464973772ec4","sha256":"717d07021d23421a7675aa600f725ff603f79f6f298005617b1e09476bcbf01e"},"downloads":-1,"filename":"pugsql-0.1.11-py3-none-any.whl","has_sig":false,"md5_digest":"05ad814184737d0b025d464973772ec4","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13000,"upload_time":"2019-06-14T16:25:28","upload_time_iso_8601":"2019-06-14T16:25:28.653213Z","url":"https://files.pythonhosted.org/packages/5e/38/610dab3625e1dc8d20ea26c1f8d6b0ebbb2525d87c5b2e512713963b6bc0/pugsql-0.1.11-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"964902efcea5998f82100089265a780717cf80eb818f12173637ecce7b3a32f7","md5":"a0ec3ef4903ceefdb3afc42c34c67c5f","sha256":"93e46cb50d26cc919c17521fb6aaaece2c9a084115bdcece8a007623bef6ae63"},"downloads":-1,"filename":"pugsql-0.1.11.tar.gz","has_sig":false,"md5_digest":"a0ec3ef4903ceefdb3afc42c34c67c5f","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11161,"upload_time":"2019-06-14T16:25:29","upload_time_iso_8601":"2019-06-14T16:25:29.938623Z","url":"https://files.pythonhosted.org/packages/96/49/02efcea5998f82100089265a780717cf80eb818f12173637ecce7b3a32f7/pugsql-0.1.11.tar.gz","yanked":false,"yanked_reason":null}],"0.1.12":[{"comment_text":"","digests":{"blake2b_256":"1935e65e1ad5f64e90d63fb93a6936897e1a0555c7d6f4461ab4aecda6d30944","md5":"50abda1166dddbccacc0c14ccd3f617f","sha256":"2ce4b30c861d3b6e38b2696b50407511f29bb7b034b3467eba0e9dfee69c89e1"},"downloads":-1,"filename":"pugsql-0.1.12-py3-none-any.whl","has_sig":false,"md5_digest":"50abda1166dddbccacc0c14ccd3f617f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13124,"upload_time":"2019-06-23T01:58:28","upload_time_iso_8601":"2019-06-23T01:58:28.668770Z","url":"https://files.pythonhosted.org/packages/19/35/e65e1ad5f64e90d63fb93a6936897e1a0555c7d6f4461ab4aecda6d30944/pugsql-0.1.12-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"5fd57517111ebf4c21b164eb99d0c0faeb3504219c080c1402a0b9228d3dad91","md5":"1d6ec45a76aeb0dc5da44c608dbe1630","sha256":"0bd3c9b13c22a175377a99ff4821e54532ed3795c7fec3ca9333af51b9e76aca"},"downloads":-1,"filename":"pugsql-0.1.12.tar.gz","has_sig":false,"md5_digest":"1d6ec45a76aeb0dc5da44c608dbe1630","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11275,"upload_time":"2019-06-23T01:58:30","upload_time_iso_8601":"2019-06-23T01:58:30.209892Z","url":"https://files.pythonhosted.org/packages/5f/d5/7517111ebf4c21b164eb99d0c0faeb3504219c080c1402a0b9228d3dad91/pugsql-0.1.12.tar.gz","yanked":false,"yanked_reason":null}],"0.1.13":[{"comment_text":"","digests":{"blake2b_256":"a5d77c0f264e63ed03a056cb265aba9860ff651000347be5548957731540df7b","md5":"d47628ac6248bbdbbeed54785e237916","sha256":"3619b31c4ef859bf3d36e2f00a339b41989ca40bc3cb5c0d7714582386382824"},"downloads":-1,"filename":"pugsql-0.1.13-py3-none-any.whl","has_sig":false,"md5_digest":"d47628ac6248bbdbbeed54785e237916","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13404,"upload_time":"2019-06-28T21:11:33","upload_time_iso_8601":"2019-06-28T21:11:33.395341Z","url":"https://files.pythonhosted.org/packages/a5/d7/7c0f264e63ed03a056cb265aba9860ff651000347be5548957731540df7b/pugsql-0.1.13-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"9a72a6aa98e791383272199220c224a14b60f85d76a087cc58f8e25328dcf47e","md5":"d7f92487da2010dcbc7d14055de95a34","sha256":"831787c81353c0450b16fd10c76e522a01cd1a30e2604f35af33ad07882b5e26"},"downloads":-1,"filename":"pugsql-0.1.13.tar.gz","has_sig":false,"md5_digest":"d7f92487da2010dcbc7d14055de95a34","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11499,"upload_time":"2019-06-28T21:11:35","upload_time_iso_8601":"2019-06-28T21:11:35.138362Z","url":"https://files.pythonhosted.org/packages/9a/72/a6aa98e791383272199220c224a14b60f85d76a087cc58f8e25328dcf47e/pugsql-0.1.13.tar.gz","yanked":false,"yanked_reason":null}],"0.1.14":[{"comment_text":"","digests":{"blake2b_256":"2f39602618c0348130b41f31d7435e024a40a7a9264b618b3cd5f15f26854897","md5":"a82ba389e3abb02194bad494243d96db","sha256":"01a8eb8bf989bbdfb44915ec800005c66fe438d36bd030ba504dc773316a2222"},"downloads":-1,"filename":"pugsql-0.1.14-py3-none-any.whl","has_sig":false,"md5_digest":"a82ba389e3abb02194bad494243d96db","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13495,"upload_time":"2019-06-29T16:49:50","upload_time_iso_8601":"2019-06-29T16:49:50.101019Z","url":"https://files.pythonhosted.org/packages/2f/39/602618c0348130b41f31d7435e024a40a7a9264b618b3cd5f15f26854897/pugsql-0.1.14-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3cdeac9b67693d0086b19c7944a420a4e57d71061a757389becda2aea426e747","md5":"dbc524fd7ecc0e3c46325ca23168905c","sha256":"81711de248661e26607fae72ed74ce62e0ac2e6342f56deb562b7813d6c44b06"},"downloads":-1,"filename":"pugsql-0.1.14.tar.gz","has_sig":false,"md5_digest":"dbc524fd7ecc0e3c46325ca23168905c","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11591,"upload_time":"2019-06-29T16:49:51","upload_time_iso_8601":"2019-06-29T16:49:51.409170Z","url":"https://files.pythonhosted.org/packages/3c/de/ac9b67693d0086b19c7944a420a4e57d71061a757389becda2aea426e747/pugsql-0.1.14.tar.gz","yanked":false,"yanked_reason":null}],"0.1.15":[{"comment_text":"","digests":{"blake2b_256":"61421e4bc6e4fccbfd2f7e7546578a8ae661980afd68377889bc9dcd20f15588","md5":"e977c791555939b68f5284c366f3bf51","sha256":"fe65d07a901a5faab9786b175fd7641f2691edf093f014af6ef9171fcefcc8c8"},"downloads":-1,"filename":"pugsql-0.1.15-py3-none-any.whl","has_sig":false,"md5_digest":"e977c791555939b68f5284c366f3bf51","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13542,"upload_time":"2019-06-29T17:14:16","upload_time_iso_8601":"2019-06-29T17:14:16.671824Z","url":"https://files.pythonhosted.org/packages/61/42/1e4bc6e4fccbfd2f7e7546578a8ae661980afd68377889bc9dcd20f15588/pugsql-0.1.15-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"3609de60e9173b1f40bfe1c551f2000bad1a850876170bdb8136b38a02f4b69b","md5":"58e586ed3044a490035ed7f9a884ec19","sha256":"169c1f3007970c62e1556b3d451b8526615662ede00d939ea4e1e89a39c00ce9"},"downloads":-1,"filename":"pugsql-0.1.15.tar.gz","has_sig":false,"md5_digest":"58e586ed3044a490035ed7f9a884ec19","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11633,"upload_time":"2019-06-29T17:14:18","upload_time_iso_8601":"2019-06-29T17:14:18.043651Z","url":"https://files.pythonhosted.org/packages/36/09/de60e9173b1f40bfe1c551f2000bad1a850876170bdb8136b38a02f4b69b/pugsql-0.1.15.tar.gz","yanked":false,"yanked_reason":null}],"0.1.16":[{"comment_text":"","digests":{"blake2b_256":"dfa19c25a2b801388eb609118babeabac338acffa32655d922b1e529f70236fe","md5":"ca25b3111edc67b07f5d002c50361422","sha256":"883b1e59615cd848fb64929bbd0458ec2bd9685a4d50021bc1f4759ba0b7b042"},"downloads":-1,"filename":"pugsql-0.1.16-py3-none-any.whl","has_sig":false,"md5_digest":"ca25b3111edc67b07f5d002c50361422","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13626,"upload_time":"2020-01-12T04:52:28","upload_time_iso_8601":"2020-01-12T04:52:28.526777Z","url":"https://files.pythonhosted.org/packages/df/a1/9c25a2b801388eb609118babeabac338acffa32655d922b1e529f70236fe/pugsql-0.1.16-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"06b606af0b71496b2ba47ea87d549933ce10955471ea5716744811230c2825e5","md5":"3e5f875b646981d00a85c347d9946495","sha256":"d5e462313463e30311d62dbf4def5fe035381c2d9ee5ce5a7d9586ff053d4160"},"downloads":-1,"filename":"pugsql-0.1.16.tar.gz","has_sig":false,"md5_digest":"3e5f875b646981d00a85c347d9946495","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11723,"upload_time":"2020-01-12T04:52:30","upload_time_iso_8601":"2020-01-12T04:52:30.294719Z","url":"https://files.pythonhosted.org/packages/06/b6/06af0b71496b2ba47ea87d549933ce10955471ea5716744811230c2825e5/pugsql-0.1.16.tar.gz","yanked":false,"yanked_reason":null}],"0.1.17":[{"comment_text":"","digests":{"blake2b_256":"d94041d1c78d222648be4631dc29a19d56c441a29fa47084a7008919bb1bd64c","md5":"10ed9a7deab752c9502eaa11ae3ee43c","sha256":"7b9b835c8b4b1216c8881413b9db1269ce2c9153ecf19e12b4a52a9a24b7261d"},"downloads":-1,"filename":"pugsql-0.1.17-py3-none-any.whl","has_sig":false,"md5_digest":"10ed9a7deab752c9502eaa11ae3ee43c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13702,"upload_time":"2020-02-09T18:57:23","upload_time_iso_8601":"2020-02-09T18:57:23.844489Z","url":"https://files.pythonhosted.org/packages/d9/40/41d1c78d222648be4631dc29a19d56c441a29fa47084a7008919bb1bd64c/pugsql-0.1.17-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"01eb66294d0b1c339e0c8885905689dc2a557826238b448ed8bfbb4406a90b78","md5":"f9437e3357e43949cef548ef4f71fa3a","sha256":"2e33fa6906037af060f7f9ef3326156b53fd61c05fd4612248ed05097ad13e63"},"downloads":-1,"filename":"pugsql-0.1.17.tar.gz","has_sig":false,"md5_digest":"f9437e3357e43949cef548ef4f71fa3a","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11789,"upload_time":"2020-02-09T18:57:25","upload_time_iso_8601":"2020-02-09T18:57:25.203471Z","url":"https://files.pythonhosted.org/packages/01/eb/66294d0b1c339e0c8885905689dc2a557826238b448ed8bfbb4406a90b78/pugsql-0.1.17.tar.gz","yanked":false,"yanked_reason":null}],"0.1.18":[{"comment_text":"","digests":{"blake2b_256":"334ede73076973b5a012aeb0567531a6c29f08a6200b83ec835f0c41084f8434","md5":"c90f088e7608d99e38f3aed530dc586f","sha256":"39667ca3df3db88f33077e51965e5dc4419cd1e85882b3b70a49b8bf07ced456"},"downloads":-1,"filename":"pugsql-0.1.18-py3-none-any.whl","has_sig":false,"md5_digest":"c90f088e7608d99e38f3aed530dc586f","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13707,"upload_time":"2020-02-09T19:04:07","upload_time_iso_8601":"2020-02-09T19:04:07.439569Z","url":"https://files.pythonhosted.org/packages/33/4e/de73076973b5a012aeb0567531a6c29f08a6200b83ec835f0c41084f8434/pugsql-0.1.18-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"2f0a87bc5ab209afa1e4bc2757389ff2c308ef8520312a7d3c54e754a152f49d","md5":"234cf99600efdd55cb8da611111f04cd","sha256":"1cba41ef8eba8ade3441d817e7555774f39f6334412cee16ecec9404f26ede29"},"downloads":-1,"filename":"pugsql-0.1.18.tar.gz","has_sig":false,"md5_digest":"234cf99600efdd55cb8da611111f04cd","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11794,"upload_time":"2020-02-09T19:04:09","upload_time_iso_8601":"2020-02-09T19:04:09.014269Z","url":"https://files.pythonhosted.org/packages/2f/0a/87bc5ab209afa1e4bc2757389ff2c308ef8520312a7d3c54e754a152f49d/pugsql-0.1.18.tar.gz","yanked":false,"yanked_reason":null}],"0.1.19":[{"comment_text":"","digests":{"blake2b_256":"e38ffa5fad4064736ecabdfdb1d4cf260c69d1c1dc60a8c4c799f185e1724e91","md5":"4440fc445dd717e2a6487ed1ef6cc73d","sha256":"fbdc9713f653ab50d76fc1fbd2ec35e8d65a2d2ab635347f43ed40876fae92a3"},"downloads":-1,"filename":"pugsql-0.1.19-py3-none-any.whl","has_sig":false,"md5_digest":"4440fc445dd717e2a6487ed1ef6cc73d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13917,"upload_time":"2020-08-27T17:41:04","upload_time_iso_8601":"2020-08-27T17:41:04.674698Z","url":"https://files.pythonhosted.org/packages/e3/8f/fa5fad4064736ecabdfdb1d4cf260c69d1c1dc60a8c4c799f185e1724e91/pugsql-0.1.19-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7469d538c9e64c7c2d1f4327713441934d5f3b4aa0443d0488b13a6acb5aba52","md5":"1b38c88c3f91dbb7b98a5e2c80afe8ec","sha256":"1ed46b182edf8f23f56a828663b8f2e9863d4ab082d59e8415a4d558e4947748"},"downloads":-1,"filename":"pugsql-0.1.19.tar.gz","has_sig":false,"md5_digest":"1b38c88c3f91dbb7b98a5e2c80afe8ec","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11925,"upload_time":"2020-08-27T17:41:05","upload_time_iso_8601":"2020-08-27T17:41:05.855451Z","url":"https://files.pythonhosted.org/packages/74/69/d538c9e64c7c2d1f4327713441934d5f3b4aa0443d0488b13a6acb5aba52/pugsql-0.1.19.tar.gz","yanked":false,"yanked_reason":null}],"0.1.2":[{"comment_text":"","digests":{"blake2b_256":"6f2f64be5238997e32d4c2e8b4b04dde8807e080536d63d2ce9a83e8fb4f17ee","md5":"e47315e93b4bd3ba30ea808344a6f168","sha256":"e66ff40484f78343ae9dee0e70ec34d52b769e369891c49a7d021d5b063eac77"},"downloads":-1,"filename":"pugsql-0.1.2-py3-none-any.whl","has_sig":false,"md5_digest":"e47315e93b4bd3ba30ea808344a6f168","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7,<4.0","size":7441,"upload_time":"2019-05-24T06:04:37","upload_time_iso_8601":"2019-05-24T06:04:37.119216Z","url":"https://files.pythonhosted.org/packages/6f/2f/64be5238997e32d4c2e8b4b04dde8807e080536d63d2ce9a83e8fb4f17ee/pugsql-0.1.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"5ffe3c86dfc2044d3633d986cd2d096afd0e68e238dc507771c5861a4f7bbc0d","md5":"65949698da2131b209529d9bfb0f1763","sha256":"475030180853a8a87c9c784e8bdd4c1960d0ec61b9fa586d19975171343eca52"},"downloads":-1,"filename":"pugsql-0.1.2.tar.gz","has_sig":false,"md5_digest":"65949698da2131b209529d9bfb0f1763","packagetype":"sdist","python_version":"source","requires_python":">=3.7,<4.0","size":6425,"upload_time":"2019-05-24T06:04:38","upload_time_iso_8601":"2019-05-24T06:04:38.438538Z","url":"https://files.pythonhosted.org/packages/5f/fe/3c86dfc2044d3633d986cd2d096afd0e68e238dc507771c5861a4f7bbc0d/pugsql-0.1.2.tar.gz","yanked":false,"yanked_reason":null}],"0.1.3":[{"comment_text":"","digests":{"blake2b_256":"db6e7db97d728830e90e09d5a3eae0fe1e63fbd475c3ee31610d647e5745d732","md5":"4552a34831d4eb20d49c8ec64e53e63e","sha256":"8eb84438534e37b8e37ca3e43d57bcc24e0b55fb0223d7eb5e55dcdec9a79899"},"downloads":-1,"filename":"pugsql-0.1.3-py3-none-any.whl","has_sig":false,"md5_digest":"4552a34831d4eb20d49c8ec64e53e63e","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":7459,"upload_time":"2019-05-25T01:10:16","upload_time_iso_8601":"2019-05-25T01:10:16.288154Z","url":"https://files.pythonhosted.org/packages/db/6e/7db97d728830e90e09d5a3eae0fe1e63fbd475c3ee31610d647e5745d732/pugsql-0.1.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"dada448a977f1d427343ad8152b0bc19751f10180bb7ae0e34cb2e5573f3e6c3","md5":"f2e67b4498e65d51a7473050630113c0","sha256":"6076bdbcc869bebf8e01d317c023f626e0986504eae2848232bd15e3fe05bf3c"},"downloads":-1,"filename":"pugsql-0.1.3.tar.gz","has_sig":false,"md5_digest":"f2e67b4498e65d51a7473050630113c0","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":6460,"upload_time":"2019-05-25T01:10:17","upload_time_iso_8601":"2019-05-25T01:10:17.637160Z","url":"https://files.pythonhosted.org/packages/da/da/448a977f1d427343ad8152b0bc19751f10180bb7ae0e34cb2e5573f3e6c3/pugsql-0.1.3.tar.gz","yanked":false,"yanked_reason":null}],"0.1.4":[{"comment_text":"","digests":{"blake2b_256":"b5b600825a3b82e8c71e5d40504efabf6f254a4d00b19dd799d76e104798c203","md5":"191bf41c5cc1131fdbdecbd825f5dde0","sha256":"37fc84e1d372c06e36745e45de687be31e2460a0ee97d07acabfc9dea1ff7687"},"downloads":-1,"filename":"pugsql-0.1.4-py3-none-any.whl","has_sig":false,"md5_digest":"191bf41c5cc1131fdbdecbd825f5dde0","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":8564,"upload_time":"2019-05-25T20:21:56","upload_time_iso_8601":"2019-05-25T20:21:56.590487Z","url":"https://files.pythonhosted.org/packages/b5/b6/00825a3b82e8c71e5d40504efabf6f254a4d00b19dd799d76e104798c203/pugsql-0.1.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"26cc387001b3869af5671416c15f19849ff7aa4addab8ff6e392432e0556129d","md5":"8ff1a7a73f7ba6ae541fe04ead6d3436","sha256":"3a420e18c2125fb31eaa80b27c23f8e12068a147d0355a714f47d47a798eaa06"},"downloads":-1,"filename":"pugsql-0.1.4.tar.gz","has_sig":false,"md5_digest":"8ff1a7a73f7ba6ae541fe04ead6d3436","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":7456,"upload_time":"2019-05-25T20:21:57","upload_time_iso_8601":"2019-05-25T20:21:57.815569Z","url":"https://files.pythonhosted.org/packages/26/cc/387001b3869af5671416c15f19849ff7aa4addab8ff6e392432e0556129d/pugsql-0.1.4.tar.gz","yanked":false,"yanked_reason":null}],"0.1.5":[{"comment_text":"","digests":{"blake2b_256":"ade34f9f2d02e81f21777d00df673894f5e7417acd04290adb21aaccc742f7fc","md5":"b9abec274e171fc06789b11681c82468","sha256":"0fea82a4cd8ff560fd628e6c329650684f99946952bd13e2f1b34815245b24db"},"downloads":-1,"filename":"pugsql-0.1.5-py3-none-any.whl","has_sig":false,"md5_digest":"b9abec274e171fc06789b11681c82468","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":8567,"upload_time":"2019-05-25T20:39:06","upload_time_iso_8601":"2019-05-25T20:39:06.132238Z","url":"https://files.pythonhosted.org/packages/ad/e3/4f9f2d02e81f21777d00df673894f5e7417acd04290adb21aaccc742f7fc/pugsql-0.1.5-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"75285ab871b90ed02c624f4fc977f1af951cd718b78cf281fba34eb14a0e851f","md5":"bf8481961bb42ad9288d838f163cb1c0","sha256":"e52aecd583fc6a598d08125ec0b8c2727babfa01b239959776525c5f6267d6fc"},"downloads":-1,"filename":"pugsql-0.1.5.tar.gz","has_sig":false,"md5_digest":"bf8481961bb42ad9288d838f163cb1c0","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":7472,"upload_time":"2019-05-25T20:39:07","upload_time_iso_8601":"2019-05-25T20:39:07.329349Z","url":"https://files.pythonhosted.org/packages/75/28/5ab871b90ed02c624f4fc977f1af951cd718b78cf281fba34eb14a0e851f/pugsql-0.1.5.tar.gz","yanked":false,"yanked_reason":null}],"0.1.6":[{"comment_text":"","digests":{"blake2b_256":"2e2aabe4f60e1cf43f66a54624e04bdafd226bf0b9de6a7293b251314633fbe1","md5":"eadef40d23dd5df907aa86706d44a95c","sha256":"87f1dfb3affe35754e18c4fae8c1b59a518693b7ff74efc74e5364befa6e5328"},"downloads":-1,"filename":"pugsql-0.1.6-py3-none-any.whl","has_sig":false,"md5_digest":"eadef40d23dd5df907aa86706d44a95c","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.4","size":10050,"upload_time":"2019-05-26T17:25:58","upload_time_iso_8601":"2019-05-26T17:25:58.982271Z","url":"https://files.pythonhosted.org/packages/2e/2a/abe4f60e1cf43f66a54624e04bdafd226bf0b9de6a7293b251314633fbe1/pugsql-0.1.6-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"c83af5c3fe16421876c8de9d0b40638a6db0b3d2df445a00c0f4922b4faef9cf","md5":"0539b6a63340e9fd06524f3c81d3c448","sha256":"15d8e5f4563e27a99c941d015b718c63ea3ba28c2fe225672b434c2ddd0f0f0d"},"downloads":-1,"filename":"pugsql-0.1.6.tar.gz","has_sig":false,"md5_digest":"0539b6a63340e9fd06524f3c81d3c448","packagetype":"sdist","python_version":"source","requires_python":">=3.4","size":8521,"upload_time":"2019-05-26T17:26:00","upload_time_iso_8601":"2019-05-26T17:26:00.247528Z","url":"https://files.pythonhosted.org/packages/c8/3a/f5c3fe16421876c8de9d0b40638a6db0b3d2df445a00c0f4922b4faef9cf/pugsql-0.1.6.tar.gz","yanked":false,"yanked_reason":null}],"0.1.7":[{"comment_text":"","digests":{"blake2b_256":"999c15ffff9b0d980b8fa82eb91878d7ecded188c87cf85f7c958dcf043fc051","md5":"2a3f5f7912ee0f8d484e8a6caa293c8a","sha256":"6276ecdbaa1f8a47d54a90c66d52111563db1e7a8be01ae8793d435f7e0265b1"},"downloads":-1,"filename":"pugsql-0.1.7-py3-none-any.whl","has_sig":false,"md5_digest":"2a3f5f7912ee0f8d484e8a6caa293c8a","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":11914,"upload_time":"2019-05-28T03:52:35","upload_time_iso_8601":"2019-05-28T03:52:35.203485Z","url":"https://files.pythonhosted.org/packages/99/9c/15ffff9b0d980b8fa82eb91878d7ecded188c87cf85f7c958dcf043fc051/pugsql-0.1.7-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"5ba0640985789fd1ce7cea6b3779ba01f2cfbf2fbe6e1fd37d1ccaf4729d9976","md5":"741c82f150230f78ae42d81ae62857ee","sha256":"ecc26e37ba28e880e59d2ba37e72786417ba6af72cba4466317dafc61eb6d460"},"downloads":-1,"filename":"pugsql-0.1.7.tar.gz","has_sig":false,"md5_digest":"741c82f150230f78ae42d81ae62857ee","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":10084,"upload_time":"2019-05-28T03:52:36","upload_time_iso_8601":"2019-05-28T03:52:36.580080Z","url":"https://files.pythonhosted.org/packages/5b/a0/640985789fd1ce7cea6b3779ba01f2cfbf2fbe6e1fd37d1ccaf4729d9976/pugsql-0.1.7.tar.gz","yanked":false,"yanked_reason":null}],"0.1.8":[{"comment_text":"","digests":{"blake2b_256":"b2bb456644c3c0063ccfe783ef511e1873d328f36cfd831e4fbe64796fa30b56","md5":"6830e8a699d657b032bccc461dcc6cb9","sha256":"b9d7f88c1237ac3168071edbae078661337213b4ea04e932dff4ffd7e3470bb1"},"downloads":-1,"filename":"pugsql-0.1.8-py3-none-any.whl","has_sig":false,"md5_digest":"6830e8a699d657b032bccc461dcc6cb9","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12166,"upload_time":"2019-06-08T01:37:26","upload_time_iso_8601":"2019-06-08T01:37:26.005113Z","url":"https://files.pythonhosted.org/packages/b2/bb/456644c3c0063ccfe783ef511e1873d328f36cfd831e4fbe64796fa30b56/pugsql-0.1.8-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"d6ee1819b940aad72ad1c30781e20f7c5325adecdcd1bbbb3199382f9550d407","md5":"e86e91d50523a8d258583c5ed2d754fb","sha256":"9dbd2e26f263ba39f5801352e80966b821093f8b805077edbbc8e98cb999f314"},"downloads":-1,"filename":"pugsql-0.1.8.tar.gz","has_sig":false,"md5_digest":"e86e91d50523a8d258583c5ed2d754fb","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":10387,"upload_time":"2019-06-08T01:37:27","upload_time_iso_8601":"2019-06-08T01:37:27.462643Z","url":"https://files.pythonhosted.org/packages/d6/ee/1819b940aad72ad1c30781e20f7c5325adecdcd1bbbb3199382f9550d407/pugsql-0.1.8.tar.gz","yanked":false,"yanked_reason":null}],"0.1.9":[{"comment_text":"","digests":{"blake2b_256":"f274ee5e7e55c5a73de3499c5b83d0f852aacc2e8b91b254b9d1d684567fe0fb","md5":"e227bd9d3e0fe886f67e2f58fdec1f39","sha256":"c1596017fc40cb6f763c4f747eab33aefa39580c2981baa648741c1e78f0aef0"},"downloads":-1,"filename":"pugsql-0.1.9-py3-none-any.whl","has_sig":false,"md5_digest":"e227bd9d3e0fe886f67e2f58fdec1f39","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":12909,"upload_time":"2019-06-10T22:27:36","upload_time_iso_8601":"2019-06-10T22:27:36.832728Z","url":"https://files.pythonhosted.org/packages/f2/74/ee5e7e55c5a73de3499c5b83d0f852aacc2e8b91b254b9d1d684567fe0fb/pugsql-0.1.9-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"62e3818903ed838fb260fdddd97e970962b2e76c0c27439e5a95e029b7ac14cf","md5":"25d400ec852669f2db2a8ab8a8bd6357","sha256":"0d3cf1a454edd5a0387fbd1e436be738498ee22f102a28a0215884d2264d03de"},"downloads":-1,"filename":"pugsql-0.1.9.tar.gz","has_sig":false,"md5_digest":"25d400ec852669f2db2a8ab8a8bd6357","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11039,"upload_time":"2019-06-10T22:27:38","upload_time_iso_8601":"2019-06-10T22:27:38.079608Z","url":"https://files.pythonhosted.org/packages/62/e3/818903ed838fb260fdddd97e970962b2e76c0c27439e5a95e029b7ac14cf/pugsql-0.1.9.tar.gz","yanked":false,"yanked_reason":null}],"0.2.0":[{"comment_text":"","digests":{"blake2b_256":"b98dbafe2c3964a325c02aa94e6608ebfb981f7e5e8039c75b391419746072cc","md5":"845e4d16651445a0052ac9c6764671e7","sha256":"338bb24716ef43a7e787a43c15903bb988135d5f9a3cbe89480ea1292a8e98cd"},"downloads":-1,"filename":"pugsql-0.2.0-py3-none-any.whl","has_sig":false,"md5_digest":"845e4d16651445a0052ac9c6764671e7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13598,"upload_time":"2020-09-03T17:21:02","upload_time_iso_8601":"2020-09-03T17:21:02.006780Z","url":"https://files.pythonhosted.org/packages/b9/8d/bafe2c3964a325c02aa94e6608ebfb981f7e5e8039c75b391419746072cc/pugsql-0.2.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"b7465bde8040c5a667f8892917096ebd71467029e2f0e26f9c57d1aa20c63b3d","md5":"d4adee25c75e99dd3c2cf51ddef65ce5","sha256":"cd315bd2168cb572a3e6e20b9450b56692e5f3378fd6f821d12086b786449dc4"},"downloads":-1,"filename":"pugsql-0.2.0.tar.gz","has_sig":false,"md5_digest":"d4adee25c75e99dd3c2cf51ddef65ce5","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11676,"upload_time":"2020-09-03T17:21:03","upload_time_iso_8601":"2020-09-03T17:21:03.426780Z","url":"https://files.pythonhosted.org/packages/b7/46/5bde8040c5a667f8892917096ebd71467029e2f0e26f9c57d1aa20c63b3d/pugsql-0.2.0.tar.gz","yanked":false,"yanked_reason":null}],"0.2.1":[{"comment_text":"","digests":{"blake2b_256":"95ef801b3f722c0870fa3db8d7e96553bce18e065f30f91ecd1551f2af851f3b","md5":"7ff59a4575e8ae916b8607c0fc188dc2","sha256":"4274b72948b3dbad1d7acc2a73287c7d41c1043de95b4f66ffa58d25dc301de6"},"downloads":-1,"filename":"pugsql-0.2.1-py3-none-any.whl","has_sig":false,"md5_digest":"7ff59a4575e8ae916b8607c0fc188dc2","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13719,"upload_time":"2020-09-03T22:44:19","upload_time_iso_8601":"2020-09-03T22:44:19.643081Z","url":"https://files.pythonhosted.org/packages/95/ef/801b3f722c0870fa3db8d7e96553bce18e065f30f91ecd1551f2af851f3b/pugsql-0.2.1-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"b7909a2fd37bae313856b5bdb0ee0706f7789d8c0729a6dc7bbc194585623ba7","md5":"befa305c8b7840fa4f6d9686f0d3d77a","sha256":"1cf541af32c8b1b030c3d60803b0463a0490fb6cea9e3f373861984fff7375ec"},"downloads":-1,"filename":"pugsql-0.2.1.tar.gz","has_sig":false,"md5_digest":"befa305c8b7840fa4f6d9686f0d3d77a","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11795,"upload_time":"2020-09-03T22:44:20","upload_time_iso_8601":"2020-09-03T22:44:20.786099Z","url":"https://files.pythonhosted.org/packages/b7/90/9a2fd37bae313856b5bdb0ee0706f7789d8c0729a6dc7bbc194585623ba7/pugsql-0.2.1.tar.gz","yanked":false,"yanked_reason":null}],"0.2.2":[{"comment_text":"","digests":{"blake2b_256":"15334ec36b431229ee7607f199650a0a81d0fd0a3eeefbff6423b7b09b9ca387","md5":"f28adb85fe0ad5337b6fecfdc19fa1bc","sha256":"adadcc015ba59b17887cf7fa72fc2aa0bbf22faf993a10761930e2294546828e"},"downloads":-1,"filename":"pugsql-0.2.2-py3-none-any.whl","has_sig":false,"md5_digest":"f28adb85fe0ad5337b6fecfdc19fa1bc","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13781,"upload_time":"2020-09-13T05:35:42","upload_time_iso_8601":"2020-09-13T05:35:42.119859Z","url":"https://files.pythonhosted.org/packages/15/33/4ec36b431229ee7607f199650a0a81d0fd0a3eeefbff6423b7b09b9ca387/pugsql-0.2.2-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"829773dce9b4a9a0e49c9913ed30f8588dff981dffa0c72545327dd0b8741f1c","md5":"b5cf74cebcf3e77a5c52a267f9dfd3ab","sha256":"f61c596215412969e06662b6ba073e5697949f420b2797c20db08a38f6a19ab4"},"downloads":-1,"filename":"pugsql-0.2.2.tar.gz","has_sig":false,"md5_digest":"b5cf74cebcf3e77a5c52a267f9dfd3ab","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11848,"upload_time":"2020-09-13T05:35:43","upload_time_iso_8601":"2020-09-13T05:35:43.121082Z","url":"https://files.pythonhosted.org/packages/82/97/73dce9b4a9a0e49c9913ed30f8588dff981dffa0c72545327dd0b8741f1c/pugsql-0.2.2.tar.gz","yanked":false,"yanked_reason":null}],"0.2.3":[{"comment_text":"","digests":{"blake2b_256":"f485742aff5b46e2f7415d485a46516b79bcbce13a199d94bebe3b32ab3be5a1","md5":"7772435f7525343f545d22bf7ab89840","sha256":"8970a421388bf7d6277517d361e0e1a4bf7d5b0ffaa7c77123aabfec9f3f58b6"},"downloads":-1,"filename":"pugsql-0.2.3-py3-none-any.whl","has_sig":false,"md5_digest":"7772435f7525343f545d22bf7ab89840","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.5","size":13781,"upload_time":"2020-09-13T06:06:09","upload_time_iso_8601":"2020-09-13T06:06:09.234448Z","url":"https://files.pythonhosted.org/packages/f4/85/742aff5b46e2f7415d485a46516b79bcbce13a199d94bebe3b32ab3be5a1/pugsql-0.2.3-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"4e5b2459568d9bbb08c2837ce83e73aa35a7c772e4cf5a1fd8b0f93e5ee83c27","md5":"3f7f47a4d9086fd4f59cb6c0c6f6de92","sha256":"b3caf1a0c9fee25529761c0b3bad75cf22e775720e4a60ea189fa5c30ec0fc8b"},"downloads":-1,"filename":"pugsql-0.2.3.tar.gz","has_sig":false,"md5_digest":"3f7f47a4d9086fd4f59cb6c0c6f6de92","packagetype":"sdist","python_version":"source","requires_python":">=3.5","size":11877,"upload_time":"2020-09-13T06:06:10","upload_time_iso_8601":"2020-09-13T06:06:10.324371Z","url":"https://files.pythonhosted.org/packages/4e/5b/2459568d9bbb08c2837ce83e73aa35a7c772e4cf5a1fd8b0f93e5ee83c27/pugsql-0.2.3.tar.gz","yanked":false,"yanked_reason":null}],"0.2.4":[{"comment_text":"","digests":{"blake2b_256":"702a969b4ef1f2d350f33263ba874f0cc2ab0a6ae757b5de6a0d9420ccc53061","md5":"caed0f3850aea87f2e2f7c5bb27a87c7","sha256":"fb0a7c64cbcc8990cb37673cfc85ee2d2acd3786889948eb848ae168af784781"},"downloads":-1,"filename":"pugsql-0.2.4-py3-none-any.whl","has_sig":false,"md5_digest":"caed0f3850aea87f2e2f7c5bb27a87c7","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.7","size":14021,"upload_time":"2022-03-13T23:32:45","upload_time_iso_8601":"2022-03-13T23:32:45.020017Z","url":"https://files.pythonhosted.org/packages/70/2a/969b4ef1f2d350f33263ba874f0cc2ab0a6ae757b5de6a0d9420ccc53061/pugsql-0.2.4-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"0413528ad70afccad1b83c61c1629444f351660eafca1c287602e9bcab842d20","md5":"4c5293dfbf74c292876d19c0fc94fc76","sha256":"5c7ef34ad08a929b3a93bf4e675d65fc8952732161b37d52fa8adff0cae978ba"},"downloads":-1,"filename":"pugsql-0.2.4.tar.gz","has_sig":false,"md5_digest":"4c5293dfbf74c292876d19c0fc94fc76","packagetype":"sdist","python_version":"source","requires_python":">=3.7","size":12075,"upload_time":"2022-03-13T23:32:47","upload_time_iso_8601":"2022-03-13T23:32:47.442289Z","url":"https://files.pythonhosted.org/packages/04/13/528ad70afccad1b83c61c1629444f351660eafca1c287602e9bcab842d20/pugsql-0.2.4.tar.gz","yanked":false,"yanked_reason":null}],"0.3.0":[{"comment_text":"","digests":{"blake2b_256":"dd272946b63096479be1b6a38f35e00ed0d8cea541314e569107888e342af6c3","md5":"b1f6a44afe6283f70636f4e5244e677d","sha256":"6fbe6b8323d459097276b39a8bf589d288db97d8e1b72720e9e18b0bf617068c"},"downloads":-1,"filename":"pugsql-0.3.0-py3-none-any.whl","has_sig":false,"md5_digest":"b1f6a44afe6283f70636f4e5244e677d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.8.1","size":14133,"upload_time":"2024-06-14T17:33:01","upload_time_iso_8601":"2024-06-14T17:33:01.177088Z","url":"https://files.pythonhosted.org/packages/dd/27/2946b63096479be1b6a38f35e00ed0d8cea541314e569107888e342af6c3/pugsql-0.3.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7ef0bd7d9aaddc37f3e32bc70b103391b91fb28cd6088389838d1e635d789135","md5":"e46e8083ef0e53b6222ac3efc63cf55a","sha256":"da373fc1249e31511f36ca6273577578fb98e019bd56d6fa6e7c828d372c4d6e"},"downloads":-1,"filename":"pugsql-0.3.0.tar.gz","has_sig":false,"md5_digest":"e46e8083ef0e53b6222ac3efc63cf55a","packagetype":"sdist","python_version":"source","requires_python":">=3.8.1","size":11873,"upload_time":"2024-06-14T17:33:03","upload_time_iso_8601":"2024-06-14T17:33:03.009084Z","url":"https://files.pythonhosted.org/packages/7e/f0/bd7d9aaddc37f3e32bc70b103391b91fb28cd6088389838d1e635d789135/pugsql-0.3.0.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"blake2b_256":"dd272946b63096479be1b6a38f35e00ed0d8cea541314e569107888e342af6c3","md5":"b1f6a44afe6283f70636f4e5244e677d","sha256":"6fbe6b8323d459097276b39a8bf589d288db97d8e1b72720e9e18b0bf617068c"},"downloads":-1,"filename":"pugsql-0.3.0-py3-none-any.whl","has_sig":false,"md5_digest":"b1f6a44afe6283f70636f4e5244e677d","packagetype":"bdist_wheel","python_version":"py3","requires_python":">=3.8.1","size":14133,"upload_time":"2024-06-14T17:33:01","upload_time_iso_8601":"2024-06-14T17:33:01.177088Z","url":"https://files.pythonhosted.org/packages/dd/27/2946b63096479be1b6a38f35e00ed0d8cea541314e569107888e342af6c3/pugsql-0.3.0-py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"blake2b_256":"7ef0bd7d9aaddc37f3e32bc70b103391b91fb28cd6088389838d1e635d789135","md5":"e46e8083ef0e53b6222ac3efc63cf55a","sha256":"da373fc1249e31511f36ca6273577578fb98e019bd56d6fa6e7c828d372c4d6e"},"downloads":-1,"filename":"pugsql-0.3.0.tar.gz","has_sig":false,"md5_digest":"e46e8083ef0e53b6222ac3efc63cf55a","packagetype":"sdist","python_version":"source","requires_python":">=3.8.1","size":11873,"upload_time":"2024-06-14T17:33:03","upload_time_iso_8601":"2024-06-14T17:33:03.009084Z","url":"https://files.pythonhosted.org/packages/7e/f0/bd7d9aaddc37f3e32bc70b103391b91fb28cd6088389838d1e635d789135/pugsql-0.3.0.tar.gz","yanked":false,"yanked_reason":null}],"vulnerabilities":[]} diff --git a/docs/_pdoc/version.mako b/docs/_pdoc/version.mako index f82e068..268b033 100644 --- a/docs/_pdoc/version.mako +++ b/docs/_pdoc/version.mako @@ -1 +1 @@ -v0.2.4 +v0.3.0 diff --git a/docs/doc/0.3.0/pugsql/compiler.html b/docs/doc/0.3.0/pugsql/compiler.html new file mode 100644 index 0000000..938e27c --- /dev/null +++ b/docs/doc/0.3.0/pugsql/compiler.html @@ -0,0 +1,641 @@ + + + + + + +pugsql.compiler API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.compiler

+
+
+

Code that processes SQL files and returns modules of database functions.

+
+Source code +
"""
+Code that processes SQL files and returns modules of database functions.
+"""
+import os
+import re
+import threading
+from contextlib import contextmanager, suppress
+from glob import glob
+
+from sqlalchemy import create_engine
+from sqlalchemy.exc import ResourceClosedError
+from sqlalchemy.orm import sessionmaker
+
+from . import context, parser
+from .exceptions import NoConnectionError
+
+__pdoc__ = {}
+
+
+class Module(object):
+    """
+    Holds a set of SQL functions loaded from files.
+    """
+    sqlpaths = None
+    engine = None
+
+    def __init__(self, sqlpath, encoding=None):
+        """
+        Loads functions found in the *sql files specified by `sqlpath` into
+        properties on this object. An `encoding` for the files can optionally
+        be provided.
+
+        The named sql functions in files should be unique.
+        """
+        self.sqlpaths = set()
+        self._statements = {}
+        self._sessionmaker = None
+        self._locals = threading.local()
+
+        self.add_queries(sqlpath, encoding=encoding)
+
+    def add_queries(self, *paths, encoding=None):
+        """
+        Adds queries from *sql files in one or more `paths` to the module.
+        An `encoding` for the files can optionally be provided.
+
+        The named sql functions in files should be unique.
+        """
+        for p in paths:
+            self._add_path(p, encoding=encoding)
+        self.sqlpaths |= set(paths)
+
+    def _add_path(self, sqlpath, encoding=None):
+        if not os.path.isdir(sqlpath):
+            raise ValueError('Directory not found: %s' % sqlpath)
+
+        for sqlfile in sorted(glob(os.path.join(sqlpath, '*sql'))):
+            with open(sqlfile, 'r', encoding=encoding) as f:
+                pugsql = f.read()
+
+            # handle multiple statements per file
+            statements = re.split(r'\n+(?=--\s*:name)', pugsql)
+            for statement in statements:
+                s = parser.parse(statement, ctx=context.Context(sqlfile))
+
+                if hasattr(self, s.name):
+                    if s.name not in self._statements:
+                        raise ValueError(
+                            'Error loading %s - the function name "%s" is '
+                            'reserved. Please choose another name.' % (
+                                sqlfile, s.name))
+                    raise ValueError(
+                        'Error loading %s - a SQL function named %s was '
+                        'already defined in %s.' % (
+                            sqlfile,
+                            s.name,
+                            self._statements[s.name].filename))
+
+                s.set_module(self)
+
+                setattr(self, s.name, s)
+                self._statements[s.name] = s
+
+    @contextmanager
+    def transaction(self):
+        """
+        Returns a session that manages a transaction scope, in which
+        many statements can be run. Statements run on this module will
+        automatically use this transaction. The normal use case  is to use this
+        like a context manager, rather than interact with the result:
+
+            foo = pugsql.module('sql/foo')
+            with foo.transaction():
+                x = foo.get_x(x_id=1234)
+                foo.update_x(x_id=1234, x+1)
+
+            # when the context manager exits, the transaction is committed.
+            # if an exception occurs, it is rolled back.
+
+        The transaction is active for statements executed on the current thread
+        only.
+
+        For engines that support SAVEPOINT, calling this method a second time
+        begins a nested transaction.
+
+        For more info, see here:
+        https://docs.sqlalchemy.org/en/13/orm/session_transaction.html
+        """
+        if not getattr(self._locals, 'session', None):
+            if not self._sessionmaker:
+                raise NoConnectionError()
+
+            self._locals.session = self._sessionmaker()
+
+            session = self._locals.session
+            try:
+                yield session
+                session.commit()
+            except Exception as e:
+                session.rollback()
+                raise e
+            finally:
+                session.close()
+                self._locals.session = None
+        else:
+            session = self._locals.session.begin_nested()
+            try:
+                yield session
+            except Exception as e:
+                session.rollback()
+                raise e
+            else:
+                with suppress(ResourceClosedError):
+                    session.commit()
+
+    def _execute(self, clause, *multiparams, **params):
+        if getattr(self._locals, 'session', None):
+            return self._locals.session.execute(clause, multiparams or params)
+
+        if not self.engine:
+            raise NoConnectionError()
+
+        with self.engine.connect() as conn:
+            if multiparams:
+                result = conn.execute(clause, *multiparams)
+            else:
+                result = conn.execute(clause, params)
+            conn.commit()
+            return result
+
+    @property
+    def _dialect(self):
+        """
+        Gets the dialect for the SQLAlchemy engine.
+        """
+        if not self.engine:
+            raise NoConnectionError()
+        return self.engine.dialect
+
+    def connect(self, connstr, **kwargs):
+        """
+        Sets the connection string for SQL functions on this module.
+
+        See https://docs.sqlalchemy.org/en/13/core/engines.html for examples of
+        legal connection strings for different databases.
+        """
+        self.setengine(create_engine(connstr, **kwargs))
+
+    def setengine(self, engine):
+        """
+        Sets the SQLAlchemy engine for SQL functions on this module. This can
+        be used instead of the connect method, when more customization of the
+        connection engine is desired.
+
+        See also: https://docs.sqlalchemy.org/en/13/core/connections.html
+        """
+        self.engine = engine
+        self._sessionmaker = sessionmaker(bind=engine)
+
+    def disconnect(self):
+        """
+        Disassociates the module from any connection it was previously given.
+        """
+        self.engine = None
+        self._sessionmaker = None
+
+    def __iter__(self):
+        return iter(self._statements.values())
+
+
+__pdoc__['Module.sqlpaths'] = (
+    'A list of paths that the `pugsql.compiler.Module` was loaded from.')
+__pdoc__['Module.engine'] = (
+    'The sqlalchemy engine object being used by the `pugsql.compiler.Module`.')
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class Module +(sqlpath, encoding=None) +
+
+

Holds a set of SQL functions loaded from files.

+

Loads functions found in the *sql files specified by sqlpath into +properties on this object. An encoding for the files can optionally +be provided.

+

The named sql functions in files should be unique.

+
+Source code +
class Module(object):
+    """
+    Holds a set of SQL functions loaded from files.
+    """
+    sqlpaths = None
+    engine = None
+
+    def __init__(self, sqlpath, encoding=None):
+        """
+        Loads functions found in the *sql files specified by `sqlpath` into
+        properties on this object. An `encoding` for the files can optionally
+        be provided.
+
+        The named sql functions in files should be unique.
+        """
+        self.sqlpaths = set()
+        self._statements = {}
+        self._sessionmaker = None
+        self._locals = threading.local()
+
+        self.add_queries(sqlpath, encoding=encoding)
+
+    def add_queries(self, *paths, encoding=None):
+        """
+        Adds queries from *sql files in one or more `paths` to the module.
+        An `encoding` for the files can optionally be provided.
+
+        The named sql functions in files should be unique.
+        """
+        for p in paths:
+            self._add_path(p, encoding=encoding)
+        self.sqlpaths |= set(paths)
+
+    def _add_path(self, sqlpath, encoding=None):
+        if not os.path.isdir(sqlpath):
+            raise ValueError('Directory not found: %s' % sqlpath)
+
+        for sqlfile in sorted(glob(os.path.join(sqlpath, '*sql'))):
+            with open(sqlfile, 'r', encoding=encoding) as f:
+                pugsql = f.read()
+
+            # handle multiple statements per file
+            statements = re.split(r'\n+(?=--\s*:name)', pugsql)
+            for statement in statements:
+                s = parser.parse(statement, ctx=context.Context(sqlfile))
+
+                if hasattr(self, s.name):
+                    if s.name not in self._statements:
+                        raise ValueError(
+                            'Error loading %s - the function name "%s" is '
+                            'reserved. Please choose another name.' % (
+                                sqlfile, s.name))
+                    raise ValueError(
+                        'Error loading %s - a SQL function named %s was '
+                        'already defined in %s.' % (
+                            sqlfile,
+                            s.name,
+                            self._statements[s.name].filename))
+
+                s.set_module(self)
+
+                setattr(self, s.name, s)
+                self._statements[s.name] = s
+
+    @contextmanager
+    def transaction(self):
+        """
+        Returns a session that manages a transaction scope, in which
+        many statements can be run. Statements run on this module will
+        automatically use this transaction. The normal use case  is to use this
+        like a context manager, rather than interact with the result:
+
+            foo = pugsql.module('sql/foo')
+            with foo.transaction():
+                x = foo.get_x(x_id=1234)
+                foo.update_x(x_id=1234, x+1)
+
+            # when the context manager exits, the transaction is committed.
+            # if an exception occurs, it is rolled back.
+
+        The transaction is active for statements executed on the current thread
+        only.
+
+        For engines that support SAVEPOINT, calling this method a second time
+        begins a nested transaction.
+
+        For more info, see here:
+        https://docs.sqlalchemy.org/en/13/orm/session_transaction.html
+        """
+        if not getattr(self._locals, 'session', None):
+            if not self._sessionmaker:
+                raise NoConnectionError()
+
+            self._locals.session = self._sessionmaker()
+
+            session = self._locals.session
+            try:
+                yield session
+                session.commit()
+            except Exception as e:
+                session.rollback()
+                raise e
+            finally:
+                session.close()
+                self._locals.session = None
+        else:
+            session = self._locals.session.begin_nested()
+            try:
+                yield session
+            except Exception as e:
+                session.rollback()
+                raise e
+            else:
+                with suppress(ResourceClosedError):
+                    session.commit()
+
+    def _execute(self, clause, *multiparams, **params):
+        if getattr(self._locals, 'session', None):
+            return self._locals.session.execute(clause, multiparams or params)
+
+        if not self.engine:
+            raise NoConnectionError()
+
+        with self.engine.connect() as conn:
+            if multiparams:
+                result = conn.execute(clause, *multiparams)
+            else:
+                result = conn.execute(clause, params)
+            conn.commit()
+            return result
+
+    @property
+    def _dialect(self):
+        """
+        Gets the dialect for the SQLAlchemy engine.
+        """
+        if not self.engine:
+            raise NoConnectionError()
+        return self.engine.dialect
+
+    def connect(self, connstr, **kwargs):
+        """
+        Sets the connection string for SQL functions on this module.
+
+        See https://docs.sqlalchemy.org/en/13/core/engines.html for examples of
+        legal connection strings for different databases.
+        """
+        self.setengine(create_engine(connstr, **kwargs))
+
+    def setengine(self, engine):
+        """
+        Sets the SQLAlchemy engine for SQL functions on this module. This can
+        be used instead of the connect method, when more customization of the
+        connection engine is desired.
+
+        See also: https://docs.sqlalchemy.org/en/13/core/connections.html
+        """
+        self.engine = engine
+        self._sessionmaker = sessionmaker(bind=engine)
+
+    def disconnect(self):
+        """
+        Disassociates the module from any connection it was previously given.
+        """
+        self.engine = None
+        self._sessionmaker = None
+
+    def __iter__(self):
+        return iter(self._statements.values())
+
+

Class variables

+
+
var engine
+
+

The sqlalchemy engine object being used by the Module.

+
+
var sqlpaths
+
+

A list of paths that the Module was loaded from.

+
+
+

Methods

+
+
+def add_queries(self, *paths, encoding=None) +
+
+

Adds queries from *sql files in one or more paths to the module. +An encoding for the files can optionally be provided.

+

The named sql functions in files should be unique.

+
+Source code +
def add_queries(self, *paths, encoding=None):
+    """
+    Adds queries from *sql files in one or more `paths` to the module.
+    An `encoding` for the files can optionally be provided.
+
+    The named sql functions in files should be unique.
+    """
+    for p in paths:
+        self._add_path(p, encoding=encoding)
+    self.sqlpaths |= set(paths)
+
+
+
+def connect(self, connstr, **kwargs) +
+
+

Sets the connection string for SQL functions on this module.

+

See https://docs.sqlalchemy.org/en/13/core/engines.html for examples of +legal connection strings for different databases.

+
+Source code +
def connect(self, connstr, **kwargs):
+    """
+    Sets the connection string for SQL functions on this module.
+
+    See https://docs.sqlalchemy.org/en/13/core/engines.html for examples of
+    legal connection strings for different databases.
+    """
+    self.setengine(create_engine(connstr, **kwargs))
+
+
+
+def disconnect(self) +
+
+

Disassociates the module from any connection it was previously given.

+
+Source code +
def disconnect(self):
+    """
+    Disassociates the module from any connection it was previously given.
+    """
+    self.engine = None
+    self._sessionmaker = None
+
+
+
+def setengine(self, engine) +
+
+

Sets the SQLAlchemy engine for SQL functions on this module. This can +be used instead of the connect method, when more customization of the +connection engine is desired.

+

See also: https://docs.sqlalchemy.org/en/13/core/connections.html

+
+Source code +
def setengine(self, engine):
+    """
+    Sets the SQLAlchemy engine for SQL functions on this module. This can
+    be used instead of the connect method, when more customization of the
+    connection engine is desired.
+
+    See also: https://docs.sqlalchemy.org/en/13/core/connections.html
+    """
+    self.engine = engine
+    self._sessionmaker = sessionmaker(bind=engine)
+
+
+
+def transaction(self) +
+
+

Returns a session that manages a transaction scope, in which +many statements can be run. Statements run on this module will +automatically use this transaction. The normal use case +is to use this +like a context manager, rather than interact with the result:

+
foo = pugsql.module('sql/foo')
+with foo.transaction():
+    x = foo.get_x(x_id=1234)
+    foo.update_x(x_id=1234, x+1)
+
+# when the context manager exits, the transaction is committed.
+# if an exception occurs, it is rolled back.
+
+

The transaction is active for statements executed on the current thread +only.

+

For engines that support SAVEPOINT, calling this method a second time +begins a nested transaction.

+

For more info, see here: +https://docs.sqlalchemy.org/en/13/orm/session_transaction.html

+
+Source code +
@contextmanager
+def transaction(self):
+    """
+    Returns a session that manages a transaction scope, in which
+    many statements can be run. Statements run on this module will
+    automatically use this transaction. The normal use case  is to use this
+    like a context manager, rather than interact with the result:
+
+        foo = pugsql.module('sql/foo')
+        with foo.transaction():
+            x = foo.get_x(x_id=1234)
+            foo.update_x(x_id=1234, x+1)
+
+        # when the context manager exits, the transaction is committed.
+        # if an exception occurs, it is rolled back.
+
+    The transaction is active for statements executed on the current thread
+    only.
+
+    For engines that support SAVEPOINT, calling this method a second time
+    begins a nested transaction.
+
+    For more info, see here:
+    https://docs.sqlalchemy.org/en/13/orm/session_transaction.html
+    """
+    if not getattr(self._locals, 'session', None):
+        if not self._sessionmaker:
+            raise NoConnectionError()
+
+        self._locals.session = self._sessionmaker()
+
+        session = self._locals.session
+        try:
+            yield session
+            session.commit()
+        except Exception as e:
+            session.rollback()
+            raise e
+        finally:
+            session.close()
+            self._locals.session = None
+    else:
+        session = self._locals.session.begin_nested()
+        try:
+            yield session
+        except Exception as e:
+            session.rollback()
+            raise e
+        else:
+            with suppress(ResourceClosedError):
+                session.commit()
+
+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/context.html b/docs/doc/0.3.0/pugsql/context.html new file mode 100644 index 0000000..019489e --- /dev/null +++ b/docs/doc/0.3.0/pugsql/context.html @@ -0,0 +1,184 @@ + + + + + + +pugsql.context API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.context

+
+
+

Objects and methods used to keep track of positions in source files.

+
+Source code +
"""
+Objects and methods used to keep track of positions in source files.
+"""
+from collections import namedtuple
+
+
+_Context = namedtuple('Context', ['sqlfile', 'line', 'col'])
+
+
+def Context(sqlfile, line=0, col=1):
+    """
+    Returns a context object, which is a named tuple with the following fields:
+
+      * `sqlfile` - the path of the .sql file that is being processed.
+      * `line` - the line number currently being processed.
+      * `col` - the column number currently being processed.
+
+    Context objects are not mutable. Use the `pugsql.context.advance` method or
+    create new copies to change source context.
+    """
+    return _Context(sqlfile, line, col)
+
+
+def advance(context, lines=0, cols=0):
+    """
+    Advances the provided context object to indicate a farther position in the
+    same file. Passing `lines` advances lines, and passing `cols` advances
+    columns.
+
+    Returns a new Context object.
+
+    When advancing `lines`, e.g.
+
+        context.advance(ctx, lines=1)
+
+    The current `cols` is reset to zero.
+    """
+    c = context.col + cols if lines == 0 else 1
+    return _Context(context.sqlfile, context.line + lines, c)
+
+
+
+
+
+
+
+

Functions

+
+
+def Context(sqlfile, line=0, col=1) +
+
+

Returns a context object, which is a named tuple with the following fields:

+
    +
  • sqlfile - the path of the .sql file that is being processed.
  • +
  • line - the line number currently being processed.
  • +
  • col - the column number currently being processed.
  • +
+

Context objects are not mutable. Use the advance() method or +create new copies to change source context.

+
+Source code +
def Context(sqlfile, line=0, col=1):
+    """
+    Returns a context object, which is a named tuple with the following fields:
+
+      * `sqlfile` - the path of the .sql file that is being processed.
+      * `line` - the line number currently being processed.
+      * `col` - the column number currently being processed.
+
+    Context objects are not mutable. Use the `pugsql.context.advance` method or
+    create new copies to change source context.
+    """
+    return _Context(sqlfile, line, col)
+
+
+
+def advance(context, lines=0, cols=0) +
+
+

Advances the provided context object to indicate a farther position in the +same file. Passing lines advances lines, and passing cols advances +columns.

+

Returns a new Context object.

+

When advancing lines, e.g.

+
context.advance(ctx, lines=1)
+
+

The current cols is reset to zero.

+
+Source code +
def advance(context, lines=0, cols=0):
+    """
+    Advances the provided context object to indicate a farther position in the
+    same file. Passing `lines` advances lines, and passing `cols` advances
+    columns.
+
+    Returns a new Context object.
+
+    When advancing `lines`, e.g.
+
+        context.advance(ctx, lines=1)
+
+    The current `cols` is reset to zero.
+    """
+    c = context.col + cols if lines == 0 else 1
+    return _Context(context.sqlfile, context.line + lines, c)
+
+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/exceptions.html b/docs/doc/0.3.0/pugsql/exceptions.html new file mode 100644 index 0000000..ed8e2a8 --- /dev/null +++ b/docs/doc/0.3.0/pugsql/exceptions.html @@ -0,0 +1,238 @@ + + + + + + +pugsql.exceptions API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.exceptions

+
+
+

Exception types raised by PugSQL. PugSQL will also raise built-in exceptions +when they're appropriate.

+
+Source code +
"""
+Exception types raised by PugSQL. PugSQL will also raise built-in exceptions
+when they're appropriate.
+"""
+
+__pdoc__ = {}
+
+
+class ParserError(ValueError):
+    """
+    Exception raised when syntax errors are encountered parsing PugSQL files.
+    """
+    token = None
+
+    def __init__(self, message, token):
+        """
+        Creates a new ParserError given a message and the token indicating the
+        position of the error. Builds a user-facing error message indicating
+        the file, line, and column of the error.
+        """
+        super(ParserError, self).__init__(
+            'Error in %s:%s:%s - %s' % (
+                token.context.sqlfile,
+                token.context.line,
+                token.context.col,
+                message))
+        self.token = token
+
+
+__pdoc__['ParserError.token'] = (
+    'The `pugsql.lexer.Token` indicating the position of the error '
+    'encountered during parsing.')
+
+
+class NoConnectionError(RuntimeError):
+    """
+    Exception raised when a PugSQL module is not connected to a database.
+    """
+    def __init__(self):
+        super(NoConnectionError, self).__init__(
+            'No connection engine is configured. Pass a connection string '
+            "to the module's connect method, or pass a SQLAlchemy engine "
+            'to the set_engine method.')
+
+
+class InvalidArgumentError(AttributeError):
+    """
+    Exception raised when a PugSQL statement is called with incorrect
+    arguments.
+    """
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class InvalidArgumentError +(*args, **kwargs) +
+
+

Exception raised when a PugSQL statement is called with incorrect +arguments.

+
+Source code +
class InvalidArgumentError(AttributeError):
+    """
+    Exception raised when a PugSQL statement is called with incorrect
+    arguments.
+    """
+
+

Ancestors

+
    +
  • builtins.AttributeError
  • +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class NoConnectionError +
+
+

Exception raised when a PugSQL module is not connected to a database.

+
+Source code +
class NoConnectionError(RuntimeError):
+    """
+    Exception raised when a PugSQL module is not connected to a database.
+    """
+    def __init__(self):
+        super(NoConnectionError, self).__init__(
+            'No connection engine is configured. Pass a connection string '
+            "to the module's connect method, or pass a SQLAlchemy engine "
+            'to the set_engine method.')
+
+

Ancestors

+
    +
  • builtins.RuntimeError
  • +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+
+
+class ParserError +(message, token) +
+
+

Exception raised when syntax errors are encountered parsing PugSQL files.

+

Creates a new ParserError given a message and the token indicating the +position of the error. Builds a user-facing error message indicating +the file, line, and column of the error.

+
+Source code +
class ParserError(ValueError):
+    """
+    Exception raised when syntax errors are encountered parsing PugSQL files.
+    """
+    token = None
+
+    def __init__(self, message, token):
+        """
+        Creates a new ParserError given a message and the token indicating the
+        position of the error. Builds a user-facing error message indicating
+        the file, line, and column of the error.
+        """
+        super(ParserError, self).__init__(
+            'Error in %s:%s:%s - %s' % (
+                token.context.sqlfile,
+                token.context.line,
+                token.context.col,
+                message))
+        self.token = token
+
+

Ancestors

+
    +
  • builtins.ValueError
  • +
  • builtins.Exception
  • +
  • builtins.BaseException
  • +
+

Class variables

+
+
var token
+
+

The Token indicating the position of the error encountered during parsing.

+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/index.html b/docs/doc/0.3.0/pugsql/index.html new file mode 100644 index 0000000..e990706 --- /dev/null +++ b/docs/doc/0.3.0/pugsql/index.html @@ -0,0 +1,194 @@ + + + + + + +pugsql API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql

+
+
+

PugSQL is an anti-ORM that facilitates interacting with databases using SQL +in files. A minimal usage example:

+
# create a module from sql files on disk
+queries = pugsql.module('path/to/sql/files')
+
+# connect to the database and use the sql queries as functions
+queries.connect(connection_string)
+queries.update_username(user_id=42, username='mcfunley')
+
+
+Source code +
"""
+PugSQL is an anti-ORM that facilitates interacting with databases using SQL
+in files. A minimal usage example:
+
+    # create a module from sql files on disk
+    queries = pugsql.module('path/to/sql/files')
+
+    # connect to the database and use the sql queries as functions
+    queries.connect(connection_string)
+    queries.update_username(user_id=42, username='mcfunley')
+
+"""
+from . import compiler
+
+__version__ = '0.3.0'
+
+
+def module(sqlpath, encoding=None):
+    """
+    Compiles a set of SQL files in the directory specified by sqlpath, and
+    returns a module. The module contains a function for each named query
+    found in the files.
+
+        # create a module from sql files on disk
+        queries = pugsql.module('path/to/sql/files')
+
+        # connect to the database and use the sql queries as functions
+        queries.connect(connection_string)
+        queries.update_username(user_id=42, username='mcfunley')
+    """
+    return compiler.Module(sqlpath, encoding=encoding)
+
+
+__all__ = ['__version__', 'module',]
+
+
+
+

Sub-modules

+
+
pugsql.compiler
+
+

Code that processes SQL files and returns modules of database functions.

+
+
pugsql.context
+
+

Objects and methods used to keep track of positions in source files.

+
+
pugsql.exceptions
+
+

Exception types raised by PugSQL. PugSQL will also raise built-in exceptions +when they're appropriate.

+
+
pugsql.lexer
+
+

Functions that take strings and yield streams or dicts of Token +objects, keeping track of source location.

+
+
pugsql.parser
+
+

Code that consumes PugSQL-dialect sql strings and returns validated +Statement objects.

+
+
pugsql.statement
+
+

Compiled SQL function objects.

+
+
+
+
+
+
+

Functions

+
+
+def module(sqlpath, encoding=None) +
+
+

Compiles a set of SQL files in the directory specified by sqlpath, and +returns a module. The module contains a function for each named query +found in the files.

+
# create a module from sql files on disk
+queries = pugsql.module('path/to/sql/files')
+
+# connect to the database and use the sql queries as functions
+queries.connect(connection_string)
+queries.update_username(user_id=42, username='mcfunley')
+
+
+Source code +
def module(sqlpath, encoding=None):
+    """
+    Compiles a set of SQL files in the directory specified by sqlpath, and
+    returns a module. The module contains a function for each named query
+    found in the files.
+
+        # create a module from sql files on disk
+        queries = pugsql.module('path/to/sql/files')
+
+        # connect to the database and use the sql queries as functions
+        queries.connect(connection_string)
+        queries.update_username(user_id=42, username='mcfunley')
+    """
+    return compiler.Module(sqlpath, encoding=encoding)
+
+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/lexer.html b/docs/doc/0.3.0/pugsql/lexer.html new file mode 100644 index 0000000..245c580 --- /dev/null +++ b/docs/doc/0.3.0/pugsql/lexer.html @@ -0,0 +1,351 @@ + + + + + + +pugsql.lexer API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.lexer

+
+
+

Functions that take strings and yield streams or dicts of Token +objects, keeping track of source location.

+
+Source code +
"""
+Functions that take strings and yield streams or dicts of `pugsql.lexer.Token`
+objects, keeping track of source location.
+"""
+from . import context
+from collections import namedtuple
+import re
+
+
+__pdoc__ = {}
+
+
+Token = namedtuple('Token', ['tag', 'value', 'context'])
+__pdoc__['Token'] = 'A tagged string produced by the lexer.'
+__pdoc__['Token.tag'] = 'A character indicating the meaning of the `value`.'
+__pdoc__['Token.value'] = 'The string value of the `Token`.'
+__pdoc__['Token.context'] = ('A `pugsql.context.Context` for tracking source '
+                             'code information.')
+
+
+def lex(pugsql, ctx):
+    """
+    Splits the provided multiline PugSQL string into Tokens.
+    """
+    def generate(pugsql, ctx):
+        for line in pugsql.splitlines():
+            ctx = context.advance(ctx, lines=1)
+            yield _categorize(line, ctx)
+    return list(generate(pugsql, ctx))
+
+
+def _categorize(line, ctx):
+    line, ctx = _whitespace_advance(line, ctx)
+
+    if line.startswith('--'):
+        return Token('C', line, ctx)
+    return Token('Q', line, ctx)
+
+
+def lex_comment(token):
+    m = re.match(
+        r'(?P<lead>--\s*)'
+        r'(?P<keyword>\:[^ ]+)'
+        r'(?P<internalws>\s+)?'
+        r'(?P<rest>.*)?', token.value)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+    restbegin = sum(len(d[k] or '') for k in d.keys() if k != 'rest')
+
+    return {
+        'keyword': Token(
+            'K',
+            d['keyword'],
+            context.advance(token.context, cols=len(d['lead']))),
+
+        'rest': Token(
+            'S',
+            d['rest'],
+            context.advance(token.context, cols=restbegin))
+    }
+
+
+def lex_name(token):
+    line, ctx = _whitespace_advance(token.value, token.context)
+
+    m = re.match(
+        r'(?P<name>[^ ]+)'
+        r'(?P<internalws>\s+)?'
+        r'(?P<keyword>\:[^ ]+)?'
+        r'(?P<internalws2>\s+)?'
+        r'(?P<rest>.+)?', line)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+
+    kwbegin = len(d['name']) + len(d['internalws'] or '')
+    kwctx = context.advance(ctx, cols=kwbegin)
+    restbegin = sum(len(d[k] or '') for k in d.keys() if k != 'rest')
+    restctx = context.advance(ctx, cols=restbegin)
+    return {
+        'name': Token('N', d['name'], ctx),
+        'keyword': Token('K', d['keyword'], kwctx),
+        'rest': Token('S', d['rest'], restctx),
+    }
+
+
+def lex_result(token):
+    line, ctx = _whitespace_advance(token.value, token.context)
+    m = re.match(
+        r'(?P<keyword>\:[^ ]+)'
+        r'(?P<rest>.+)?', line)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+    restctx = context.advance(ctx, cols=len(d['keyword']))
+
+    return {
+        'keyword': Token('K', d['keyword'], ctx),
+        'rest': Token('S', d['rest'], restctx),
+    }
+
+
+def _whitespace_advance(line, ctx):
+    ctx = context.advance(ctx, cols=len(line) - len(line.lstrip()))
+    return line.strip(), ctx
+
+
+
+
+
+
+
+

Functions

+
+
+def lex(pugsql, ctx) +
+
+

Splits the provided multiline PugSQL string into Tokens.

+
+Source code +
def lex(pugsql, ctx):
+    """
+    Splits the provided multiline PugSQL string into Tokens.
+    """
+    def generate(pugsql, ctx):
+        for line in pugsql.splitlines():
+            ctx = context.advance(ctx, lines=1)
+            yield _categorize(line, ctx)
+    return list(generate(pugsql, ctx))
+
+
+
+def lex_comment(token) +
+
+
+
+Source code +
def lex_comment(token):
+    m = re.match(
+        r'(?P<lead>--\s*)'
+        r'(?P<keyword>\:[^ ]+)'
+        r'(?P<internalws>\s+)?'
+        r'(?P<rest>.*)?', token.value)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+    restbegin = sum(len(d[k] or '') for k in d.keys() if k != 'rest')
+
+    return {
+        'keyword': Token(
+            'K',
+            d['keyword'],
+            context.advance(token.context, cols=len(d['lead']))),
+
+        'rest': Token(
+            'S',
+            d['rest'],
+            context.advance(token.context, cols=restbegin))
+    }
+
+
+
+def lex_name(token) +
+
+
+
+Source code +
def lex_name(token):
+    line, ctx = _whitespace_advance(token.value, token.context)
+
+    m = re.match(
+        r'(?P<name>[^ ]+)'
+        r'(?P<internalws>\s+)?'
+        r'(?P<keyword>\:[^ ]+)?'
+        r'(?P<internalws2>\s+)?'
+        r'(?P<rest>.+)?', line)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+
+    kwbegin = len(d['name']) + len(d['internalws'] or '')
+    kwctx = context.advance(ctx, cols=kwbegin)
+    restbegin = sum(len(d[k] or '') for k in d.keys() if k != 'rest')
+    restctx = context.advance(ctx, cols=restbegin)
+    return {
+        'name': Token('N', d['name'], ctx),
+        'keyword': Token('K', d['keyword'], kwctx),
+        'rest': Token('S', d['rest'], restctx),
+    }
+
+
+
+def lex_result(token) +
+
+
+
+Source code +
def lex_result(token):
+    line, ctx = _whitespace_advance(token.value, token.context)
+    m = re.match(
+        r'(?P<keyword>\:[^ ]+)'
+        r'(?P<rest>.+)?', line)
+
+    if not m:
+        return None
+
+    d = m.groupdict()
+    restctx = context.advance(ctx, cols=len(d['keyword']))
+
+    return {
+        'keyword': Token('K', d['keyword'], ctx),
+        'rest': Token('S', d['rest'], restctx),
+    }
+
+
+
+
+
+

Classes

+
+
+class Token +(tag, value, context) +
+
+

A tagged string produced by the lexer.

+

Ancestors

+
    +
  • builtins.tuple
  • +
+

Instance variables

+
+
var context
+
+

A Context() for tracking source code information.

+
+
var tag
+
+

A character indicating the meaning of the value.

+
+
var value
+
+

The string value of the Token.

+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/parser.html b/docs/doc/0.3.0/pugsql/parser.html new file mode 100644 index 0000000..f58d17d --- /dev/null +++ b/docs/doc/0.3.0/pugsql/parser.html @@ -0,0 +1,269 @@ + + + + + + +pugsql.parser API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.parser

+
+
+

Code that consumes PugSQL-dialect sql strings and returns validated +Statement objects.

+
+Source code +
"""
+Code that consumes PugSQL-dialect sql strings and returns validated
+`pugsql.statement.Statement` objects.
+"""
+from . import lexer, statement, context
+from .exceptions import ParserError
+from itertools import takewhile
+import re
+
+
+_one = statement.One()
+_many = statement.Many()
+_affected = statement.Affected()
+_scalar = statement.Scalar()
+_insert = statement.Insert()
+_raw = statement.Raw()
+
+
+def parse(pugsql, ctx=None):
+    """
+    Processes the SQL string given in `pugsql` and returns a valid
+    `pugsql.statement.Statement` object.
+
+    Will raise a `pugsql.exceptions.ParserError` in any number of cases in
+    which the PugSQL metadata isn't valid. However, this does not parse and
+    validate the SQL statement.
+
+    `ctx` is a context object provided by the `pugsql.context.Context`
+    function, or `None`. If it is `None` a default context is created which
+    will indicate that the SQL is being parsed from a literal string.
+    """
+    ctx = ctx or context.Context('<literal>')
+
+    stream = lexer.lex(pugsql, ctx)
+    leading_comments = _leading_comments(stream)
+    rest = stream[len(leading_comments):]
+
+    cpr = _parse_comments(leading_comments)
+    sql = '\n'.join(cpr['unconsumed'] + [token.value for token in rest])
+
+    return statement.Statement(
+        name=cpr['name'],
+        sql=sql,
+        doc=cpr['doc'],
+        result=cpr['result'],
+        filename=ctx.sqlfile if ctx.sqlfile != '<literal>' else None)
+
+
+def _leading_comments(stream):
+    def is_comment(t):
+        # allow blank whitespace lines in the leading comment
+        return t.tag == 'C' or t.value == '' or re.match(r'^\s+$', t.value)
+    return list(takewhile(is_comment, stream))
+
+
+def _parse_comments(comments):
+    cpr = {
+        'name': None,
+        'result': _raw,
+        'doc': None,
+        'unconsumed': [],
+    }
+
+    for comment_token in comments:
+        toks = lexer.lex_comment(comment_token)
+        if not toks:
+            cpr['unconsumed'].append(comment_token.value)
+        elif toks['keyword'].value == ':name':
+            _consume_name(cpr, toks['rest'])
+        elif toks['keyword'].value == ':result':
+            _consume_result(cpr, toks['rest'])
+        else:
+            cpr['unconsumed'].append(comment_token.value)
+
+    return cpr
+
+
+def _consume_result(cpr, rest):
+    if not rest.value:
+        raise ParserError('expected keyword', rest)
+    _set_result(cpr, rest)
+
+
+def _consume_name(cpr, rest):
+    tokens = lexer.lex_name(rest)
+    if not tokens:
+        raise ParserError('expected a query name.', rest)
+
+    name = tokens['name'].value
+    if not _is_legal_name(name):
+        raise ParserError(
+            "'%s' is not a legal Python function name." % name,
+            tokens['name'])
+
+    cpr['name'] = name
+
+    if not tokens['keyword'].value:
+        if tokens['rest'].value:
+            raise ParserError(
+                'encountered unexpected input after query name.',
+                tokens['rest'])
+        return
+
+    if tokens['rest'].value:
+        raise ParserError(
+            'encountered unexpected input after result type.',
+            tokens['rest'])
+
+    _set_result(cpr, tokens['keyword'])
+
+
+def _set_result(cpr, ktok):
+    tokens = lexer.lex_result(ktok)
+    if not tokens:
+        raise ParserError('expected keyword', ktok)
+
+    if tokens['rest'].value:
+        raise ParserError(
+            'encountered unexpected input after result type',
+            tokens['rest'])
+
+    keyword = tokens['keyword'].value
+
+    if keyword == ':one' or keyword == ':1':
+        cpr['result'] = _one
+    elif keyword == ':many' or keyword == ':*':
+        cpr['result'] = _many
+    elif keyword == ':affected' or keyword == ':n':
+        cpr['result'] = _affected
+    elif keyword == ':insert':
+        cpr['result'] = _insert
+    elif keyword == ':scalar':
+        cpr['result'] = _scalar
+    elif keyword != ':raw':
+        raise ParserError("unrecognized keyword '%s'" % keyword, ktok)
+
+
+def _is_legal_name(value):
+    return re.match(r'^[a-zA-Z_][a-zA-Z0-9_]+$', value) is not None
+
+
+
+
+
+
+
+

Functions

+
+
+def parse(pugsql, ctx=None) +
+
+

Processes the SQL string given in pugsql and returns a valid +Statement object.

+

Will raise a ParserError in any number of cases in +which the PugSQL metadata isn't valid. However, this does not parse and +validate the SQL statement.

+

ctx is a context object provided by the Context() +function, or None. If it is None a default context is created which +will indicate that the SQL is being parsed from a literal string.

+
+Source code +
def parse(pugsql, ctx=None):
+    """
+    Processes the SQL string given in `pugsql` and returns a valid
+    `pugsql.statement.Statement` object.
+
+    Will raise a `pugsql.exceptions.ParserError` in any number of cases in
+    which the PugSQL metadata isn't valid. However, this does not parse and
+    validate the SQL statement.
+
+    `ctx` is a context object provided by the `pugsql.context.Context`
+    function, or `None`. If it is `None` a default context is created which
+    will indicate that the SQL is being parsed from a literal string.
+    """
+    ctx = ctx or context.Context('<literal>')
+
+    stream = lexer.lex(pugsql, ctx)
+    leading_comments = _leading_comments(stream)
+    rest = stream[len(leading_comments):]
+
+    cpr = _parse_comments(leading_comments)
+    sql = '\n'.join(cpr['unconsumed'] + [token.value for token in rest])
+
+    return statement.Statement(
+        name=cpr['name'],
+        sql=sql,
+        doc=cpr['doc'],
+        result=cpr['result'],
+        filename=ctx.sqlfile if ctx.sqlfile != '<literal>' else None)
+
+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/docs/doc/0.3.0/pugsql/statement.html b/docs/doc/0.3.0/pugsql/statement.html new file mode 100644 index 0000000..c04cd88 --- /dev/null +++ b/docs/doc/0.3.0/pugsql/statement.html @@ -0,0 +1,815 @@ + + + + + + +pugsql.statement API documentation + + + + + + + + + + + + +
+
+
+

Module pugsql.statement

+
+
+

Compiled SQL function objects.

+
+Source code +
"""
+Compiled SQL function objects.
+"""
+from .exceptions import InvalidArgumentError
+from contextlib import contextmanager
+import sqlalchemy
+from sqlalchemy.ext.compiler import compiles
+from sqlalchemy.sql.expression import BindParameter
+import threading
+
+
+_locals = threading.local()
+
+
+@contextmanager
+def _compile_context(multiparams, params):
+    _locals.compile_context = {
+        'multiparams': multiparams,
+        'params': params,
+    }
+    try:
+        yield
+    finally:
+        _locals.compile_context = None
+
+
+@compiles(BindParameter)
+def _visit_bindparam(element, compiler, **kw):
+    cc = getattr(_locals, 'compile_context', None)
+    if cc:
+        if _is_expanding_param(element, cc):
+            element.expanding = True
+    return compiler.visit_bindparam(element)
+
+
+def _is_expanding_param(element, cc):
+    if element.key not in cc['params']:
+        return False
+    return isinstance(cc['params'][element.key], (tuple, list))
+
+
+class Result(object):
+    def transform(self, r):
+        raise NotImplementedError()
+
+    @property
+    def display_type(self):
+        raise NotImplementedError()
+
+
+class One(Result):
+    def transform(self, r):
+        row = r.first()
+        if row:
+            return { k: v for k, v in zip(r.keys(), row) }
+        return None
+
+    @property
+    def display_type(self):
+        return 'row'
+
+
+class Many(Result):
+    def transform(self, r):
+        ks = r.keys()
+        return ({ k: v for k, v in zip(ks, row)} for row in r.fetchall())
+
+    @property
+    def display_type(self):
+        return 'rows'
+
+
+class Affected(Result):
+    def transform(self, r):
+        return r.rowcount
+
+    @property
+    def display_type(self):
+        return 'rowcount'
+
+
+class Scalar(Result):
+    def transform(self, r):
+        row = r.first()
+        if not row:
+            return None
+        return row[0]
+
+    @property
+    def display_type(self):
+        return 'scalar'
+
+
+class Insert(Scalar):
+    def transform(self, r):
+        if hasattr(r, 'lastrowid'):
+            return r.lastrowid
+        return super(Insert, self).transform(r)
+
+    @property
+    def display_type(self):
+        return 'insert'
+
+
+class Raw(Result):
+    def transform(self, r):
+        return r
+
+    @property
+    def display_type(self):
+        return 'raw'
+
+
+class Statement(object):
+    def __init__(self, name, sql, doc, result, filename=None):
+        self.filename = filename
+
+        if not name:
+            self._value_err('Statement must have a name.')
+
+        if sql is None:
+            self._value_err('Statement must have a SQL string.')
+        sql = sql.strip()
+        if not len(sql):
+            self._value_err('SQL string cannot be empty.')
+
+        if not result:
+            self._value_err('Statement must have a result type.')
+
+        self.name = name
+        self.sql = sql
+        self.doc = doc
+        self.result = result
+        self.filename = filename
+        self._module = None
+        self._text = sqlalchemy.sql.text(self.sql)
+
+    def _value_err(self, msg):
+        if self.filename:
+            raise ValueError('%s In: %s' % (msg, self.filename))
+        raise ValueError(msg)
+
+    def set_module(self, module):
+        self._module = module
+
+    def _assert_module(self):
+        if self._module is None:
+            raise RuntimeError(
+                'This statement is not associated with a module')
+
+    def __call__(self, *multiparams, **params):
+        self._assert_module()
+        multiparams, params = self._convert_params(multiparams, params)
+        self._validateMultiparams(params, multiparams)
+        with _compile_context(multiparams, params):
+            try:
+                r = self._module._execute(self._text, *multiparams, **params)
+            except AttributeError as e:
+                if str(e) == "'tuple' object has no attribute 'keys'":
+                    self._positionalArgError()
+                raise
+        return self.result.transform(r)
+
+    def _validateMultiparams(self, params, multiparams):
+        # try to catch some common usage mistakes
+        if not len(multiparams):
+            return
+
+        if len(params):
+            # currently never supported to pass both positional args and
+            # keywords
+            self._positionalArgError()
+
+        for p in multiparams:
+            # multiparams are allowed when they're tuples/rows/etc to be e.g.
+            # inserted
+            if not type(p) in { dict, list, set }:
+                self._positionalArgError()
+
+    def _positionalArgError(self):
+        raise InvalidArgumentError(
+            'Pass keyword arguments to statements (received '
+            'positional arguments).')
+
+    def _convert_params(self, multiparams, params):
+        def conv(x):
+            if isinstance(x, set):
+                return tuple(x)
+            return x
+        return (
+            [conv(p) for p in multiparams],
+            { k: conv(v) for k, v in params.items() })
+
+    def _param_names(self):
+        def kfn(p):
+            return self.sql.index(':' + p)
+        return sorted(self._text._bindparams.keys(), key=kfn)
+
+    def __str__(self):
+        paramstr = ', '.join(['%s=None' % k for k in self._param_names()])
+        return 'pugsql.statement.Statement: %s(%s) :: %s' % (
+            self.name, paramstr, self.result.display_type)
+
+    def __repr__(self):
+        return str(self)
+
+
+
+
+
+
+
+
+
+

Classes

+
+
+class Affected +
+
+
+
+Source code +
class Affected(Result):
+    def transform(self, r):
+        return r.rowcount
+
+    @property
+    def display_type(self):
+        return 'rowcount'
+
+

Ancestors

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'rowcount'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    return r.rowcount
+
+
+
+
+
+class Insert +
+
+
+
+Source code +
class Insert(Scalar):
+    def transform(self, r):
+        if hasattr(r, 'lastrowid'):
+            return r.lastrowid
+        return super(Insert, self).transform(r)
+
+    @property
+    def display_type(self):
+        return 'insert'
+
+

Ancestors

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'insert'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    if hasattr(r, 'lastrowid'):
+        return r.lastrowid
+    return super(Insert, self).transform(r)
+
+
+
+
+
+class Many +
+
+
+
+Source code +
class Many(Result):
+    def transform(self, r):
+        ks = r.keys()
+        return ({ k: v for k, v in zip(ks, row)} for row in r.fetchall())
+
+    @property
+    def display_type(self):
+        return 'rows'
+
+

Ancestors

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'rows'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    ks = r.keys()
+    return ({ k: v for k, v in zip(ks, row)} for row in r.fetchall())
+
+
+
+
+
+class One +
+
+
+
+Source code +
class One(Result):
+    def transform(self, r):
+        row = r.first()
+        if row:
+            return { k: v for k, v in zip(r.keys(), row) }
+        return None
+
+    @property
+    def display_type(self):
+        return 'row'
+
+

Ancestors

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'row'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    row = r.first()
+    if row:
+        return { k: v for k, v in zip(r.keys(), row) }
+    return None
+
+
+
+
+
+class Raw +
+
+
+
+Source code +
class Raw(Result):
+    def transform(self, r):
+        return r
+
+    @property
+    def display_type(self):
+        return 'raw'
+
+

Ancestors

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'raw'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    return r
+
+
+
+
+
+class Result +
+
+
+
+Source code +
class Result(object):
+    def transform(self, r):
+        raise NotImplementedError()
+
+    @property
+    def display_type(self):
+        raise NotImplementedError()
+
+

Subclasses

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    raise NotImplementedError()
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    raise NotImplementedError()
+
+
+
+
+
+class Scalar +
+
+
+
+Source code +
class Scalar(Result):
+    def transform(self, r):
+        row = r.first()
+        if not row:
+            return None
+        return row[0]
+
+    @property
+    def display_type(self):
+        return 'scalar'
+
+

Ancestors

+ +

Subclasses

+ +

Instance variables

+
+
var display_type
+
+
+
+Source code +
@property
+def display_type(self):
+    return 'scalar'
+
+
+
+

Methods

+
+
+def transform(self, r) +
+
+
+
+Source code +
def transform(self, r):
+    row = r.first()
+    if not row:
+        return None
+    return row[0]
+
+
+
+
+
+class Statement +(name, sql, doc, result, filename=None) +
+
+
+
+Source code +
class Statement(object):
+    def __init__(self, name, sql, doc, result, filename=None):
+        self.filename = filename
+
+        if not name:
+            self._value_err('Statement must have a name.')
+
+        if sql is None:
+            self._value_err('Statement must have a SQL string.')
+        sql = sql.strip()
+        if not len(sql):
+            self._value_err('SQL string cannot be empty.')
+
+        if not result:
+            self._value_err('Statement must have a result type.')
+
+        self.name = name
+        self.sql = sql
+        self.doc = doc
+        self.result = result
+        self.filename = filename
+        self._module = None
+        self._text = sqlalchemy.sql.text(self.sql)
+
+    def _value_err(self, msg):
+        if self.filename:
+            raise ValueError('%s In: %s' % (msg, self.filename))
+        raise ValueError(msg)
+
+    def set_module(self, module):
+        self._module = module
+
+    def _assert_module(self):
+        if self._module is None:
+            raise RuntimeError(
+                'This statement is not associated with a module')
+
+    def __call__(self, *multiparams, **params):
+        self._assert_module()
+        multiparams, params = self._convert_params(multiparams, params)
+        self._validateMultiparams(params, multiparams)
+        with _compile_context(multiparams, params):
+            try:
+                r = self._module._execute(self._text, *multiparams, **params)
+            except AttributeError as e:
+                if str(e) == "'tuple' object has no attribute 'keys'":
+                    self._positionalArgError()
+                raise
+        return self.result.transform(r)
+
+    def _validateMultiparams(self, params, multiparams):
+        # try to catch some common usage mistakes
+        if not len(multiparams):
+            return
+
+        if len(params):
+            # currently never supported to pass both positional args and
+            # keywords
+            self._positionalArgError()
+
+        for p in multiparams:
+            # multiparams are allowed when they're tuples/rows/etc to be e.g.
+            # inserted
+            if not type(p) in { dict, list, set }:
+                self._positionalArgError()
+
+    def _positionalArgError(self):
+        raise InvalidArgumentError(
+            'Pass keyword arguments to statements (received '
+            'positional arguments).')
+
+    def _convert_params(self, multiparams, params):
+        def conv(x):
+            if isinstance(x, set):
+                return tuple(x)
+            return x
+        return (
+            [conv(p) for p in multiparams],
+            { k: conv(v) for k, v in params.items() })
+
+    def _param_names(self):
+        def kfn(p):
+            return self.sql.index(':' + p)
+        return sorted(self._text._bindparams.keys(), key=kfn)
+
+    def __str__(self):
+        paramstr = ', '.join(['%s=None' % k for k in self._param_names()])
+        return 'pugsql.statement.Statement: %s(%s) :: %s' % (
+            self.name, paramstr, self.result.display_type)
+
+    def __repr__(self):
+        return str(self)
+
+

Methods

+
+
+def set_module(self, module) +
+
+
+
+Source code +
def set_module(self, module):
+    self._module = module
+
+
+
+
+
+
+
+ +
+ + + + + + + \ No newline at end of file