{ "info": { "author": "Gabe Appleton", "author_email": "gabe@gabeappleton.me", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Programming Language :: Other", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet", "Topic :: Scientific/Engineering :: GIS", "Topic :: Software Development :: Compilers" ], "description": "overpassify\n===========\n\nA Python to OverpassQL transpiler, now on both `GitHub\n`__ and `GitLab\n`__\n\n`OverpassQL `__\nis the language used to query features on OpenStreetMap. Unfortunately,\nit's not very readable.\n\nThe goal here is to enable people to write in a more developer-friendly\nlanguage, and still have it work on the existing infrastructure. As of\nnow, ``overpassify`` can take a snippet like:\n\n.. code:: python\n\n from overpassify import overpassify\n\n @overpassify\n def query():\n search = Area(3600134503)\n ways = Way(search, highway=...)\n odd_keys_demo = Way(search, **{Regex('maxspeed(?::.+)?'): Regex('.+ mph')})\n nodes = Node(search)\n out(ways, geom=True, count=True)\n out(nodes, geom=True, count=True)\n noop()\n\nAnd from that generate:\n\n.. code::\n\n (area(3600134503);) -> .search;\n (way[\"highway\"](area.search);) -> .ways;\n (way[~\"maxspeed(?::.+)?\"~\".+ mph\"](area.search);) -> .odd_keys_demo;\n (node(area.search);) -> .nodes;\n .ways out count;\n .ways out geom;\n .nodes out count;\n .nodes out geom;\n\nThat last ``noop()`` is because of `issue\n#2 `__. And as a\nnote, this library assumes you never use a variable name of the form\n``tmp*``. That format will probably be changed to something even less\nlikely in the future, but some translations (for instance, a full\nternary) *require* the use of temporary variables.\n\nOverview\n--------\n\nI'll say this from the outset: ``overpassify`` will support a subset of\nPython. Some things are just too difficult (and maybe impossible) to\nautomatically translate. Functions are an example of that.\n\nOn the other hand, it will try to support a superset of easily-usable\nOverpassQL. Some of those extra features won't be as efficient as their\nPython counterparts, but they will be available.\n\nCurrently ``overpassify`` supports 41/56 of the features listed in the\nOverpassQL guide, and additionally supports ternary statements, ``if`` blocks,\n``break``, and ``continue``.\n\nClasses\n-------\n\nThis library provides wrappers for five types. ``Set()``, ``Node()``,\n``Way()``, ``Area()``, and ``Relation()``. Those last four are *all*\nconsidered subclasses of ``Set()``.\n\nThis library also provides support for strings and numbers. In the\nfuture it will provide support for regex and other things in specific\nplaces.\n\n(Note: Currently nested constructors have some problems in\nimplementation)\n\nAssignment\n----------\n\nThis works about the way you'd expect it to. There are a couple caveats\nthough.\n\n#. You cannot assign a non-\\ ``Set()`` to a variable. This means only\n those five classes listed above.\n#. You cannot assign multiple variables in one line. No ``a, b = b, a``,\n and the like. This could *potentially* be changed later.\n\nNumber and Set Arithmetic\n-------------------------\n\nAnother supported feature is the ability to manipulate these sets and\nnumbers.\n\nAdding sets will produce the union of those sets. Adding numbers will\nproduce their sum.\n\nSubtracting **two** sets will produce their difference. Subtracting\nnumbers will do the same.\n\nSet Filtering\n-------------\n\nYou are also allowed to filter a ``Set()``'s contents by type. For\ninstance, ``Way.filter()`` would yield all the ways within\n````.\n\nSet intersections\n-----------------\n\nA similar process will allow you to take the intersection of arbitrary\nnumbers of **named** sets. So ``Set.intersect(a, b)`` will yield all\nelements common between ``a`` and ``b``. You cannot, at the moment, use\nan expression inside this function. It **must** be predefined.\n\nYou can also use this in tandem with Set Filtering. So\n``Area.intersect(a, b)`` would yield only the areas common between ``a``\nand ``b``.\n\nSearching for Sets\n------------------\n\nThis library also supports *most* of the ways OverpassQL can search for\ninformation. This currently includes:\n\n#. Checking within an area (or set of areas)\n#. Fetching by ID\n#. Tag matching\n#. Conditional filters (see next section)\n\nThe first two are just given as arguments to the constructor. If you put\nin ``Way(12345)``, that will find the Way with ID 12345. If you put in\n``Way()``, it will return all ways within that area.\n\nYou can also define areas using the ``Around()`` function. This has two\nuseful overloads. The first takes the form\n``Around(, )``. The second takes the form\n``Around(, , )``.\n\nTag matching can be done with keyword arguments. So if you look for\n``Node(highway=\"stop\")``, that will find you all stop signs. It also\nsupports existence checking (``Way(highway=...)``), and non-existence\nchecking (``Area(landuse=None)``), and regex matching\n(``Way(highway=Regex(\"path|cycleway|sidewalk\"))``).\n\nFor keys which are not usable as a keyword, you can use a \"splatted\" dictionary.\nFor instance ``Node(**{'maxspeed:advisory': Regex('.+ mph')})``. The same\nfollows for regex key matching, though regex key matching *must* be with a\nregex value.\n\nYou can also search by both an area and a filter. For instance:\n``Way(, maxspeed=None)``.\n\nTernary Expressions and Conditional Filters\n-------------------------------------------\n\nYou can also filter using the familiar ``a if b else c``. This would\nmean that if ``b`` is truthy, ``a`` should become ``b``, and otherwise\nbecome ``c``.\n\nUnfortunately, since this is not a native feature to OverpassQL, it ends\nup evaluating both sides of that statement.\n\nIf you want ``c`` to be an empty set, however, we can optimize that. So\n``foo = a if b else ()`` is the syntax to use there.\n\nAdditional performance is lost because OverpassQL does not support a\nconditional being the *only* filter. This means that we need to provide\nsome other filter, and one in current use is to divide it by type and\nreconstruct. Because of this, filtering down to the appropriate set type yields\nsignificantly batter performance.\n\nReturning Data\n--------------\n\nIn OverpassQL, data can be returned in pieces throughout the function.\nIt's more equivalent to Python's ``yield`` than ``return``. The function\nwe use for that here is ``out()``.\n\n``out()`` takes in one positional argument, and many possible keyword\narguments. It yields data for the positional argument using all the\ntypes defined in the keywords.\n\nFor instance ``out(, geom=True, body=True, qt=True)``\nwould return all the data that MapRoulette needs to draw those points on\ntheir map.\n\nAs a sidenote, the value given for these keywords is never actually\nchecked. It could as easily be ``geom=False`` as ``geom=True``, and\n``overpassify`` will not care.\n\nFor-Each Loop\n-------------\n\nHere you can use the traditional Python for loop:\n\n.. code:: python\n\n for way in ways:\n out(way, geom=True)\n\nIt does not yet support the else clause, and though it supports ``break`` and\n``continue``, please be aware that this will dramatically slow runtime in that\nloop.\n\nIf Statements\n-------------\n\nThis is a feature that OverpassQL cannot do without some emulation. So\nwhat we do here is:\n\n#. Grab an individual item that will probably be stable over long\n periods of time; in this case, the ``Relation()`` representing\n Antarctica\n#. Use a conditional filter on that relation to get a one item or zero\n item ``Set()``\n#. Iterate over that in a for loop\n#. If there is an else clause, use a conditional filter with the\n negation of the test given to get a one item or zero item ``Set()``\n#. Iterate over the else clause in a for loop\n\nSettings\n--------\n\nWe also provide a wrapper for the option headers. Note that this will\nraise an error if it's not on the first line of your query.\n\nThe valid keywords for ``Settings()`` are as follows:\n\n- ``timeout``: The maximum number of seconds you would like your query\n to run for\n- ``maxsize``: The maximum number of bytes you would like your query to\n return\n- ``out``: The format to return in. It defaults to XML, but you can set\n it to ``\"json\"`` or a variant on ``\"csv\"``, as described `in the\n OverpassQL\n spec `__\n- ``bbox``: The string describing a global bounding box. It is used to\n limit the area your query can encompass, and should take the form\n ``\",,,\"``\n- ``date``: The string describing what date you would like to query\n for. This allows you to look at past database states. Note that it\n needs an extra set of quotes, so it would look like\n ``date='\"2012-09-12T06:55:00Z\"'``\n- ``diff``: Similar to the above, except it will return the difference\n between that query run at each time. If you give one time, it will\n assume you want to compare to now. It would look like\n ``diff='\"2012-09-12T06:55:00Z\",\"2014-12-24T13:33:00Z\"'``\n- ``adiff``: Similar to the above, except that it tells you what\n happened to each absent element\n\nRough Translation Table\n-----------------------\n\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Feature | OverpassQL | Python |\n+=======================+=======================================+====================================================+\n| Assignment | `` -> .name`` | ``name = `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Unions | ``(; ...; )`` | `` + ... + `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Difference | ``( - )`` | `` - `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Intersection | ``..`` | ``Set.intersect(, )`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Type-filtering | ``way.`` | ``Way.filter()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Searching | | |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By ID | ``area(1)`` or ``way(7)`` | ``Area(1)`` or ``Way(7)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..In an area | ``way(area.)`` | ``Way()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By tags | ``way[\"tag\"=\"value\"]`` | ``Way(tag=value)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By tag existence | ``way[\"tag\"]`` | ``Way(tag=...)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By tag nonexistence | ``way[!\"tag\"]`` | ``Way(tag=None)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By regex | ``way[\"highway\"~\"a|b\"](area.)`` | ``Way(, highway=Regex(\"a|b\"))`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..By inverse regex | ``way[\"highway\"!~\"a|b\"](area.)`` | ``Way(, highway=NotRegex(\"a|b\"))`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..In area + tag | ``way[\"highway\"](area.)`` | ``Way(, highway=...)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Ternary | very long | `` if else `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Conditional Filter | ``.(if: )`` | `` if else ()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| For Loop | ``foreach.->.()`` | ``for in :\\n `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| If Statement | very long | ``if :\\n \\nelse:\\n `` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| Recursing | | |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..Up | ``.a <`` or ``.a < -> .b`` | ``a.recurse_up()`` or ``b = a.recurse_up()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..Up (w/ relations) | ``.a <<`` or ``.a << -> .b`` | ``a.recurse_up_relations()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..Down | ``.a >`` or ``.a > -> .b`` | ``a.recurse_down()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..Down (w/ relations) | ``.a >>`` or ``.a >> -> .b`` | ``a.recurse_down_relations()`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| is_in filers | | |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..On a set | ``.a is_in -> .areas_with_part_of_a`` | ``areas_containing_part_of_a = is_in(a)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n| ..On a lat/lon pair | ``is_in(0, 0) -> .areas_with_0_0`` | ``areas_containing_0_0 = is_in(0, 0)`` |\n+-----------------------+---------------------------------------+----------------------------------------------------+\n\nFeatures Not Yet Implemented\n----------------------------\n\n#. Filters\n\n #. Recursion Functions\n #. Filter By Bounding Box\n #. Filter By Polygon\n #. Filter By \"newer\"\n #. Filter By Date Of Change\n #. Filter By User\n #. Filter By Area Pivot\n\n#. ID Evaluators\n\n #. id() And type()\n #. is\\_tag() And Tag Fetching\n #. Property Count Functions\n\n#. Aggregators\n\n #. Union and Set\n #. Min and Max\n #. Sum\n #. Statistical Counts\n\n#. Number Normalizer\n#. Date Normalizer\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/gappleto97/overpassify", "keywords": "OSM OpenStreetMap Overpass OverpassQL Transpiler Transpile Compiler Compile Query", "license": "LGPLv3", "maintainer": "", "maintainer_email": "", "name": "overpassify", "package_url": "https://pypi.org/project/overpassify/", "platform": "", "project_url": "https://pypi.org/project/overpassify/", "project_urls": { "Homepage": "https://github.com/gappleto97/overpassify" }, "release_url": "https://pypi.org/project/overpassify/1.2.2/", "requires_dist": null, "requires_python": "", "summary": "A tool to more easily develop queries of OpenStreetMap", "version": "1.2.2" }, "last_serial": 4038677, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "f1b786e574219c3309f558be1ddac9b1", "sha256": "f60e6b726212e4c33bfd605db3849649643134644aa0f098fa5043c623e8dc00" }, "downloads": -1, "filename": "overpassify-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f1b786e574219c3309f558be1ddac9b1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13850, "upload_time": "2017-06-13T20:02:29", "url": "https://files.pythonhosted.org/packages/4f/33/83173d29bd03047cba8cf529df49f831473e3ef3d2f88fa379a127318cfd/overpassify-1.0.0-py2.py3-none-any.whl" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "7702ea6fae1dcb3ad6f59cddd614247a", "sha256": "5f229560c3fddbb21257d8c2c599dac88199d7ea8fd9b016a2944b9d657ecb97" }, "downloads": -1, "filename": "overpassify-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7702ea6fae1dcb3ad6f59cddd614247a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13814, "upload_time": "2017-06-13T20:21:16", "url": "https://files.pythonhosted.org/packages/b2/a6/b987cff2e641a81cb1e39f037a1d03f7c1c7cc77d89f0c8eb3175a690699/overpassify-1.0.1-py2.py3-none-any.whl" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "4a2bac134a5c8ea4983554b5dc42d7ac", "sha256": "ac4cc755e8d06e0ccf6f3427720d2936f1a2c94a001a9d337173f565d585be04" }, "downloads": -1, "filename": "overpassify-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4a2bac134a5c8ea4983554b5dc42d7ac", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14900, "upload_time": "2017-06-14T04:54:44", "url": "https://files.pythonhosted.org/packages/94/eb/f837f6519306b4c668b0f2ff0b09186459556650c509e434d4f451140456/overpassify-1.1.0-py2.py3-none-any.whl" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "98599e62400bafd1e8a63924781e08f0", "sha256": "fcb7085c8d8e5d934a73c61acc1434531c33de81e504c2b9ba6f53f461da4709" }, "downloads": -1, "filename": "overpassify-1.1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "98599e62400bafd1e8a63924781e08f0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18899, "upload_time": "2018-01-12T03:42:21", "url": "https://files.pythonhosted.org/packages/51/75/1911e8488bb90c7c0aa4d7b1e53276abcf9fa18a8effe39fcf5e4eb80aad/overpassify-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5bea59cfa7ee1b0a534d88e269883a7f", "sha256": "b663ec01db9ed13100b82611c79a2f43d2aeb2fee64e40d7d89554414df6dbbc" }, "downloads": -1, "filename": "overpassify-1.1.1.tar.gz", "has_sig": true, "md5_digest": "5bea59cfa7ee1b0a534d88e269883a7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14674, "upload_time": "2018-01-12T03:42:24", "url": "https://files.pythonhosted.org/packages/cd/94/5ed9394935ed9dbda0f8c4821b7671e1c58c24b7bff16d7d10a27fa8d6ac/overpassify-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "53cf0cdbd19476c1c220e822eaacc923", "sha256": "1a472f715fb4b9f854ad09481ca2d37883e7257c4067faff97d7b9f5d78bfb15" }, "downloads": -1, "filename": "overpassify-1.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "53cf0cdbd19476c1c220e822eaacc923", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18892, "upload_time": "2018-01-12T03:46:30", "url": "https://files.pythonhosted.org/packages/5b/f3/45eee3dd0cca93601c3e5b27b44023623a13c08f9b15b784033b1a3e05b7/overpassify-1.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab8b753e69973438d979420a663c3999", "sha256": "73ada5f38c7d3b1c0bc51c3143943ab391e069b8a330c1f8cd3b8af89655909d" }, "downloads": -1, "filename": "overpassify-1.1.2.tar.gz", "has_sig": true, "md5_digest": "ab8b753e69973438d979420a663c3999", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14675, "upload_time": "2018-01-12T03:46:32", "url": "https://files.pythonhosted.org/packages/8b/cd/7a9488039a48ee8958415ba2c0f145ce5d0519e41047c479cf7b2c96c3ba/overpassify-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "68d52fb129e9adbe2a6aba9a58a359f4", "sha256": "cd269ab6531a3fc89f2e1ad769507a0b93fc8879438f668bfd0c6fc87b623678" }, "downloads": -1, "filename": "overpassify-1.1.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "68d52fb129e9adbe2a6aba9a58a359f4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18933, "upload_time": "2018-01-12T04:14:21", "url": "https://files.pythonhosted.org/packages/8e/61/04fe3d5791e9b60db90c5decd8664bbd884fa61fa280f7042c16125a8a28/overpassify-1.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4dcb7be1c3c2cad8485cc2ab5a32757d", "sha256": "94834f65bec57dcb3ef005f03d014fefd62408a2837935f2002bb5efaacbd0ad" }, "downloads": -1, "filename": "overpassify-1.1.3.tar.gz", "has_sig": true, "md5_digest": "4dcb7be1c3c2cad8485cc2ab5a32757d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14701, "upload_time": "2018-01-12T04:14:24", "url": "https://files.pythonhosted.org/packages/77/a5/7484d74c14a7d9069154032fa50165d145cc3c690b75afc402639a6501fa/overpassify-1.1.3.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "fc5df64ddaa6dc8c1e7e7a862f7e1dcd", "sha256": "8cd0474849261b2669361a1cd682b868838de190274d42239bae9035cc1d906c" }, "downloads": -1, "filename": "overpassify-1.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "fc5df64ddaa6dc8c1e7e7a862f7e1dcd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13490, "upload_time": "2018-07-07T07:45:03", "url": "https://files.pythonhosted.org/packages/59/2b/04d3138aea11efeac42b0849e5825a6ae16994d7d41dfe11f03d903e0f5c/overpassify-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18495263ce9680106dce5494fd3b2a46", "sha256": "59c5fca595d9e24b0c65d9245833089d256685686d6bdfb12489b458de8be1e6" }, "downloads": -1, "filename": "overpassify-1.2.0.tar.gz", "has_sig": true, "md5_digest": "18495263ce9680106dce5494fd3b2a46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14904, "upload_time": "2018-07-07T07:45:07", "url": "https://files.pythonhosted.org/packages/af/d3/406ad0c0ce5073dcfa86ce01007b6186cb2580ff0b1b5b6627b81537d4e3/overpassify-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "4ffbe9e5c2e7c38a624ffc4ac1fa4da8", "sha256": "5a9049fa67a63811bbc9416a277e4276edaa4c427fd583d27664ce7ef1466ae2" }, "downloads": -1, "filename": "overpassify-1.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4ffbe9e5c2e7c38a624ffc4ac1fa4da8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13644, "upload_time": "2018-07-07T08:04:10", "url": "https://files.pythonhosted.org/packages/ac/ea/6b702c4cd94f5422a6836b8fbcc3a3a24525779e13696fb392670cceb819/overpassify-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "275639206fdf274acee98a7fd99b7133", "sha256": "5e2832d2a75f6e5eb58872b187c8dc07048492c1865d04d882326882f20c7223" }, "downloads": -1, "filename": "overpassify-1.2.1.tar.gz", "has_sig": true, "md5_digest": "275639206fdf274acee98a7fd99b7133", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15057, "upload_time": "2018-07-07T08:04:13", "url": "https://files.pythonhosted.org/packages/02/7a/8e0f57b232e515422b83241f5a154119e735ec667afb0079877cdf1af80e/overpassify-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "1612c4a15146863e97b37d880de22d52", "sha256": "d84b9aa21dceaae9c83a4fc320a6a7aeac120fd266a7e112e50a63d0d71f06f2" }, "downloads": -1, "filename": "overpassify-1.2.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "1612c4a15146863e97b37d880de22d52", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13815, "upload_time": "2018-07-07T08:14:59", "url": "https://files.pythonhosted.org/packages/97/f2/98594233731933334268e3445f95f61cf274aa14e059014a6358df917cb8/overpassify-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56a5fee5bdd50de6e730a4c85bd95d7d", "sha256": "ce6a1e14e4d1818c4a922284b80a9a8375c7d6db559195d64ff5b087b514def0" }, "downloads": -1, "filename": "overpassify-1.2.2.tar.gz", "has_sig": true, "md5_digest": "56a5fee5bdd50de6e730a4c85bd95d7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15257, "upload_time": "2018-07-07T08:15:02", "url": "https://files.pythonhosted.org/packages/fd/57/734047e4dbef8dfd6b9e410e4712ed014d2e35a63bae4851601c18f1f865/overpassify-1.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1612c4a15146863e97b37d880de22d52", "sha256": "d84b9aa21dceaae9c83a4fc320a6a7aeac120fd266a7e112e50a63d0d71f06f2" }, "downloads": -1, "filename": "overpassify-1.2.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "1612c4a15146863e97b37d880de22d52", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13815, "upload_time": "2018-07-07T08:14:59", "url": "https://files.pythonhosted.org/packages/97/f2/98594233731933334268e3445f95f61cf274aa14e059014a6358df917cb8/overpassify-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56a5fee5bdd50de6e730a4c85bd95d7d", "sha256": "ce6a1e14e4d1818c4a922284b80a9a8375c7d6db559195d64ff5b087b514def0" }, "downloads": -1, "filename": "overpassify-1.2.2.tar.gz", "has_sig": true, "md5_digest": "56a5fee5bdd50de6e730a4c85bd95d7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15257, "upload_time": "2018-07-07T08:15:02", "url": "https://files.pythonhosted.org/packages/fd/57/734047e4dbef8dfd6b9e410e4712ed014d2e35a63bae4851601c18f1f865/overpassify-1.2.2.tar.gz" } ] }