{ "info": { "author": "Benjie Chen, Ginkgo Bioworks", "author_email": "benjie@ginkgobioworks.com, devs@ginkgobioworks.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Other Environment", "Environment :: Web Environment", "Framework :: Django :: 1.6", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: JavaScript", "Programming Language :: Python :: 2.7", "Programming Language :: SQL", "Topic :: Database", "Topic :: Internet :: WWW/HTTP :: Indexing/Search", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: General" ], "description": "Curious\n=======\n\n.. image:: https://travis-ci.org/ginkgobioworks/curious.svg?branch=master\n :target: https://travis-ci.org/ginkgobioworks/curious\n\nCurious traverses relationships in a relational database. Curious\nqueries allow users to explore relationships among objects, traverse\nrecursive relationships, and jump between loosely connected databases.\nCurious also provides a JSON interface to the objects. Users and\nprogrammers can use Curious queries in analysis scripts and\napplications.\n\nCurious favors a data centric model of application construction; Curious\nqueries expose normalized, relational data, reducing UI dependency on UI\nspecific API end-points serving denormalized data. Changing what data an\nUI needs no longer requires changing the UI specific end-points.\n\nCurious works well with deep data models with many relationships. A\nCurious query can traverse 10s of foreign key like relationships\nefficiently. Curious queries always operate on sets of objects, and can\nconnect a small number of objects via a relationship to a large number\nof objects, then via another relationship from the large number of\nobjects to a smaller set again. For example, Book to Authors to Country\nof Residence. Unlike GraphQL, Curious outputs relationships between\nobjects, rather than an ever growing tree of JSON representations of the\nobjects.\n\nExample\n-------\n\n::\n\n Book.last(10) Book.author_set Author.country(continent__name=\"North America\")\n\nQuery Language\n--------------\n\nThe query language allows traversing models by identfying the relationships between them,\nthrough foreign keys in Django models, or arbitrary id-mapping functions. A Curious query\nis a space-separated set of terms, which connect models together by relationships.\n\nSeveral kinds of \"joins\" are possible using these relationship primitives:\n\n- A traditional `inner join` ``Book Book.author_set``\n- A `left outer join`: ``Book.last(10) ?(Book.author_set)``\n- A `recusrive join`: ``Parent.children_*``\n\nFurthermore, at each stage in a join, `filtering` can happen:\n\n- Filtering by `Django field lookups`_: ``Book Book.author_set(id__in=[2,3,4])``\n- Filtering by `subquery`: ``Book +(Book.author_set(id__in=[2,3,4]))``\n- Filtering by `exclusive subquery` ``Book -(Book.author_set(id__in=[2,3,4]))``\n\nFinally, relationships can generate `counts`:\n\n- Counting ``Book Book.author_set__count``\n\n.. _Django field lookups: https://docs.djangoproject.com/en/1.11/ref/models/querysets/#field-lookups\n\nConfiguring Curious\n-------------------\n\n::\n\n import myapp.models\n from curious import model_registry\n\n def register():\n model_registry.register(myapp.models)\n\nThen include ``register`` when your Django app boots up.\n\nUsing Curious\n-------------\n\nTurn off CSRF. Deploy it as a Django app.\n\nWriting Customized Relationships\n--------------------------------\n\nUse filter and deferred to real functions.\n\nDevelopment\n-----------\n\nRequires Docker. Spin up your container using the provided ``docker-compose.yml`` file and Makefile\nby running ``make image``. This creates an image with a correct git configuration for your user,\nwhich makes it easy to release. All of the commands you should need to run are defined the\n``Makefile`` as targets. All of the targets except for ``image``, are meant to be run inside the\nDocker container, but can be run from the host machine by having ``-ext`` appended to them. For\nexample, to run tests, you could either call ``make test`` from inside the container, or ``make\ntest-ext`` from the host.\n\nIf you are modifying the static assets during development, they can be recompiled with the\n``build_assets`` make task, or by calling ``python setup.py build_assets``.\n\n::\n\n ./make test-ext\n\n\nDeployment\n----------\n\nDeployment of tagged commits happens to PyPI automatically via Travis CI. To bump and deploy a new\nversion, run ``make bump/[foo]-ext``, where ``[foo]`` is ``major``, ``minor``, or ``patch``. Then\n``git push origin --tags master``.\n\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/ginkgobioworks/curious", "keywords": "graph query django sql curious database ginkgo", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "curious", "package_url": "https://pypi.org/project/curious/", "platform": "", "project_url": "https://pypi.org/project/curious/", "project_urls": { "Homepage": "https://github.com/ginkgobioworks/curious" }, "release_url": "https://pypi.org/project/curious/1.2.0/", "requires_dist": [ "Django (~=1.11)", "humanize", "parsimonious (==0.5)", "parsedatetime (~=1.0)" ], "requires_python": "", "summary": "Graph-based data exploration tool", "version": "1.2.0" }, "last_serial": 3741509, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b1bf51b6a9611a68d887f8749811d390", "sha256": "b06fdab240f01d59654cb543171e718679db3240167b4ddb00ca56081d4aee48" }, "downloads": -1, "filename": "curious-0.1.tar.gz", "has_sig": false, "md5_digest": "b1bf51b6a9611a68d887f8749811d390", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 957057, "upload_time": "2014-04-15T13:51:09", "url": "https://files.pythonhosted.org/packages/60/58/36d88c0c4cf21ab5b9299c37dfba4d4019139b9ab5e6a6d721772c6ab163/curious-0.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "e7e714bb9b73a8bd86c43f0d5b39229f", "sha256": "d2ce54152f52ac166cb74d004713bfb5ef2f0451e9f52e00dd34a777cdb094c1" }, "downloads": -1, "filename": "curious-0.2.2-py2-none-any.whl", "has_sig": false, "md5_digest": "e7e714bb9b73a8bd86c43f0d5b39229f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 48410, "upload_time": "2017-05-01T18:14:46", "url": "https://files.pythonhosted.org/packages/e1/8e/688d7ea8cd779343a10c936eb268d004425d84ceb044e4c9a28dc3d3ef56/curious-0.2.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c1a1f7cf8094f7d19efa4d600d8847ed", "sha256": "b3be2f8ec5b3a10a1efb8bf05432053fde7bc14549cc96c0d20fb552a8d0da23" }, "downloads": -1, "filename": "curious-0.2.2.tar.gz", "has_sig": false, "md5_digest": "c1a1f7cf8094f7d19efa4d600d8847ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39254, "upload_time": "2017-04-10T21:36:51", "url": "https://files.pythonhosted.org/packages/55/66/385462224717b546d2d698de4815b7e066d2c2344def56144c45a11695f1/curious-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "b5d6d92e8c75eb98d4a56f00e6e9464f", "sha256": "8a9bc5c66cd095a94fae40a10bca72cec6f240c355c04e8fed10c619388cfd0c" }, "downloads": -1, "filename": "curious-0.2.3-py2-none-any.whl", "has_sig": false, "md5_digest": "b5d6d92e8c75eb98d4a56f00e6e9464f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 48691, "upload_time": "2017-05-19T23:09:14", "url": "https://files.pythonhosted.org/packages/38/c6/e8549d2090b10d83a1e3b82841059dd43a6d8221f5218bc2ca2c0cf2503a/curious-0.2.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f47bab43805e75767b5d79d4e2324a57", "sha256": "998b4a0115e23f8f90cf3c3156eecf8f3bfa23c9600267dffae013a03e63aa1a" }, "downloads": -1, "filename": "curious-0.2.3.tar.gz", "has_sig": false, "md5_digest": "f47bab43805e75767b5d79d4e2324a57", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39323, "upload_time": "2017-05-19T23:09:16", "url": "https://files.pythonhosted.org/packages/fe/d5/4f942187550d2dee3c8fa3477e7c7b17aa260e0d4f7a003659aa9c8efc16/curious-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "dde5900acce4663927b33ec78c02bc75", "sha256": "5ee599eccd4a8e69ec4849b656d6cd0af54df42a7c95d099c39de9d631bed669" }, "downloads": -1, "filename": "curious-0.2.4-py2-none-any.whl", "has_sig": false, "md5_digest": "dde5900acce4663927b33ec78c02bc75", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 49238, "upload_time": "2017-06-19T22:40:42", "url": "https://files.pythonhosted.org/packages/41/a6/e8ea2ac65ee3fef04b4a6607bc149c62c6e40800759f44e143b1f6bcdc21/curious-0.2.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0593d6bd83eace3918c0dea4db6807ad", "sha256": "71c28b5def7b9e603f999248411b8ce8642d529bf2b2ff8bea3e3f0d7fb7147e" }, "downloads": -1, "filename": "curious-0.2.4.tar.gz", "has_sig": false, "md5_digest": "0593d6bd83eace3918c0dea4db6807ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39798, "upload_time": "2017-06-19T22:40:44", "url": "https://files.pythonhosted.org/packages/bc/51/e470c1308b1e9b9fcf6130e0564f8ee10786a41ae22fc2d961e36e957298/curious-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "830abe353b3805b1175e3387a478532a", "sha256": "fc823e50df9adaadb96bc1c8c2696b485ed0867c6f02f7e967acda91c4179e9d" }, "downloads": -1, "filename": "curious-0.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "830abe353b3805b1175e3387a478532a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1912616, "upload_time": "2017-06-19T23:07:09", "url": "https://files.pythonhosted.org/packages/4b/09/88c56951f40666e41dc4263abda5b10dbb4939977221eddfc7fd8526a27a/curious-0.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0fdede459dfe463262b0328baff6071b", "sha256": "791175e694cbcd20e17168ec47802a78592125848baf9bd8d58101e17c0d3a2d" }, "downloads": -1, "filename": "curious-0.3.0.tar.gz", "has_sig": false, "md5_digest": "0fdede459dfe463262b0328baff6071b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1805987, "upload_time": "2017-06-19T23:07:12", "url": "https://files.pythonhosted.org/packages/90/c7/c2e5a2be6fe221d797145aa61e4a5b2ff59ad17f8ab8f3f827cf60aa60ed/curious-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b6532b1e4b03b7667120dedc4a0748d7", "sha256": "e092f6f572ac9df441145364465af4da5c04cd925983026126af6d756d4a077f" }, "downloads": -1, "filename": "curious-0.4.0-py2-none-any.whl", "has_sig": false, "md5_digest": "b6532b1e4b03b7667120dedc4a0748d7", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1912647, "upload_time": "2017-08-10T03:14:03", "url": "https://files.pythonhosted.org/packages/e5/29/8179933b55d24476ba619e08ba4ad8c323265e270273f6c9fe5bae19ba3c/curious-0.4.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfefa74823855aef6989d9975870645e", "sha256": "2763ad5c32f593f47675bfad89aeaf819dda0b2bf0cff42c276296dcff75fd5e" }, "downloads": -1, "filename": "curious-0.4.0.tar.gz", "has_sig": false, "md5_digest": "bfefa74823855aef6989d9975870645e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1806058, "upload_time": "2017-08-10T03:14:06", "url": "https://files.pythonhosted.org/packages/f8/d3/6cd861a8c710afbf6d9ffd4bb623b284838d170b71db9957b218859df378/curious-0.4.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "3c4dcebf41f604f26f2844ce834481b3", "sha256": "45810bfc058a37a7bb027b11adcb95bb91df991681a3fedcef24752971fe1bc7" }, "downloads": -1, "filename": "curious-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "3c4dcebf41f604f26f2844ce834481b3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 49212, "upload_time": "2017-10-29T16:13:08", "url": "https://files.pythonhosted.org/packages/a5/b4/0d83c37a7b4f30b0610448e236831ba575c88ec716663b1ab74ef59d79cb/curious-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1dff72e2ddf0b30d49144c5366754955", "sha256": "4e63def410581e3e6063c8edb2d87e7a8b25d84662231b224ed170b9db380caf" }, "downloads": -1, "filename": "curious-1.0.0.tar.gz", "has_sig": false, "md5_digest": "1dff72e2ddf0b30d49144c5366754955", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39816, "upload_time": "2017-10-29T16:13:09", "url": "https://files.pythonhosted.org/packages/21/77/cc807c1ae476f6d509d6beea7ab50baf1449c1d2952756c2e93354af6412/curious-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "dcf7e6401b6fd85e67ed6b1e5d595c44", "sha256": "1b31088ce4050425af65055be7f93c3e8fed25d74f919af7b3014f057bdedae8" }, "downloads": -1, "filename": "curious-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "dcf7e6401b6fd85e67ed6b1e5d595c44", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1912592, "upload_time": "2017-11-06T07:19:27", "url": "https://files.pythonhosted.org/packages/f3/b2/d5a5fafd769da4c4d78f3686f3e06786b158d42c12a0b8f7a84048df7551/curious-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "21279bc48ea267e9f40dbfafc7f8cb7b", "sha256": "dea493ecf361d710d708bb5c42a28253e14f30b4eb3611a08bb746002debb82e" }, "downloads": -1, "filename": "curious-1.0.1.tar.gz", "has_sig": false, "md5_digest": "21279bc48ea267e9f40dbfafc7f8cb7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1806013, "upload_time": "2017-11-06T07:19:30", "url": "https://files.pythonhosted.org/packages/e0/24/61825c78884aec4ff21fe9445e0ea82eaae7b85472162988aa35af044733/curious-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "e546fd16361ab4966187ed8517a6fa01", "sha256": "1632e4979ed6f39709ba4988bb44b0feda468471c54e928e916bf1c5ea5baf4b" }, "downloads": -1, "filename": "curious-1.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "e546fd16361ab4966187ed8517a6fa01", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1912634, "upload_time": "2017-11-10T16:09:34", "url": "https://files.pythonhosted.org/packages/bd/00/d886e754ca7715a0a99fd845c8db80d5d78915521133a7ab1a3be234ac3a/curious-1.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa7491b8c15c6fde0e9aaf7af36d820b", "sha256": "b934ce70ad430f17b9c75f241efcd4e243cd6f5f90ed47829ec0e451d42b0338" }, "downloads": -1, "filename": "curious-1.0.2.tar.gz", "has_sig": false, "md5_digest": "fa7491b8c15c6fde0e9aaf7af36d820b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1806098, "upload_time": "2017-11-10T16:09:37", "url": "https://files.pythonhosted.org/packages/2c/5b/3ff967a62c009e7e9b05736f779bd2663258fcf26e0cdb63ed4bcffec53a/curious-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "0a67cb42820601443175e8a25db8696b", "sha256": "2b69a0d3813ab21cd4ac22de599f7a28827570c04a1da52ca12c3a0f0d719584" }, "downloads": -1, "filename": "curious-1.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "0a67cb42820601443175e8a25db8696b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1912668, "upload_time": "2017-12-04T15:02:24", "url": "https://files.pythonhosted.org/packages/81/f5/2a8d7a2c46535e5c24cbfd3ad9c4f85b9a025beceff30ed3a25fc3491a15/curious-1.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "34fac30c72c0786b38505dfd2efb8bdf", "sha256": "1503b56081fd9a3b76ad01aa996d70500c4f8909c07603d41c1a88b44fab0aa2" }, "downloads": -1, "filename": "curious-1.0.3.tar.gz", "has_sig": false, "md5_digest": "34fac30c72c0786b38505dfd2efb8bdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1806138, "upload_time": "2017-12-04T15:02:26", "url": "https://files.pythonhosted.org/packages/18/47/1b06b403bbd1950da7f5e3206ef0c7f6172f94fca542f156d34fd9ca46ba/curious-1.0.3.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "493ca1ad6ad26ff34c3c310b02defcda", "sha256": "1743ad72e66087cc20f65384cea4b8e18f9a8621e479f570869891e4dcf42c98" }, "downloads": -1, "filename": "curious-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "493ca1ad6ad26ff34c3c310b02defcda", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1918360, "upload_time": "2018-03-20T03:11:41", "url": "https://files.pythonhosted.org/packages/10/02/27c0bd787f144aa2fee89d72ecfeff246d34cc440b52b131d9e79799dbe1/curious-1.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "48b7c76ea56a665f659c42b472499628", "sha256": "3a8192e28dfe015152cb9e02cd78b120312fd1aa2ca933c64a0ed9de1826c8c0" }, "downloads": -1, "filename": "curious-1.1.0.tar.gz", "has_sig": false, "md5_digest": "48b7c76ea56a665f659c42b472499628", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1811579, "upload_time": "2018-03-20T03:11:43", "url": "https://files.pythonhosted.org/packages/78/fd/e3a261b06227aa736acdc9ed2a9048d9b65fb6e664bec52894e6b916ee7b/curious-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "99df7d74c2691a6d2a6316423aec48a6", "sha256": "dbf314c2d998bba3cdb375c7b4af732d57fbda95798bf32f9a6be3442dd2a8bf" }, "downloads": -1, "filename": "curious-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "99df7d74c2691a6d2a6316423aec48a6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1918005, "upload_time": "2018-04-06T15:40:17", "url": "https://files.pythonhosted.org/packages/82/81/f0bb678a9a399c0b54edda5d10cd507508031965b51f4e3dd964b11a4e18/curious-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec50dd1c6a472ffbf34513c636afb61d", "sha256": "9c02a3b5fdf3172b1bb3d3f8c59b5fd2d93776da99efc26f79d95f05e532e472" }, "downloads": -1, "filename": "curious-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ec50dd1c6a472ffbf34513c636afb61d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1813607, "upload_time": "2018-04-06T15:40:19", "url": "https://files.pythonhosted.org/packages/19/0c/b15807f2a98560fe9b728aa146ad545d95e225db2d7ed7872f399dc9f694/curious-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "99df7d74c2691a6d2a6316423aec48a6", "sha256": "dbf314c2d998bba3cdb375c7b4af732d57fbda95798bf32f9a6be3442dd2a8bf" }, "downloads": -1, "filename": "curious-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "99df7d74c2691a6d2a6316423aec48a6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 1918005, "upload_time": "2018-04-06T15:40:17", "url": "https://files.pythonhosted.org/packages/82/81/f0bb678a9a399c0b54edda5d10cd507508031965b51f4e3dd964b11a4e18/curious-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec50dd1c6a472ffbf34513c636afb61d", "sha256": "9c02a3b5fdf3172b1bb3d3f8c59b5fd2d93776da99efc26f79d95f05e532e472" }, "downloads": -1, "filename": "curious-1.2.0.tar.gz", "has_sig": false, "md5_digest": "ec50dd1c6a472ffbf34513c636afb61d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1813607, "upload_time": "2018-04-06T15:40:19", "url": "https://files.pythonhosted.org/packages/19/0c/b15807f2a98560fe9b728aa146ad545d95e225db2d7ed7872f399dc9f694/curious-1.2.0.tar.gz" } ] }