{ "info": { "author": "Chris Fauerbach", "author_email": "chris@fauie.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# metrobus\n![Metrobus - Elastic](https://raw.githubusercontent.com/chrisfauerbach/metrobus/master/elasticsearch_head.png?raw=true)\n\nProof of concept and example for smart routing on a dumb bus.\n\nThis is a small project focused on my blog posts around routing on a message bus that's dumb. Like Kafka. \n\nStateless and dumb: https://medium.com/capital-one-developers/stateless-and-dumb-microservices-on-a-message-bus-be78bca93ccb\n\nFast Cache: https://medium.com/capital-one-developers/blazing-fast-data-lookup-in-a-microservices-world-dd3ae548ca45\n\nI use some of the cacheing ideas in here for a few of my data lookups.\n\nThe concept for the 'test' example application is fairly simple. The 'pusher' generates records, as if from a client or application. These records are simple JSON structures. For our example, we get cool things like an account number (FAKE!). The 'pusher' sends the message to the 'Source' topic on Kafka. Consider this your public entry point for upstream clients.\n\nNext, the 'busdriver' takes over. The 'busdriver' then pulls data from the Source, and formats it to something that downstream can use. In our case, we add a 'header' object. This 'header' contains a 'route' (and an initial route, and a historical route for tracking purposes). Once this is created based on some intelligence (if the message is in a certain state, or of a certain type, etc), then the 'busdriver' configures it to be so. This is where the 'metrobus' framework comes into play. Once the callback to the 'busdriver' returns the 'wrapped' object, the framework pulls (pops) the \"next\" stop (Kafka Topic) from the routes stack, and sends the message downstream.\n\nIn this case, our first stop after the 'busdriver' is the microservice that uses external data to get the email address associated with the account.. This is our 'contactpoint' micro service. You know, the point at which we should contact the customer? Email address? Come on. Generic! The 'contactpoint' microservice pulls from an external cache, and loads the email address. If the cache doesn't contain the email address, the callback function returns None, indicating that the message is 'dropped' appropriately. I may change this to a specific 'Exception'. Soon?\n\nNext is the 'whitelist' service. Long story short, same pattern. If the email address is in the whitelist cache, we can send to it. If not, the message gets dropped.\n\nNext is the 'LogStop' service. If we were really building an email service, this is where we would send the message out through an SMTP server or something cool like mailgun or mailchimp. IN this case, we just drop it.. cause you know... example code.\n\nQuestions? hit me up: chris [ @ ] [at] (obfuscation) fauie.com\n\n\nOH, The entire reason I wrote this framework is to make each of my stops 'dumb', and focus on only one thing... processing the message. Doesn't care where it came from. Doesn't care where it's going. Just do your job. KISS.\n\n```python\nimport time\nimport json\nfrom metrobus import metrobus\nimport sys\nimport random\n\n\n# To consume latest messages and auto-commit offsets\nWHITE_LIST = set()\n\ndef callback(message):\n print(\"Received in CB: \", message)\n real_message = message\n if real_message['email'] in WHITE_LIST:\n real_message['whitelist'] = True\n return real_message\n print(\"DROPPING due to missing white list.\")\n return\n\nif __name__ == \"__main__\":\n print(\"Trying to start app.\")\n print(\"Loading whitelist\")\n counter = 0\n with open('./data/whitelist.dat', 'r') as input_file:\n for line in input_file:\n line = line.strip()\n WHITE_LIST.add(line)\n counter+=1\n if counter % 100000 == 0:\n print('added another 100k, up to ', counter)\n\n\n topic_in = \"WhiteList\"\n metrostop = metrobus.MetroStop(callback, in_topic=topic_in)\n metrostop.start()\n```\n\nThe unique bit of code for this 'stop' is the \"topic_in\" (configuration file, seriously folks), loading of the cache (whitelist.dat), and then processing each message. Seriously, it's like 12 lines of code.. This is what I mean, when I say \"are you kidding? That's like 10 lines of code!\"\n\n\n# Setup\n\nOnce you download the clone/download this repo, let's setup some stuff in the test path:\n- git clone git@github.com:chrisfauerbach/metrobus.git\n- cd metrobus\n- cd test\n- pip install --upgrade pipenv\n- pipenv shell\n- mkdir data\n- python make_whitelist.py > data/whitelist.dat\n- python make_account_email.py > data/emails.dat\n- ./run.sh\n\nYou'll then see a lot of docker compose stuff happening. The environment variables are in metrobus.env\n\nThey're set to:\n- Kafka: kafka:9092\n- Redis: redis:6379\n\nThose host names are set in the docker-compose file.\n\n\n# docker-compose.yml\n\n ## Web Status\n Web application, in order to see some super basic stats from redis. \n\n http://localhost:5000/\n\n Flask app in web.py\n\n ## Pusher\n Cool name, eh? Pusher?\n\n This is the example 'source' of data\n\n Raw JSON messages going into Kafka...\n\n pusher.py\n\n ## Bus Driver\n\n This is the first major step of the process.\n\n Bus driver is my smart router dude. In a real\n\n application, bus driver could/would inspect\n\n the state of the data coming in. THen, it would\n\n dynamically build a route\n\n https://medium.com/capital-one-developers/stateless-and-dumb-microservices-on-a-message-bus-be78bca93ccb\n\n ## Contact Point - Add Email (Stage one)\n\n This application uses the fake account ID\n\n generated in the pusher. Adds an email\n\n address based on the cps.dat file you\n\n previously generated. Drops message if can't find\n\n ## Whitelist (stage two)\n\n Example of a whitelist. I blogged about black list.\n\n Same dealio? If record (email in this case) isn't\n\n in the list, then we can drop the messsage (return)\n\n ## Log Stop (stage three)\n\n This is an example 'sink' stop on the metrobus\n\n All this bad boy does is logs the message..\n\n in the real world, this could shove into elasticsearch\n\n or something less cool than ES.\n\n\n\n\n## NOTE\nThis is a personal project and has nothing to do with my employer or any contracts/clients I have. \n\nI will build this project out to be MIT licensed though, for anyone to use and abuse.\n\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://github.com/chrisfauerbach/metrobus", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "metrobus", "package_url": "https://pypi.org/project/metrobus/", "platform": "", "project_url": "https://pypi.org/project/metrobus/", "project_urls": { "Homepage": "https://github.com/chrisfauerbach/metrobus" }, "release_url": "https://pypi.org/project/metrobus/0.0.23/", "requires_dist": null, "requires_python": "", "summary": "A package to allow flexible and quick programs on a message bus/kafka.", "version": "0.0.23" }, "last_serial": 4189574, "releases": { "0.0.10": [ { "comment_text": "", "digests": { "md5": "386388d92a539127760267c5eab3698c", "sha256": "d799725fb32d14e3fa71eadaa3b72547b868955772dc9aeb42ff6bf17aceab9f" }, "downloads": -1, "filename": "metrobus-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "386388d92a539127760267c5eab3698c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7309, "upload_time": "2018-08-17T19:07:54", "url": "https://files.pythonhosted.org/packages/be/74/bfbc0471b177e3711c19eb6fd7211e51ec7a45c44a1ad9a6e6ad61fb343a/metrobus-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "043b2687b0ccf648fce9bdb2a4a10327", "sha256": "12473b7f3245e98f31ff5983474e9ace9935863f177bf687a666cdafc62dd85b" }, "downloads": -1, "filename": "metrobus-0.0.10.tar.gz", "has_sig": false, "md5_digest": "043b2687b0ccf648fce9bdb2a4a10327", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7208, "upload_time": "2018-08-17T19:07:55", "url": "https://files.pythonhosted.org/packages/e8/78/df1742537564c9021ec299e03ca22eabfef978ca14dcf4e4a3bdab5cc57d/metrobus-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "232fd0a4158795e9e0b13333dd0d135f", "sha256": "be2aa8e46aaa09c70c3a39d8070e2dba1309b3fb790e5a5f44501757d83144f1" }, "downloads": -1, "filename": "metrobus-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "232fd0a4158795e9e0b13333dd0d135f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7450, "upload_time": "2018-08-17T19:29:43", "url": "https://files.pythonhosted.org/packages/93/0c/cf42a205380c7cca8e84e1bde7af5e62edee51981318329742bae5c6b64d/metrobus-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8ea4b5be6bfb6f5d47057fb05c68d608", "sha256": "f279415d75a721cf2741b33e32321548f1bcb4471abc251d5db197c5c467400a" }, "downloads": -1, "filename": "metrobus-0.0.11.tar.gz", "has_sig": false, "md5_digest": "8ea4b5be6bfb6f5d47057fb05c68d608", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7329, "upload_time": "2018-08-17T19:29:44", "url": "https://files.pythonhosted.org/packages/10/d0/ae857d2d6e6f0782480271f3c38d1b605192c67b21f6b555b177113b6cab/metrobus-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "067f54a4c15f3847a3873e44e0dc16b7", "sha256": "3b50f5f33aa8ef57b63c021557ebfb9a32231043ece2de773f3050354b1d3476" }, "downloads": -1, "filename": "metrobus-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "067f54a4c15f3847a3873e44e0dc16b7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7580, "upload_time": "2018-08-17T19:43:31", "url": "https://files.pythonhosted.org/packages/99/d3/b2a9cb010b7768e86cb4079b90b49c12aa71e8687f39f7abcc22e470453f/metrobus-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c138bb1b921ef161723a8f953eef0fe3", "sha256": "b82eb92a4caee7d8981083cb951341a08074efb48d12eb2ca3d87ef82bf598e0" }, "downloads": -1, "filename": "metrobus-0.0.12.tar.gz", "has_sig": false, "md5_digest": "c138bb1b921ef161723a8f953eef0fe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7461, "upload_time": "2018-08-17T19:43:32", "url": "https://files.pythonhosted.org/packages/12/65/57826bf1ebcd2a6d597ccfeb16c3237d40d0fcec9c8ce94cdf3545968128/metrobus-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "aedf30a57eb75623c7de3f1321f5a468", "sha256": "b1bf592792bd2fa509ce9eab030006bcf52935176a5ea548efe7c0824cdfdf1d" }, "downloads": -1, "filename": "metrobus-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "aedf30a57eb75623c7de3f1321f5a468", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7583, "upload_time": "2018-08-17T19:49:16", "url": "https://files.pythonhosted.org/packages/d2/36/53641955688226d21fd8676104553d0619dce2bdad3663d9a19fc640c43d/metrobus-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3fbe5e27ebbacd856a34e9aa05be9507", "sha256": "0cd66b894ec8934b8dc5684af891c9803b7a4e3e4874300f67a8be0e6e790e00" }, "downloads": -1, "filename": "metrobus-0.0.13.tar.gz", "has_sig": false, "md5_digest": "3fbe5e27ebbacd856a34e9aa05be9507", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7460, "upload_time": "2018-08-17T19:49:16", "url": "https://files.pythonhosted.org/packages/7d/84/4b289b9e8491ea4dc84fa615ceff272121f4987d7e9f56e4aad4f2f51047/metrobus-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "c200348ce421f7540b6abfc8b076bb42", "sha256": "4ceac537edfefd320d2bc0fcc119d5df062301765d5cfb9e9c1b5126e64ca02a" }, "downloads": -1, "filename": "metrobus-0.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "c200348ce421f7540b6abfc8b076bb42", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7593, "upload_time": "2018-08-17T20:01:22", "url": "https://files.pythonhosted.org/packages/2e/98/d966ade950178582e97ca17f9a45ebfd615e27e66e1d96efc3db4836e549/metrobus-0.0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0e80d99c9fca63651f4b95c45f41699", "sha256": "eb7098e014b113f2c475a015572980de811d7af4e944c29a3917c26dae4ba089" }, "downloads": -1, "filename": "metrobus-0.0.14.tar.gz", "has_sig": false, "md5_digest": "e0e80d99c9fca63651f4b95c45f41699", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7473, "upload_time": "2018-08-17T20:01:23", "url": "https://files.pythonhosted.org/packages/72/20/751c356193c42e7e2f2c574d80b76ae4b4ecceca19715774b4a5cc797d41/metrobus-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "2a339b15f7f9b218c1a6b24f3250b491", "sha256": "17bdaeb4275473bf50049e9010b5ede342aa6a2f6a90794bfa19c4144d8ee403" }, "downloads": -1, "filename": "metrobus-0.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "2a339b15f7f9b218c1a6b24f3250b491", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7602, "upload_time": "2018-08-17T20:31:29", "url": "https://files.pythonhosted.org/packages/63/2b/a6ec5ffa6047947f6c225f7ff9ff3c4443d24c5056b1f2e58506da1960f4/metrobus-0.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3305ea9661bf7d6b7801365f5e29b56", "sha256": "cc82eb5667c68921cee1f789a2f815b90c90eadaaf4dcf10e43c640a9d5632b7" }, "downloads": -1, "filename": "metrobus-0.0.15.tar.gz", "has_sig": false, "md5_digest": "c3305ea9661bf7d6b7801365f5e29b56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7491, "upload_time": "2018-08-17T20:31:31", "url": "https://files.pythonhosted.org/packages/de/13/8d72dd1a417dcaa622f512f821095692e3cf3edbedefa740e8738a8728df/metrobus-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "110eb1b6e1e9d461468af57074d9122f", "sha256": "1520e859e4af21ab10715c59bb2d2e64ad05c7cc92f9b058392565430c7eb987" }, "downloads": -1, "filename": "metrobus-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "110eb1b6e1e9d461468af57074d9122f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7600, "upload_time": "2018-08-17T20:38:23", "url": "https://files.pythonhosted.org/packages/2a/d3/2e1f63dbd6b97a42475b5e7b3c00478bb3c5d49ffccf8c293095bf9f1a21/metrobus-0.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8fab4f6c1ea51c717b9b6d28f9aaba59", "sha256": "03a3ed5a5b86e2a9cf6c6e2ceee582b79a437586eca5ea5c8e9017bb9b235c59" }, "downloads": -1, "filename": "metrobus-0.0.16.tar.gz", "has_sig": false, "md5_digest": "8fab4f6c1ea51c717b9b6d28f9aaba59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7497, "upload_time": "2018-08-17T20:38:24", "url": "https://files.pythonhosted.org/packages/9e/22/b7dc6a123a5cff2ab3d0e077b9917bf5fa9aada01931fc9fe82bdf81d30f/metrobus-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "7d5039d7a76b92a9769e7297349212f7", "sha256": "c7eba3a4848f3747c497c5bddb3d4a9b117d99e443b225c4ddf4cda3097f8a28" }, "downloads": -1, "filename": "metrobus-0.0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "7d5039d7a76b92a9769e7297349212f7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7600, "upload_time": "2018-08-20T14:50:50", "url": "https://files.pythonhosted.org/packages/c2/fe/9f4ae763c0e38c5697fae8d1f4cd604eb5548a727ca4e1358fef1f1848d7/metrobus-0.0.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23b18b1993478e80f36e494dffb3e1ef", "sha256": "afbb0796337a47cf33296d4a76459c5442e3ef92c8a0bc1e5e1d87b01c82759c" }, "downloads": -1, "filename": "metrobus-0.0.17.tar.gz", "has_sig": false, "md5_digest": "23b18b1993478e80f36e494dffb3e1ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7491, "upload_time": "2018-08-20T14:50:52", "url": "https://files.pythonhosted.org/packages/64/88/d14377d067dd1b2743247f759f1bb15694084d6ae6568aa9b600e7ca2fab/metrobus-0.0.17.tar.gz" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "0833c47b9cfc693a440f9f686f5a41f3", "sha256": "a9fcf646c7cccd71186450698288679593677d36d1f56f80e3363afd67198746" }, "downloads": -1, "filename": "metrobus-0.0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "0833c47b9cfc693a440f9f686f5a41f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7554, "upload_time": "2018-08-20T15:09:11", "url": "https://files.pythonhosted.org/packages/55/c7/352c67fed7475ad731c6ee2ba3ef6c70aa75f02e1bc49fee14eb7fb6f1c5/metrobus-0.0.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7063df0ac586430c1e4ab3dc6252f179", "sha256": "a2c829b07fe7f44b8e6e715f3d1385f88c1508e31c3c982aecadc938ee5ebe22" }, "downloads": -1, "filename": "metrobus-0.0.18.tar.gz", "has_sig": false, "md5_digest": "7063df0ac586430c1e4ab3dc6252f179", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7451, "upload_time": "2018-08-20T15:09:13", "url": "https://files.pythonhosted.org/packages/b3/6a/e60f376447327febb705119a9bf5d6adcd48e8d150adfbd19c908f5567e5/metrobus-0.0.18.tar.gz" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "b7d320b25b872e9cba5d207623b2bb3f", "sha256": "761e5a0ee5582459d58502667d78ade20cee20441329ef3b2ae852aafea858f7" }, "downloads": -1, "filename": "metrobus-0.0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "b7d320b25b872e9cba5d207623b2bb3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7562, "upload_time": "2018-08-20T15:56:29", "url": "https://files.pythonhosted.org/packages/74/19/cf11fb6ada0034d0538eb6be2a47de8b30dfe48e7aacff11d3d27f5a1b4d/metrobus-0.0.19-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a9afc5b2832f76e112269b081d756fb", "sha256": "b2d80f2249fc110673532cf9644deb4d6b42eb773dafaca3285f60277219f00b" }, "downloads": -1, "filename": "metrobus-0.0.19.tar.gz", "has_sig": false, "md5_digest": "6a9afc5b2832f76e112269b081d756fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7456, "upload_time": "2018-08-20T15:56:30", "url": "https://files.pythonhosted.org/packages/88/2e/09f60805df293d3d7010a79c26f8e7ec42e48023abd391d92461affc0732/metrobus-0.0.19.tar.gz" } ], "0.0.20": [ { "comment_text": "", "digests": { "md5": "e5babdac365ae66baf86e265241f9c38", "sha256": "12314a787ee96392ef72d8b0d688305c2bde02d6866e68734e8e6d9add8b412a" }, "downloads": -1, "filename": "metrobus-0.0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "e5babdac365ae66baf86e265241f9c38", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7582, "upload_time": "2018-08-20T17:48:12", "url": "https://files.pythonhosted.org/packages/ad/2a/46dc4eea876652ace625bf1bab17cb73f5101cf2e9cd1cd6c917a343eb52/metrobus-0.0.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7fc131e1cfe1de3466fd2a333fcf8c9d", "sha256": "4bfcf32de77fdba4bd12f71f23601ceca5a611117e7a8a4b0d3f920840dca71c" }, "downloads": -1, "filename": "metrobus-0.0.20.tar.gz", "has_sig": false, "md5_digest": "7fc131e1cfe1de3466fd2a333fcf8c9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7473, "upload_time": "2018-08-20T17:48:13", "url": "https://files.pythonhosted.org/packages/aa/5d/bf696cb07e943ae7a39e4292fa94a94aeef611a0a5d81e04e0e97cdc0e95/metrobus-0.0.20.tar.gz" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "1f205375c5d353866c65b69defa70107", "sha256": "fd6f9ae23290488492e18a2ddddffab552482a6241b7d56a557757c90c4a7384" }, "downloads": -1, "filename": "metrobus-0.0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "1f205375c5d353866c65b69defa70107", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7586, "upload_time": "2018-08-20T18:55:31", "url": "https://files.pythonhosted.org/packages/16/29/b6d08b7917708c72f60394d8e02b906602708367df01ca358097acc28bac/metrobus-0.0.21-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e2077f1ae62a0e27da692b02b74211ae", "sha256": "d669cd0fff5fb23c420854f54530839dd256dd60b7414b11021bbd58a59deaf5" }, "downloads": -1, "filename": "metrobus-0.0.21.tar.gz", "has_sig": false, "md5_digest": "e2077f1ae62a0e27da692b02b74211ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7479, "upload_time": "2018-08-20T18:55:33", "url": "https://files.pythonhosted.org/packages/af/95/3773dfdd97022829f301363c37715392e0f6d3e37e6ae642c1412039c0cb/metrobus-0.0.21.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "cf1d8b3f6cc5c29677e7b7876be21ba2", "sha256": "5116a7a1f156fb03cf587f254ab6c33e937cd65f6e982b4337e427ae649180bc" }, "downloads": -1, "filename": "metrobus-0.0.22-py3-none-any.whl", "has_sig": false, "md5_digest": "cf1d8b3f6cc5c29677e7b7876be21ba2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7618, "upload_time": "2018-08-20T19:15:12", "url": "https://files.pythonhosted.org/packages/d0/70/70a1e5fd49380b85f7353359b6039c17125dec668c6eca495a1d583c2525/metrobus-0.0.22-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f03e3c04ab78572b929de44fd296e49", "sha256": "9aeccaa7a03fb12e543dc450d42b8fa52f5a93e63dec82a0e6297309d2e12e5b" }, "downloads": -1, "filename": "metrobus-0.0.22.tar.gz", "has_sig": false, "md5_digest": "7f03e3c04ab78572b929de44fd296e49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7508, "upload_time": "2018-08-20T19:15:13", "url": "https://files.pythonhosted.org/packages/61/e8/a7ae17ea3bd73773a6895e12a1c21b36f821865adc2d3f8a48ec62973016/metrobus-0.0.22.tar.gz" } ], "0.0.23": [ { "comment_text": "", "digests": { "md5": "d1e364d84d6af0a84cd741c4e1136b8a", "sha256": "b5259e7ceaf7da69f7a32efcf99ebecdb63eb2683da67abb2c8ee1fc702b5cd5" }, "downloads": -1, "filename": "metrobus-0.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "d1e364d84d6af0a84cd741c4e1136b8a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7620, "upload_time": "2018-08-20T19:18:34", "url": "https://files.pythonhosted.org/packages/a5/8c/4546c727404d0fbbdf02d3ebb892b8277ec5f68d1a638e6b5b156935ec47/metrobus-0.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3aef8e4d8fea8b9a4bfbb6f7e9f7a04a", "sha256": "85d9bd709c05b5ef698f7c4963b07b1947a204fe88f4b90c7fcc51c182201d17" }, "downloads": -1, "filename": "metrobus-0.0.23.tar.gz", "has_sig": false, "md5_digest": "3aef8e4d8fea8b9a4bfbb6f7e9f7a04a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7510, "upload_time": "2018-08-20T19:18:35", "url": "https://files.pythonhosted.org/packages/f7/48/97bbc0a1e254724b90d08863946a5f6e055ad89373acc572c2aa88bc8db2/metrobus-0.0.23.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "49661d16345c56c86b2fe11831579750", "sha256": "4a1b8cfe62cd34e7b4c3eb601a85eb0c1ac97896148aa0a66274324cc75aec45" }, "downloads": -1, "filename": "metrobus-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "49661d16345c56c86b2fe11831579750", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5646, "upload_time": "2018-07-13T01:10:23", "url": "https://files.pythonhosted.org/packages/40/3c/15452fcbd55cec71ed942c16b6c88fcfb4b91ce8a707765ceb3e90dc473f/metrobus-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73a84ad3d299c7d5880d17dcff2af5e6", "sha256": "a94da8d5e0937805c173fbd1e85e5b64bb1dae7562a379af4665cbc8ec6be5ba" }, "downloads": -1, "filename": "metrobus-0.0.6.tar.gz", "has_sig": false, "md5_digest": "73a84ad3d299c7d5880d17dcff2af5e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5368, "upload_time": "2018-07-13T01:10:24", "url": "https://files.pythonhosted.org/packages/e8/b2/742d2a35dc986341007c8ffba64bf470add5bcdc68080a4a4a40131ebd9a/metrobus-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "a07b603dd3e7c60e641b225f0a5174cd", "sha256": "92f74990b70424b5595d046b2b7fefd361b835fc7cf174e66227c9238d443fac" }, "downloads": -1, "filename": "metrobus-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "a07b603dd3e7c60e641b225f0a5174cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7294, "upload_time": "2018-08-17T18:21:25", "url": "https://files.pythonhosted.org/packages/64/c4/17ba7ddc94b94949e2299beb89c8d9dc54f42a7f7cc71a866d1d65462cac/metrobus-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0bf42720102d67be603da207406501e", "sha256": "cbd74419c539826ed716ff1118a834743f2ffdff63a377b8eb8c41ad21a957be" }, "downloads": -1, "filename": "metrobus-0.0.7.tar.gz", "has_sig": false, "md5_digest": "e0bf42720102d67be603da207406501e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7205, "upload_time": "2018-08-17T18:21:27", "url": "https://files.pythonhosted.org/packages/8c/b1/5e8ccbcaa972a5643e24fa63afaacb3870a1c8bb3296f2790584f9b85f9a/metrobus-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "1fda45a71004af74ff74e68d9b8a3f3b", "sha256": "1fd179c8ddf80018354f879465f7ba7311f2787b8aaa7c348566b1649c2829a1" }, "downloads": -1, "filename": "metrobus-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "1fda45a71004af74ff74e68d9b8a3f3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7295, "upload_time": "2018-08-17T18:50:33", "url": "https://files.pythonhosted.org/packages/e2/64/254a38ba00d407074a5713a475bd29a8570d640b5c59781bc888b5bd5923/metrobus-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d06ae01e5c8ec0c94a036efe3142a188", "sha256": "2690b93969fe77bdb0f2dad6ed7437f04c7bc6aeb37b8c64bf79236c09fb406b" }, "downloads": -1, "filename": "metrobus-0.0.8.tar.gz", "has_sig": false, "md5_digest": "d06ae01e5c8ec0c94a036efe3142a188", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7205, "upload_time": "2018-08-17T18:50:34", "url": "https://files.pythonhosted.org/packages/62/6d/bd7d06b624fd34c238e57f80d3d0de4c4a0abadd676a7a83a549fc976e79/metrobus-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "3adaab60e1a8870fa3661523621bac56", "sha256": "ee6b9b7e39cca49e2a84b1ce22c4c07526d0b42ad2995a81ff09f86168964fb5" }, "downloads": -1, "filename": "metrobus-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "3adaab60e1a8870fa3661523621bac56", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7293, "upload_time": "2018-08-17T19:01:19", "url": "https://files.pythonhosted.org/packages/fe/13/b2f91ae4ac5393ee9476945141e7c067252279f6a3e1da36cb3d9a870944/metrobus-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c423b7a3ba9102f1d78620c962d6daac", "sha256": "8fae65c172aa7eb33c34b4e7db1c251d5da65be5a723e9ff8b5304bd3fb9e1f3" }, "downloads": -1, "filename": "metrobus-0.0.9.tar.gz", "has_sig": false, "md5_digest": "c423b7a3ba9102f1d78620c962d6daac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7201, "upload_time": "2018-08-17T19:01:20", "url": "https://files.pythonhosted.org/packages/4a/cc/884d82baafccefbf5cad36e2fd73534ebe32f351c86e8ca799c84fa51ac7/metrobus-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d1e364d84d6af0a84cd741c4e1136b8a", "sha256": "b5259e7ceaf7da69f7a32efcf99ebecdb63eb2683da67abb2c8ee1fc702b5cd5" }, "downloads": -1, "filename": "metrobus-0.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "d1e364d84d6af0a84cd741c4e1136b8a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7620, "upload_time": "2018-08-20T19:18:34", "url": "https://files.pythonhosted.org/packages/a5/8c/4546c727404d0fbbdf02d3ebb892b8277ec5f68d1a638e6b5b156935ec47/metrobus-0.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3aef8e4d8fea8b9a4bfbb6f7e9f7a04a", "sha256": "85d9bd709c05b5ef698f7c4963b07b1947a204fe88f4b90c7fcc51c182201d17" }, "downloads": -1, "filename": "metrobus-0.0.23.tar.gz", "has_sig": false, "md5_digest": "3aef8e4d8fea8b9a4bfbb6f7e9f7a04a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7510, "upload_time": "2018-08-20T19:18:35", "url": "https://files.pythonhosted.org/packages/f7/48/97bbc0a1e254724b90d08863946a5f6e055ad89373acc572c2aa88bc8db2/metrobus-0.0.23.tar.gz" } ] }