{ "info": { "author": "fcracker79", "author_email": "fcracker79@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development" ], "description": "|build status|\n\nreactive-grpc\n=============\n\nA simple gRPC bridge to reactive streams.\n\nExample: Given the following Protocol buffers definition:\n\n::\n\n syntax = \"proto3\";\n\n package rxgrpc.test;\n\n service TestService {\n rpc GetOneToOne(TestRequest) returns (TestResponse) {}\n rpc GetOneToStream(TestRequest) returns (stream TestResponse) {}\n rpc GetStreamToOne(stream TestRequest) returns (TestResponse) {}\n rpc GetStreamToStream(stream TestRequest) returns (stream TestResponse) {}\n }\n\n message TestRequest {\n string message = 1;\n }\n\n message TestResponse {\n string message = 1;\n }\n\nand a simple Servicer class:\n\n.. code:: python\n\n from test.proto.test_pb2_grpc import TestServiceServicer\n from test.proto import test_pb2\n\n\n class _Servicer(TestServiceServicer):\n def GetOneToOne(self, request: test_pb2.TestRequest, context):\n return test_pb2.TestResponse(message='response: {}'.format(request.message))\n\n def GetOneToStream(self, request, context):\n for i in range(3):\n yield test_pb2.TestResponse(message='response {}: {}'.format(i, request.message))\n\n def GetStreamToOne(self, request_iterator, context):\n return test_pb2.TestResponse(\n message='response: {}'.format(\n ', '.join(map(lambda d: d.message, request_iterator))\n )\n )\n\n def GetStreamToStream(self, request_iterator, context):\n yield from map(\n lambda d: test_pb2.TestResponse(message='response: {}'.format(d.message)),\n request_iterator\n )\n\nA simple gRPC reactive server where request messages are transformed can\nbe created as follows:\n\n.. code:: python\n\n from test.proto import test_pb2_grpc, test_pb2\n from rxgrpc import server, mappers\n from rx import operators\n from test.proto.test_pb2_grpc import TestServiceServicer\n\n\n class _Servicer(TestServiceServicer):\n # ...\n pass\n\n\n workers = 3\n rx_server = server.create_server(test_pb2, workers)\n test_pb2_grpc.add_TestServiceServicer_to_server(_Servicer(), rx_server)\n rx_server.add_insecure_port('[::]:50051')\n\n def _transform_message(m: test_pb2.TestRequest) -> test_pb2.TestRequest:\n return test_pb2.TestRequest(message='TRANSFORMED {}'.format(m.message))\n\n rx_server.set_grpc_observable(\n rx_server.grpc_pipe(\n operators.map(mappers.grpc_invocation_map(_transform_message)),\n method_name='/rxgrpc.test.TestService/GetOneToOne'),\n method_name='/rxgrpc.test.TestService/GetOneToOne'\n )\n\n rx_server.start()\n\nHere it is an example of a filter for a streaming input:\n\n.. code:: python\n\n from rxgrpc import operators\n from test.proto import test_pb2\n\n\n def _filter_message(m: test_pb2.TestRequest) -> test_pb2.TestRequest:\n return bool(int(m.message[-1]) % 2)\n\n server = ...\n server.set_grpc_observable(\n server.grpc_pipe(\n operators.filter(_filter_message),\n method_name='/rxgrpc.test.TestService/GetStreamToOne'),\n method_name='/rxgrpc.test.TestService/GetStreamToOne'\n )\n\n.. |build status| image:: https://img.shields.io/travis/fcracker79/reactive-grpc/master.svg?style=flat-square\n :target: https://travis-ci.org/fcracker79/reactive-grpc", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/fcracker79/reactive-grpc", "keywords": "reactive reactive-programming grpc protobuf", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "reactive-grpc", "package_url": "https://pypi.org/project/reactive-grpc/", "platform": "", "project_url": "https://pypi.org/project/reactive-grpc/", "project_urls": { "Homepage": "https://github.com/fcracker79/reactive-grpc" }, "release_url": "https://pypi.org/project/reactive-grpc/0.0.2/", "requires_dist": null, "requires_python": "", "summary": "Python reactive gRPC support", "version": "0.0.2" }, "last_serial": 4994678, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c8a68c637204389ca581bbee6ced09ca", "sha256": "6de728b2fa325532794fdc202ddfd8dc4e1c266cb6c692e1e8eb7ae7714035b3" }, "downloads": -1, "filename": "reactive-grpc-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c8a68c637204389ca581bbee6ced09ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4905, "upload_time": "2019-03-24T18:02:01", "url": "https://files.pythonhosted.org/packages/31/ad/6d28ca0143aa92bb23b139c027eab3931c0f45d0a9f58a65c7bf95572472/reactive-grpc-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "d790412d5d052eb8bab80f96d5e195b5", "sha256": "88585707c4996894987deff715f24173ce83448019ae40a6d93a5ace10125bf7" }, "downloads": -1, "filename": "reactive-grpc-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d790412d5d052eb8bab80f96d5e195b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5511, "upload_time": "2019-03-27T20:34:18", "url": "https://files.pythonhosted.org/packages/22/d1/6f356fb5c1911f151c2cfe80ce1579f70b63bbc13826f55ede1c8130370d/reactive-grpc-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d790412d5d052eb8bab80f96d5e195b5", "sha256": "88585707c4996894987deff715f24173ce83448019ae40a6d93a5ace10125bf7" }, "downloads": -1, "filename": "reactive-grpc-0.0.2.tar.gz", "has_sig": false, "md5_digest": "d790412d5d052eb8bab80f96d5e195b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5511, "upload_time": "2019-03-27T20:34:18", "url": "https://files.pythonhosted.org/packages/22/d1/6f356fb5c1911f151c2cfe80ce1579f70b63bbc13826f55ede1c8130370d/reactive-grpc-0.0.2.tar.gz" } ] }