{ "info": { "author": "", "author_email": "pydavid@baguette.io", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "==================\nbaguette-messaging\n==================\n\n.. image:: https://travis-ci.org/baguette-io/baguette-messaging.svg?branch=master\n :target: https://travis-ci.org/baguette-io/baguette-messaging\n\nTiny Framework to build micro services.\nCurrently only support **amqp**, **rpc over amqp** and **http stream** based micro services.\n\nHow it works\n============\n\n\nAMQP\n----\n\n| We declare a publisher:\n| the method decorated takes one parameter **publish** (farine.amqp.publisher.Publisher)\n\n.. code:: python\n\n\timport farine.amqp\n\t\n\tclass Publish(object):\n\t\n\t @farine.amqp.publish(exchange='consume', routing_key='routing_key')\n\t def publish_dummy(self, publish):\n \"\"\"\n :param publish: Send the data through AMQP.\n :type publish: farine.amqp.publisher.Publisher\n\t \"\"\"\n\t publish({'result':0})\n\t\n| And then a consumer :\n| the method decorated takes two parameters **body** (dict) and **message** (kombu.message.Message).\n\n.. code:: python\n\n\timport farine.amqp\n\n\tclass Consume(object):\n\t\n\t @farine.amqp.consume(exchange='publish', routing_key='routing_key')\n\t def consume_dummy(self, body, message):\n \"\"\"\n :param body: The message's data.\n :type body: dict\n :param message: Message class.\n :type message: kombu.message.Message\n \"\"\"\n\t message.ack()\n \n\n\nRPC over AMQP\n-------------\n\n| We need declare two services :\n| the server : Wait for a call(consumer), and answer(publisher).\n| The method decorated just takes **args** and **kwargs**\n\n.. code:: python\n\n\timport farine.rpc\n\t\n\tclass Server(object):\n\t\n\t @farine.rpc.method()\n\t def dummy(self, *args, **kwargs):\n\t return True\n\t\n\n| And the client : Send a call(publisher), and wait for an answer(consumer).\n| the method decorated takes one argument **rpc** (farine.rpc.client.Client).\n| The result will be a dictionnary.\n\n.. code:: python\n\n\timport farine.rpc\n\t\n\tclass Client(object):\n\t\n @farine.rpc.client('myotherservice')\n\t def dummy(self, rpc):\n \"\"\"\n :param rpc: The RPC client.\n :type rpc: farine.rpc.client.Client\n \"\"\"\n\t result = rpc.dummy()\n\n\nRPC Stream\n----------\n\n| We can also do streaming RPC call.\n| All you need to do is to add *__stream__ = True** to your RPC call.\n| Also, a generator is returned.\n\nExample:\n\n.. code:: python\n\n\timport farine.rpc\n\t\n\tclass Server(object):\n\t\n\t @farine.rpc.method()\n\t def dummy(self, *args, **kwargs):\n\t yield 'a'\n\t yield 'b'\n\t\n.. code:: python\n\n\timport farine.rpc\n\t\n\tclass Client(object):\n\t\n\t @farine.rpc.client('myotherservice')\n\t def dummy(self, rpc):\n \"\"\"\n :param rpc: The RPC client.\n :type rpc: farine.rpc.client.Client\n \"\"\"\n\t for result in rpc.dummy(__stream__=True):\n print result\n\n\nHTTP Stream\n-----------\n\n| We can declare a service that will listen to an HTTP SSE event :\n| the method decorated takes one argument **data** (dict).\n| In the configuration file, we just need to setup the endpoint to listen.\n\n.. code:: python\n\n\timport farine.stream\n\t\n\tclass Client(object):\n\t\n\t @farine.stream.http()\n\t def listen_event(self, data):\n \"\"\"\n :param data: The event sent.\n :type data: dict\n \"\"\"\n\t return True\n\nExecute method\n--------------\n\n| If all we need is to execute a method, we can use `farine.execute.method`.\n| It will restart it, if it ends (customizable).\n\n\n.. code:: python\n\n\timport farine.execute\n\t\n\tclass Client(object):\n\t\n\t @farine.execute.method()\n\t def my_own_stuff(self):\n \"\"\"\n Your own code.\n \"\"\"\n\n\nDatabase\n========\n\n| *baguette-messaging* is using peewee to manage databases connections (only postgresql is supported for the moment)\n| In order for it to detect that you are using a database, you need to create a **models.py** module.\n| Then, each time we enter into a method (amqp,rpc,stream) a database connection will be created and closed.\n| You can use the database connection using **self.db**, to manage transactions for example.\n\nExample\n-------\n\nmodels.py:\n\n.. code:: python\n\n from farine.connectors.sql import *\n \n class User(Model):\n name = CharField()\n\nservice.py:\n\n.. code:: python\n\n\timport farine.amqp\n\tfrom models import User\n\t\n\tclass Client(object):\n\n\t @farine.amqp.consume(exchange='exchange', routing_key='routing_key')\n\t def select(self, body, message):\n\t return User.select().where(User.id==1)\n\n\nOverview\n========\n\n| You can mix in a service, everything:\n| it can be a consumer of an HTTP stream, and send back the result in RPC, etc.\n\nExample\n--------\n\n.. code:: python\n\n\timport farine.rpc\n\timport farine.stream\n\t\n\tclass Client(object):\n\n @farine.stream.http()\n def get(self, data):\n return self.send(data)\n\n\t @farine.rpc.client('myotherservice')\n\t def send(self, rpc, data):\n\t return rpc.process(data)\n\n\nConfiguration\n=============\n\nBy default the configuration file is located in */etc/farine.ini*.\nYou can override this path using the environment variable **FARINE_INI**.\n\n| It must contains one section by service (using the **lowercase class name**).\n| a **DEFAULT** section can also be present.\n\nExample\n-------\n\n::\n\n [DEFAULT]\n amqp_uri = amqp://baguette:baguette@127.0.0.1:5672/baguette\n\n [consume]\n enabled = true\n\n\nDatabase\n--------\n\nIf you use a database connection, you have to add in the **[DEFAULT]** section the db parameters:\n\n::\n\n [DEFAULT]\n db_connector = postgres (required)\n db_name = name (required)\n db_user = user (required)\n db_host = host (required)\n db_password = password (required)\n db_port = port (optional)\n db_max_conn = max_connections (optional)\n db_stale_timeout = stale timeout (optional)\n db_timeout = timeout (optional)\n\n\nLaunch\n======\n\nTo launch a service, just run:\n\n.. code:: shell\n\n\tfarine --start=mymodule\n\nIt will try to import *mymodule.service* and launch it.\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/baguette-io/baguette-messaging/", "keywords": "micro", "license": "", "maintainer": "", "maintainer_email": "", "name": "baguette-messaging", "package_url": "https://pypi.org/project/baguette-messaging/", "platform": "", "project_url": "https://pypi.org/project/baguette-messaging/", "project_urls": { "Homepage": "https://github.com/baguette-io/baguette-messaging/" }, "release_url": "https://pypi.org/project/baguette-messaging/0.19/", "requires_dist": null, "requires_python": "", "summary": "Baguette messaging framework", "version": "0.19" }, "last_serial": 3970864, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "e41a8dbdf0234cd77ea3ae7f0e82d1c3", "sha256": "92069fa539796036e1764b19a1ab197915398f2918fcd34aee445131c4aa0301" }, "downloads": -1, "filename": "baguette-messaging-0.1.tar.gz", "has_sig": false, "md5_digest": "e41a8dbdf0234cd77ea3ae7f0e82d1c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15317, "upload_time": "2017-07-23T09:51:50", "url": "https://files.pythonhosted.org/packages/4d/d9/2467ff8a4ba735c9137b62d018e215a4e551092cf32648280b80613f79f5/baguette-messaging-0.1.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "300e2bc11556ae1ca6a0cd967e90c575", "sha256": "872b475737006fc1fac8d6447cc614e28466faad42de0e8536a06f1fa7771598" }, "downloads": -1, "filename": "baguette-messaging-0.11.tar.gz", "has_sig": false, "md5_digest": "300e2bc11556ae1ca6a0cd967e90c575", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18066, "upload_time": "2017-09-28T15:27:05", "url": "https://files.pythonhosted.org/packages/06/e9/b1b2b224333ea0d4245583d0886fe47cb93a6435675917974b031f1475d2/baguette-messaging-0.11.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "f1b07808ba6e97e0d581c942ebdbe679", "sha256": "53986da68ba2d21c44e9445c83bfce6750048c58c7709b8251fa6eed675a8588" }, "downloads": -1, "filename": "baguette-messaging-0.12.tar.gz", "has_sig": false, "md5_digest": "f1b07808ba6e97e0d581c942ebdbe679", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16177, "upload_time": "2017-10-10T16:57:58", "url": "https://files.pythonhosted.org/packages/50/d9/a69bfd0f929ba04102fd97cda698d258634547a321a0258a98b2dc3edaa4/baguette-messaging-0.12.tar.gz" } ], "0.13": [ { "comment_text": "", "digests": { "md5": "609f74e58b667682b1a1cd12b2428e3b", "sha256": "f3792352d39bc55e41f60bd6b32332a68c68373c38408d91b53c1e68faf27bdb" }, "downloads": -1, "filename": "baguette-messaging-0.13.tar.gz", "has_sig": false, "md5_digest": "609f74e58b667682b1a1cd12b2428e3b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16176, "upload_time": "2017-10-10T20:50:23", "url": "https://files.pythonhosted.org/packages/3d/8f/4ddc557ebd626025a0a2895617b28e432bde1a1599f4324a8ee623c18a36/baguette-messaging-0.13.tar.gz" } ], "0.14": [ { "comment_text": "", "digests": { "md5": "af6ce86a7f91c7f6878b9638e351ee5f", "sha256": "0823c3cf3716190ece81b2fa1a6c9b19ee6e359665e0b4c363e6fbad3c6aa84f" }, "downloads": -1, "filename": "baguette-messaging-0.14.tar.gz", "has_sig": false, "md5_digest": "af6ce86a7f91c7f6878b9638e351ee5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16181, "upload_time": "2017-10-10T20:59:54", "url": "https://files.pythonhosted.org/packages/d1/d5/ebd2d81328a1c50f65a4a08092f60bb8af50161e8688699ad65d5325b3f8/baguette-messaging-0.14.tar.gz" } ], "0.15": [ { "comment_text": "", "digests": { "md5": "64eeb2ca33e261348f3876659950bc5b", "sha256": "d3d1c2da866f41594189d1f72ed61835dcd69e34a613c46628f17b3d1d931835" }, "downloads": -1, "filename": "baguette-messaging-0.15.tar.gz", "has_sig": false, "md5_digest": "64eeb2ca33e261348f3876659950bc5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18277, "upload_time": "2018-01-21T16:23:53", "url": "https://files.pythonhosted.org/packages/d0/58/a43ee0f597f4339c1eef26b4133c2cde546b77d762429889ea5d35dc8c27/baguette-messaging-0.15.tar.gz" } ], "0.16": [ { "comment_text": "", "digests": { "md5": "05f4bcbb3cb9b214cc77132fc9add3dc", "sha256": "26db6089c0b68208a67c795ba0ca90013ab8cad3c631004f09797a8cc0f0ad33" }, "downloads": -1, "filename": "baguette-messaging-0.16.tar.gz", "has_sig": false, "md5_digest": "05f4bcbb3cb9b214cc77132fc9add3dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19009, "upload_time": "2018-02-03T10:50:18", "url": "https://files.pythonhosted.org/packages/1e/cb/df0240ce7cf36f7d79d30cf49d587bd4f51157a99901e55edaa4df432d51/baguette-messaging-0.16.tar.gz" } ], "0.17": [ { "comment_text": "", "digests": { "md5": "e58c839db7d82c2c2acc6f55a1c73fcd", "sha256": "241e47f2a32af1e8abab7163ede49cf462ec28a3dfaea07c9e6b5694f81eb2ad" }, "downloads": -1, "filename": "baguette-messaging-0.17.tar.gz", "has_sig": false, "md5_digest": "e58c839db7d82c2c2acc6f55a1c73fcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18955, "upload_time": "2018-02-10T12:03:21", "url": "https://files.pythonhosted.org/packages/4f/32/b28d75592cafe1ec7ddebe42843803d99d2133c4dc434dd491b8f38ecd1d/baguette-messaging-0.17.tar.gz" } ], "0.18": [ { "comment_text": "", "digests": { "md5": "8f61593d3837eb27d352d533377dbd61", "sha256": "d50c69810e1f180d9469f92a067f13f2361c6f4dcc3cf79125c3b18e2f9bca87" }, "downloads": -1, "filename": "baguette-messaging-0.18.tar.gz", "has_sig": false, "md5_digest": "8f61593d3837eb27d352d533377dbd61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18899, "upload_time": "2018-04-01T13:35:49", "url": "https://files.pythonhosted.org/packages/54/07/169597aaf1749499b3ff549b85a24ab5a981767faa337ad79d02f2f0da16/baguette-messaging-0.18.tar.gz" } ], "0.19": [ { "comment_text": "", "digests": { "md5": "734035eec1d7b87210d353dd86811244", "sha256": "c6f1a7022f2d5f974b54014625df2a7d2df34a75c0d3202f3f715a8e64411b74" }, "downloads": -1, "filename": "baguette-messaging-0.19.tar.gz", "has_sig": false, "md5_digest": "734035eec1d7b87210d353dd86811244", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18881, "upload_time": "2018-06-17T11:45:08", "url": "https://files.pythonhosted.org/packages/60/bd/c947d994b5ef0022c6ccf04764b5a43cb121080f3795809ed3ed06bc9be7/baguette-messaging-0.19.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "734035eec1d7b87210d353dd86811244", "sha256": "c6f1a7022f2d5f974b54014625df2a7d2df34a75c0d3202f3f715a8e64411b74" }, "downloads": -1, "filename": "baguette-messaging-0.19.tar.gz", "has_sig": false, "md5_digest": "734035eec1d7b87210d353dd86811244", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18881, "upload_time": "2018-06-17T11:45:08", "url": "https://files.pythonhosted.org/packages/60/bd/c947d994b5ef0022c6ccf04764b5a43cb121080f3795809ed3ed06bc9be7/baguette-messaging-0.19.tar.gz" } ] }