{ "info": { "author": "Richard Kuesters", "author_email": "rkuesters@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Utilities" ], "description": "==============\n``sanic-boom``\n==============\n\n\n\nComponents injection, fast routing and non-global (layered) middlewares. Give your Sanic application a Boom!\n\nIn a nutshell\n-------------\n\n.. code-block:: python\n\n \"\"\"Example code taken from\n https://marshmallow.readthedocs.io/en/3.0/quickstart.html#quickstart\n \"\"\"\n\n import datetime as dt\n import inspect\n import typing as t\n\n from marshmallow import Schema, fields, post_load\n from sanic.exceptions import ServerError\n from sanic.response import text\n\n from sanic_boom import Component, SanicBoom\n\n # --------------------------------------------------------------------------- #\n # marshmallow related code\n # --------------------------------------------------------------------------- #\n\n\n class User(object):\n def __init__(self, name, email):\n self.name = name\n self.email = email\n self.created_at = dt.datetime.now()\n\n def __repr__(self):\n return \"\".format(self=self)\n\n def say_hi(self):\n return \"hi, my name is {}\".format(self.name)\n\n\n class UserSchema(Schema):\n name = fields.Str()\n email = fields.Email()\n created_at = fields.DateTime()\n\n @post_load\n def make_user(self, data):\n return User(**data)\n\n\n # --------------------------------------------------------------------------- #\n # sanic-boom related code\n # --------------------------------------------------------------------------- #\n\n\n class JSONBody(t.Generic[t.T_co]):\n pass\n\n\n class JSONBodyComponent(Component):\n def resolve(self, param: inspect.Parameter) -> bool:\n if hasattr(param.annotation, \"__origin__\"):\n return param.annotation.__origin__ == JSONBody\n return False\n\n async def get(self, request, param: inspect.Parameter) -> object:\n inferred_type = param.annotation.__args__[0]\n try:\n return inferred_type().load(request.json).data\n except Exception:\n raise ServerError(\n \"Couldn't convert JSON body to {!s}\".format(inferred_type)\n )\n\n\n app = SanicBoom(__name__)\n app.add_component(JSONBodyComponent)\n\n\n @app.post(\"/\")\n async def handler(user: JSONBody[UserSchema]): # notice the handler parameters\n return text(user.say_hi())\n\n\n if __name__ == \"__main__\":\n app.run(host=\"0.0.0.0\", port=8000, workers=1)\n\n::\n\n $ curl -v http://localhost:8000/ -d '{\"name\":\"John Doe\",\"email\":\"john.doe@example.tld\"}'\n * Trying ::1...\n * TCP_NODELAY set\n * connect to ::1 port 8000 failed: Connection refused\n * Trying 127.0.0.1...\n * TCP_NODELAY set\n * Connected to localhost (127.0.0.1) port 8000 (#0)\n > POST / HTTP/1.1\n > Host: localhost:8000\n > User-Agent: curl/7.61.1\n > Accept: */*\n > Content-Length: 50\n > Content-Type: application/x-www-form-urlencoded\n >\n * upload completely sent off: 50 out of 50 bytes\n < HTTP/1.1 200 OK\n < Connection: keep-alive\n < Keep-Alive: 5\n < Content-Length: 23\n < Content-Type: text/plain; charset=utf-8\n <\n * Connection #0 to host localhost left intact\n hi, my name is John Doe\n\n.. warning::\n\n **IMPORTANT**: ``sanic-boom`` is in **very early stages** of development! Use with caution and be aware that some functionalities and APIs may change between versions until they're out of **alpha**.\n\nDependencies\n============\n\n``sanic-boom`` depends on two \"not-so-known\" libraries (both created by the author of ``sanic-boom``):\n\n- `sanic-ipware `_; and\n- `xrtr `_\n\n.. important::\n\n Since ``xrtr`` **replaces** the Sanic default router under the hood in ``sanic-boom``, it is very important for the developer to read its documentation (in the link provided above).\n\nDocumentation\n=============\n\nhttps://sanic-boom.readthedocs.io/en/latest/\n\nLicense\n=======\n\n``sanic-boom`` is a free software distributed under the `MIT `_ license.\n\nChangelog\n=========\n\nv0.1.2 on 2018-10-23\n--------------------\n\n* Added ``components`` property on ``BoomRequest`` so any request \"leftover\" may be handled properly (like an open database connection).\n\nv0.1.1 on 2018-10-18\n--------------------\n\n* Fixed a bug where handlers derived from ``HTTPMethodView`` class were not being executed (for their signature actually be ``*args, **kwargs``).\n\n\nv0.1.0 on 2018-10-17\n--------------------\n\n* First release on PyPI. (Probably) not stable.\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/vltr/sanic-boom", "keywords": "sanic,components,lifecycle,productivity", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "sanic-boom", "package_url": "https://pypi.org/project/sanic-boom/", "platform": "", "project_url": "https://pypi.org/project/sanic-boom/", "project_urls": { "Homepage": "https://github.com/vltr/sanic-boom" }, "release_url": "https://pypi.org/project/sanic-boom/0.1.4/", "requires_dist": [ "Sanic (<=19.3)", "xrtr (>=0.2.1)", "sanic-ipware (>=0.1.0)", "httptools (>=0.0.11)" ], "requires_python": "", "summary": "Components injection, fast routing and non-global (layered) middlewares. Give your Sanic application a Boom!", "version": "0.1.4" }, "last_serial": 5906747, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "9ca97bf669f6aacaab60b9b5e9859b69", "sha256": "95cc458f22abbaa6c2b7134df7781bac639a92531b0422d4bb0a282d8059ade6" }, "downloads": -1, "filename": "sanic_boom-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9ca97bf669f6aacaab60b9b5e9859b69", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14514, "upload_time": "2018-10-17T20:14:45", "url": "https://files.pythonhosted.org/packages/04/d1/611d255695e5e3d78a275a56dc42223eb658ff445c6bb62bb94a4617b11c/sanic_boom-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa3bc352084b5474e95d15dff1664c44", "sha256": "8be654be5afa5898ea3803fd67a1a4753076748793f5b1688fd0f900c0e4ce61" }, "downloads": -1, "filename": "sanic-boom-0.1.0.tar.gz", "has_sig": false, "md5_digest": "fa3bc352084b5474e95d15dff1664c44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27137, "upload_time": "2018-10-17T20:14:47", "url": "https://files.pythonhosted.org/packages/32/16/35e27b99cc2f8012ba20ee878f49e2a3b1778d58c21cefed51424319d822/sanic-boom-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d7f67a473048d175a2aa5220c398bec6", "sha256": "ab07116f307f59f5183ed8e7f1e7e14577e33b5a6732929a105744034399d00d" }, "downloads": -1, "filename": "sanic_boom-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d7f67a473048d175a2aa5220c398bec6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14826, "upload_time": "2018-10-18T20:30:41", "url": "https://files.pythonhosted.org/packages/2f/cd/83c6b3befaba341a11e45cb3f1bebfc9288ae22942a26c25d42b5f00a154/sanic_boom-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b37210e36501f520f7b4803a47129319", "sha256": "045d4dca6baad6de441de6fb8dd943bfaf610ee44a3195f90f0586b179c4a239" }, "downloads": -1, "filename": "sanic-boom-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b37210e36501f520f7b4803a47129319", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30184, "upload_time": "2018-10-18T20:30:43", "url": "https://files.pythonhosted.org/packages/34/2d/bd89140b6dc0bcd5d68440033879667c2eb6f468612902d3bc987b7c1868/sanic-boom-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "14bffd07043c26f9c75db0088303421e", "sha256": "9fbf717dbfea8b93b4e4c94e50d856a7fea3e8ed1fb1a64d39cd042fb5a95238" }, "downloads": -1, "filename": "sanic_boom-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "14bffd07043c26f9c75db0088303421e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15109, "upload_time": "2018-10-23T18:13:03", "url": "https://files.pythonhosted.org/packages/7f/4a/a9ba25f1d70bafaa9a6e564c937235c7e319b6580cbbc589ee960badb7c0/sanic_boom-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d0415b06f887ec0a180c97e09a37ca89", "sha256": "98ce8ea6c9fc108cb5d1c23f48ea28e46d3fa34e15b280a77dc0347ee719d784" }, "downloads": -1, "filename": "sanic-boom-0.1.2.tar.gz", "has_sig": false, "md5_digest": "d0415b06f887ec0a180c97e09a37ca89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30538, "upload_time": "2018-10-23T18:13:04", "url": "https://files.pythonhosted.org/packages/52/4c/ff1ec11e77cf5da468db41448f11cad3f7b61f5edcfb66e43ff69b40e6c1/sanic-boom-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "48fe2477bbdc34c1ec294c87e70c061a", "sha256": "a1005443a07673c1d0a458caf0dfc86b0541347164c101e1268ecfba40d43dd5" }, "downloads": -1, "filename": "sanic-boom-0.1.3.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "48fe2477bbdc34c1ec294c87e70c061a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10861, "upload_time": "2019-09-30T11:55:48", "url": "https://files.pythonhosted.org/packages/4c/64/8859baa403b13b8a5669fd7b61c6d71a8c097367b72f92d3618e980844f6/sanic-boom-0.1.3.linux-x86_64.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "3c0e3dd19129665c12eff8fbd914f138", "sha256": "ba84a51a64ea1a007a566fffacaf169cd840a6f2c656ecebecba47a22f985cb6" }, "downloads": -1, "filename": "sanic_boom-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3c0e3dd19129665c12eff8fbd914f138", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15123, "upload_time": "2019-09-30T12:36:27", "url": "https://files.pythonhosted.org/packages/29/54/813f48751ed4c311208102db5ef0c8c94e8aca67b5d7403e6a81fbed321e/sanic_boom-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a405515d54bfb0d081c5245227f6d07", "sha256": "b3a509046b15536c169fac2c1dda57e7a77f6f11df6402c5b7d1480f24e67443" }, "downloads": -1, "filename": "sanic-boom-0.1.4.tar.gz", "has_sig": false, "md5_digest": "7a405515d54bfb0d081c5245227f6d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30813, "upload_time": "2019-09-30T12:36:29", "url": "https://files.pythonhosted.org/packages/1d/37/20382d424313e27bf63d1c4430b88540eba78aeb1272f2c7b1c725abd55d/sanic-boom-0.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3c0e3dd19129665c12eff8fbd914f138", "sha256": "ba84a51a64ea1a007a566fffacaf169cd840a6f2c656ecebecba47a22f985cb6" }, "downloads": -1, "filename": "sanic_boom-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3c0e3dd19129665c12eff8fbd914f138", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15123, "upload_time": "2019-09-30T12:36:27", "url": "https://files.pythonhosted.org/packages/29/54/813f48751ed4c311208102db5ef0c8c94e8aca67b5d7403e6a81fbed321e/sanic_boom-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a405515d54bfb0d081c5245227f6d07", "sha256": "b3a509046b15536c169fac2c1dda57e7a77f6f11df6402c5b7d1480f24e67443" }, "downloads": -1, "filename": "sanic-boom-0.1.4.tar.gz", "has_sig": false, "md5_digest": "7a405515d54bfb0d081c5245227f6d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30813, "upload_time": "2019-09-30T12:36:29", "url": "https://files.pythonhosted.org/packages/1d/37/20382d424313e27bf63d1c4430b88540eba78aeb1272f2c7b1c725abd55d/sanic-boom-0.1.4.tar.gz" } ] }