{
"info": {
"author": "Fridolin Pokorny",
"author_email": "fridolin.pokorny@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: System :: Distributed Computing"
],
"description": "Selinon\n=======\n\nAn advanced task flow management on top of\n`Celery `__.\n\n|codecov| |PyPI Current Version| |PyPI Implementation| |PyPI Wheel|\n|Travis CI| |Documentation Status| |GitHub stars| |GitHub license|\n|Twitter|\n\nIs this project helpful? `Send me a simple warm\nmessage `__!\n\nCrossroad\n---------\n\n- `PyPI `__\n- `Documentation `__\n- `Developers\n documentation `__\n- `Travis CI `__\n\n\nLast stable release: `Selinon 1.0.0 `_\n\nTLDR;\n-----\n\nAn advanced flow management above Celery (an asynchronous distributed\ntask queue) written in Python3, that allows you to:\n\n- Dynamically schedule tasks based on results of previous tasks\n- Group tasks into flows in simple YAML configuration files\n- Schedule flows from other flows (even recursively)\n- Store results of tasks in your storages and databases transparently,\n validate results against defined JSON schemas\n- Do redeployment respecting changes in the YAML configuration files\n without purging queues (migrations)\n- Track flow progress via the build-in tracing mechanism\n- Complex per-task or per-flow failure handling with fallback tasks or\n fallback flows\n- No DAG limitation in your flows\n- Selectively pick tasks in your flow graphs that should be executed\n respecting task dependencies\n- Make your deployment easy to orchestrate using orchestration tools\n such as `Kubernetes `__\n- Highly scalable Turing complete solution for big data processing pipelines\n- And (of course) much more... check\n `docs `__\n\nYouTube Video\n-------------\n\nLet's explain Selinon using a `YouTube video (click to redirect to YouTube) `_.\n\n.. figure:: https://raw.githubusercontent.com/selinon/selinon/master/example/ironwood.jpeg\n :alt: Ironwoodland\n :align: center\n\nAbout\n-----\n\nThis tool is an implementation above Celery that enables you to define\nflows and dependencies in flows, schedule tasks based on results of\nCelery workers, their success or any external events. If you are not\nfamiliar with Celery, check out its homepage\n`www.celeryproject.org `__ or `this nice\ntutorial `__.\n\nSelinon was originally designed to take care of advanced flows in one of\nRed Hat products, where it already served thousands of flows and tasks.\nIts main aim is to simplify specifying group of tasks, grouping tasks\ninto flows, handle data and execution dependencies between tasks and\nflows, easily reuse tasks and flows, model advanced execution units in\nYAML configuration files and make the whole system easy to model, easy\nto maintain and easy to debug.\n\nBy placing declarative configuration of the whole system into YAML files\nyou can keep tasks as simple as needed. Storing results of tasks in\ndatabases, modeling dependencies or executing fallback tasks/flows on\nfailures are separated from task logic. This gives you a power to\ndynamically change task and flow dependencies on demand, optimize data\nretrieval and data storage from databases per task bases or even track\nprogress based on events traced in the system.\n\nSelinon was designed to serve millions of tasks in clusters or data\ncenters orchestrated by `Kubernetes `__,\n`OpenShift `__ or any other orchestration tool,\nbut can simplify even small systems. Moreover, Selinon can make them\neasily scalable in the future and make developer's life much easier.\n\nA Quick First Overview\n----------------------\n\nSelinon is serving recipes in a distributed environment, so let's make a\ndinner!\n\nIf we want to make a dinner, we need to buy ingredients. These\ningredients are bought in ``buyIngredientsFlow``. This flow consists of\nmultiple tasks, but let's focus on our main flow. Once all ingredients\nare bought, we can start preparing our dinner in ``prepareFlow``. Again,\nthis flow consists of some additional steps that need to be done in\norder to accomplish our future needs. As you can see, if anything goes\nwrong in mentioned flows (see red arrows), we make a fallback to pizza\nwith beer which we order. To make beer cool, we place it to our\n``Fridge`` storage. If we successfully finished ``prepareFlow`` after\nsuccessful shopping, we can proceed to ``serveDinnerFlow``.\n\nJust to point out - grey nodes represent flows (which can be made of\nother flows or tasks) and white (rounded) nodes are tasks. Conditions\nare represented in hexagons (see bellow). Black arrows represent time or\ndata dependencies between our nodes, grey arrows pinpoint where results\nof tasks are stored.\n\n.. figure:: https://raw.githubusercontent.com/selinon/selinon/master/example/graph/dinnerFlow.png\n :alt: Main dinner flow\n :align: center\n\nFor our dinner we need eggs, flour and some additional ingredients.\nMoreover, we conditionally buy a flower based on our condition. Our task\n``BuyFlowerTask`` will not be scheduled (or executed) if our condition\nis ``False``. Conditions are made of predicates and these predicates can\nbe grouped as desired with logical operators. You can define your own\npredicates if you want (default are available in\n``selinon.predicates``). Everything that is bought is stored in\n``Basket`` storage transparently.\n\nLet's visualise our ``buyIngredientsFlow``:\n\n.. figure:: https://raw.githubusercontent.com/selinon/selinon/master/example/graph/buyIngredientsFlow.png\n :alt: Buy ingredients flow\n :align: center\n\nAs stated in our main flow after buying ingredients, we proceed to\ndinner preparation but first we need to check our recipe that is hosted\nat ``http://recipes.lan/how-to-bake-pie.html``. Any ingredients we\nbought are transparently retrieved from defined storage as defined in\nour YAML configuration file. We warm up our oven to expected temperature\nand once the temperature is reached and we have finished with dough, we\ncan proceed to baking.\n\nBased on the description above, our ``prepareFlow`` will look like the\nfollowing graph:\n\n.. figure:: https://raw.githubusercontent.com/selinon/selinon/master/example/graph/prepareFlow.png\n :alt: Prepare flow\n :align: center\n\nOnce everything is done we serve plates. As we want to serve plates for\nall guests we need to make sure we schedule N tasks of type\n``ServePlateTask``. Each time we run our whole dinner flow, number of\nguests may vary so make sure no guest stays hungry. Our\n``serveDinnerFlow`` would look like the following graph:\n\n.. figure:: https://raw.githubusercontent.com/selinon/selinon/master/example/graph/serveDinnerFlow.png\n :alt: Serve dinner flow\n :align: center\n\nThis example demonstrates very simple flows. The whole configuration can\nbe found `here `__. Just check it out how you can\neasily define your flows! You can find a script that visualises graphs\nbased on the YAML configuration in `this repo `__ as well.\n\nMore info\n---------\n\nThe example was intentionally simplified. You can also parametrize your\nflows, schedule N tasks (where N is a run-time evaluated variable), do\nresult caching, placing tasks on separate queues in order to be capable\nof doing fluent system updates, throttle execution of certain tasks in\ntime, propagate results of tasks to sub-flows etc. Just check\n`documentation `__ for more info.\n\nLive Demo\n---------\n\nA live demo with few examples can be found\n`here `__. Feel free to check it out.\n\nInstallation\n------------\n\n::\n\n $ pip3 install selinon\n\nAvailable extras:\n\n* celery - needed if you use Celery\n* mongodb - needed for MongoDB `storage adapter `_\n* postgresql - needed for PostgreSQL `storage adapter `_\n* redis - needed for Redis `storage adapter `_\n* s3 - needed for S3 `storage adapter `_\n* sentry - needed for `Sentry support `_\n\nExtras can be installed via:\n\n::\n\n $ pip3 install selinon[celery,mongodb,postgresql,redis,s3,sentry]\n\nFeel free to select only needed extras for your setup.\n\n\n.. |codecov| image:: https://codecov.io/gh/selinon/selinon/branch/master/graph/badge.svg\n.. |PyPI Current Version| image:: https://img.shields.io/pypi/v/selinon.svg\n.. |PyPI Implementation| image:: https://img.shields.io/pypi/implementation/selinon.svg\n.. |PyPI Wheel| image:: https://img.shields.io/pypi/wheel/selinon.svg\n.. |Travis CI| image:: https://travis-ci.org/selinon/selinon.svg?branch=master\n.. |Documentation Status| image:: https://readthedocs.org/projects/selinon/badge/?version=latest\n.. |GitHub stars| image:: https://img.shields.io/github/stars/selinon/selinon.svg\n.. |GitHub license| image:: https://img.shields.io/badge/license-BSD-blue.svg\n.. |Twitter| image:: https://img.shields.io/twitter/url/http/github.com/selinon/selinon.svg?style=social\n\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/selinon/selinon",
"keywords": "selinon celery yaml flow distributed-computing",
"license": "BSD",
"maintainer": "Fridolin Pokorny",
"maintainer_email": "fridolin.pokorny@gmail.com",
"name": "selinon",
"package_url": "https://pypi.org/project/selinon/",
"platform": "",
"project_url": "https://pypi.org/project/selinon/",
"project_urls": {
"Homepage": "https://github.com/selinon/selinon"
},
"release_url": "https://pypi.org/project/selinon/1.1.0/",
"requires_dist": [
"click",
"codegen",
"graphviz",
"jsonschema",
"pyyaml",
"rainbow-logging-handler",
"celery (>=4) ; extra == 'celery'",
"pymongo ; extra == 'mongodb'",
"SQLAlchemy ; extra == 'postgresql'",
"SQLAlchemy-Utils ; extra == 'postgresql'",
"redis ; extra == 'redis'",
"boto3 ; extra == 's3'",
"sentry-sdk ; extra == 'sentry'"
],
"requires_python": "",
"summary": "an advanced dynamic task flow management on top of Celery",
"version": "1.1.0"
},
"last_serial": 5555088,
"releases": {
"0.1.0rc2": [
{
"comment_text": "",
"digests": {
"md5": "bb8c080e2ccf8274606f063b29ab7a58",
"sha256": "d4f65bc85871961d068fc683b33e077ed50735f8747f5adfb6f802deaca0a21e"
},
"downloads": -1,
"filename": "selinon-0.1.0rc2.tar.gz",
"has_sig": false,
"md5_digest": "bb8c080e2ccf8274606f063b29ab7a58",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 22997,
"upload_time": "2016-09-22T16:47:14",
"url": "https://files.pythonhosted.org/packages/92/d1/486e1bd19200ac72f46325958f21d7b3b874f2784555a2035c7964bc3038/selinon-0.1.0rc2.tar.gz"
}
],
"0.1.0rc3": [
{
"comment_text": "",
"digests": {
"md5": "658583d4cc3803582d9c1ba88cf2c38f",
"sha256": "a351dac9de60499097d11f4b710e92f89eb413430ba767bac6f5ada27b04301b"
},
"downloads": -1,
"filename": "selinon-0.1.0rc3.tar.gz",
"has_sig": false,
"md5_digest": "658583d4cc3803582d9c1ba88cf2c38f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 23038,
"upload_time": "2016-10-03T06:00:54",
"url": "https://files.pythonhosted.org/packages/a4/f2/d4c8d1fcb755ecd92357fa0595411587343d35d6001735d5893ddc3387ab/selinon-0.1.0rc3.tar.gz"
}
],
"0.1.0rc4": [
{
"comment_text": "",
"digests": {
"md5": "a3ce858f996790ab33b4964dddaf0b4b",
"sha256": "00e40cc59e3763f70754e3d7e73e4dac9a168bc2f9e816ac4929547e76ccd81e"
},
"downloads": -1,
"filename": "selinon-0.1.0rc4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a3ce858f996790ab33b4964dddaf0b4b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 30635,
"upload_time": "2017-05-27T12:59:47",
"url": "https://files.pythonhosted.org/packages/0d/78/8280fec00ee4e05286551f9285e72b847cd53f01f912ee612599166af5e0/selinon-0.1.0rc4-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "138197f43c67af2ee3fafcf44f0a9eda",
"sha256": "0d4a390f4c19cc3f6b81463138aa85f214b0f37849896f188c63943e782b85a9"
},
"downloads": -1,
"filename": "selinon-0.1.0rc4.tar.gz",
"has_sig": false,
"md5_digest": "138197f43c67af2ee3fafcf44f0a9eda",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37001,
"upload_time": "2017-05-27T12:59:49",
"url": "https://files.pythonhosted.org/packages/dc/c2/1d395728a463b11e1f0a69eb5d03c8e532a8a1f3336d86fcff4e99137585/selinon-0.1.0rc4.tar.gz"
}
],
"0.1.0rc5": [
{
"comment_text": "",
"digests": {
"md5": "c28bea08326c994c6322e77fcef4177d",
"sha256": "5fe8a180d251d9974700e0fb8cc6097530e0eabae2f4b44aaa638d3e920c50dd"
},
"downloads": -1,
"filename": "selinon-0.1.0rc5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c28bea08326c994c6322e77fcef4177d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 30697,
"upload_time": "2017-08-10T11:01:36",
"url": "https://files.pythonhosted.org/packages/1e/a3/a3d8cbd5dd43f5ac1f5114f0ba2dd743123292c0edc37cbe798bcf79004b/selinon-0.1.0rc5-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "3eb6f021fd3f18b797ea09fa3246f598",
"sha256": "2c75d3f55dd2acf9bf75038d1b63bb8437314c93607c6bf5858f9b89d7b55273"
},
"downloads": -1,
"filename": "selinon-0.1.0rc5.tar.gz",
"has_sig": false,
"md5_digest": "3eb6f021fd3f18b797ea09fa3246f598",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37065,
"upload_time": "2017-08-10T11:01:38",
"url": "https://files.pythonhosted.org/packages/5d/be/dd53c6a68821b182699ee5334c158fee6f65c6f6d5b1ad9c07f0fce77084/selinon-0.1.0rc5.tar.gz"
}
],
"0.1.0rc6": [
{
"comment_text": "",
"digests": {
"md5": "a0ed60473c45b7bc974a89fbc0d4346a",
"sha256": "302a63e3f4b6d499dfdf18dae42f9eaee3790a491950afceaeb56e97477486fd"
},
"downloads": -1,
"filename": "selinon-0.1.0rc6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a0ed60473c45b7bc974a89fbc0d4346a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 32440,
"upload_time": "2017-11-02T14:58:19",
"url": "https://files.pythonhosted.org/packages/85/76/47032b87dfa45644ef7b145e45611e1d9af29c80c43650eda239e72be306/selinon-0.1.0rc6-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f7fe2131967b8b51fd31b86fa81ed737",
"sha256": "3749d47e55e02f6dc643c0afc9eebe0b21622afebb5bc454163e80aacd714867"
},
"downloads": -1,
"filename": "selinon-0.1.0rc6.tar.gz",
"has_sig": false,
"md5_digest": "f7fe2131967b8b51fd31b86fa81ed737",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 42235,
"upload_time": "2017-11-02T14:58:21",
"url": "https://files.pythonhosted.org/packages/b4/45/bf05968b896ffc2cc1939a7e5ebdfe8fd253b0adb0010b2473e2afbc1c88/selinon-0.1.0rc6.tar.gz"
}
],
"0.1.0rc7": [
{
"comment_text": "",
"digests": {
"md5": "cebfa7a1897fc332dd0bddfb7a6f3e30",
"sha256": "188cc2b0fac8a4b674c1f7811894a67640cbcafcbc6fea8e531ded71cbeea0c9"
},
"downloads": -1,
"filename": "selinon-0.1.0rc7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cebfa7a1897fc332dd0bddfb7a6f3e30",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 35090,
"upload_time": "2017-11-27T12:10:35",
"url": "https://files.pythonhosted.org/packages/02/3e/6d0650538f07f5ee23be1132365ecf5ed41c4fd94a3e0f08abc11ddfe34b/selinon-0.1.0rc7-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "dd4928ed3f755bdcb2793a90898d9a31",
"sha256": "e86ba05e64caff63b520c3d6efb22431699b9cd8dea5deb79ca71a7ffc2137db"
},
"downloads": -1,
"filename": "selinon-0.1.0rc7.tar.gz",
"has_sig": false,
"md5_digest": "dd4928ed3f755bdcb2793a90898d9a31",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 47087,
"upload_time": "2017-11-27T12:10:37",
"url": "https://files.pythonhosted.org/packages/31/38/e1d5b0bc0b06b2f448571061909710a335e9353695f8ee33bf53be5a7bc2/selinon-0.1.0rc7.tar.gz"
}
],
"0.1.0rc8": [
{
"comment_text": "",
"digests": {
"md5": "c2fddf469ba9e0e7618ec725dadf2c86",
"sha256": "25bbe07976e58956a63fd3e28ed38bb3e5abaf8aa326c6275d6d95c07a532691"
},
"downloads": -1,
"filename": "selinon-0.1.0rc8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c2fddf469ba9e0e7618ec725dadf2c86",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 35090,
"upload_time": "2017-11-27T13:37:26",
"url": "https://files.pythonhosted.org/packages/11/e9/d9f90f8570916ce84c5f78b5c8a27e0b5ec17816918699ccaf885eea1f87/selinon-0.1.0rc8-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "5293ba5a6de262042b3e0eeee6f0ca97",
"sha256": "f8cf57af8bb9854cea6120e0ec8225f508c3752278e6fa40e79f643fed88db89"
},
"downloads": -1,
"filename": "selinon-0.1.0rc8.tar.gz",
"has_sig": false,
"md5_digest": "5293ba5a6de262042b3e0eeee6f0ca97",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 47092,
"upload_time": "2017-11-27T13:37:27",
"url": "https://files.pythonhosted.org/packages/31/46/cdef8629e3cf5c683f1bdf0a019a09d0097baca23231ab89ce540a0e1fe4/selinon-0.1.0rc8.tar.gz"
}
],
"0.1.0rc9": [
{
"comment_text": "",
"digests": {
"md5": "4c004930121ee4f372f16fb4b1f89486",
"sha256": "a55e014e32ecc5ebeddf19e96c370fa010c39d8236362eeb08dd2399fd9ecba9"
},
"downloads": -1,
"filename": "selinon-0.1.0rc9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4c004930121ee4f372f16fb4b1f89486",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 35088,
"upload_time": "2017-11-27T14:36:59",
"url": "https://files.pythonhosted.org/packages/3f/2e/07bfbe0726a5222e3b5b92d9773516a2823dec17bd53560865f6074f89d5/selinon-0.1.0rc9-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "53bb5abecc39be6962211464f74db91e",
"sha256": "226878fb26decb06d6d4540d979e1bbf2e6785b18f85fdeec7465db868eb0e59"
},
"downloads": -1,
"filename": "selinon-0.1.0rc9.tar.gz",
"has_sig": false,
"md5_digest": "53bb5abecc39be6962211464f74db91e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 47086,
"upload_time": "2017-11-27T14:37:00",
"url": "https://files.pythonhosted.org/packages/45/01/6941a1f01a1ef127eb9bd46244ed5b0ed8168e961e368f8802a2240d1513/selinon-0.1.0rc9.tar.gz"
}
],
"1.0.0": [
{
"comment_text": "",
"digests": {
"md5": "9afd4729943517d0857470e1769c67fe",
"sha256": "9a62e16ea9dc730d006e1271231f318ee2dad48d145fd3b9e902a925ea3cca2e"
},
"downloads": -1,
"filename": "selinon-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9afd4729943517d0857470e1769c67fe",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 320992,
"upload_time": "2018-08-01T21:43:01",
"url": "https://files.pythonhosted.org/packages/bd/2c/1d319ef154074cd48683fc01c747098fd2b5f51e262d64b5dd8c62f71901/selinon-1.0.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "fa8c632958025ddb1ef825e88f5a9c57",
"sha256": "392ab7d2ff1430417a50327515538cec3e9f302b7513dc8e8474745a1b28187a"
},
"downloads": -1,
"filename": "selinon-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "fa8c632958025ddb1ef825e88f5a9c57",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 210072,
"upload_time": "2018-08-01T21:43:03",
"url": "https://files.pythonhosted.org/packages/09/ff/ff3aba3cb03f82ae98fb4d313a2e6340cfa5be1ebfdec7c3cf8a6660b229/selinon-1.0.0.tar.gz"
}
],
"1.0.0rc1": [
{
"comment_text": "",
"digests": {
"md5": "c2aed45dfc296ef3f8933ef8426368cb",
"sha256": "813526f17112f9172bff37bac8810872376a114c219d5d581a824ced60c24a94"
},
"downloads": -1,
"filename": "selinon-1.0.0rc1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c2aed45dfc296ef3f8933ef8426368cb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 42221,
"upload_time": "2017-12-09T11:48:40",
"url": "https://files.pythonhosted.org/packages/65/5c/68299dc60b311939997ac4ea915e817cf9b7bd97be7e2ac7530c19852cf8/selinon-1.0.0rc1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "74dfe0932848d4b55a1a505d4e1efcc5",
"sha256": "20ce5c7d1d8b3942257e8f05e9a1140ce4c6a0c1ab9cc8f95389a65468135730"
},
"downloads": -1,
"filename": "selinon-1.0.0rc1.tar.gz",
"has_sig": false,
"md5_digest": "74dfe0932848d4b55a1a505d4e1efcc5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 52030,
"upload_time": "2017-12-09T11:48:42",
"url": "https://files.pythonhosted.org/packages/99/98/20de798bd8eb64317666643151d954b87583b9c13aabbf4290e3cbc799c1/selinon-1.0.0rc1.tar.gz"
}
],
"1.0.0rc2": [
{
"comment_text": "",
"digests": {
"md5": "c3bb6f3f50943bd1cb7e6dffdfc451c8",
"sha256": "2a0cad292f5bbc253df8d0471fdbb4ca9f6ea7c8ab6b87c53e967098c2224bfa"
},
"downloads": -1,
"filename": "selinon-1.0.0rc2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c3bb6f3f50943bd1cb7e6dffdfc451c8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 314990,
"upload_time": "2017-12-14T09:11:54",
"url": "https://files.pythonhosted.org/packages/13/ec/c56f5c71b1316b88d4d05d4a69a67eae7128aff6058b991f469b279d97fb/selinon-1.0.0rc2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "c16a1437b9686b10c624016256f4bc42",
"sha256": "ee1ba83a5ec382c76717d87f406e1766dd1d0e0d153e4b9b0c63cbde369a9c3b"
},
"downloads": -1,
"filename": "selinon-1.0.0rc2.tar.gz",
"has_sig": false,
"md5_digest": "c16a1437b9686b10c624016256f4bc42",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 199867,
"upload_time": "2017-12-14T09:11:55",
"url": "https://files.pythonhosted.org/packages/63/c1/d358945999e3459a7bf0683b8f1f5e4a1f34105ba0d1f0840686b0864311/selinon-1.0.0rc2.tar.gz"
}
],
"1.0.0rc3": [
{
"comment_text": "",
"digests": {
"md5": "1d42f651dc71ef845da69807cebb179a",
"sha256": "7a0c361c50de4b43e7cb7636092369de9fd2be55afa286e885cb44515127f65a"
},
"downloads": -1,
"filename": "selinon-1.0.0rc3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1d42f651dc71ef845da69807cebb179a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 324791,
"upload_time": "2017-12-27T12:42:32",
"url": "https://files.pythonhosted.org/packages/af/9b/187c42889e3869a96b0af778f92d6d1ea15f3ef8f67e58f0448ddb526a48/selinon-1.0.0rc3-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "7992cc70eefe5ece0950b13bba165da5",
"sha256": "e6cabeb45f0b3c1c1198ff427535419aaf82b1a64d948c5625eb16e2b5972780"
},
"downloads": -1,
"filename": "selinon-1.0.0rc3.tar.gz",
"has_sig": false,
"md5_digest": "7992cc70eefe5ece0950b13bba165da5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 208310,
"upload_time": "2017-12-27T12:42:35",
"url": "https://files.pythonhosted.org/packages/af/45/9fa33a537eaad1d903d2eb31c25bbb5ae66e5936550dd80a6b461a507f09/selinon-1.0.0rc3.tar.gz"
}
],
"1.0.0rc4": [
{
"comment_text": "",
"digests": {
"md5": "0c7814857114d7483d0f8f122e8b5ea1",
"sha256": "5716bc78fbb5076aa291db7fd651c36f68c1e74197844cba8a16986638a71630"
},
"downloads": -1,
"filename": "selinon-1.0.0rc4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0c7814857114d7483d0f8f122e8b5ea1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 325087,
"upload_time": "2018-02-22T10:09:00",
"url": "https://files.pythonhosted.org/packages/e9/03/a06af487ea42da22690cfbd13bd32842d87cd23fcdfb6f0082378179a855/selinon-1.0.0rc4-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "e828ea4a94c03e06c22ae3aeb4dc1fcb",
"sha256": "818b44b3974d5d17b1afc81bfe738472d1b999ed133c0fe07a0105d8149bafdf"
},
"downloads": -1,
"filename": "selinon-1.0.0rc4.tar.gz",
"has_sig": false,
"md5_digest": "e828ea4a94c03e06c22ae3aeb4dc1fcb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 208627,
"upload_time": "2018-02-22T10:09:02",
"url": "https://files.pythonhosted.org/packages/69/04/61d87b31ba735a8a3c7ee6c005f641cae5065ab782b978478c12615c7d5d/selinon-1.0.0rc4.tar.gz"
}
],
"1.1.0": [
{
"comment_text": "",
"digests": {
"md5": "6fd831dc7e35d53d5748634f7e2d564d",
"sha256": "551fb76c988b8870980344b9a33edb98cea757139641b77560fe87267ded19d6"
},
"downloads": -1,
"filename": "selinon-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6fd831dc7e35d53d5748634f7e2d564d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 322916,
"upload_time": "2019-07-19T08:07:03",
"url": "https://files.pythonhosted.org/packages/d7/46/3b2c73eb483bc915ca3c4a779eb76268ba5bb233fc29bbd7d38decb1d0b2/selinon-1.1.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f21cdd947c6817f853e92f555e1e3e6a",
"sha256": "a023f2d5beedadb3b858d695c36a54cfbf4a9779a1f6d8590091ffe71a85c657"
},
"downloads": -1,
"filename": "selinon-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "f21cdd947c6817f853e92f555e1e3e6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 210554,
"upload_time": "2019-07-19T08:07:05",
"url": "https://files.pythonhosted.org/packages/60/a8/897b94b267bfb214369c37fed62b820f31cc774ac1180ee50e61bcc57039/selinon-1.1.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "6fd831dc7e35d53d5748634f7e2d564d",
"sha256": "551fb76c988b8870980344b9a33edb98cea757139641b77560fe87267ded19d6"
},
"downloads": -1,
"filename": "selinon-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6fd831dc7e35d53d5748634f7e2d564d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 322916,
"upload_time": "2019-07-19T08:07:03",
"url": "https://files.pythonhosted.org/packages/d7/46/3b2c73eb483bc915ca3c4a779eb76268ba5bb233fc29bbd7d38decb1d0b2/selinon-1.1.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "f21cdd947c6817f853e92f555e1e3e6a",
"sha256": "a023f2d5beedadb3b858d695c36a54cfbf4a9779a1f6d8590091ffe71a85c657"
},
"downloads": -1,
"filename": "selinon-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "f21cdd947c6817f853e92f555e1e3e6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 210554,
"upload_time": "2019-07-19T08:07:05",
"url": "https://files.pythonhosted.org/packages/60/a8/897b94b267bfb214369c37fed62b820f31cc774ac1180ee50e61bcc57039/selinon-1.1.0.tar.gz"
}
]
}