{ "info": { "author": "Jiri Jaburek", "author_email": "comps@nomail.dom", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3 :: Only" ], "description": "# Python EXecution ENvironment\n\nThis is a (fairly) simple framework for building anything that requires some\nkind of ordered execution, such as a build system, a test suite, or similar.\n\n## How to use it\n\nSee further topics (in this order):\n\n1. [Scheduler](doc/sched.md)\n1. [Task metadata](doc/task-meta.md)\n1. [Factory](doc/factory.md)\n\n## Current state\n\nThe project currently sits idle until I find a use for it. It is not under\nvery active development, but it's also not abandonware.\n\nFeel free to fork it and make enhancements if you wish.\n\nNo APIs, names or anything is currently declared as stable, if you use this\nproject in your projects, expect having to rename/rework things some time\nin the future.\n\n## Background\n\nThe idea came from limitations of various (non-Python) test suites that used\nstatic (ini) files for configuration, limiting options for dynamic execution,\nnot having parallel execution support (or a crappy make-job-like one), etc.\n\nThus the goal was to create a system which would support\n\n1. Tree-based structure of tests, no single (flat) or double (main/sub) levels\n1. Dependency tracking and resolution between tests\n1. Parallel execution of tests with resolved dependencies\n1. Dynamic runtime configuration (selecting tests based on OS, etc.)\n1. Multiple results per one test (ie. 'pass', but with problems detected)\n1. Persistent state keeping (for re-runs of tests, for OS reboot)\n1. Some watchdog for keeping test runtime in check\n1. etc.\n\nand the idea was to utilize python as a \"configuration\" language.\n\nGeneralizing this, the above formed into\n\n1. A \"factory-time\" logic, which would traverse a tree structure and generate\n the tests (a.k.a. execution units, python callables) based on some input\n1. An \"execution-time\" logic, which would use a scheduler to efficiently run\n the collected tests\n\nFurther generalizing, it ultimately turned into an universal execution engine\ninfo which you can feed any python callables and, given the right metadata,\nthey get scheduled and run in the right order, with the \"factory-time\" being\nessentially just an example way of how to generate execution units.\n\n## Limitations\n\nNeeds python 3.6+, mostly due to quality-of-life features. Functionally,\nit could be ported to python 2.7 as it currently uses only basic `threading`\nand `multiprocessing` features (eg. no `futures`), at the expense of code\nreadability.\n\n* Parallel result pipelining\n * Wish\n * A thread-safe process-safe interface to get results from running tasks\n * The user can then spawn a separate custom pool of threads/processes that\n query this interface and post-process results returned from tasks, in\n parallel\n * While other tasks are still running, not after everything finishes\n * Why Not\n * There are process-unsafe metadata returned to the user, namely the\n callable objects that were executed, exception objects, etc.\n * These are safe to pass only to the thread/process that added the task\n * There is a simple workaround: simply take care of the metadata in the\n thread that added the tasks and pass on picklable data (ie. retvals\n from the executed callables) to the custom process pool for further\n post-processing\n\n## Wishlist\n\n* Scheduling groups of exclusivity\n * Pass groups of callables instead of just callables to the scheduler\n * Have only one group running at a time\n * As it finishes, destroy the worker pool, create a new one for the\n new group\n * Allows to specify nr. of workers/spare and pool type (thread/mp) used\n on a per group basis!\n * Useful when a set of tasks is very different from the rest, ie. testing\n virtual machines (5 workers) versus testing syscalls (100 workers), and one\n global setting cannot cover both.\n * Also useful to logically split mutually exclusive things that need\n uninterrupted / unconditional access to the OS without defining \"claims\"\n to lots of tests.\n * Also useful for tasks that should logically run \"together\", possibly\n needing sequential execution due to formal requirements.\n\n* Adding new tasks on-the-fly\n * While processing results from the `Sched.run()` iterator, add new tasks\n * Useful when the overall task set depends on result(s) from some tasks\n * `pexen.sched.pool` support already in place\n * But proper `Sched` support would need heavy rewrites, removal of sanity\n checks, etc.\n * I did the rewrite; took 6-8 hours and the code was incomprehensible\n * Refactoring of the whole `pexen.sched` would be needed\n\n* A post-processor for factories\n * A task that requires some generic resource, ie. `httpd`\n * The post-processor would find (somehow) another, best suitable, task that\n provides it, adding it to the tasks for execution\n * Similar to how Debian packages can depend on a virtual package like\n `mail-transport-agent` and have multiple packages (`exim4`, `postfix`, etc.)\n provide it\n\n* \"UseCases\" that would glue Factory and Scheduler\n * Ie. \"test suite UseCase\" for running a test suite, collecting and formatting\n results, storing xUnit results in a file, supporting resume from\n an interrupted execution, etc.\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/comps/pexen", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pexen", "package_url": "https://pypi.org/project/pexen/", "platform": "", "project_url": "https://pypi.org/project/pexen/", "project_urls": { "Homepage": "https://github.com/comps/pexen" }, "release_url": "https://pypi.org/project/pexen/0.0.3/", "requires_dist": null, "requires_python": "", "summary": "Python EXecution ENvironment, scheduler included", "version": "0.0.3" }, "last_serial": 5862415, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "ebe130156ea512981048b72327316279", "sha256": "be0bbb0b1843f76a2290e319abc85393b8133a10a0452e01024d82cabb0d35cd" }, "downloads": -1, "filename": "pexen-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ebe130156ea512981048b72327316279", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12821, "upload_time": "2019-06-28T17:00:23", "url": "https://files.pythonhosted.org/packages/df/51/08f6fed3bfea3798b43e03b69fa06a6cfee34052dce06786c59462cfda2d/pexen-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dea5d2743197f7d06c650ef6c2dab383", "sha256": "012c16d05df90bf47e471f6a4cd230377111e3c021272aa4b89b2d679a9b548e" }, "downloads": -1, "filename": "pexen-0.0.1.tar.gz", "has_sig": false, "md5_digest": "dea5d2743197f7d06c650ef6c2dab383", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14420, "upload_time": "2019-06-28T17:00:26", "url": "https://files.pythonhosted.org/packages/85/a3/59afcacbae98f924384551755b466ca6b2afefb892f346fcea7aac53e38d/pexen-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "9903fd09dad40fdacd1d0269d9bf0a52", "sha256": "4696a9e42dcad6887e2b221fcd932eb0b46803c902356d6503e5b36ee988af68" }, "downloads": -1, "filename": "pexen-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9903fd09dad40fdacd1d0269d9bf0a52", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4781, "upload_time": "2019-09-11T17:39:52", "url": "https://files.pythonhosted.org/packages/8a/f5/d5e0c2d4576364496b8ee922435f640d5ad08061063dda6fa0c2d9aef06d/pexen-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15db00d30b099d6ffa1a9d323642d80f", "sha256": "e20be63ac3b001c94719827716c2e9d7f7fbb2269be3671f20bc3cf3d80d74c5" }, "downloads": -1, "filename": "pexen-0.0.2.tar.gz", "has_sig": false, "md5_digest": "15db00d30b099d6ffa1a9d323642d80f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4116, "upload_time": "2019-09-11T17:39:53", "url": "https://files.pythonhosted.org/packages/a1/4c/bd1415afa2e2168191eb8501f8544eca61713a67bfa2f00152a35d51768e/pexen-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "e912258386584fb95e7578958fcfc21f", "sha256": "35d23ac5dcf4a1d0a40734bd10ece085af5451ff314106e1ede1b553c6787950" }, "downloads": -1, "filename": "pexen-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e912258386584fb95e7578958fcfc21f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16580, "upload_time": "2019-09-20T13:53:13", "url": "https://files.pythonhosted.org/packages/d1/2d/57919cc9575c670f4d3329afa0f633d06d13ad5b10e56f48890b6236d1b6/pexen-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b77975eb66813979afd3ddd62ab4b3e", "sha256": "c0d76ee8714a1098f6cc8183ffcbdccdfaf4a34d56f9f1318f5549de80b481b7" }, "downloads": -1, "filename": "pexen-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8b77975eb66813979afd3ddd62ab4b3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15578, "upload_time": "2019-09-20T13:53:15", "url": "https://files.pythonhosted.org/packages/ef/1b/3976217090b7cad1b46fa6220cd4f175060c16d9a934d90100f69d18279c/pexen-0.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e912258386584fb95e7578958fcfc21f", "sha256": "35d23ac5dcf4a1d0a40734bd10ece085af5451ff314106e1ede1b553c6787950" }, "downloads": -1, "filename": "pexen-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e912258386584fb95e7578958fcfc21f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16580, "upload_time": "2019-09-20T13:53:13", "url": "https://files.pythonhosted.org/packages/d1/2d/57919cc9575c670f4d3329afa0f633d06d13ad5b10e56f48890b6236d1b6/pexen-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b77975eb66813979afd3ddd62ab4b3e", "sha256": "c0d76ee8714a1098f6cc8183ffcbdccdfaf4a34d56f9f1318f5549de80b481b7" }, "downloads": -1, "filename": "pexen-0.0.3.tar.gz", "has_sig": false, "md5_digest": "8b77975eb66813979afd3ddd62ab4b3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15578, "upload_time": "2019-09-20T13:53:15", "url": "https://files.pythonhosted.org/packages/ef/1b/3976217090b7cad1b46fa6220cd4f175060c16d9a934d90100f69d18279c/pexen-0.0.3.tar.gz" } ] }