{ "info": { "author": "Tai Sakuma", "author_email": "tai.sakuma@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "[![PyPI version](https://badge.fury.io/py/mantichora.svg)](https://badge.fury.io/py/mantichora) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/mantichora/badges/version.svg)](https://anaconda.org/conda-forge/mantichora) [![DOI](https://zenodo.org/badge/doi/10.5281/zenodo.2581882.svg)](https://doi.org/10.5281/zenodo.2581882) [![Build Status](https://travis-ci.org/alphatwirl/mantichora.svg?branch=master)](https://travis-ci.org/alphatwirl/mantichora) [![codecov](https://codecov.io/gh/alphatwirl/mantichora/branch/master/graph/badge.svg)](https://codecov.io/gh/alphatwirl/mantichora)\n\n# Mantichora\n\nA simple interface to _multiprocessing_\n\n*****\n\n_Mantichora_ provides a simple interface to\n[_multiprocessing_](https://docs.python.org/3/library/multiprocessing.html).\n\n```python\nfrom mantichora import mantichora\n\nwith mantichora() as mcore:\n mcore.run(func1)\n mcore.run(func2)\n mcore.run(func3)\n mcore.run(func4)\n results = mcore.returns()\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 12559 / 12559 |: func1\n 71.27% :::::::::::::::::::::::::::: | 28094 / 39421 |: func2\n 30.34% :::::::::::: | 28084 / 92558 |: func3\n 35.26% :::::::::::::: | 27282 / 77375 |: func4\n```\n\nYou can simply give Mantichora as many functions as you need to run.\nMantichora will run them concurrently in background processes by using\nmultiprocessing and give you the return values of the functions. The\nreturn values are sorted in the order of the functions you have\noriginally given to Mantichora. Progress bars from\n[atpbar](https://github.com/alphatwirl/atpbar) can be used in the\nfunctions.\n\nThe code in this package was originally developed in the sub-package\n[_concurrently_](https://github.com/alphatwirl/alphatwirl/tree/v0.23.2/alphatwirl/concurrently)\nof [_alphatwirl_](https://github.com/alphatwirl/alphatwirl).\n\n\nThe examples in this file can be also run on Jupyter Notebook.
\n[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/alphatwirl/notebook-mantichora-001/master?filepath=mantichora.ipynb)\n\n*****\n\n- [**Requirement**](#requirement)\n- [**Install**](#install)\n- [**User guide**](#user-guide)\n - [**Quick start**](#quick-start)\n - [Import libraries](#import-libraries)\n - [Define a task function](#define-a-task-function)\n - [Run tasks concurrently with Mantichora](#run-tasks-concurrently-with-mantichora)\n - [**Features**](#features)\n - [Without the `with` statement](#without-the-with-statement)\n - [`end()`](#end)\n - [`terminate()`](#terminate)\n - [Receive results as tasks finish](#receive-results-as-tasks-finish)\n - [`receive_one()`](#receive_one)\n - [`receive_finished()`](#receive_finished)\n - [Logging](#logging)\n- [**License**](#license)\n- [**Contact**](#contact)\n\n*****\n\n## Requirement\n\n- Python 2.7, 3.6, or 3.7\n\n*****\n\n## Install\n\nYou can install with `conda` from conda-forge:\n\n```bash\nconda install -c conda-forge mantichora\n```\n\nor with `pip`:\n\n```bash\npip install -U mantichora\n```\n\n## User guide\n\n### Quick start\n\nI will show here how to use Mantichora by simple examples.\n\n#### Import libraries\n\nWe are going use two python standard libraries\n[time](https://docs.python.org/3/library/time.html) and\n[random](https://docs.python.org/3/library/random.html) in an example\ntask function. In the example task function, we are also going to use\n[atpbar](https://github.com/alphatwirl/atpbar) for progress bars.\nImport these packages and `mantichora`.\n\n```python\nimport time, random\nfrom atpbar import atpbar\nfrom mantichora import mantichora\n```\n\n#### Define a task function\n\nLet us define a simple task function.\n\n```python\ndef task_loop(name, ret=None):\n n = random.randint(1000, 10000)\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n return ret\n```\n\nThe task in this function is to sleep for `0.0001` seconds as many\ntimes as the number randomly selected from between `1000` and\n`10000`. `atpbar` is used to show a progress bar. The function takes\ntwo arguments: `name`, the label on the progress bar, and `ret`, the\nreturn value of the function.\n\n**Note:** Mantichora uses\n[multiprocessing](https://docs.python.org/3/library/multiprocessing.html)\nto run task functions in background processes. As a result, task\nfunctions, their arguments, and their return values need to be\n[picklable](https://docs.python.org/3.6/library/pickle.html#what-can-be-pickled-and-unpickled).\n\nYou can just try running this function without using Mantichora.\n\n```python\nresult = task_loop('task1', 'result1')\n```\n\nThis doesn't return immediately. It waits for the function to finish.\nYou will see a progress bar.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 58117 / 58117 |: task1\n```\n\nThe return value is stored in `result`.\n\n```python\nprint(result)\n```\n\n```\n 'result1'\n```\n\n#### Run tasks concurrently with Mantichora\n\nNow, we run multiple tasks concurrently with Mantichora.\n\n```python\nwith mantichora(nworkers=3) as mcore:\n mcore.run(task_loop, 'task', ret='result1')\n mcore.run(task_loop, 'another task', ret='result2')\n mcore.run(task_loop, 'still another task', ret='result3')\n mcore.run(task_loop, 'yet another task', ret='result4')\n mcore.run(task_loop, 'task again', ret='result5')\n mcore.run(task_loop, 'more task', ret='result6')\n results = mcore.returns()\n```\n\nIn the example code above, `mantichora` is initialized with an\noptional argument `nworkers`. The `nworkers` specifies the number of\nthe workers. It is `3` in the above example. The default is `4`. At\nmost as many tasks as `nworkers` can run concurrently.\n\nThe [`with`\nstatement](https://docs.python.org/3/reference/compound_stmts.html#the-with-statement)\nis used in the example. This ensures that `mantichora` properly\nends the workers.\n\nYou can give task functions and their arguments to `mcore.run()`. You\ncan call `mcore.run()` as many times as you need. In the above\nexample, `mcore.run()` is called with the same task function with\ndifferent arguments. You can also use a different function each time.\n`mcore.run()` returns immediately; it doesn't wait for the task to\nfinish or even to start. In each call, `mcore.run()` only puts a task\nin a queue. The workers in background processes pick up tasks from the\nqueue and run them.\n\nThe `mcore.returns()` waits until all tasks finish and returns their\nreturn values, which are sorted in the order of the tasks you have\noriginally given to `mcore.run()`.\n\nProgress bars will be shown by `atpbar`.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 1415 / 1415 |: still another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 7770 / 7770 |: task again\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 18431 / 18431 |: yet another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 25641 / 25641 |: more task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 74669 / 74669 |: task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 87688 / 87688 |: another task\n```\n\nThe results are sorted in the original order regardless of the order\nin which the tasks have finished.\n\n```python\nprint(results)\n```\n\n```\n['result1', 'result2', 'result3', 'result4', 'result5', 'result6']\n```\n\n*****\n\n### Features\n\n#### Without the `with` statement\n\n##### `end()`\n\nIf you don't use the `with` statement, you need to call `end()`.\n\n```python\nmcore = mantichora()\n\nmcore.run(task_loop, 'task', ret='result1')\nmcore.run(task_loop, 'another task', ret='result2')\nmcore.run(task_loop, 'still another task', ret='result3')\nmcore.run(task_loop, 'yet another task', ret='result4')\nmcore.run(task_loop, 'task again', ret='result5')\nmcore.run(task_loop, 'more task', ret='result6')\n\nresults = mcore.returns()\n\nmcore.end()\nprint(results)\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 4695 / 4695 |: yet another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 7535 / 7535 |: still another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 9303 / 9303 |: another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 9380 / 9380 |: task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 5812 / 5812 |: more task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 9437 / 9437 |: task again\n['result1', 'result2', 'result3', 'result4', 'result5', 'result6']\n```\n\n##### `terminate()`\n\n`mantichora` can be terminated with `terminate()`. After `terminate()`\nis called, `end()` still needs to be called. In the example below,\n`terminate()` is called after 0.5 seconds of sleep while some tasks\nare still running.\n\n```python\nmcore = mantichora()\n\nmcore.run(task_loop, 'task', ret='result1')\nmcore.run(task_loop, 'another task', ret='result2')\nmcore.run(task_loop, 'still another task', ret='result3')\nmcore.run(task_loop, 'yet another task', ret='result4')\nmcore.run(task_loop, 'task again', ret='result5')\nmcore.run(task_loop, 'more task', ret='result6')\n\ntime.sleep(0.5)\n\nmcore.terminate()\nmcore.end()\n```\n\nThe progress bars stop when the tasks are terminated.\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 2402 / 2402 |: still another task\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 3066 / 3066 |: another task\n 59.28% ::::::::::::::::::::::: | 2901 / 4894 |: task\n 69.24% ::::::::::::::::::::::::::: | 2919 / 4216 |: yet another task\n 0.00% | 0 / 9552 |: task again\n 0.00% | 0 / 4898 |: more task\n```\n\n*****\n\n#### Receive results as tasks finish\n\nInstead of waiting for all tasks to finish beofre receiving the\nreulsts, you can get results as tasks finish with the method\n`receive_one()` or `receive_receive()`.\n\n#### `receive_one()`\n\nThe method `receive_one()` returns a pair of the run ID and the return\nvalue of a task function. If no task has finished, `receive_one()`\nwaits until one task finishes. `receive_one()` returns `None` if no\ntasks are outstanding. The method `run()` returns the run ID for the\ntask.\n\n```python\nwith mantichora() as mcore:\n runids = [ ]\n runids.append(mcore.run(task_loop, 'task1', ret='result1'))\n runids.append(mcore.run(task_loop, 'task2', ret='result2'))\n runids.append(mcore.run(task_loop, 'task3', ret='result3'))\n runids.append(mcore.run(task_loop, 'task4', ret='result4'))\n runids.append(mcore.run(task_loop, 'task5', ret='result5'))\n runids.append(mcore.run(task_loop, 'task6', ret='result6'))\n #\n pairs = [ ]\n for i in range(len(runids)):\n pairs.append(mcore.receive_one())\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 1748 / 1748 |: task3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 4061 / 4061 |: task1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 2501 / 2501 |: task5\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 2028 / 2028 |: task6\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8206 / 8206 |: task4\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 9157 / 9157 |: task2\n```\n\nThe `runid` is the list of the run IDs in the order of the tasks that\nhave been given to `run()`.\n\n```python\nprint(runids)\n```\n\n```\n[0, 1, 2, 3, 4, 5]\n```\n\nThe `pairs` are in the order in which the tasks have finished.\n\n```python\nprint(pairs)\n```\n\n```\n[(2, 'result3'), (0, 'result1'), (4, 'result5'), (5, 'result6'), (3, 'result4'), (1, 'result2')]\n```\n\n##### `receive_finished()`\n\nThe method `receive_finished()` returns a list of pairs of the run ID\nand the return value of finished task functions. The method\n`receive_finished()` doesn't wait for a task to finish. It returns an\nempty list if no task has finished.\n\n```python\nwith mantichora() as mcore:\n runids = [ ]\n runids.append(mcore.run(task_loop, 'task1', ret='result1'))\n runids.append(mcore.run(task_loop, 'task2', ret='result2'))\n runids.append(mcore.run(task_loop, 'task3', ret='result3'))\n runids.append(mcore.run(task_loop, 'task4', ret='result4'))\n runids.append(mcore.run(task_loop, 'task5', ret='result5'))\n runids.append(mcore.run(task_loop, 'task6', ret='result6'))\n #\n pairs = [ ]\n while len(pairs) < len(runids):\n pairs.extend(mcore.receive_finished())\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 3979 / 3979 |: task3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 6243 / 6243 |: task2\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 6640 / 6640 |: task1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8632 / 8632 |: task4\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 6235 / 6235 |: task5\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8325 / 8325 |: task6\n```\n\nThe `runid` is again the list of the run IDs in the order of the tasks\nthat have been given to `run()`.\n\n```python\nprint(runids)\n```\n\n```\n[0, 1, 2, 3, 4, 5]\n```\n\nThe `pairs` are also again in the order in which the tasks have finished.\n\n```python\nprint(pairs)\n```\n\n```\n[(2, 'result3'), (1, 'result2'), (0, 'result1'), (3, 'result4'), (4, 'result5'), (5, 'result6')]\n```\n\n*****\n\n#### Logging\n\nLogging in background processes is propagated to the main process in\nthe way described in a [section of Logging\nCookbook](https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes).\n\nHere is a simple example task function that uses `logging`. The task\nfunction does logging just before returning.\n\n\n```python\nimport logging\n\ndef task_log(name, ret=None):\n n = random.randint(1000, 10000)\n for i in atpbar(range(n), name=name):\n time.sleep(0.0001)\n logging.info('finishing \"{}\"'.format(name))\n return ret\n```\n\nSet the logging stream to a string stream so that we can later\nretrieve the logging as a string.\n\n```python\nimport io\nstream = io.StringIO()\nlogging.basicConfig(level=logging.INFO, stream=stream)\n```\n\nRun the tasks.\n\n```python\nwith mantichora() as mcore:\n mcore.run(task_log, 'task1', ret='result1')\n mcore.run(task_log, 'task2', ret='result2')\n mcore.run(task_log, 'task3', ret='result3')\n mcore.run(task_log, 'task4', ret='result4')\n results = mcore.returns()\n```\n\n```\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 4217 / 4217 |: task2\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 7691 / 7691 |: task3\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 8140 / 8140 |: task1\n 100.00% :::::::::::::::::::::::::::::::::::::::: | 9814 / 9814 |: task4\n```\n\nLogging made in the task function in background processes is sent to\nthe main process and written in the string stream.\n\n\n```python\nprint(stream.getvalue())\n```\n\n```\nINFO:root:finishing \"task2\"\nINFO:root:finishing \"task3\"\nINFO:root:finishing \"task1\"\nINFO:root:finishing \"task4\"\n```\n\n*****\n\n## License\n\n- mantichora is licensed under the BSD license.\n\n*****\n\n## Contact\n\n- Tai Sakuma - tai.sakuma@gmail.com\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/alphatwirl/mantichora", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "mantichora", "package_url": "https://pypi.org/project/mantichora/", "platform": "", "project_url": "https://pypi.org/project/mantichora/", "project_urls": { "Homepage": "https://github.com/alphatwirl/mantichora" }, "release_url": "https://pypi.org/project/mantichora/0.9.5/", "requires_dist": [ "atpbar (>=1.0.3)" ], "requires_python": "", "summary": "A simple interface to multiprocessing", "version": "0.9.5" }, "last_serial": 4946148, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "1da3ac8dde0a31b3ba240dbdc6870fe0", "sha256": "bea177e5de3d0a7c68a9042f5c78aebe4545c7c64f1f5198fd6e9272fb6e1cc0" }, "downloads": -1, "filename": "mantichora-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1da3ac8dde0a31b3ba240dbdc6870fe0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3230, "upload_time": "2019-02-28T14:20:24", "url": "https://files.pythonhosted.org/packages/d2/6d/50498ad5fe23070c8978b02e4f04bfb3eefc026834721b32b33eee0e7ee1/mantichora-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d3c4ded8bda20f3a1ad1836d7778a43b", "sha256": "48ceade3ac9e8faf89c39bcb3816227fe471387b86f65995b0e742f34b279c08" }, "downloads": -1, "filename": "mantichora-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d3c4ded8bda20f3a1ad1836d7778a43b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17691, "upload_time": "2019-02-28T14:20:27", "url": "https://files.pythonhosted.org/packages/b7/77/543e3f55b9c0a5dba8832128204b24d4b012404dec9718920e5042cec56f/mantichora-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "35d8282e083112611636262fdbbd91a4", "sha256": "1465add0e2307ef47921422c047b9acaa1a6fbc4a23866c5aa308f41386a8360" }, "downloads": -1, "filename": "mantichora-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "35d8282e083112611636262fdbbd91a4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3219, "upload_time": "2019-03-01T10:19:16", "url": "https://files.pythonhosted.org/packages/bd/13/7899539f43f61b4a4e40f0369312e5162ca68cf8f22c033572d083c91e10/mantichora-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9197fa571798e5f6bdd391a2ed28bdd9", "sha256": "791c4c115f08b82dada6883d4624b9b68dc89ef38a940801993c5907ff769429" }, "downloads": -1, "filename": "mantichora-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9197fa571798e5f6bdd391a2ed28bdd9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17671, "upload_time": "2019-03-01T10:19:17", "url": "https://files.pythonhosted.org/packages/19/51/0ecfa0f946db901e8564f51e46eec76ee27e11517523e5d30036e4a23826/mantichora-0.1.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "54f6cc6772bc8d92669221db22bfdc06", "sha256": "b698272398d34d6bf1d7ebb6a2c3b0248b35cc32658ae7f10b1b28bd2624bbdc" }, "downloads": -1, "filename": "mantichora-0.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "54f6cc6772bc8d92669221db22bfdc06", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9273, "upload_time": "2019-03-02T12:51:47", "url": "https://files.pythonhosted.org/packages/5c/d7/9f420e0544015d971bb12c11bf216c15defcf2ead64749159cc0b0351f72/mantichora-0.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e22e16a09d8537bb3673a66619f88007", "sha256": "3c7629c65dc67ee03db393e50f41a67111857c0d53d0679515cfeb1fb9ebd520" }, "downloads": -1, "filename": "mantichora-0.9.0.tar.gz", "has_sig": false, "md5_digest": "e22e16a09d8537bb3673a66619f88007", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22926, "upload_time": "2019-03-02T12:51:48", "url": "https://files.pythonhosted.org/packages/7c/6a/c7d2683de5719ad7c6acb8cae79f996ea84ce52bd91ce5d7c8756065244c/mantichora-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "6626903fcc64e4ec3c34c9f8c496ce34", "sha256": "a5708099af0fb9c4f69f69b762894b34293eb789bdc1203225e4301d6800f0f5" }, "downloads": -1, "filename": "mantichora-0.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6626903fcc64e4ec3c34c9f8c496ce34", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9311, "upload_time": "2019-03-02T13:15:01", "url": "https://files.pythonhosted.org/packages/7e/c5/8b5e4dcb6ead3f520b8f087f91cfe2e82535f338c6183be564a2c42d23c1/mantichora-0.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b1c5dd1d083dd5340fe2b1459f175832", "sha256": "3be993a9f4969a5852ea73ddcfc31c071e10ce3fdc44c8620ab7ac8e9f0d02c4" }, "downloads": -1, "filename": "mantichora-0.9.1.tar.gz", "has_sig": false, "md5_digest": "b1c5dd1d083dd5340fe2b1459f175832", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22982, "upload_time": "2019-03-02T13:15:03", "url": "https://files.pythonhosted.org/packages/de/ee/eb43e34716ba7cd3854ea1f309133c6f0bdf36b6899a753cb73d3fb890bd/mantichora-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "b34cc31e7c11fd9294690d5c6e4aaf6c", "sha256": "e506ff3d420a67cd4aae004a64c5de5b41d510393e77453a29f8c47cd8380ebe" }, "downloads": -1, "filename": "mantichora-0.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b34cc31e7c11fd9294690d5c6e4aaf6c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9308, "upload_time": "2019-03-02T14:03:30", "url": "https://files.pythonhosted.org/packages/a4/02/31344e72d0bd62dd63b922914aec2a1a830fd8b281b88e1d97936bf77b8f/mantichora-0.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68e24a52af571aa0ca75f13337cf8bf7", "sha256": "5dc7af51826ccd8ac8068382daebf118309f4cbfe9c4c41452162dc84d197e0b" }, "downloads": -1, "filename": "mantichora-0.9.2.tar.gz", "has_sig": false, "md5_digest": "68e24a52af571aa0ca75f13337cf8bf7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22982, "upload_time": "2019-03-02T14:03:32", "url": "https://files.pythonhosted.org/packages/0e/98/81734b0a393b62c86ddb70efe984efdd47676bd327310c4c881357669d33/mantichora-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "34341eef479fd29ad0619f1cf9fb919c", "sha256": "4f51d866dcde6cb2d1316ee2d9825beba030334ecf9406773bc836e96771af8a" }, "downloads": -1, "filename": "mantichora-0.9.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34341eef479fd29ad0619f1cf9fb919c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10871, "upload_time": "2019-03-10T17:40:08", "url": "https://files.pythonhosted.org/packages/53/47/8c967ef8aa8b3aae82716bcfe62ebf8831992161919d13880af2865272ba/mantichora-0.9.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8cd5f7f47b8b403f2084f7fbe30b374d", "sha256": "08c67c1ea764d9d8fa02ab7d3757656cc32a67e884ff32881cc60125d948601b" }, "downloads": -1, "filename": "mantichora-0.9.3.tar.gz", "has_sig": false, "md5_digest": "8cd5f7f47b8b403f2084f7fbe30b374d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29712, "upload_time": "2019-03-10T17:40:08", "url": "https://files.pythonhosted.org/packages/59/70/c543d58c3ac1f14f7fcce1e7869dcf3c0b9c72ec4fe3047f6f72b4abb9b4/mantichora-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "560882f96e9e1a9bc092886cb7c585ce", "sha256": "0b13143aca7aed2de09589d1ddc51bc48bb6c336db38104e1b6bda216a374511" }, "downloads": -1, "filename": "mantichora-0.9.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "560882f96e9e1a9bc092886cb7c585ce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11103, "upload_time": "2019-03-14T14:55:27", "url": "https://files.pythonhosted.org/packages/6a/e4/b963e0aaa33f5d74b88dc49f500962192aed1eb446c250962f06ff9a2250/mantichora-0.9.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90b6b8a38b07e0c37d0922d7695cf4c2", "sha256": "69a9653dab788b20f79f48e2e0038525ee6ef342600b8b5750e45a8b35f9416e" }, "downloads": -1, "filename": "mantichora-0.9.4.tar.gz", "has_sig": false, "md5_digest": "90b6b8a38b07e0c37d0922d7695cf4c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30007, "upload_time": "2019-03-14T14:55:28", "url": "https://files.pythonhosted.org/packages/79/4f/8ca6d3fa28d77f8cc980e4ee8e690fd1acbe3c0ca074e6140a048d224fbd/mantichora-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "47e5d3997bf8e0fdd96042199464d987", "sha256": "b89a1337c7a344ac7588f5a55e25103863b6a324e80b65f78498dd768b9190a8" }, "downloads": -1, "filename": "mantichora-0.9.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "47e5d3997bf8e0fdd96042199464d987", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11094, "upload_time": "2019-03-15T21:49:58", "url": "https://files.pythonhosted.org/packages/c2/18/642ff4a8cffa5504ce77c180f53e7e8b34f46e92ee5de29b1d96d5903de5/mantichora-0.9.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c2030ed29c01c4acf1d04a30e73ae431", "sha256": "ffd02503e06d23b1a700bf4350d9b0894cefa4556bd5b6f952abb25b79a89012" }, "downloads": -1, "filename": "mantichora-0.9.5.tar.gz", "has_sig": false, "md5_digest": "c2030ed29c01c4acf1d04a30e73ae431", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29978, "upload_time": "2019-03-15T21:49:59", "url": "https://files.pythonhosted.org/packages/01/fd/e7e1e0582686222386d403ffd847f0cd0e0644af4fc8492ff41e2db17024/mantichora-0.9.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "47e5d3997bf8e0fdd96042199464d987", "sha256": "b89a1337c7a344ac7588f5a55e25103863b6a324e80b65f78498dd768b9190a8" }, "downloads": -1, "filename": "mantichora-0.9.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "47e5d3997bf8e0fdd96042199464d987", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11094, "upload_time": "2019-03-15T21:49:58", "url": "https://files.pythonhosted.org/packages/c2/18/642ff4a8cffa5504ce77c180f53e7e8b34f46e92ee5de29b1d96d5903de5/mantichora-0.9.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c2030ed29c01c4acf1d04a30e73ae431", "sha256": "ffd02503e06d23b1a700bf4350d9b0894cefa4556bd5b6f952abb25b79a89012" }, "downloads": -1, "filename": "mantichora-0.9.5.tar.gz", "has_sig": false, "md5_digest": "c2030ed29c01c4acf1d04a30e73ae431", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29978, "upload_time": "2019-03-15T21:49:59", "url": "https://files.pythonhosted.org/packages/01/fd/e7e1e0582686222386d403ffd847f0cd0e0644af4fc8492ff41e2db17024/mantichora-0.9.5.tar.gz" } ] }