{ "info": { "author": "Josef Nevrly", "author_email": "jnevrly@alps.cz", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "mutaprops\n=========\n\n\n.. image:: https://img.shields.io/pypi/v/mutaprops.svg\n :target: https://pypi.python.org/pypi/mutaprops\n\n.. image:: https://img.shields.io/travis/JNevrly/mutaprops.svg\n :target: https://travis-ci.org/calcite/mutaprops\n\n.. image:: https://readthedocs.org/projects/pip/badge/\n :target: https://readthedocs.org/projects/pip/badge/\n :alt: Documentation Status\n\n.. image:: https://pyup.io/repos/github/calcite/mutaprops/shield.svg\n :target: https://pyup.io/repos/github/calcite/mutaprops/\n :alt: Updates\n\n\nMutated Properties - a simple HTML5 property-configuration UI,\nautogenerated from your classes.\n\nIt's great if you need a quick'n'dirty UI with minimal\neffort and without changing much of the existing codebase. Mutaprops also thrive\non headless systems when usual UI solutions like tkinter_ doesn't make sense.\n\nHowever, the customization possibilities are limited, so if you are looking for\nsome framework for building a full-fledged attractive GUI, better look\nelsewhere.\n\n.. * Free software: MIT license\n.. * Documentation: https://mutaprops.readthedocs.io.\n\n\nFeatures\n--------\n\n* Generate a self-documented web UI directly from your objects with simple decorators\n* UI state automatically updated with object state changes (through websockets)\n* Supports multiple UI sessions on the same object, synchronized through\n websockets\n* Supports clustering of UI's from multiple machines\n* UI look and feel can be customized with your own stylesheet\n* Add any widget you like with direct HTML support\n* HTML5 log console capturing all your Python logging\n* Asyncio support (and also a requirement ;))\n\nThe simplest example\n--------------------\n\nImagine a normal Python class:\n\n.. code-block:: python\n\n class Hoovercraft:\n\n MAX_EELS = 40\n\n def __init__(self, number_of_eels=20, speed=0, direction='North'):\n self._eel_count = number_of_eels\n self._speed = speed\n self._direction = direction\n self._engine_running = False\n self._steering_locked = True\n\n @property\n def eels(self):\n return self._eel_count\n\n @eels.setter\n def eels(self, value):\n self._eel_count = value\n if self._eel_count >= self.MAX_EELS:\n logger.warning(\"The hoovercraft is full of eels!\")\n\n def drop_all_eels(self):\n self.eels = 0\n logger.info(\"Eels are goooone!\")\n\nNow, to turn this into an UI, one just has to decorate it like this:\n\n.. code-block:: python\n\n from mutaprops import *\n\n @mutaprop_class(\"Hoovercraft UI\")\n class Hoovercraft:\n\n MAX_EELS = 40\n\n def __init__(self, number_of_eels=20, speed=0, direction='North'):\n self._eel_count = number_of_eels\n self._speed = speed\n self._direction = direction\n self._engine_running = False\n self._steering_locked = True\n\n @mutaproperty(\"Number of eels\", MutaTypes.INT, min_val=0,\n max_val=MAX_EELS)\n def eels(self):\n return self._eel_count\n\n @eels.setter\n def eels(self, value):\n self._eel_count = value\n if self._eel_count >= self.MAX_EELS:\n logger.warning(\"The hoovercraft is full of eels!\")\n\n @mutaprop_action(\"Drop all eels!\")\n def drop_all_eels(self):\n self.eels = 0\n logger.info(\"Eels are goooone!\")\n\nAnd then run it like this:\n\n\n.. code-block:: python\n\n if __name__ == '__main__':\n\n test = Hoovercraft()\n test.muta_init(\"Hoovercraft instance #1\")\n man = HttpMutaManager(\"Hoovercraft manager\", proxy_log=logger)\n man.add_object(test)\n man.run(port=9000)\n\nEt voila, here's the UI:\n\n.. image:: docs/img/screenshot-simple.png\n\nOther examples\n--------------\n\nThe ``examples/`` folder contains several other examples:\n\n* `simple_example.py`_ is the extension of the example above, including more\n data types and also shows how to work with docstrings and ``mutasources``\n\n* `advanced_example.py`_ demonstrates grouping of parameters, style\n customizations, raw HTML features and asyncio integration.\n\nFull documentation\n------------------\n\nThe complete documentation is available at https://mutaprops.readthedocs.io\n\nUsing the UI\n------------\n\nSimple explanation how to use the UI is\n`here `_.\n\n\nCredits\n-------\n\nThe default logo created with the Chlorinar_ font.\n\nThe JavaScript frontend created with the fantastic `Vue.js`_.\n\nThe widgets and styling are based on `Bootstrap 3`_.\n\nThe toggle widget is the `Bootstrap toggle`_.\n\nHoovercraft logo used in `advanced_example.py`_ was created by Theresa Stoodley\nfrom the Noun Project. Licensed under Creative Commons 3.0 license.\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _`simple_example.py`: examples/simple_example.py\n.. _`advanced_example.py`: examples/advanced_example.py\n.. _Chlorinar: http://www.dafont.com/chlorinar.font\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n.. _tkinter: https://docs.python.org/3.6/library/tkinter.html\n.. _`Vue.js`: https://vuejs.org\n.. _`Bootstrap 3`: https://getbootstrap.com/docs/3.3/\n.. _`Bootstrap toggle`: http://www.bootstraptoggle.com/\n\n\n\n=======\nHistory\n=======\n\nLatest releases\n+++++++++++++++\n\n0.6.11 (2019-03-07)\n------------------\n* Fixed (OMG) yet another log message placeholder escaping bug !!!\n\n0.6.10 (2019-03-07)\n------------------\n* Fixed another log message placeholder escaping bug !!\n\n0.6.9 (2019-03-07)\n------------------\n* Fixed log message placeholder escaping bug.\n\n0.6.8 (2019-02-20)\n------------------\n* Fixed master controller connection bug.\n\n0.6.7 (2019-02-18)\n------------------\n* Fixed log timestamp bug.\n\n0.6.6 (2019-01-31)\n------------------\n* Updated sockjs dependency.\n\n0.6.5 (2018-08-20)\n------------------\n* Updated dependencies. (Still not newest, as it is required for\n Mutaprops to run on Python 3.4)\n\n0.6.4 (2017-11-07)\n------------------\n* Fixed chardet dependency.\n\n0.6.3 (2017-10-16)\n------------------\n* Fixed bug with step setting.\n\n0.6.0 (2017-08-30)\n------------------\n* Added css separation\n* Added documentation\n* Minor bug fixes\n\nOlder releases\n++++++++++++++\n\n0.5.7 (2017-08-25)\n------------------\nAdded the forgoten JS build...\n\n0.5.6 (2017-08-25)\n------------------\nFixed various UI bugs (read-only settings, responsive design, title).\nActions now can have read-only setting.\n\n0.5.5 (2017-04-26)\n------------------\nFixed incompatibility with Python 3.4.2.\n\n0.5.4 (2017-04-25)\n------------------\nFixed debug print of properties.\n\n0.5.3 (2017-04-21)\n------------------\nFixed bug with log messages formatting on the Web UI.\n\n0.5.2 (2017-04-20)\n------------------\nFixed bug with Bool-type props help panels not uncollapsing.\n\n0.5.1 (2017-03-06)\n------------------\nFixed error message when object was not selected in an one-object list.\n\n0.5.0 (2017-02-15)\n------------------\n* Large internal rework - introduced update-dependencies for values and\n selected meta-values (selects, minimums, maximums, steps etc).\n* Added MutaSources as non-UI MutaProps for supporting internal dependencies\n* Added HTML type of value (read-only)\n* JS client now works with single state-store (Vuex)\n* MutaSelects removed - this functionality is now replaced by more general\n update-dependencies through MutaSources. This breaks compatibility with 0.4.x\n\n0.4.1 (2016-12-06)\n------------------\n* Fixed bug with displaying first prop in hierarchy panel.\n\n0.4.0 (2016-12-06)\n------------------\n* One level hierarchy (panels) and experimental support of toggle buttons instead of checkboxes.\n\n0.3.0 (2016-11-03)\n------------------\n* Allowed HTML in help blocks\n* Allowed local files/local dir\n\n0.2.2 (2016-11-03)\n------------------\n* Fixed path problem on linux\n\n0.2.1 (2016-11-03)\n------------------\n* Added ALPS logo\n\n0.2.0 (2016-11-03)\n------------------\n\n* HTTP manager chaining.\n* UI bugfixes.\n\n0.1.0 (2016-11-03)\n------------------\n\n* First (internal) release.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/calcite/mutaprops", "keywords": "mutaprops,GUI,HTML5,autogenerated", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "mutaprops", "package_url": "https://pypi.org/project/mutaprops/", "platform": "", "project_url": "https://pypi.org/project/mutaprops/", "project_urls": { "Homepage": "https://github.com/calcite/mutaprops" }, "release_url": "https://pypi.org/project/mutaprops/0.6.11/", "requires_dist": null, "requires_python": "", "summary": "Simple UI, autogenerated from your classes.", "version": "0.6.11" }, "last_serial": 4911492, "releases": { "0.6.0": [ { "comment_text": "", "digests": { "md5": "e657e60435b89c1dc204aae7f6f1d4f9", "sha256": "290848907a8c6b9625ac737fe70a98a1df10ed3ab200421044f9bcd1f274874a" }, "downloads": -1, "filename": "mutaprops-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e657e60435b89c1dc204aae7f6f1d4f9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 228165, "upload_time": "2017-08-30T13:46:25", "url": "https://files.pythonhosted.org/packages/59/0a/2b2f83c921a317d54b76af05a6c321830198d6450cf022cc072a7f599ac9/mutaprops-0.6.0-py2.py3-none-any.whl" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "a7113d4cacba956a4ec9909541563c86", "sha256": "a8811e7084f7711013d6089020a5b8ae02a4fbc0aa74dd4dace7241a077123a5" }, "downloads": -1, "filename": "mutaprops-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a7113d4cacba956a4ec9909541563c86", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 228223, "upload_time": "2017-08-30T14:05:12", "url": "https://files.pythonhosted.org/packages/80/a7/3fe6a5c9b4f96a14f520ddf2d6d78e4cb69ef242b99b5748056f72eb48b5/mutaprops-0.6.1-py2.py3-none-any.whl" } ], "0.6.10": [ { "comment_text": "", "digests": { "md5": "716dfb30e948b4f9cd156dd9609c72cd", "sha256": "45506389a0b59bbe6c5972775ac170ad1878437810b89654cb399156f942d72a" }, "downloads": -1, "filename": "mutaprops-0.6.10.tar.gz", "has_sig": false, "md5_digest": "716dfb30e948b4f9cd156dd9609c72cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540641, "upload_time": "2019-03-07T13:47:47", "url": "https://files.pythonhosted.org/packages/91/01/a0a9c07f58b047b0f9cadb6d0b58ffff456752d9515a195ebaeaabe4047f/mutaprops-0.6.10.tar.gz" } ], "0.6.11": [ { "comment_text": "", "digests": { "md5": "5326f1f316f9864b1c4b40a1477093ff", "sha256": "8a2099313fb8f4d0bf6d0f45466ad007ddd88edf39c97f5f75e6a9e6bdd48b02" }, "downloads": -1, "filename": "mutaprops-0.6.11.tar.gz", "has_sig": false, "md5_digest": "5326f1f316f9864b1c4b40a1477093ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540731, "upload_time": "2019-03-07T16:46:35", "url": "https://files.pythonhosted.org/packages/33/de/cee85d2576e03998d9e413fc5ceadcd274bcd375ebf707417ec1d6c24e8e/mutaprops-0.6.11.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "69277ad22b1cb2d0b89c005dd4b11614", "sha256": "ec6d99de03d95d047a9b53fe497ecd983a8374b7d56edf079d9bdc3b1f23277e" }, "downloads": -1, "filename": "mutaprops-0.6.3.tar.gz", "has_sig": false, "md5_digest": "69277ad22b1cb2d0b89c005dd4b11614", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 539343, "upload_time": "2017-10-16T08:28:07", "url": "https://files.pythonhosted.org/packages/b6/b5/5fecaff8eb8214ee2fbd418b2d47cf3d4b121ea5b9ccdbf27042896fa3e5/mutaprops-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "f915d1523ae57b579eaac1aecf3c702c", "sha256": "6e9447d1d7bb30e5ac8deb7a78aeffc7a50cff94da3c85103e8d783a8ef59707" }, "downloads": -1, "filename": "mutaprops-0.6.4.tar.gz", "has_sig": false, "md5_digest": "f915d1523ae57b579eaac1aecf3c702c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 539379, "upload_time": "2017-11-07T10:20:41", "url": "https://files.pythonhosted.org/packages/9d/f2/33ba68b3eed38c10f8b6a50e6403421a97701aa76aef6ef93640b48ecf68/mutaprops-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "18a4cd474e14dc2ac3484be2ab4bd1d4", "sha256": "e512937966822938d2b43beb99e6d98e748534d006eb7df39d3ee48115d827ad" }, "downloads": -1, "filename": "mutaprops-0.6.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "18a4cd474e14dc2ac3484be2ab4bd1d4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 228402, "upload_time": "2018-08-20T11:54:30", "url": "https://files.pythonhosted.org/packages/23/87/49859deb8ac6922a0806012f41f8838252b69bb1aea08d4e5efdfd8b162a/mutaprops-0.6.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "82673186bcbd493e9b94ec3a821355b0", "sha256": "a274cd901b8fb003b759f4507af32eb0be3ffea1038b09de17bc46d683241b1d" }, "downloads": -1, "filename": "mutaprops-0.6.5.tar.gz", "has_sig": false, "md5_digest": "82673186bcbd493e9b94ec3a821355b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 561584, "upload_time": "2018-08-20T11:54:32", "url": "https://files.pythonhosted.org/packages/ea/42/98a62a0b866af0f36fd913dfed2b492ed2923ab22f945d66362c11e1cf51/mutaprops-0.6.5.tar.gz" } ], "0.6.6": [ { "comment_text": "", "digests": { "md5": "a9907f09be02d6c23facd60f9b2a7c70", "sha256": "e785fbf1cfbfc84bfa96cadaf477fefa5b2674b7aa52fa1c790f6336178f1178" }, "downloads": -1, "filename": "mutaprops-0.6.6.tar.gz", "has_sig": false, "md5_digest": "a9907f09be02d6c23facd60f9b2a7c70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540427, "upload_time": "2019-01-31T15:52:38", "url": "https://files.pythonhosted.org/packages/d7/05/cea96829452b95c6d44ee9dd7c7af5c7043643c39f8c6b2a1619efac818f/mutaprops-0.6.6.tar.gz" } ], "0.6.7": [ { "comment_text": "", "digests": { "md5": "63aa0617558b063a9846be9d2e0d94f3", "sha256": "9e3b59d11f97803993e07c2814bf5261d9180a4c4dd25b48fad9ae4db9dbcaa8" }, "downloads": -1, "filename": "mutaprops-0.6.7.tar.gz", "has_sig": false, "md5_digest": "63aa0617558b063a9846be9d2e0d94f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540432, "upload_time": "2019-02-18T12:25:49", "url": "https://files.pythonhosted.org/packages/12/57/4986cba9df25f0169ce3332ad89283424f731f71e6717ad1862b55d05b65/mutaprops-0.6.7.tar.gz" } ], "0.6.8": [ { "comment_text": "", "digests": { "md5": "62367209f61b2048b576190a49227436", "sha256": "2a393cd5578781c492d00445363d696f0044738003892a9d37f636b9451962b6" }, "downloads": -1, "filename": "mutaprops-0.6.8.tar.gz", "has_sig": false, "md5_digest": "62367209f61b2048b576190a49227436", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540536, "upload_time": "2019-02-20T17:22:28", "url": "https://files.pythonhosted.org/packages/e4/51/5417fcd0da4c205262f262e213ea3bf6629fc5ee886c64e25b7bd4ccd414/mutaprops-0.6.8.tar.gz" } ], "0.6.9": [ { "comment_text": "", "digests": { "md5": "6274d8de570d0a802a6acefe040caee2", "sha256": "2c98a5e8bf7dedb788503d5b4de3bb4d7e94081f289fa99f3b072623c1d96cb2" }, "downloads": -1, "filename": "mutaprops-0.6.9.tar.gz", "has_sig": false, "md5_digest": "6274d8de570d0a802a6acefe040caee2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540587, "upload_time": "2019-03-07T13:13:38", "url": "https://files.pythonhosted.org/packages/fc/54/74ffb27e3d954a24c85aae7560964c6ac8f5f0a2843c09fcb86d9cdf6c07/mutaprops-0.6.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5326f1f316f9864b1c4b40a1477093ff", "sha256": "8a2099313fb8f4d0bf6d0f45466ad007ddd88edf39c97f5f75e6a9e6bdd48b02" }, "downloads": -1, "filename": "mutaprops-0.6.11.tar.gz", "has_sig": false, "md5_digest": "5326f1f316f9864b1c4b40a1477093ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 540731, "upload_time": "2019-03-07T16:46:35", "url": "https://files.pythonhosted.org/packages/33/de/cee85d2576e03998d9e413fc5ceadcd274bcd375ebf707417ec1d6c24e8e/mutaprops-0.6.11.tar.gz" } ] }