{ "info": { "author": "Roel van der Goot", "author_email": "roel@simplecuriosities.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.7" ], "description": "# ajsonapi: asynchronous JSON API\n\n\n## What is it?\n\n*ajsonapi* is a Python package for creating a [JSON API][json-api] web server\nbacked by a database from a user-provided object model.\n\n\n## How to specify an object model?\n\nLet's look at a simple object model specification.\n\n```python\n# model.py\n\nfrom ajsonapi import (JSON_API,\n OneToManyRelationship,\n ManyToOneRelationship,\n Attribute,\n String)\n\nclass Persons(JSON_API):\n name = Attribute(String)\n articles = OneToManyRelationship('Articles', rfkey='person_id')\n\nclass Articles(JSON_API):\n title = Attribute(String)\n author = ManyToOneRelationship('Persons', lfkey='person_id')\n```\n\nThis model contains two class definitions: `Persons` and `Articles`. A person\nhas a name and can author zero of more articles. An article has a title and\nhas exactly one author (who is a person). The only parts in the model that may\nbe unobvious are the `lfkey` and `rfkey` parameters in the relationship\ndefinitions. They are abbreviations for *local foreign key* and *remote\nforeign key*, respectively. Ajsonapi uses these parameters to identify that\n`Persons.articles` and `Articles.author` are each other's reverse relationship\nand to persist objects and their relationships in the database.\n\nFor a more elaborate (albeit abstract) object model see [ajsonapi's model for\nfunctional testing][functest-model].\n\n\n## How to create a web server?\n\n```python\n# app.py\n\nfrom aiohttp.web import run_app\nfrom ajsonapi import Application\n\nimport model # Or directly include the above code snippet\n\nasync def make_app():\n app = Application()\n await app.connect_database('postgresql://user:password@localhost:5432/db')\n await app.create_tables()\n app.add_json_api_routes()\n return app.app\n\nrun_app(make_app())\n```\n\n## What does ajsonapi provide?\n\nFrom the above six line model, ajsonapi creates a web server that supports the\nfollowing eighteen operations (combinations of HTTP method and URI) as\ndescribed by the [JSON API specification][json-api-spec].\n\n```\nGET, POST /persons\nGET, PATCH, DELETE /persons/{id}\nGET, POST, PATCH, DELETE /persons/{id}/relationships/articles\nGET /persons/{id}/articles\nGET, POST /articles\nGET, PATCH, DELETE /articles/{id}\nGET, PATCH /articles/{id}/relationships/author\nGET /articles/{id}/author\n```\n\nAll `GET` operations support the `?include`, `?fields`, `?filter` and `?sort`\nquery parameters. All objects created and manipulated through the web server\nare persisted in a Postgres database by ajsonapi.\n\n\n## Limitations\n\nNote that ajsonapi is work in progress. The current version does not support the\nremaining query parameter (`?page`) yet.\n\n\n## Where to get it?\n\n```sh\npip install ajsonapi\n```\n\n\n\n[json-api]: https://jsonapi.org\n[json-api-spec]: https://jsonapi.org/format\n[functest-model]: https://gitlab.com/rvdg/ajsonapi/blob/master/ajsonapi/functests/model.py\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://gitlab.com/rvdg/ajsonapi", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "ajsonapi", "package_url": "https://pypi.org/project/ajsonapi/", "platform": "", "project_url": "https://pypi.org/project/ajsonapi/", "project_urls": { "Homepage": "https://gitlab.com/rvdg/ajsonapi" }, "release_url": "https://pypi.org/project/ajsonapi/0.5.1/", "requires_dist": [ "aiohttp", "asyncio", "asyncpg", "toposort" ], "requires_python": "", "summary": "Asynchronous JSON API", "version": "0.5.1" }, "last_serial": 5689499, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "b6cd8b3f8a6d0830a0762a838c1af502", "sha256": "4ba6331d62dbffc27d77a461f88b0175e7cd8e256833a9cffa8cc8a1b284e4cc" }, "downloads": -1, "filename": "ajsonapi-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b6cd8b3f8a6d0830a0762a838c1af502", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2454, "upload_time": "2018-10-15T20:21:47", "url": "https://files.pythonhosted.org/packages/2d/d4/f237575f1811ae1f31c24a4378e5d8db6a1e33ab4371de7dda4e4382f5ec/ajsonapi-0.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e8a0b5bbd43012285d06cbed8c54300", "sha256": "228f0b179765679fbe5a87faea8e5938b1098754389010f54afedda9a21cfaa4" }, "downloads": -1, "filename": "ajsonapi-0.0.0.tar.gz", "has_sig": false, "md5_digest": "5e8a0b5bbd43012285d06cbed8c54300", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1216, "upload_time": "2018-10-15T20:21:48", "url": "https://files.pythonhosted.org/packages/fe/80/7e9cf074a656564e29207552118ace2ab11694e056c0ac831c3663f2780e/ajsonapi-0.0.0.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "6a400fc98e3cbca8e7fa70e44b0a2205", "sha256": "7b2ae1c0bf634569c465ea6c6fb05861318e1a45f560900908651a38a0a4ef23" }, "downloads": -1, "filename": "ajsonapi-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6a400fc98e3cbca8e7fa70e44b0a2205", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31616, "upload_time": "2018-11-09T00:20:54", "url": "https://files.pythonhosted.org/packages/57/76/db2224c050ff556154b83a81f21f8fa4e328c56d3e37f5ff8b671b2d7958/ajsonapi-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4cfd1c48e83541006ce9d32241c3947f", "sha256": "8c92f61fd460332761213242bd7a104ef13812aefe1137621ae0c8eb070e15ee" }, "downloads": -1, "filename": "ajsonapi-0.0.2.tar.gz", "has_sig": false, "md5_digest": "4cfd1c48e83541006ce9d32241c3947f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14604, "upload_time": "2018-11-09T00:20:56", "url": "https://files.pythonhosted.org/packages/3c/53/73714789e609bb8699fb9cad7b4a7105d12111f423c5453c3abecc071cf5/ajsonapi-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "79efccf57532a7ef85b7afaf67b46f71", "sha256": "3299119242b09a56127025d872f808cc3ce4bc51a9e6c4be77ce2b8f95d8883c" }, "downloads": -1, "filename": "ajsonapi-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "79efccf57532a7ef85b7afaf67b46f71", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31837, "upload_time": "2018-11-09T15:14:53", "url": "https://files.pythonhosted.org/packages/4d/41/40453a72d561f2db8e3fffb5d584b7fd52453356dbc16c154b24b1b5ec50/ajsonapi-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87b0db2334f5b65222ef2dda58a6c3c2", "sha256": "6f3a26a0a76e75849a5c4a1453c459265476569e68b09e6b80fb0037a14b3a41" }, "downloads": -1, "filename": "ajsonapi-0.0.3.tar.gz", "has_sig": false, "md5_digest": "87b0db2334f5b65222ef2dda58a6c3c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15056, "upload_time": "2018-11-09T15:14:55", "url": "https://files.pythonhosted.org/packages/a3/c2/0d4a2ad6743ea7db2a323aa36e9c1d186d8fa3a4e76867cb4974915247a2/ajsonapi-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "06d04e1f12150a1cd9fb2ac81bffe120", "sha256": "4cb32f8375b79f00edd73f30129e7bfee591dc01a40a8e28a59785c976e1f811" }, "downloads": -1, "filename": "ajsonapi-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "06d04e1f12150a1cd9fb2ac81bffe120", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30363, "upload_time": "2019-01-14T18:00:55", "url": "https://files.pythonhosted.org/packages/cf/1a/8ccd86d5276005458e06aeb65dc5d8d4d1b8f5fd417109c6497d74d889aa/ajsonapi-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ece21f81d615d8e494f38f0f38918a9a", "sha256": "df231b7c35d8dbd6ca58e7b5bb62b6042d9500e0888b42ecc70d5ff521ef7761" }, "downloads": -1, "filename": "ajsonapi-0.0.4.tar.gz", "has_sig": false, "md5_digest": "ece21f81d615d8e494f38f0f38918a9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14619, "upload_time": "2019-01-14T18:00:56", "url": "https://files.pythonhosted.org/packages/31/d8/380228576dabbe772c896e471f3eeace0c6e761564c2d1380701c67048b7/ajsonapi-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "7a9ab93ce0a8c9e27de783c441524ed0", "sha256": "00919b98f5db5dc0b91fa5db842f8bd33f4aa803281c6928ad152cc7eda401c9" }, "downloads": -1, "filename": "ajsonapi-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "7a9ab93ce0a8c9e27de783c441524ed0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31882, "upload_time": "2019-03-14T15:36:44", "url": "https://files.pythonhosted.org/packages/c3/de/00a6e9b873aec51e46b2b82714c0c27c0c78890b81f2fcf2294eac247cbb/ajsonapi-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6282dae282d1c0f36cd226878891899c", "sha256": "ffa5aec906de6f29558eb772989b2333fb14b2b6a2ba39ca3fa6a2d7c79e10f1" }, "downloads": -1, "filename": "ajsonapi-0.0.5.tar.gz", "has_sig": false, "md5_digest": "6282dae282d1c0f36cd226878891899c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16493, "upload_time": "2019-03-14T15:36:46", "url": "https://files.pythonhosted.org/packages/0d/31/8fdaee0797f88f42372e16b64a62d52fad9c63a15e1a768ff836a94e26df/ajsonapi-0.0.5.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "3164bc80ce0cf6ed1432c232b46cb70f", "sha256": "977b38c2931b45486210810a0de37b24b5ec42d11a2f41db46e7b3c4a4eda1de" }, "downloads": -1, "filename": "ajsonapi-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3164bc80ce0cf6ed1432c232b46cb70f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33354, "upload_time": "2019-04-17T14:30:16", "url": "https://files.pythonhosted.org/packages/88/84/3f4eff0e03000ff1c13f37b780247a8b08dd13dc54adb7cd4f054a955507/ajsonapi-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d21fe989c708a23d28a81dce37e6a2f2", "sha256": "a7cd65fae2639a1d6f31c0d4261d3a12a851cfb8f763b3c18a439bd07666230f" }, "downloads": -1, "filename": "ajsonapi-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d21fe989c708a23d28a81dce37e6a2f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18484, "upload_time": "2019-04-17T14:30:17", "url": "https://files.pythonhosted.org/packages/2b/89/d0286ebefa7c6d12f8abf52e6abf3603ed237ddddc41e6aedc87ac5f00db/ajsonapi-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "6b1c6b8abf739e8e6fa6a3dab7c7da72", "sha256": "d260be98b516ba91052ee0e57dbdfe36ecb9947d10ee7c3a9ce43a591763d9f3" }, "downloads": -1, "filename": "ajsonapi-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6b1c6b8abf739e8e6fa6a3dab7c7da72", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36601, "upload_time": "2019-05-08T17:16:19", "url": "https://files.pythonhosted.org/packages/5c/ca/197350b1c88a61769bb1379c3641b1b2aa956c6d4f4aaf5832b835c97f52/ajsonapi-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73ab0a9b312483a7815dc8083c8aa07b", "sha256": "482a727adf15f5e199a24ac15f6ff7e4e084cdc11d572e42a3fb6ddce581864d" }, "downloads": -1, "filename": "ajsonapi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "73ab0a9b312483a7815dc8083c8aa07b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20104, "upload_time": "2019-05-08T17:16:22", "url": "https://files.pythonhosted.org/packages/27/03/fbfa419cc872a66527f889693f7584ca2c32d48f5c5b24290aef3dae4a7a/ajsonapi-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a3d59b2148625abe90ed3d630c762f0c", "sha256": "e50a2db62a856f7ea2941f7f32e886056d1f7cc74f327def3436bcbffff1ab09" }, "downloads": -1, "filename": "ajsonapi-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a3d59b2148625abe90ed3d630c762f0c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37419, "upload_time": "2019-06-05T01:29:47", "url": "https://files.pythonhosted.org/packages/c5/f7/6afff047e34e9451482b8c6f2abd2f1cfe105a46c409c3c68b7c6c0e96b4/ajsonapi-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea49c93790b86ec4b177747b9e355ebf", "sha256": "da01f9451f8c39d579460c99f9d62d5e87e3549c709164426a9ac132855b26b4" }, "downloads": -1, "filename": "ajsonapi-0.3.0.tar.gz", "has_sig": false, "md5_digest": "ea49c93790b86ec4b177747b9e355ebf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20835, "upload_time": "2019-06-05T01:29:48", "url": "https://files.pythonhosted.org/packages/04/4f/583c6bae29f98ba16f7a45d5f7758c469d321e99738a96afb6e119e40b22/ajsonapi-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "dd4aedc028f1cd6d2e740201af9ddc44", "sha256": "e8ae6129ed77b7cc0a6face431a33cff4cf65a9a31f2ccbfe9ceade26d8cb732" }, "downloads": -1, "filename": "ajsonapi-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dd4aedc028f1cd6d2e740201af9ddc44", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 107090, "upload_time": "2019-06-14T22:17:30", "url": "https://files.pythonhosted.org/packages/1e/65/cb181723faf7733c88748bfe31ce78fc2e337834b91239e77d8d7db34ee8/ajsonapi-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eacd0bcc35eef23122c26638927089b9", "sha256": "7ad9c7f526ff4d50fb15e5ddb33d1c032297d13249c66ea331ed5f0ae5817ad1" }, "downloads": -1, "filename": "ajsonapi-0.4.0.tar.gz", "has_sig": false, "md5_digest": "eacd0bcc35eef23122c26638927089b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62248, "upload_time": "2019-06-14T22:17:32", "url": "https://files.pythonhosted.org/packages/e5/60/c90589a3e3d508302fa2b235505b59b0c2a5eaaa56b675ff6dfb3de1f86f/ajsonapi-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "cc47df8302192110f206d1958afda99f", "sha256": "93b4d1c5b98556472a7ae307337629aadc1a5ef56b7084831488c8a4f22a4dcb" }, "downloads": -1, "filename": "ajsonapi-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cc47df8302192110f206d1958afda99f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 60124, "upload_time": "2019-07-15T00:20:41", "url": "https://files.pythonhosted.org/packages/12/95/5d570ae9e012de1b0a2ab8761d4f2c4a22c1743e18a2b38016be63b2b5fd/ajsonapi-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fb13e149b13f22df1edaf2a6a9aa7bd6", "sha256": "4b8d95d5b359bd6b1caee1db01107a7c332decf12e6b6104c92128fbe49f0e9a" }, "downloads": -1, "filename": "ajsonapi-0.5.0.tar.gz", "has_sig": false, "md5_digest": "fb13e149b13f22df1edaf2a6a9aa7bd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34480, "upload_time": "2019-07-15T00:20:43", "url": "https://files.pythonhosted.org/packages/a8/60/4eab27bcefcd219ebca00bff49a45951378100110f5c0b8979c9a7e7eb7d/ajsonapi-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "9d3957f8a8d8afb39bf0a824ff6db8d0", "sha256": "7d043c08e035440e24a4698d3d408e8e7a2508babc7f7ff45b2a2287e20a1994" }, "downloads": -1, "filename": "ajsonapi-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9d3957f8a8d8afb39bf0a824ff6db8d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 60188, "upload_time": "2019-08-16T21:04:32", "url": "https://files.pythonhosted.org/packages/e0/04/0ea625b9056f473d185a911954442a9a13bd9cbeecfdefbd2e578b41b033/ajsonapi-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "048fae033dbdbaab93dd303e6df9fa52", "sha256": "bd673dc405e84b254e8ebf61096b1c8ae0018e2d3eda62228a9ae7d6f5340549" }, "downloads": -1, "filename": "ajsonapi-0.5.1.tar.gz", "has_sig": false, "md5_digest": "048fae033dbdbaab93dd303e6df9fa52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34525, "upload_time": "2019-08-16T21:04:35", "url": "https://files.pythonhosted.org/packages/e3/44/e9d9f19652f78a139e190352bb611da1e9cbc609b599f33d2bfd313c871b/ajsonapi-0.5.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9d3957f8a8d8afb39bf0a824ff6db8d0", "sha256": "7d043c08e035440e24a4698d3d408e8e7a2508babc7f7ff45b2a2287e20a1994" }, "downloads": -1, "filename": "ajsonapi-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9d3957f8a8d8afb39bf0a824ff6db8d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 60188, "upload_time": "2019-08-16T21:04:32", "url": "https://files.pythonhosted.org/packages/e0/04/0ea625b9056f473d185a911954442a9a13bd9cbeecfdefbd2e578b41b033/ajsonapi-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "048fae033dbdbaab93dd303e6df9fa52", "sha256": "bd673dc405e84b254e8ebf61096b1c8ae0018e2d3eda62228a9ae7d6f5340549" }, "downloads": -1, "filename": "ajsonapi-0.5.1.tar.gz", "has_sig": false, "md5_digest": "048fae033dbdbaab93dd303e6df9fa52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34525, "upload_time": "2019-08-16T21:04:35", "url": "https://files.pythonhosted.org/packages/e3/44/e9d9f19652f78a139e190352bb611da1e9cbc609b599f33d2bfd313c871b/ajsonapi-0.5.1.tar.gz" } ] }