From 68fc337b5a6d46a71c81dc046eb65e6153ba7078 Mon Sep 17 00:00:00 2001 From: washad Date: Sat, 22 Jun 2019 18:50:11 -0600 Subject: [PATCH] Done for now --- build/lib/pyrediseasyio/html/html_io.py | 31 ++-- build/lib/pyrediseasyio/html/html_io_group.py | 27 ++- build/lib/pyrediseasyio/io/io_group.py | 7 +- build/lib/pyrediseasyio/io/single_io.py | 160 ++++++++++++++++++ build/lib/tests/test_get_attributes.py | 6 +- .../tests/test_html_io_group_conversion.py | 58 ++++--- dist/pyrediseasyio-0.0.17-py3-none-any.whl | Bin 17410 -> 0 bytes dist/pyrediseasyio-0.0.17.tar.gz | Bin 8537 -> 0 bytes dist/pyrediseasyio-0.0.19-py3-none-any.whl | Bin 0 -> 18385 bytes dist/pyrediseasyio-0.0.19.tar.gz | Bin 0 -> 8598 bytes pyrediseasyio.egg-info/PKG-INFO | 2 +- pyrediseasyio.egg-info/SOURCES.txt | 2 +- pyrediseasyio/html/html_io.py | 2 +- setup.py | 2 +- tests/test_html_io_group_conversion.py | 8 +- 15 files changed, 241 insertions(+), 64 deletions(-) create mode 100644 build/lib/pyrediseasyio/io/single_io.py delete mode 100644 dist/pyrediseasyio-0.0.17-py3-none-any.whl delete mode 100644 dist/pyrediseasyio-0.0.17.tar.gz create mode 100644 dist/pyrediseasyio-0.0.19-py3-none-any.whl create mode 100644 dist/pyrediseasyio-0.0.19.tar.gz diff --git a/build/lib/pyrediseasyio/html/html_io.py b/build/lib/pyrediseasyio/html/html_io.py index 66285c5..bd5b67b 100644 --- a/build/lib/pyrediseasyio/html/html_io.py +++ b/build/lib/pyrediseasyio/html/html_io.py @@ -4,36 +4,39 @@ class HTMLIO: - def __init__(self, io: SingleIO, namespace: str='easyio'): + def __init__(self, io: SingleIO): + key = io.key self.io = io - self.namespace = namespace - self.html_class = f'{self.namespace}_io' + self.container_id = f'{key}_io' + self.value_id = f'{key}_io_value' self.name = io.name - self.val = io.value - self.addr = io.addr + self.value = io.value self.units = io.units - self.html_id = f'{self.addr}_io_value' + + def html(self, show_units: bool = True): io = self.io name, addr, val, units = io.name, io.addr, io.value, io.units - with div(cls=self.html_class, id=addr) as container: - div(name, cls=f'{self.html_class}_name') - div(val, cls=f'{self.html_class}_value', id=self.html_id, onchange='OnIOValueChange(event)') + with div(cls='easyio_io', id=self.container_id) as container: + div(name, cls='easyio_name') + div(val, cls=f'easyio_value', id=self.value_id, onchange='OnIOValueChange(event)') if show_units: units = '' if units is None else units - div(units, cls=f'{self.html_class}_units') + div(units, cls=f'easyio_units') return container + + def html_row(self, show_units: bool = True): io = self.io name, addr, val, units = io.name, io.addr, io.value, io.units - with tr(cls=self.html_class, id=addr) as container: - td(name, cls=f'{self.html_class}_name') - td(val, cls=f'{self.html_class}_value', id=self.html_id, onchange='OnIOValueChange(event)') + with tr(cls='easyio_io', id=self.container_id) as container: + td(name, cls='easyio_name') + td(val, cls=f'easyio_value', id=self.value_id, onchange='OnIOValueChange(event)') if show_units: units = '' if units is None else units - td(units, cls=f'{self.html_class}_units') + td(units, cls=f'easyio_units') return container diff --git a/build/lib/pyrediseasyio/html/html_io_group.py b/build/lib/pyrediseasyio/html/html_io_group.py index 75cac30..9dcc63d 100644 --- a/build/lib/pyrediseasyio/html/html_io_group.py +++ b/build/lib/pyrediseasyio/html/html_io_group.py @@ -1,7 +1,7 @@ from pyrediseasyio.io.io_group import IOGroup from pyrediseasyio.html.html_io import HTMLIO from typing import List, Callable -from dominate.tags import div, table +from dominate.tags import div, table, tr, th import json @@ -12,24 +12,29 @@ def __init__(self, io_group: IOGroup, html_id: str = None): self.namespace = io_group.namespace self.html_id = html_id + + def html(self, by_names: List = None, by_type: List = None, by_lambda_each: Callable = None, by_lambda_results: Callable = None, - html_classes: List = None): + html_classes: List = None, show_units: bool=True): attrs = self._io_group.get_attributes(by_names, by_type, by_lambda_each, by_lambda_results) - cls = f'{self.namespace}_io_container' + cls = f'easyio_io_container' classes = html_classes.append(cls) if html_classes else [cls] classes = ' '.join(classes) - html_id = f'{attrs[0].addr}_io_container' if self.html_id is None else self.html_id + html_id = f'{attrs[0].key}_io_container' if self.html_id is None else self.html_id with div(cls=classes, id=html_id) as container: for attr in attrs: - HTMLIO(attr, self.namespace).html() + HTMLIO(attr).html(show_units) return container + + def html_table(self, by_names: List = None, by_type: List = None, by_lambda_each: Callable = None, by_lambda_results: Callable = None, - html_classes: List = None, show_units: bool=True): + html_classes: List = None, show_units: bool = True, + headers: List = None): attrs = self._io_group.get_attributes(by_names, by_type, by_lambda_each, by_lambda_results) cls = f'{self.namespace}_io_container' @@ -38,10 +43,16 @@ def html_table(self, by_names: List = None, by_type: List = None, html_id = f'{attrs[0].addr}_io_container' if self.html_id is None else self.html_id with table(cls=classes, id=html_id) as container: + if headers: + with tr(): + for h in headers: + th(h) for attr in attrs: - HTMLIO(attr, self.namespace).html_row(show_units) + HTMLIO(attr).html_row(show_units) return container + + def dumps(self, by_names: List = None, by_type: List = None, by_lambda_each: Callable = None, by_lambda_results: Callable = None): @@ -49,7 +60,7 @@ def dumps(self, by_names: List = None, by_type: List = None, def f(a): io = HTMLIO(a) - return dict(id=io.html_id, name=io.name, value=io.val, units=io.units) + return dict(id=io.value_id, name=io.name, value=io.value, units=io.units) results = [f(a) for a in attrs] return json.dumps(results) diff --git a/build/lib/pyrediseasyio/io/io_group.py b/build/lib/pyrediseasyio/io/io_group.py index ca486d1..96f9c4f 100644 --- a/build/lib/pyrediseasyio/io/io_group.py +++ b/build/lib/pyrediseasyio/io/io_group.py @@ -23,9 +23,10 @@ def __init__(self, host='localhost', port=6379, db=0, continue attr._reader_writer = self self.members.append(name) - new_name = name if attr.addr is None else attr.addr - attr.addr = new_name if namespace is None else f"{namespace}_{new_name}" - + if attr.addr is None: + attr.addr = name + if namespace is not None: + attr.namespace = namespace if delete_keys_on_startup: self.delete_key(attr.addr) if set_defaults_on_startup: diff --git a/build/lib/pyrediseasyio/io/single_io.py b/build/lib/pyrediseasyio/io/single_io.py new file mode 100644 index 0000000..005c732 --- /dev/null +++ b/build/lib/pyrediseasyio/io/single_io.py @@ -0,0 +1,160 @@ +from pyrediseasyio.abstract_reader_writer import AbstractReaderWriter +import threading +import json + +lock = threading.Lock() + + +class SingleIO: + def __init__(self, name: str, addr: str = None, default: object = None, + units: str = None, reader: AbstractReaderWriter = None, namespace: str=None): + self.name = name + self.addr = addr + self.namespace = namespace + self._reader_writer = reader + self.default = default + self.units = units + + def __and__(self, other): + if hasattr(other, 'value'): + return self.value and other.value + return self.value and other + + def __add__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value + other + + def __sub__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value - other + + def __mul__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value * other + + def __eq__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value == other + + def __floordiv__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value // other + + def __iadd__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val += other + self.write(val) + + def __idiv__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val /= other + self.write(val) + + def __ifloordiv__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val //= other + self.write(val) + + def __imul__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val *= other + self.write(val) + + def __invert__(self): + return ~self.value + + def __ipow__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val **= other + self.write(val) + + def __isub__(self, other): + if hasattr(other, 'value'): + other = other.value + val = self.value + val -= other + self.write(val) + + def __ne__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value != other + + def __or__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value or other + + def __pos__(self): + return self.value + + def __pow__(self, power, modulo=None): + if hasattr(power, 'value'): + power = power.value + return self.value ** power + + def __neg__(self): + return -self.value + + def __set__(self, obj, value): + self.write(value) + + def __str__(self): + return f'[{type(self).__name__}] {self.name} = {self.value} {self.units}' + + def __truediv__(self, other): + if hasattr(other, 'value'): + other = other.value + return self.value / other + + @property + def key(self): + return f'{self.namespace}{self.addr}' + + @property + def value(self): + return self.read() + + @staticmethod + def _convert_type(value): + return value + + def publish(self, value, channel: str = None, and_write: bool = False): + value = self._convert_type(value) + data = json.dumps({self.key: value}) + self._reader_writer.publish(data, channel) + if and_write: + self.write(value) + + def read(self): + if self._reader_writer is None: + return None + with lock: + val = self._reader_writer.read(self.key) + if val is None: + val = self.default + val = self._convert_type(val) + return val + + def write(self, value): + if self._reader_writer is None: + return + with lock: + value = self._convert_type(value) + self._reader_writer.write(self.key, value) + diff --git a/build/lib/tests/test_get_attributes.py b/build/lib/tests/test_get_attributes.py index 0ec7a8f..a619fd5 100644 --- a/build/lib/tests/test_get_attributes.py +++ b/build/lib/tests/test_get_attributes.py @@ -23,7 +23,7 @@ class TestGroup2(IOGroup): test_group = TestGroup() -test_group2 = TestGroup2(namespace="testns") +test_group2 = TestGroup2(namespace="Test") class TestAttributes(unittest.TestCase): @@ -50,6 +50,6 @@ def test_limit_by_io_result(self): assert_that(attrs[0].value).is_equal_to(34) def test_namespace(self): - assert_that(test_group2.Bool1.addr).is_equal_to(f'testns_Bool1') - assert_that(test_group2.Float1.addr).is_equal_to('testns_MyName') + assert_that(test_group2.Bool1.key).is_equal_to(f'TestBool1') + assert_that(test_group2.Float1.key).is_equal_to('TestMyName') diff --git a/build/lib/tests/test_html_io_group_conversion.py b/build/lib/tests/test_html_io_group_conversion.py index 12bd837..7fdb0a3 100644 --- a/build/lib/tests/test_html_io_group_conversion.py +++ b/build/lib/tests/test_html_io_group_conversion.py @@ -12,7 +12,7 @@ class TestGroup(IOGroup): Float1 = FloatIO("Float 1", default=1.23, units="furlongs") -test_group = TestGroup(namespace='my_ns') +test_group = TestGroup(namespace='Pin1') def html_equals(html1, html2): @@ -26,16 +26,16 @@ class TestHTML(unittest.TestCase): def test_boolean_div_conversion(self): h = HMTLIOGroup(test_group).html().render() expected = ''' -
-
-
Boolean 1
-
False
-
On/Off
+
+
+
Boolean 1
+
False
+
On/Off
-
-
Float 1
-
1.23
-
furlongs
+
+
Float 1
+
1.23
+
furlongs
''' @@ -44,16 +44,16 @@ def test_boolean_div_conversion(self): def test_boolean_table_conversion(self): h = HMTLIOGroup(test_group).html_table().render() expected = ''' - - - - - +
Boolean 1FalseOn/Off
+ + + + - - - - + + + +
Boolean 1FalseOn/Off
Float 11.23furlongs
Float 11.23furlongs
''' @@ -62,16 +62,16 @@ def test_boolean_table_conversion(self): def test_different_id(self): h = HMTLIOGroup(test_group, html_id="NewID").html_table().render() expected = ''' - - - - - +
Boolean 1FalseOn/Off
+ + + + - - - - + + + +
Boolean 1FalseOn/Off
Float 11.23furlongs
Float 11.23furlongs
''' @@ -84,8 +84,10 @@ def test_json_dumps_basic(self): assert_that(len(as_list)).is_equal_to(len(test_group)) assert_that(as_list[0]['name']).is_equal_to('Boolean 1') + def test_json_dumps_by_name(self): h = HMTLIOGroup(test_group, "new_ns") d = h.dumps(by_names=['Bool1']) + print(d) as_list = json.loads(d) assert_that(len(as_list)).is_equal_to(1) diff --git a/dist/pyrediseasyio-0.0.17-py3-none-any.whl b/dist/pyrediseasyio-0.0.17-py3-none-any.whl deleted file mode 100644 index 9023a067e556f4c2dfb522d9ffdefcade2e3b28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17410 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

%cYqlb0W)gV+_Z|gHy9vS;s{5#8DGX6IBkB}C$ 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 Gg#Q8Km_`i% literal 0 HcmV?d00001 diff --git a/pyrediseasyio.egg-info/PKG-INFO b/pyrediseasyio.egg-info/PKG-INFO index 512288f..a9038c3 100644 --- a/pyrediseasyio.egg-info/PKG-INFO +++ b/pyrediseasyio.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyrediseasyio -Version: 0.0.17 +Version: 0.0.19 Summary: A set of tools for simplifying reading and writing of single values to/from Redis. Home-page: https://github.com/washad/PyRedisEasyIO Author: Steve Jackson diff --git a/pyrediseasyio.egg-info/SOURCES.txt b/pyrediseasyio.egg-info/SOURCES.txt index 25535fd..c7d171c 100644 --- a/pyrediseasyio.egg-info/SOURCES.txt +++ b/pyrediseasyio.egg-info/SOURCES.txt @@ -11,11 +11,11 @@ pyrediseasyio/html/__init__.py pyrediseasyio/html/html_io.py pyrediseasyio/html/html_io_group.py pyrediseasyio/io/__init__.py -pyrediseasyio/io/base.py pyrediseasyio/io/boolean_io.py pyrediseasyio/io/float_io.py pyrediseasyio/io/integer_io.py pyrediseasyio/io/io_group.py +pyrediseasyio/io/single_io.py pyrediseasyio/io/string_io.py tests/__init__.py tests/test_get_attributes.py diff --git a/pyrediseasyio/html/html_io.py b/pyrediseasyio/html/html_io.py index aaca9dd..bd5b67b 100644 --- a/pyrediseasyio/html/html_io.py +++ b/pyrediseasyio/html/html_io.py @@ -36,7 +36,7 @@ def html_row(self, show_units: bool = True): td(val, cls=f'easyio_value', id=self.value_id, onchange='OnIOValueChange(event)') if show_units: units = '' if units is None else units - div(units, cls=f'easyio_units') + td(units, cls=f'easyio_units') return container diff --git a/setup.py b/setup.py index 8746c71..5fc0a9c 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="pyrediseasyio", - version="0.0.17", + version="0.0.19", author="Steve Jackson", author_email="washad@gmail.com", description="A set of tools for simplifying reading and writing of single values to/from Redis.", diff --git a/tests/test_html_io_group_conversion.py b/tests/test_html_io_group_conversion.py index 362f780..7fdb0a3 100644 --- a/tests/test_html_io_group_conversion.py +++ b/tests/test_html_io_group_conversion.py @@ -48,12 +48,12 @@ def test_boolean_table_conversion(self): Boolean 1 False -

+ On/Off Float 1 1.23 -
furlongs
+ furlongs ''' @@ -66,12 +66,12 @@ def test_different_id(self): Boolean 1 False -
On/Off
+ On/Off Float 1 1.23 -
furlongs
+ furlongs '''