{ "info": { "author": "Samuel Colvin", "author_email": "s@muelcolvin.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Environment :: MacOS X", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: SQL", "Topic :: Internet", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# buildpg\n\n[![CI](https://github.com/samuelcolvin/buildpg/workflows/ci/badge.svg?event=push)](https://github.com/samuelcolvin/buildpg/actions?query=event%3Apush+branch%3Amaster+workflow%3Aci)\n[![Coverage](https://codecov.io/gh/samuelcolvin/buildpg/branch/master/graph/badge.svg)](https://codecov.io/gh/samuelcolvin/buildpg)\n[![pypi](https://img.shields.io/pypi/v/buildpg.svg)](https://pypi.python.org/pypi/buildpg)\n[![versions](https://img.shields.io/pypi/pyversions/buildpg.svg)](https://github.com/samuelcolvin/buildpg)\n[![license](https://img.shields.io/github/license/samuelcolvin/buildpg.svg)](https://github.com/samuelcolvin/buildpg/blob/master/LICENSE)\n\nQuery building for the postgresql prepared statements and asyncpg.\n\nLots of more powerful features, including full clause construction, multiple values, logic functions,\nquery pretty-printing and different variable substitution - below is just a very quick summary.\nPlease check the code and tests for examples.\n\n## Building Queries\n\nSimple variable substitution:\n\n```py\nfrom buildpg import render\n\nrender('select * from mytable where x=:foo and y=:bar', foo=123, bar='whatever')\n>> 'select * from mytable where x=$1 and y=$2', [123, 'whatever']\n```\n\n\nUse of `V` to substitute constants:\n\n```py\nfrom buildpg import V, render\n\nrender('select * from mytable where :col=:foo', col=V('x'), foo=456)\n>> 'select * from mytable where x=$1', [456]\n```\n\nComplex logic:\n\n```py\nfrom buildpg import V, funcs, render\n\nwhere_logic = V('foo.bar') == 123\nif spam_value:\n where_logic &= V('foo.spam') <= spam_value\n\nif exclude_cake:\n where_logic &= funcs.not_(V('foo.cake').in_([1, 2, 3]))\n\nrender('select * from foo :where', where=where_logic)\n>> 'select * from foo foo.bar = $1 AND foo.spam <= $2 AND not(foo.cake in $3)', [123, 123, ['x', 'y']]\n```\n\nValues usage:\n\n```py\nfrom buildpg import Values, render\n\nrender('insert into the_table (:values__names) values :values', values=Values(a=123, b=456, c='hello'))\n>> 'insert into the_table (a, b, c) values ($1, $2, $3)', [123, 456, 'hello']\n```\n\n## With asyncpg\n\nAs a wrapper around *asyncpg*:\n\n```py\nimport asyncio\nfrom buildpg import asyncpg\n\nasync def main():\n async with asyncpg.create_pool_b('postgres://postgres@localhost:5432/db') as pool:\n await pool.fetchval_b('select spam from mytable where x=:foo and y=:bar', foo=123, bar='whatever')\n >> 42\n\nasyncio.run(main())\n```\n\n\nBoth the pool and connections have `*_b` variants of all common query methods:\n\n- `execute_b`\n- `executemany_b`\n- `fetch_b`\n- `fetchval_b`\n- `fetchrow_b`\n- `cursor_b`\n\n\n## Operators\n\n| Python operator/function | SQL operator |\n| ------------------------ | ------------ |\n| `&` | `AND` |\n| `|` | `OR` |\n| `=` | `=` |\n| `!=` | `!=` |\n| `<` | `<` |\n| `<=` | `<=` |\n| `>` | `>` |\n| `>=` | `>=` |\n| `+` | `+` |\n| `-` | `-` |\n| `*` | `*` |\n| `/` | `/` |\n| `%` | `%` |\n| `**` | `^` |\n| `-` | `-` |\n| `~` | `not(...)` |\n| `sqrt` | `|/` |\n| `abs` | `@` |\n| `contains` | `@>` |\n| `contained_by` | `<@` |\n| `overlap` | `&&` |\n| `like` | `LIKE` |\n| `ilike` | `ILIKE` |\n| `cat` | `||` |\n| `in_` | `in` |\n| `from_` | `from` |\n| `at_time_zone` | `AT TIME ZONE` |\n| `matches` | `@@` |\n| `is_` | `is` |\n| `is_not` | `is not` |\n| `for_` | `for` |\n| `factorial` | `!` |\n| `cast` | `::` |\n| `asc` | `ASC` |\n| `desc` | `DESC` |\n| `comma` | `,` |\n| `on` | `ON` |\n| `as_` | `AS` |\n| `nulls_first` | `NULLS FIRST` |\n| `nulls_last` | `NULLS LAST` |\n\nUsage:\n\n```py\nfrom buildpg import V, S, render\n\ndef show(component):\n sql, params = render(':c', c=component)\n print(f'sql=\"{sql}\" params={params}')\n\nshow(V('foobar').contains([1, 2, 3]))\n#> sql=\"foobar @> $1\" params=[[1, 2, 3]]\nshow(V('foobar') == 4)\n#> sql=\"foobar = $1\" params=[4]\nshow(~V('foobar'))\n#> sql=\"not(foobar)\" params=[]\nshow(S(625).sqrt())\n#> sql=\"|/ $1\" params=[625]\nshow(V('foo').is_not('true'))\n#> sql=\"foo is not true\" params=[]\n```\n\n## Functions\n\n| Python function | SQL function |\n| ------------------------------------------- | ------------- |\n| `AND(*args)` | ` and ...` |\n| `OR(*args)` | ` or ...` |\n| `NOT(arg)` | `not()` |\n| `comma_sep(*args)` | `, , ...` |\n| `count(expr)` | `count(expr)` |\n| `any(arg)` | `any()` |\n| `now()` | `now()` |\n| `cast(v, cast_type)` | `::` |\n| `upper(string)` | `upper()` |\n| `lower(string)` | `lower()` |\n| `length(string)` | `length()` |\n| `left(string, n)` | `left(, )` |\n| `right(string, n)` | `right(, )` |\n| `extract(expr)` | `extract()` |\n| `sqrt(n)` | `|/` |\n| `abs(n)` | `@` |\n| `factorial(n)` | `!` |\n| `position(substring, string)` | `position( in from )` |\n| `to_tsquery(arg1, text-None)` | `to_tsquery()` |\n\nUsage:\n\n```py\nfrom buildpg import V, render, funcs\n\ndef show(component):\n sql, params = render(':c', c=component)\n print(f'sql=\"{sql}\" params={params}')\n\nshow(funcs.AND(V('x') == 4, V('y') > 6))\n#> sql=\"x = $1 AND y > $2\" params=[4, 6]\nshow(funcs.position('foo', 'this has foo in it'))\n#> sql=\"position($1 in $2)\" params=['foo', 'this has foo in it']\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/samuelcolvin/buildpg", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "buildpg", "package_url": "https://pypi.org/project/buildpg/", "platform": "", "project_url": "https://pypi.org/project/buildpg/", "project_urls": { "Homepage": "https://github.com/samuelcolvin/buildpg" }, "release_url": "https://pypi.org/project/buildpg/0.4/", "requires_dist": null, "requires_python": ">=3.6", "summary": "Query building for the postgresql prepared statements and asyncpg.", "version": "0.4", "yanked": false, "yanked_reason": null }, "last_serial": 13047625, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "8fddc5d595600bd4c4d328a3d62b80c5", "sha256": "7334deaf81f143cace9c9ab67a56dc434cc59b455596dc2d5f47bb54dc16d52a" }, "downloads": -1, "filename": "buildpg-0.0.1-py36-none-any.whl", "has_sig": false, "md5_digest": "8fddc5d595600bd4c4d328a3d62b80c5", "packagetype": "bdist_wheel", "python_version": "py36", "requires_python": ">=3.6", "size": 7577, "upload_time": "2018-06-07T15:42:42", "upload_time_iso_8601": "2018-06-07T15:42:42.514835Z", "url": "https://files.pythonhosted.org/packages/ea/39/b7e76037e9156b609606cfcb8542cf2c785bbc1620748d2b579bece7e9a4/buildpg-0.0.1-py36-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9e56267f8f5667fe88e9ccdc6f0151dc", "sha256": "b1b16973f1332bfd6c3d060456b72b75ce0aa61648fd0f9a7ae02a0fa1d1fa77" }, "downloads": -1, "filename": "buildpg-0.0.1.tar.gz", "has_sig": false, "md5_digest": "9e56267f8f5667fe88e9ccdc6f0151dc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5909, "upload_time": "2018-06-07T15:42:43", "upload_time_iso_8601": "2018-06-07T15:42:43.537216Z", "url": "https://files.pythonhosted.org/packages/5c/ba/1d1f10964b3ae3a1190985c6d220fa795b02c05cf2c95faa0801b58ed5bb/buildpg-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "aa6777239d6155b4770b6df59cd791c8", "sha256": "a7f3cbec4d1703cde2f4d1a1c5873480406830b33fb070cd3760b435b0efe8b7" }, "downloads": -1, "filename": "buildpg-0.0.2-py36-none-any.whl", "has_sig": false, "md5_digest": "aa6777239d6155b4770b6df59cd791c8", "packagetype": "bdist_wheel", "python_version": "py36", "requires_python": ">=3.6", "size": 8210, "upload_time": "2018-06-13T11:21:10", "upload_time_iso_8601": "2018-06-13T11:21:10.223167Z", "url": "https://files.pythonhosted.org/packages/db/d5/d2c25ff5f981f9c9965cec809041bd82f8ae1ae9499b39060616bb95f222/buildpg-0.0.2-py36-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "81942c86bf9545c138bd5fd6e02fac66", "sha256": "47a0ec960333d650882d1c84c345e274ced21d3a17510a322b6977a02ca3462a" }, "downloads": -1, "filename": "buildpg-0.0.2.tar.gz", "has_sig": false, "md5_digest": "81942c86bf9545c138bd5fd6e02fac66", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6516, "upload_time": "2018-06-13T11:21:11", "upload_time_iso_8601": "2018-06-13T11:21:11.300677Z", "url": "https://files.pythonhosted.org/packages/d7/5c/5504c26a4eb46b6fe8fa1a970c417d3c9a766d3fbb1bbdb3e203cf6fb329/buildpg-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1": [ { "comment_text": "", "digests": { "md5": "5920811569d01edfdf3b6a16670df226", "sha256": "951d37966adfa6ef622b01abb57ae5fdf759fd95c66be0472180faa06a3bc36b" }, "downloads": -1, "filename": "buildpg-0.1-py36.py37-none-any.whl", "has_sig": false, "md5_digest": "5920811569d01edfdf3b6a16670df226", "packagetype": "bdist_wheel", "python_version": "py36.py37", "requires_python": ">=3.6", "size": 10475, "upload_time": "2019-03-19T17:28:28", "upload_time_iso_8601": "2019-03-19T17:28:28.742596Z", "url": "https://files.pythonhosted.org/packages/72/1a/37cae9cbd03eda62ab45bacb603ce1fce10a8cdaeda5a8d0c49f796a85ba/buildpg-0.1-py36.py37-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d5bc97c2647d6252ee5f32ab49ef2c36", "sha256": "8d322f9397f9c2f26ef122182b0ced2cb7539f5482474417c5f10de3fba62924" }, "downloads": -1, "filename": "buildpg-0.1.tar.gz", "has_sig": false, "md5_digest": "d5bc97c2647d6252ee5f32ab49ef2c36", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 9505, "upload_time": "2019-03-19T17:28:30", "upload_time_iso_8601": "2019-03-19T17:28:30.031831Z", "url": "https://files.pythonhosted.org/packages/bc/8b/60d1f6764c4e0e278cf1dbdc9711c1bf137e1b5974366281dc06612b5831/buildpg-0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2": [ { "comment_text": "", "digests": { "md5": "8d0dd2d3eccf48851e408db0ad3dde5d", "sha256": "d4e648da5c8dde1336d5a91d0305b214a941206f4ac0458bfadfc11aa227be80" }, "downloads": -1, "filename": "buildpg-0.2-py36.py37-none-any.whl", "has_sig": false, "md5_digest": "8d0dd2d3eccf48851e408db0ad3dde5d", "packagetype": "bdist_wheel", "python_version": "py36.py37", "requires_python": ">=3.6", "size": 11478, "upload_time": "2019-05-02T14:11:01", "upload_time_iso_8601": "2019-05-02T14:11:01.050962Z", "url": "https://files.pythonhosted.org/packages/3b/1b/68dbaf295dd49a4c36e19849e71764df71212e9595bb94c0de43291e9e5f/buildpg-0.2-py36.py37-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8c6aabdcdef3258127b6fef3d12a0f02", "sha256": "9e9dcf009fd0605e2b2caf1b224f9382652b8b11b366c2e39178e7ee297f83e0" }, "downloads": -1, "filename": "buildpg-0.2.tar.gz", "has_sig": false, "md5_digest": "8c6aabdcdef3258127b6fef3d12a0f02", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11699, "upload_time": "2019-05-02T14:11:02", "upload_time_iso_8601": "2019-05-02T14:11:02.417391Z", "url": "https://files.pythonhosted.org/packages/a1/86/82b4a25a378d6d4c5722a6bdadaa3ca0fa66804b695e1150a9233f3a8785/buildpg-0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "3d36a28158d4cee673a03c38982fe6ed", "sha256": "616cc71e45df93a5bfde9f68cb5867574265e1be9e478e2133d574561d839bed" }, "downloads": -1, "filename": "buildpg-0.2.1-py36.py37-none-any.whl", "has_sig": false, "md5_digest": "3d36a28158d4cee673a03c38982fe6ed", "packagetype": "bdist_wheel", "python_version": "py36.py37", "requires_python": ">=3.6", "size": 11573, "upload_time": "2019-05-02T15:15:38", "upload_time_iso_8601": "2019-05-02T15:15:38.498787Z", "url": "https://files.pythonhosted.org/packages/3b/3f/2299b25174d190ec7151e156429290d0b208be684f1531a450766851e69c/buildpg-0.2.1-py36.py37-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "06b3e501a5581ba3f6dac50d30d96de2", "sha256": "175eb3e4b7b4b0ff48be1dc01835622ea4c874600ca5a45696bea4a816d642cd" }, "downloads": -1, "filename": "buildpg-0.2.1.tar.gz", "has_sig": false, "md5_digest": "06b3e501a5581ba3f6dac50d30d96de2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11804, "upload_time": "2019-05-02T15:15:39", "upload_time_iso_8601": "2019-05-02T15:15:39.580559Z", "url": "https://files.pythonhosted.org/packages/4c/c3/d321bf7b1c60fdd88f51e909039692cd923e62799a4891f5de151285bfbe/buildpg-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "81983acbddd1916855ef5b79d461ba2e", "sha256": "39aad8e4b8c9cb70c03d4754c7751bec40ade7d7181c3779bcd25de708a42afc" }, "downloads": -1, "filename": "buildpg-0.2.2-py36.py37-none-any.whl", "has_sig": false, "md5_digest": "81983acbddd1916855ef5b79d461ba2e", "packagetype": "bdist_wheel", "python_version": "py36.py37", "requires_python": ">=3.6", "size": 11598, "upload_time": "2019-10-29T11:13:02", "upload_time_iso_8601": "2019-10-29T11:13:02.930357Z", "url": "https://files.pythonhosted.org/packages/07/6e/639179c46007d52891d53f3af0327540b91a521c753eda39488d06524cc9/buildpg-0.2.2-py36.py37-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7e09d8f7b708a71492b214e006b2a284", "sha256": "9ee1293e907e5e16e2cb8fd39dc7aedc48044fbc727cbd9ed749010a47928906" }, "downloads": -1, "filename": "buildpg-0.2.2.tar.gz", "has_sig": false, "md5_digest": "7e09d8f7b708a71492b214e006b2a284", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11013, "upload_time": "2019-10-29T11:13:04", "upload_time_iso_8601": "2019-10-29T11:13:04.876851Z", "url": "https://files.pythonhosted.org/packages/45/b7/a695d900e8455f48b2e668904a176f8ec2b51d5c92640c000d2a6f5a019d/buildpg-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "fcb3390fd6076f7e85fee871c0ed8265", "sha256": "5b0a2e730f9139e76bacb9246630fe7e91658fd14f95a1a3dfd337ff5a7b08c6" }, "downloads": -1, "filename": "buildpg-0.2.3-py36.py37-none-any.whl", "has_sig": false, "md5_digest": "fcb3390fd6076f7e85fee871c0ed8265", "packagetype": "bdist_wheel", "python_version": "py36.py37", "requires_python": ">=3.6", "size": 11602, "upload_time": "2019-11-22T15:14:35", "upload_time_iso_8601": "2019-11-22T15:14:35.790255Z", "url": "https://files.pythonhosted.org/packages/93/6a/e7120d03d563c1a574aab649513698c871f977fc92498d3f10f3a16cfac5/buildpg-0.2.3-py36.py37-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "407bffa0e62c0ca5cd3f867a8eae120d", "sha256": "fd503e2024d520d67626482283318362637e573f3ce1f08e1a6544b2d3a4c120" }, "downloads": -1, "filename": "buildpg-0.2.3.tar.gz", "has_sig": false, "md5_digest": "407bffa0e62c0ca5cd3f867a8eae120d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11016, "upload_time": "2019-11-22T15:14:37", "upload_time_iso_8601": "2019-11-22T15:14:37.411154Z", "url": "https://files.pythonhosted.org/packages/51/27/e1d07f18e9d07c88fd4efb54e57e16e034086a553932cb567201e14d8b8f/buildpg-0.2.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3": [ { "comment_text": "", "digests": { "md5": "aff5a419ee2e712c6799579c935aac55", "sha256": "1384d4b92f5404da9cdbdd6382b71cae599ec83f4e311783377c4c3c86c1bca9" }, "downloads": -1, "filename": "buildpg-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "aff5a419ee2e712c6799579c935aac55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 11679, "upload_time": "2021-07-21T10:28:32", "upload_time_iso_8601": "2021-07-21T10:28:32.237283Z", "url": "https://files.pythonhosted.org/packages/4b/02/8293f0c76a77396b408b5dc214a09afeb100e443dd76695853251df34934/buildpg-0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ef87f11931598972a8c665ff72afc64b", "sha256": "1e17caf7de6dbc3dd02447459e8589747a57965c638b6eb0f6855072cc28cc40" }, "downloads": -1, "filename": "buildpg-0.3.tar.gz", "has_sig": false, "md5_digest": "ef87f11931598972a8c665ff72afc64b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12454, "upload_time": "2021-07-21T10:28:33", "upload_time_iso_8601": "2021-07-21T10:28:33.843171Z", "url": "https://files.pythonhosted.org/packages/07/70/a7647dc0c3faffd7f12dafd87baf144e6cae234276542bcde88d3456e97f/buildpg-0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4": [ { "comment_text": "", "digests": { "md5": "fe9ed8f194b65e8323991cbc74f0e8eb", "sha256": "20d539976c81ea6f5529d3930016b0482ed0ff06def3d6da79d0fc0a3bbaeeb1" }, "downloads": -1, "filename": "buildpg-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "fe9ed8f194b65e8323991cbc74f0e8eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 11746, "upload_time": "2022-03-01T17:00:52", "upload_time_iso_8601": "2022-03-01T17:00:52.190963Z", "url": "https://files.pythonhosted.org/packages/31/5a/c5ecd08a0c9b4dfece3b41aeefc3770968b4a2da1784941c9c8dd1c65347/buildpg-0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1e3c523df94be37397684d65dcba8e05", "sha256": "3a6c1f40fb6c826caa819d84727e36a1372f7013ba696637b492e5935916d479" }, "downloads": -1, "filename": "buildpg-0.4.tar.gz", "has_sig": false, "md5_digest": "1e3c523df94be37397684d65dcba8e05", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12493, "upload_time": "2022-03-01T17:00:53", "upload_time_iso_8601": "2022-03-01T17:00:53.993200Z", "url": "https://files.pythonhosted.org/packages/48/f2/ff0e51a3c2390538da6eb4f85e30d87aafbcc6d057c6c9bb9fa222c8f2fc/buildpg-0.4.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fe9ed8f194b65e8323991cbc74f0e8eb", "sha256": "20d539976c81ea6f5529d3930016b0482ed0ff06def3d6da79d0fc0a3bbaeeb1" }, "downloads": -1, "filename": "buildpg-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "fe9ed8f194b65e8323991cbc74f0e8eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 11746, "upload_time": "2022-03-01T17:00:52", "upload_time_iso_8601": "2022-03-01T17:00:52.190963Z", "url": "https://files.pythonhosted.org/packages/31/5a/c5ecd08a0c9b4dfece3b41aeefc3770968b4a2da1784941c9c8dd1c65347/buildpg-0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1e3c523df94be37397684d65dcba8e05", "sha256": "3a6c1f40fb6c826caa819d84727e36a1372f7013ba696637b492e5935916d479" }, "downloads": -1, "filename": "buildpg-0.4.tar.gz", "has_sig": false, "md5_digest": "1e3c523df94be37397684d65dcba8e05", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12493, "upload_time": "2022-03-01T17:00:53", "upload_time_iso_8601": "2022-03-01T17:00:53.993200Z", "url": "https://files.pythonhosted.org/packages/48/f2/ff0e51a3c2390538da6eb4f85e30d87aafbcc6d057c6c9bb9fa222c8f2fc/buildpg-0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }