Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/calcite/mutaprops

Mutated Properties - a simple HTML5 property-configuration UI, autogenerated from your classes.
https://github.com/calcite/mutaprops

Last synced: 26 days ago
JSON representation

Mutated Properties - a simple HTML5 property-configuration UI, autogenerated from your classes.

Awesome Lists containing this project

README

        

mutaprops
=========

.. image:: https://img.shields.io/pypi/v/mutaprops.svg
:target: https://pypi.python.org/pypi/mutaprops

.. image:: https://img.shields.io/travis/JNevrly/mutaprops.svg
:target: https://travis-ci.org/calcite/mutaprops

.. image:: https://readthedocs.org/projects/pip/badge/
:target: https://readthedocs.org/projects/pip/badge/
:alt: Documentation Status

.. image:: https://pyup.io/repos/github/calcite/mutaprops/shield.svg
:target: https://pyup.io/repos/github/calcite/mutaprops/
:alt: Updates

Mutated Properties - a simple HTML5 property-configuration UI,
autogenerated from your classes.

It's great if you need a quick'n'dirty UI with minimal
effort and without changing much of the existing codebase. Mutaprops also thrive
on headless systems when usual UI solutions like tkinter_ doesn't make sense.

However, the customization possibilities are limited, so if you are looking for
some framework for building a full-fledged attractive GUI, better look
elsewhere.

.. * Free software: MIT license
.. * Documentation: https://mutaprops.readthedocs.io.

Features
--------

* Generate a self-documented web UI directly from your objects with simple decorators
* UI state automatically updated with object state changes (through websockets)
* Supports multiple UI sessions on the same object, synchronized through
websockets
* Supports clustering of UI's from multiple machines
* UI look and feel can be customized with your own stylesheet
* Add any widget you like with direct HTML support
* HTML5 log console capturing all your Python logging
* Asyncio support (and also a requirement ;))

The simplest example
--------------------

Imagine a normal Python class:

.. code-block:: python

class Hoovercraft:

MAX_EELS = 40

def __init__(self, number_of_eels=20, speed=0, direction='North'):
self._eel_count = number_of_eels
self._speed = speed
self._direction = direction
self._engine_running = False
self._steering_locked = True

@property
def eels(self):
return self._eel_count

@eels.setter
def eels(self, value):
self._eel_count = value
if self._eel_count >= self.MAX_EELS:
logger.warning("The hoovercraft is full of eels!")

def drop_all_eels(self):
self.eels = 0
logger.info("Eels are goooone!")

Now, to turn this into an UI, one just has to decorate it like this:

.. code-block:: python

from mutaprops import *

@mutaprop_class("Hoovercraft UI")
class Hoovercraft:

MAX_EELS = 40

def __init__(self, number_of_eels=20, speed=0, direction='North'):
self._eel_count = number_of_eels
self._speed = speed
self._direction = direction
self._engine_running = False
self._steering_locked = True

@mutaproperty("Number of eels", MutaTypes.INT, min_val=0,
max_val=MAX_EELS)
def eels(self):
return self._eel_count

@eels.setter
def eels(self, value):
self._eel_count = value
if self._eel_count >= self.MAX_EELS:
logger.warning("The hoovercraft is full of eels!")

@mutaprop_action("Drop all eels!")
def drop_all_eels(self):
self.eels = 0
logger.info("Eels are goooone!")

And then run it like this:

.. code-block:: python

if __name__ == '__main__':

test = Hoovercraft()
test.muta_init("Hoovercraft instance #1")
man = HttpMutaManager("Hoovercraft manager", proxy_log=logger)
man.add_object(test)
man.run(port=9000)

Et voila, here's the UI:

.. image:: docs/img/screenshot-simple.png

Other examples
--------------

The ``examples/`` folder contains several other examples:

* `simple_example.py`_ is the extension of the example above, including more
data types and also shows how to work with docstrings and ``mutasources``

* `advanced_example.py`_ demonstrates grouping of parameters, style
customizations, raw HTML features and asyncio integration.

Full documentation
------------------

The complete documentation is available at https://mutaprops.readthedocs.io

Using the UI
------------

Simple explanation how to use the UI is
`here `_.

Credits
-------

The default logo created with the Chlorinar_ font.

The JavaScript frontend created with the fantastic `Vue.js`_.

The widgets and styling are based on `Bootstrap 3`_.

The toggle widget is the `Bootstrap toggle`_.

Hoovercraft logo used in `advanced_example.py`_ was created by Theresa Stoodley
from the Noun Project. Licensed under Creative Commons 3.0 license.

This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.

.. _`simple_example.py`: examples/simple_example.py
.. _`advanced_example.py`: examples/advanced_example.py
.. _Chlorinar: http://www.dafont.com/chlorinar.font
.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage
.. _tkinter: https://docs.python.org/3.6/library/tkinter.html
.. _`Vue.js`: https://vuejs.org
.. _`Bootstrap 3`: https://getbootstrap.com/docs/3.3/
.. _`Bootstrap toggle`: http://www.bootstraptoggle.com/