{ "info": { "author": "Drew Shafer", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": "Overview\n========\n\ndjango-declarative-apis is a framework built on top of Django aimed at teams implementing RESTful APis. It provides a simple interface to define endpoints declaratively. Some benefits to using django-declarative-apis:\n\n- Define endpoints declaratively\n- Define model-bound and unbound resource endpoints with a consistent interface\n- OAuth 1.0a authentication out of the box\n- Define resource and endpoint-bound tasks, promoting modularity\n \\* Define synchronous and asynchronous tasks (asynchronous tasks implemented with Celery)\n- Separation of concerns between request body processing and business logic\n\n\n\n\nQuick start\n===========\n\nThis guide is intended to demonstrate the bare minimum in order to get a django-declarative-apis project up and running. The example directory contains further examples using endpoint to model relationships, authentication and response attribute filtering.\n\nCreate django app\n-----------------\n\n``` sourceCode\n./manage startapp myapp\n```\n\nAdd app to INSTALLED\\_APPS\n--------------------------\n\n``` python\nINSTALLED_APPS = [\n 'django_declarative_apis',\n 'myapp',\n]\n```\n\nAdd required config\n-------------------\n\n``` python\nDECLARATIVE_ENDPOINT_RESOURCE_ADAPTER = 'django_declarative_apis.adapters.EndpointResource'\nDECLARATIVE_ENDPOINT_AUTHENTICATION_HANDLERS = 'django_declarative_apis.authentication.oauthlib.oauth1.TwoLeggedOauth1'\n```\n\nmyapp/urls.py\n-------------\n\n``` python\nfrom django_declarative_apis import adapters\nimport myapp.resources\n\nclass NoAuth:\n @staticmethod\n def is_authenticated(request):\n return True\n\n\nurlpatterns = [\n url(\n r'^ping$',\n adapters.resource_adapter(\n get=myapp.resources.PingDefinition,\n authentication=NoAuth\n )\n ),\n]\n```\n\nmyproject/myproject/urls.py\n---------------------------\n\n``` python\nfrom django.conf.urls import url, include\nimport myapp.urls\n\nurlpatterns = [\n url(r'^', include(myapp.urls)),\n]\n```\n\nmyapp/resources.py\n------------------\n\n``` python\nfrom django_declarative_apis import machinery\n\n\nclass PingDefinition(machinery.BaseEndpointDefinition):\n def is_authorized(self):\n return True\n\n @property\n def resource(self):\n return {'ping': 'pong'}\n```", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://salesforce.com", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-declarative-apis", "package_url": "https://pypi.org/project/django-declarative-apis/", "platform": "", "project_url": "https://pypi.org/project/django-declarative-apis/", "project_urls": { "Homepage": "https://salesforce.com" }, "release_url": "https://pypi.org/project/django-declarative-apis/0.22.3/", "requires_dist": null, "requires_python": "", "summary": "Simple, readable, declarative APIs for Django", "version": "0.22.3", "yanked": false, "yanked_reason": null }, "last_serial": 12157570, "releases": { "0.18.2": [ { "comment_text": "", "digests": { "md5": "db67cd0aaf47f9d746e8c6c6007b7b62", "sha256": "8d564a428dc75efc7a6c4c2bc885134ad0884d016594a5bfdc64b002c937b1fb" }, "downloads": -1, "filename": "django_declarative_apis-0.18.2-py3-none-any.whl", "has_sig": false, "md5_digest": "db67cd0aaf47f9d746e8c6c6007b7b62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 71182, "upload_time": "2019-10-29T20:05:58", "upload_time_iso_8601": "2019-10-29T20:05:58.029305Z", "url": "https://files.pythonhosted.org/packages/28/2d/50fa38ce58bd954ec91ef3b00b21017f7a0b02e99c670271011f34cc8847/django_declarative_apis-0.18.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "de7f78e4083641da4301a232bf1c4582", "sha256": "70a796424fd34b26c8d176f43cfda90e315dfa792b2f0bd2596e1f4d2fad0ead" }, "downloads": -1, "filename": "django-declarative-apis-0.18.2.tar.gz", "has_sig": false, "md5_digest": "de7f78e4083641da4301a232bf1c4582", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49015, "upload_time": "2019-10-29T20:06:00", "upload_time_iso_8601": "2019-10-29T20:06:00.838520Z", "url": "https://files.pythonhosted.org/packages/9f/c9/a31e1eac8ecb389a922e188dc27ae639cb33ab1eaa8d3fc3c6978567edee/django-declarative-apis-0.18.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.18.3": [ { "comment_text": "", "digests": { "md5": "e7912a17c247d23f3486aeda0936f74c", "sha256": "dac2c89a42dd30f39e734555239a95d1a7cec9bdf7f5d328c60e3b45288ca3a4" }, "downloads": -1, "filename": "django_declarative_apis-0.18.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e7912a17c247d23f3486aeda0936f74c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 71183, "upload_time": "2019-10-29T21:37:17", "upload_time_iso_8601": "2019-10-29T21:37:17.823242Z", "url": "https://files.pythonhosted.org/packages/4c/94/0fbb957c6fdd567bb9e77bd3272dde48396a431166474fc7838e96e78920/django_declarative_apis-0.18.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.18.4": [ { "comment_text": "", "digests": { "md5": "d9b2deeebd593a68c16969df3da281c9", "sha256": "3129f228dfceb947d8213cf78fab2886d0d5a53de18d27009783d308c817ec88" }, "downloads": -1, "filename": "django_declarative_apis-0.18.4-py3-none-any.whl", "has_sig": false, "md5_digest": "d9b2deeebd593a68c16969df3da281c9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 71183, "upload_time": "2019-10-29T22:19:00", "upload_time_iso_8601": "2019-10-29T22:19:00.859143Z", "url": "https://files.pythonhosted.org/packages/c3/71/536d2ecfd4102f6c043c6517950b9a81dd77d019a220c1af4f8f2e7b0e6c/django_declarative_apis-0.18.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5c8971c3d7a6c207564a4fcfb2812172", "sha256": "9682247c777318a14dd17e2ce161facd411207aff23a86e90fb1991d3989bc12" }, "downloads": -1, "filename": "django-declarative-apis-0.18.4.tar.gz", "has_sig": false, "md5_digest": "5c8971c3d7a6c207564a4fcfb2812172", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48933, "upload_time": "2019-10-29T22:19:02", "upload_time_iso_8601": "2019-10-29T22:19:02.458228Z", "url": "https://files.pythonhosted.org/packages/33/63/177ee20e210b3bc66ad6861b83d1124260d348d8fca43a5f8465642d4c44/django-declarative-apis-0.18.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.18.5": [ { "comment_text": "", "digests": { "md5": "4b5afb183402f1a18ed94cb246b60e25", "sha256": "220be602b41af6de4d9df5559c2a9a390bc53e5416ea11daeacddc514b0fc1e6" }, "downloads": -1, "filename": "django_declarative_apis-0.18.5-py3-none-any.whl", "has_sig": false, "md5_digest": "4b5afb183402f1a18ed94cb246b60e25", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 71245, "upload_time": "2019-11-13T21:28:40", "upload_time_iso_8601": "2019-11-13T21:28:40.697319Z", "url": "https://files.pythonhosted.org/packages/57/14/1b6283eb4bf94f5b066e8040d9c76ce30ec04a0db91d6c61fb9ac5e22faf/django_declarative_apis-0.18.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f0a1186360e73feb4c7017085d04ab98", "sha256": "982507378f3bb00e0e449cc36a959673f36925e373c91a578b5a1949f1634c17" }, "downloads": -1, "filename": "django-declarative-apis-0.18.5.tar.gz", "has_sig": false, "md5_digest": "f0a1186360e73feb4c7017085d04ab98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48884, "upload_time": "2019-11-13T21:28:41", "upload_time_iso_8601": "2019-11-13T21:28:41.827805Z", "url": "https://files.pythonhosted.org/packages/7f/39/a15ac8b8eef642fd7163edc2908f8f85e5f16494d094f0bd5bf786e02c1a/django-declarative-apis-0.18.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.19.0": [ { "comment_text": "", "digests": { "md5": "2526bfa39d9bbf51cd0fede9f6fd5344", "sha256": "5725d73fb5dc1f36bf0c3fafdb6e6b3e35fdc64603c201de5b003803b3c84815" }, "downloads": -1, "filename": "django_declarative_apis-0.19.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2526bfa39d9bbf51cd0fede9f6fd5344", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 71335, "upload_time": "2020-01-07T18:06:58", "upload_time_iso_8601": "2020-01-07T18:06:58.859242Z", "url": "https://files.pythonhosted.org/packages/01/c0/21d05f8d6b1ba342ceb6bbadf0c4c0182dde1595d1b42e3cca2b733c9ebc/django_declarative_apis-0.19.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f2c7c3400fd8f4ff598f63912b23d753", "sha256": "aac051eca2e3af3eed6ff536fce1022ea41fcfa82754e81aa7ff0eea6a4f4c77" }, "downloads": -1, "filename": "django-declarative-apis-0.19.0.tar.gz", "has_sig": false, "md5_digest": "f2c7c3400fd8f4ff598f63912b23d753", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49100, "upload_time": "2020-01-07T18:07:00", "upload_time_iso_8601": "2020-01-07T18:07:00.166061Z", "url": "https://files.pythonhosted.org/packages/c8/5b/dc840f7d6361eacd6f6a67074d974247c43d6a516674874647ab0261cc12/django-declarative-apis-0.19.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.19.1": [ { "comment_text": "", "digests": { "md5": "3e7d75c13584806f9bb1db918cdd3bce", "sha256": "a76c701b5352a05a044a09bfa46fdaf4e9acb11f768884b840808c7b52a09ff1" }, "downloads": -1, "filename": "django_declarative_apis-0.19.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3e7d75c13584806f9bb1db918cdd3bce", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72319, "upload_time": "2020-02-04T17:01:51", "upload_time_iso_8601": "2020-02-04T17:01:51.664630Z", "url": "https://files.pythonhosted.org/packages/38/b2/8366ca344c395cca945c4a1fc94722d97f786673abcc5521e80fe0905d5d/django_declarative_apis-0.19.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "af64aa08ec2662531b461b4b03105f48", "sha256": "535c7712ce2c92280fca51bcd67c38ab5bc01ace1645d3493d36836f24fff8b5" }, "downloads": -1, "filename": "django-declarative-apis-0.19.1.tar.gz", "has_sig": false, "md5_digest": "af64aa08ec2662531b461b4b03105f48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49918, "upload_time": "2020-02-04T17:01:52", "upload_time_iso_8601": "2020-02-04T17:01:52.784439Z", "url": "https://files.pythonhosted.org/packages/44/a9/2408f92f042faba90fcbe1ad4842eda9c24c3201a3e9a342d96c4b597fc5/django-declarative-apis-0.19.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.19.2": [ { "comment_text": "", "digests": { "md5": "bf131973e3fda8025edcc69c13724a8d", "sha256": "f62c3e49cb6e760310cc1631e88a0aa72995a8bc8624f5e9de33768ecb624704" }, "downloads": -1, "filename": "django_declarative_apis-0.19.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bf131973e3fda8025edcc69c13724a8d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72325, "upload_time": "2020-02-05T01:12:49", "upload_time_iso_8601": "2020-02-05T01:12:49.705234Z", "url": "https://files.pythonhosted.org/packages/d2/a8/76cf1d40ede23cadeb5c051ed73bc2383987026dc150b28b8a435bf4e205/django_declarative_apis-0.19.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "31e1bd238080b79adee260fab8b11bf2", "sha256": "4d6eb4c9e286713708f4adc7160fc53e6d663133a7c399b6e1b0d7e2660581dd" }, "downloads": -1, "filename": "django-declarative-apis-0.19.2.tar.gz", "has_sig": false, "md5_digest": "31e1bd238080b79adee260fab8b11bf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50275, "upload_time": "2020-02-05T01:12:50", "upload_time_iso_8601": "2020-02-05T01:12:50.882867Z", "url": "https://files.pythonhosted.org/packages/62/f6/b4c5eed3301e9d85593a445f3ae33a82273035af5a50ffd7362dd9f6c2b9/django-declarative-apis-0.19.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.19.3": [ { "comment_text": "", "digests": { "md5": "ceb31770ef99364e8511c384ecba8df7", "sha256": "3f1c25eb57fb2cdd9b983e7f975731cab2be0b057257f6fc7abb7f9876321885" }, "downloads": -1, "filename": "django_declarative_apis-0.19.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ceb31770ef99364e8511c384ecba8df7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72327, "upload_time": "2020-02-05T17:01:57", "upload_time_iso_8601": "2020-02-05T17:01:57.838689Z", "url": "https://files.pythonhosted.org/packages/d3/2e/a227b18a21a718965c067e553dd0169ed61ce5b1483aa0fdef716b2ecbe9/django_declarative_apis-0.19.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d2873019a4c09f5d23a2bd2859823e83", "sha256": "0975a2f80761745d05b6a8289cd4b52646a96aabcfa0ed67d66d5b5d42054c30" }, "downloads": -1, "filename": "django-declarative-apis-0.19.3.tar.gz", "has_sig": false, "md5_digest": "d2873019a4c09f5d23a2bd2859823e83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49918, "upload_time": "2020-02-05T17:01:59", "upload_time_iso_8601": "2020-02-05T17:01:59.048431Z", "url": "https://files.pythonhosted.org/packages/f4/8d/b5de5c4985448ca9bad68e9b64477ec82ff7994e6bfc3e708622f3e463fb/django-declarative-apis-0.19.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.20.0": [ { "comment_text": "", "digests": { "md5": "4f38878613f772f304418b1425a6bc42", "sha256": "3fd0a7c15db77de50d46c254f2d62cf6a851bc8f24f109ebec7f0549c3255467" }, "downloads": -1, "filename": "django_declarative_apis-0.20.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4f38878613f772f304418b1425a6bc42", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72758, "upload_time": "2020-03-09T20:43:26", "upload_time_iso_8601": "2020-03-09T20:43:26.027815Z", "url": "https://files.pythonhosted.org/packages/27/6f/df2d785d7317dc9800c01e7436a1c7cc88ab29eab47061313dac0aee05c9/django_declarative_apis-0.20.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bce0485e64bcf0fa6db7bf1024c64166", "sha256": "9b896ae8d6b82fb0aa3310de4ba525a24861b686a17662fe4a7f9bfa6b322ef1" }, "downloads": -1, "filename": "django-declarative-apis-0.20.0.tar.gz", "has_sig": false, "md5_digest": "bce0485e64bcf0fa6db7bf1024c64166", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50435, "upload_time": "2020-03-09T20:43:27", "upload_time_iso_8601": "2020-03-09T20:43:27.066784Z", "url": "https://files.pythonhosted.org/packages/48/9f/4438ebbec1925c34a39b93bbfd053546566a73650846e3ff92b0102b7743/django-declarative-apis-0.20.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.21.0": [ { "comment_text": "", "digests": { "md5": "78d6d3b5660480633d1f1d5c13a630ef", "sha256": "ba58d3a28d8ac450d922ac1cf10c7ec0d481b7613b20273c3c1a22b60b3c09ea" }, "downloads": -1, "filename": "django-declarative-apis-0.21.0.tar.gz", "has_sig": false, "md5_digest": "78d6d3b5660480633d1f1d5c13a630ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52896, "upload_time": "2020-06-09T21:36:14", "upload_time_iso_8601": "2020-06-09T21:36:14.000014Z", "url": "https://files.pythonhosted.org/packages/85/d0/7fa4df2f634f86fda4471c408eed3ea365d5ec865e880f6380355835035f/django-declarative-apis-0.21.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.22.1": [ { "comment_text": "", "digests": { "md5": "bed77dd16b31317ce091ce2761b0ff07", "sha256": "23190340c99d7c0d9ef470bda1e56e33271971e9e336fb4cbf66de6a8cf4fedd" }, "downloads": -1, "filename": "django_declarative_apis-0.22.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bed77dd16b31317ce091ce2761b0ff07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74590, "upload_time": "2020-08-11T17:53:49", "upload_time_iso_8601": "2020-08-11T17:53:49.846343Z", "url": "https://files.pythonhosted.org/packages/43/97/f1c8d0815a000cda788d697d41b08d3b8f3d82da884200ac290fcab45ee6/django_declarative_apis-0.22.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d9b4c3c2b2ca0f934213cb4666aeb7d4", "sha256": "9c90d787b1f8f170c5eae43dd1db36c428ba91a4eccba25cf0cd8044fc4379b5" }, "downloads": -1, "filename": "django-declarative-apis-0.22.1.tar.gz", "has_sig": false, "md5_digest": "d9b4c3c2b2ca0f934213cb4666aeb7d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52549, "upload_time": "2020-08-11T17:53:51", "upload_time_iso_8601": "2020-08-11T17:53:51.034309Z", "url": "https://files.pythonhosted.org/packages/bb/20/3beb21f8f6425409ab25d965bbf829aecce67c821b1cbd3ab73274de199b/django-declarative-apis-0.22.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.22.2": [ { "comment_text": "", "digests": { "md5": "39020285b7769ff2ad79abb3204c1ed8", "sha256": "e87578d5e44818fbdcedc082dbdcbcde3b9b28feaf25468dd476fcb1eb592786" }, "downloads": -1, "filename": "django_declarative_apis-0.22.2-py3-none-any.whl", "has_sig": false, "md5_digest": "39020285b7769ff2ad79abb3204c1ed8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74758, "upload_time": "2020-09-01T21:26:15", "upload_time_iso_8601": "2020-09-01T21:26:15.666387Z", "url": "https://files.pythonhosted.org/packages/e3/a0/8b145fb9b530ce51494234a460b0b0004c4462faa2e31246a983f537d5df/django_declarative_apis-0.22.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ee92d0ff77094e9eaf94ac8606fe52f2", "sha256": "221b067055fb3976a7b56f30aefcf15876e36530f43d94727c59eb328b172edf" }, "downloads": -1, "filename": "django-declarative-apis-0.22.2.tar.gz", "has_sig": false, "md5_digest": "ee92d0ff77094e9eaf94ac8606fe52f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52739, "upload_time": "2020-09-01T21:26:17", "upload_time_iso_8601": "2020-09-01T21:26:17.006779Z", "url": "https://files.pythonhosted.org/packages/5e/80/1c50132fd0b94afe4cbd7b93f27f1a9fccfc7ee5d961a0eb95432a06e06d/django-declarative-apis-0.22.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.22.3": [ { "comment_text": "", "digests": { "md5": "86c526c6938fc62e00c7f88ff668a0e9", "sha256": "3c792805610b06a278ff35c8c53d968188eae17775dcce5841193ceb01dd9018" }, "downloads": -1, "filename": "django-declarative-apis-0.22.3.tar.gz", "has_sig": false, "md5_digest": "86c526c6938fc62e00c7f88ff668a0e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58614, "upload_time": "2021-11-22T18:37:08", "upload_time_iso_8601": "2021-11-22T18:37:08.019019Z", "url": "https://files.pythonhosted.org/packages/3d/61/9219125655344d5fd2a4fa8e9e69de44b9f8cd356e9d451f0735819ea6d4/django-declarative-apis-0.22.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "86c526c6938fc62e00c7f88ff668a0e9", "sha256": "3c792805610b06a278ff35c8c53d968188eae17775dcce5841193ceb01dd9018" }, "downloads": -1, "filename": "django-declarative-apis-0.22.3.tar.gz", "has_sig": false, "md5_digest": "86c526c6938fc62e00c7f88ff668a0e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58614, "upload_time": "2021-11-22T18:37:08", "upload_time_iso_8601": "2021-11-22T18:37:08.019019Z", "url": "https://files.pythonhosted.org/packages/3d/61/9219125655344d5fd2a4fa8e9e69de44b9f8cd356e9d451f0735819ea6d4/django-declarative-apis-0.22.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }