{ "info": { "author": "Michael Hart, Michael Wedel, Owen Arnold", "author_email": "michael.hart@stfc.ac.uk", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries" ], "description": "|Version| |Build Status| |Codacy| |Coverage Status| |Documentation|\n\n|Lewis|\n=======\n\nLeWIS - Let's Write Intricate Simulators.\n\nLewis is a Python framework for simulating hardware devices. It is\ncompatible with both Python 2.7+ and 3.4+.\n\nLewis can be installed via pip, or using a prepackaged Docker image\nthat includes all dependencies. See relevant usage sections for\ndetails.\n\nResources:\n`GitHub `__ --\n`DockerHub `__ --\n`Dockerfile `__ --\n`ReadTheDocs `__ --\n`PyPI `__\n\nLewis was previously named \"Plankton\" but, due to a\npackage with the same name on PyPI, we decided to rename the project.\n\nLewis is licensed under GPL v3 or later.\n\nPurpose and Use Cases\n---------------------\n\nLewis is being developed in the context of instrument control at the\n`ESS `__, but it is general enough\nto be used in many other contexts that require detailed, stateful\nsoftware simulations of hardware devices.\n\nWe consider a detailed device simulation to be one that can communicate\nusing the same protocol as the real device, and that can very closely\napproximate real device behaviour in terms of what is seen through this\nprotocol. This includes gradual processes, side-effects and error\nconditions.\n\nThe purpose of Lewis is to provide a common framework to facilitate\nthe development of such simulators. The framework provides a common set\nof tools, including communication protocol services, which helps minimize code\nreplication and allows the developer of a simulated device to focus on\ncapturing device behaviour.\n\nPotential use cases for detailed device simulators include:\n\n- Replacing the physical device when developing and testing software\n that interfaces with the device\n- Testing failure conditions without risking damage to the physical\n device\n- Automated system and unit tests of software that communicates with\n the device\n- Perform \"dry runs\" against test scripts that are to be run on the\n real device\n\nUsing a simulation for the above has the added benefit that, unlike most\nreal devices, a simulation may be sped up / fast-forwarded past any\nlengthy delays or processes that occur in the device.\n\nFeatures\n--------\n\nBrief Terminology\n~~~~~~~~~~~~~~~~~\n\n``Device``\\ s and ``Interface``\\ s are two independent concepts in\nLewis. The ``Device`` is model for the device behaviour and internal\nmemory. A ``Device`` can be represented using a ``StateMachine``, but it\ndoes not have to be. A ``Device`` does not include anything specific to\nthe communication protocol with the ``Device``. An ``Interface``\nprovides bindings from a protocol ``Adapter`` to a ``Device``.\nCommon ``Adapter``\\ s, , such as TCP stream, Modbus and EPICS, are provided\nby Lewis. The ``Device`` and ``Interface`` are instantiated as part of a\n``Simulation`` that provides a cycle \"heart beat\" and manages other\nenvironmental aspects and services.\n\n.. image:: https://github.com/DMSC-Instrument-Data/lewis/raw/master/docs/resources/diagrams/SimulationCycles.png\n\nWhat Can You Do With Lewis?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n- Create new ``Device``\\ s to closely imitate the internal behaviour\n and memory of something\n- Optionally make a ``Device`` work as a ``StateMachine`` via\n ``StateMachineDevice`` to give rich behaviours\n- Create one or more ``Interface``\\ s over your ``Device`` to expose it\n as an EPICS IOC, a TCP listener, or on any other bespoke protocol you\n like\n- Access and control the ``Device`` while it is running via a control server\n- Access and control the ``Simulation`` while it is running via a control server\n- Control server can be accessed via command-line utility, Python bindings, or\n JSON RPC.\n\nAdditional Documentation\n------------------------\n\nDocumentation can be found at `ReadTheDocs `__.\nIt can also be generated from the sources:\n\n::\n\n $ git clone https://github.com/DMSC-Instrument-Data/lewis\n $ cd lewis\n $ pip install -r requirements-dev.txt\n $ sphinx-build -b html docs/ docs/_build/html\n\nThe ``docs/_build/html`` directory will then contain the full documentation in HTML format.\n\n.. |Version| image:: https://images.microbadger.com/badges/version/dmscid/lewis.svg\n :target: https://hub.docker.com/r/dmscid/lewis/\n.. |Layers| image:: https://images.microbadger.com/badges/image/dmscid/lewis.svg\n :target: https://microbadger.com/images/dmscid/lewis\n.. |Build Status| image:: https://travis-ci.org/DMSC-Instrument-Data/lewis.svg?branch=master\n :target: https://travis-ci.org/DMSC-Instrument-Data/lewis\n.. |Codacy| image:: https://api.codacy.com/project/badge/Grade/77aef653cf5d42f5a9a8a5a2c929a628\n :target: https://www.codacy.com/app/DMSC/lewis?utm_source=github.com&utm_medium=referral&utm_content=DMSC-Instrument-Data/lewis&utm_campaign=Badge_Grade\n.. |Coverage Status| image:: https://coveralls.io/repos/github/DMSC-Instrument-Data/lewis/badge.svg?branch=master\n :target: https://coveralls.io/github/DMSC-Instrument-Data/lewis?branch=master\n.. |Documentation| image:: https://readthedocs.org/projects/lewis/badge/?version=latest\n :target: http://lewis.readthedocs.io/en/latest/?badge=latest\n.. |Lewis| image:: https://github.com/DMSC-Instrument-Data/lewis/raw/master/docs/resources/logo/lewis-logo.png\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/DMSC-Instrument-Data/lewis", "keywords": "hardware simulation controls", "license": "GPL v3", "maintainer": "", "maintainer_email": "", "name": "lewis", "package_url": "https://pypi.org/project/lewis/", "platform": "", "project_url": "https://pypi.org/project/lewis/", "project_urls": { "Homepage": "https://github.com/DMSC-Instrument-Data/lewis" }, "release_url": "https://pypi.org/project/lewis/1.2.1/", "requires_dist": [ "six", "pyzmq", "json-rpc", "semantic-version", "PyYAML", "scanf (>=1.4.1)", "flake8 (==3.5.0) ; extra == 'dev'", "mock (>=1.0.1) ; extra == 'dev'", "sphinx (>=1.4.5) ; extra == 'dev'", "sphinx-rtd-theme ; extra == 'dev'", "pytest (>=3.6) ; extra == 'dev'", "pytest-cov ; extra == 'dev'", "coverage ; extra == 'dev'", "tox ; extra == 'dev'", "pcaspy ; extra == 'epics'" ], "requires_python": "", "summary": "LeWIS - Let's Write Intricate Simulators!", "version": "1.2.1" }, "last_serial": 5885798, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "3d9dabd57e92ca0099db4cedc0a795e5", "sha256": "68e69d517d2e79ce662c9791045278df5a40f6e0b7d825db7a82971802717522" }, "downloads": -1, "filename": "lewis-1.0.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "3d9dabd57e92ca0099db4cedc0a795e5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 71212, "upload_time": "2016-12-15T15:20:11", "url": "https://files.pythonhosted.org/packages/59/75/05218a888efa7b0e22d89b4b7cf7adb8392c6582dd64ebfd315dea25fbf0/lewis-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8253c4dbb5b7b7b251dc9fbb648f4028", "sha256": "415e2e50d94d63c5f0a879b7494dded4c47ddff0679cb5bdc589df639dbdaadf" }, "downloads": -1, "filename": "lewis-1.0.1.tar.gz", "has_sig": true, "md5_digest": "8253c4dbb5b7b7b251dc9fbb648f4028", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66698, "upload_time": "2016-12-15T15:20:14", "url": "https://files.pythonhosted.org/packages/0a/81/1a17171eca92cc780dcabd62104a451c6918151994d676c74776c88a2814/lewis-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "5df5d2666059a5115780878ca927690f", "sha256": "fa7678b6e18c76f1b87bf51b251a907d688e40be34b9352ba1561d3e42d1c243" }, "downloads": -1, "filename": "lewis-1.0.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "5df5d2666059a5115780878ca927690f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 94245, "upload_time": "2017-01-26T15:56:58", "url": "https://files.pythonhosted.org/packages/2f/9d/cfa00a4a31d9a14bd69ff3c45ae5c396ab8e6c5adfb153928dc3c8cdd1fa/lewis-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ffdcc6d04bf09e6f16ff00fc34d3c4b1", "sha256": "76ecb17a74490e98c414b7665abd9ddb2c227ad8165e6b9b8c2bd7f41416c088" }, "downloads": -1, "filename": "lewis-1.0.2.tar.gz", "has_sig": true, "md5_digest": "ffdcc6d04bf09e6f16ff00fc34d3c4b1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81785, "upload_time": "2017-01-26T15:57:01", "url": "https://files.pythonhosted.org/packages/34/f1/e48144cb994bfc8bcf9b4637c096a355c977662eb7498d02f7170c1521bd/lewis-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "82036f6eb18822d302425ca793ce6d33", "sha256": "6e2917e315bda82bc2152acdf9001916ef270c78a7963ed12acecd0ac93eeb3e" }, "downloads": -1, "filename": "lewis-1.0.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "82036f6eb18822d302425ca793ce6d33", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 105721, "upload_time": "2017-03-24T13:38:24", "url": "https://files.pythonhosted.org/packages/d2/2d/add37ad590d7c9d394fbe484d781da8971a9d25ea61ceff8bbaa44aa05e6/lewis-1.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7807307ae3ddb104fa2e9ca0efabd1c", "sha256": "6596f23f8540bed51171025362a51d8753e96778aabfd87e11a30d701351a647" }, "downloads": -1, "filename": "lewis-1.0.3.tar.gz", "has_sig": true, "md5_digest": "e7807307ae3ddb104fa2e9ca0efabd1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91357, "upload_time": "2017-03-24T13:38:27", "url": "https://files.pythonhosted.org/packages/69/4a/20e91c893ae4a7333bb957a4902816a03c6d03159efa1cae55dcb5d8f14f/lewis-1.0.3.tar.gz" } ], "1.0.4": [], "1.1": [ { "comment_text": "", "digests": { "md5": "e5818c75e523d463626f74d375d3bccc", "sha256": "0d80464c887056cfdcd3b2a0f46de16b31b708d889895159c7cb1313d2ee155f" }, "downloads": -1, "filename": "lewis-1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "e5818c75e523d463626f74d375d3bccc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 109426, "upload_time": "2017-06-01T10:51:16", "url": "https://files.pythonhosted.org/packages/ea/d0/23b32a501737d23c076260f96edf8953e54d1da468bff5e22652be464112/lewis-1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66bbee61b57d7fa897d85bf51ccd84cc", "sha256": "4527196afe6f974d4f142ca24e7b84e2469ec60786a48c43687cdba781960f9d" }, "downloads": -1, "filename": "lewis-1.1.tar.gz", "has_sig": true, "md5_digest": "66bbee61b57d7fa897d85bf51ccd84cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 94874, "upload_time": "2017-06-01T10:51:19", "url": "https://files.pythonhosted.org/packages/08/35/366fd0b5402575a5974ff94fdfa0075eb421f6a193f354ce36871ce9269e/lewis-1.1.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5cd4de79f0021d3eb98fef1f13588e59", "sha256": "b851b600b21d40f4c64d7ccd6572c503aa836054c62fe35968188123e143375c" }, "downloads": -1, "filename": "lewis-1.1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "5cd4de79f0021d3eb98fef1f13588e59", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 109556, "upload_time": "2017-06-02T15:38:40", "url": "https://files.pythonhosted.org/packages/ac/97/f9d563a94c7dcb13aee75523a8bf349726f8c9a8af792b4f0c7a57caa545/lewis-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e2a1e53ad7af60307c380fd79534ed7d", "sha256": "eb636ec4808d070a26be27b54e8512aa8c5b0ffb70d180be7a70844cd5a6a3cb" }, "downloads": -1, "filename": "lewis-1.1.1.tar.gz", "has_sig": true, "md5_digest": "e2a1e53ad7af60307c380fd79534ed7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 95035, "upload_time": "2017-06-02T15:38:43", "url": "https://files.pythonhosted.org/packages/6e/f5/82d68685aecce31557e51a18e56da62b39a0539dfdba3b7b3596f370c97a/lewis-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "3fd19ff207fd93ec7a08a033b208f07b", "sha256": "a0649de8f759480088fd9e5ae3ef8b7126a14e9de5ce64b2179de76849a19252" }, "downloads": -1, "filename": "lewis-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3fd19ff207fd93ec7a08a033b208f07b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 112472, "upload_time": "2017-11-08T14:50:07", "url": "https://files.pythonhosted.org/packages/a6/cd/dffba843e09f622264cb2046fcf1f6c88ade7c07a6822c859e8a59ab2c3c/lewis-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8a53eae265777984982babdd3f893ebf", "sha256": "a214fa7d7e0d978f9fa3a7b864cd694a3c35b8b75d0370a6f75a377deee456ca" }, "downloads": -1, "filename": "lewis-1.2.0.tar.gz", "has_sig": false, "md5_digest": "8a53eae265777984982babdd3f893ebf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 182765, "upload_time": "2017-11-08T14:50:27", "url": "https://files.pythonhosted.org/packages/66/34/95db4f4b093d892f368dc52c1b1a6efd4e11fca643cbf3aec4aab064c817/lewis-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "7d2a8a0a2545e75eb3d3646147a51742", "sha256": "f24d518d8a5f498bbb77c7736038067ded6915e615460e84c0e0981daa7ebc33" }, "downloads": -1, "filename": "lewis-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7d2a8a0a2545e75eb3d3646147a51742", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 122174, "upload_time": "2019-09-25T15:00:14", "url": "https://files.pythonhosted.org/packages/a1/29/6da0363e08de21ca8062009dc1210347c4ebc520340aecbaa39d438b5c19/lewis-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e505a42d9f41bd544972f79ec049b7c", "sha256": "46138db39f31112a8da407f3f55c4ca3bc1f0ae85406882db865021bcab2e75f" }, "downloads": -1, "filename": "lewis-1.2.1.tar.gz", "has_sig": false, "md5_digest": "2e505a42d9f41bd544972f79ec049b7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 188718, "upload_time": "2019-09-25T15:00:17", "url": "https://files.pythonhosted.org/packages/2a/8c/1e83930fda63c2d68a468441a6f851fb31799c7b3a2880ff71a5d3b15329/lewis-1.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7d2a8a0a2545e75eb3d3646147a51742", "sha256": "f24d518d8a5f498bbb77c7736038067ded6915e615460e84c0e0981daa7ebc33" }, "downloads": -1, "filename": "lewis-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7d2a8a0a2545e75eb3d3646147a51742", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 122174, "upload_time": "2019-09-25T15:00:14", "url": "https://files.pythonhosted.org/packages/a1/29/6da0363e08de21ca8062009dc1210347c4ebc520340aecbaa39d438b5c19/lewis-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e505a42d9f41bd544972f79ec049b7c", "sha256": "46138db39f31112a8da407f3f55c4ca3bc1f0ae85406882db865021bcab2e75f" }, "downloads": -1, "filename": "lewis-1.2.1.tar.gz", "has_sig": false, "md5_digest": "2e505a42d9f41bd544972f79ec049b7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 188718, "upload_time": "2019-09-25T15:00:17", "url": "https://files.pythonhosted.org/packages/2a/8c/1e83930fda63c2d68a468441a6f851fb31799c7b3a2880ff71a5d3b15329/lewis-1.2.1.tar.gz" } ] }