From 8064e60078fb01a6017afb149cfc6ca3806ab844 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Tue, 2 Jun 2020 12:01:27 +0200 Subject: [PATCH 1/4] [property.py] Allow List/Tuple-Format Tuple Input --- odml/property.py | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/odml/property.py b/odml/property.py index 4526045a..c6f6fa00 100644 --- a/odml/property.py +++ b/odml/property.py @@ -34,19 +34,39 @@ def odml_tuple_import(t_count, new_value): except NameError: unicode = str - if len(new_value) != 1 and not isinstance(new_value[0], unicode): - return new_value - - cln = new_value[0].strip() - l_check = cln.startswith("[") and cln.endswith("]") - br_check = cln.count("(") == cln.count(")") - com_check = cln.count("(") == (cln.count(",") + 1) - sep_check = t_count == 1 or cln.count("(") == (cln.count(";") / (t_count - 1)) - - if l_check and br_check and com_check and sep_check: - new_value = cln[1:-1].split(",") - - return new_value + if not isinstance(new_value, (list, tuple)) and \ + not isinstance(new_value[0], (list, tuple)): + new_value = [new_value] + + return_value = [] + + for n_val in new_value: + if isinstance(n_val, (list, tuple)): + if len(n_val) == t_count: + n_val_str = "(" + for tuple_val in n_val: + n_val_str += str(tuple_val) + "; " + return_value += [n_val_str[:-2] + ")"] + else: + #non-unicode handling needed for python2 + if len(n_val) != 1 and not isinstance(n_val[0], unicode): + n_val = n_val.encode('utf-8') + cln = n_val.strip() + br_check = cln.count("(") == cln.count(")") + sep_check = t_count == 1 or cln.count("(") == (cln.count(";") / (t_count - 1)) + + if len(new_value) == 1 and cln.startswith("["): + l_check = cln.startswith("[") and cln.endswith("]") + com_check = cln.count("(") == (cln.count(",") + 1) + if l_check and br_check and com_check and sep_check: + return_value = cln[1:-1].split(",") + elif br_check and sep_check: + return_value += [cln] + + if not return_value: + return_value = new_value + + return return_value @allow_inherit_docstring From 44a403f85b2a9ea99f6457dbeb7b045492c60842 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Tue, 2 Jun 2020 12:03:40 +0200 Subject: [PATCH 2/4] [property.py] Add List/Tuple-Format Tuple Validation for Append and Extend --- odml/property.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/odml/property.py b/odml/property.py index c6f6fa00..e7084223 100644 --- a/odml/property.py +++ b/odml/property.py @@ -794,6 +794,11 @@ def extend(self, obj, strict=True): return new_value = self._convert_value_input(obj) + + if self._dtype.endswith("-tuple"): + t_count = int(self._dtype.split("-")[0]) + new_value = odml_tuple_import(t_count, new_value) + if len(new_value) > 0 and strict and \ dtypes.infer_dtype(new_value[0]) != self.dtype: @@ -831,6 +836,10 @@ def append(self, obj, strict=True): if len(new_value) > 1: raise ValueError("odml.property.append: Use extend to add a list of values!") + if self._dtype.endswith("-tuple"): + t_count = int(self._dtype.split("-")[0]) + new_value = odml_tuple_import(t_count, new_value) + if len(new_value) > 0 and strict and \ dtypes.infer_dtype(new_value[0]) != self.dtype: From faa3da0d840c9929065312144ad12a75f6230958 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Tue, 2 Jun 2020 12:04:54 +0200 Subject: [PATCH 3/4] [test_property.py] Add Tests for List/Tuple-Format Tuple Validation For values (initialization), append and extend. --- test/test_property.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/test/test_property.py b/test/test_property.py index 1a3cc92c..279c59e4 100644 --- a/test/test_property.py +++ b/test/test_property.py @@ -124,6 +124,16 @@ def test_value(self): with self.assertRaises(ValueError): Property(name="intprop", dtype=DType.int, value=[2, "Hello!", 4]) + p6 = Property('myprop', values=["(8; 9; 10)", "(11; 12; 13)"], dtype="3-tuple") + self.assertEqual(len(p6.values), 2) + + p7 = Property('myprop', values=[["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") + self.assertEqual(len(p7.values), 2) + + p7 = Property('myprop', values=["(8; 9; 10)", ["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") + self.assertEqual(len(p7.values), 3) + + def test_value_append(self): # Test append w/o Property value or dtype prop = Property(name="append") @@ -227,10 +237,13 @@ def test_value_append(self): self.assertRaises(ValueError, prop8.append, 1.3) self.assertRaises(ValueError, prop8.append, True) - prop9 = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") - prop9.append("(7; 8; 9)") - self.assertEqual(len(prop9), 2) - self.assertRaises(ValueError, prop9.append, "(10; 11)") + prop = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") + prop.append("(7; 8; 9)") + self.assertEqual(len(prop), 2) + self.assertRaises(ValueError, prop.append, "(10; 11)") + prop.append([[2, 3, 4]]) + self.assertEqual(len(prop), 3) + self.assertRaises(ValueError, prop.append, [[10, 11]]) def test_value_extend(self): prop = Property(name="extend") @@ -336,6 +349,9 @@ def test_value_extend(self): prop.extend(["(7; 8; 9)", "(10; 11; 12)"]) self.assertEqual(len(prop), 3) self.assertRaises(ValueError, prop.extend, "(10; 11)") + prop.extend([[2, 3, 4], [5, 6, 7]]) + self.assertEqual(len(prop), 5) + self.assertRaises(ValueError, prop.extend, [[10, 11]]) def test_get_set_value(self): values = [1, 2, 3, 4, 5] From 9eac34de77b46dfeb5f66d005cbd020c28ea1873 Mon Sep 17 00:00:00 2001 From: fschrader1992 Date: Tue, 2 Jun 2020 12:15:54 +0200 Subject: [PATCH 4/4] [test_property.py] Adopt Properties Naming for Tuple Tests --- test/test_property.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/test/test_property.py b/test/test_property.py index 279c59e4..8a38daf6 100644 --- a/test/test_property.py +++ b/test/test_property.py @@ -124,14 +124,14 @@ def test_value(self): with self.assertRaises(ValueError): Property(name="intprop", dtype=DType.int, value=[2, "Hello!", 4]) - p6 = Property('myprop', values=["(8; 9; 10)", "(11; 12; 13)"], dtype="3-tuple") - self.assertEqual(len(p6.values), 2) + prop6 = Property('myprop', values=["(8; 9; 10)", "(11; 12; 13)"], dtype="3-tuple") + self.assertEqual(len(prop6.values), 2) - p7 = Property('myprop', values=[["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") - self.assertEqual(len(p7.values), 2) + prop7 = Property('myprop', values=[["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") + self.assertEqual(len(prop7.values), 2) - p7 = Property('myprop', values=["(8; 9; 10)", ["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") - self.assertEqual(len(p7.values), 3) + prop8 = Property('myprop', values=["(8; 9; 10)", ["0", "1", "2"], [3, 4, 5]], dtype="3-tuple") + self.assertEqual(len(prop8.values), 3) def test_value_append(self): @@ -237,13 +237,13 @@ def test_value_append(self): self.assertRaises(ValueError, prop8.append, 1.3) self.assertRaises(ValueError, prop8.append, True) - prop = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") - prop.append("(7; 8; 9)") - self.assertEqual(len(prop), 2) - self.assertRaises(ValueError, prop.append, "(10; 11)") - prop.append([[2, 3, 4]]) - self.assertEqual(len(prop), 3) - self.assertRaises(ValueError, prop.append, [[10, 11]]) + prop9 = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") + prop9.append("(7; 8; 9)") + self.assertEqual(len(prop9), 2) + self.assertRaises(ValueError, prop9.append, "(10; 11)") + prop9.append([[2, 3, 4]]) + self.assertEqual(len(prop9), 3) + self.assertRaises(ValueError, prop9.append, [[10, 11]]) def test_value_extend(self): prop = Property(name="extend") @@ -345,13 +345,13 @@ def test_value_extend(self): self.assertRaises(ValueError, prop3.extend, 1.3) self.assertRaises(ValueError, prop3.extend, True) - prop = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") - prop.extend(["(7; 8; 9)", "(10; 11; 12)"]) - self.assertEqual(len(prop), 3) - self.assertRaises(ValueError, prop.extend, "(10; 11)") - prop.extend([[2, 3, 4], [5, 6, 7]]) - self.assertEqual(len(prop), 5) - self.assertRaises(ValueError, prop.extend, [[10, 11]]) + prop4 = Property(name="tuple-test", dtype="3-tuple", values="(1; 2; 3)") + prop4.extend(["(7; 8; 9)", "(10; 11; 12)"]) + self.assertEqual(len(prop4), 3) + self.assertRaises(ValueError, prop4.extend, "(10; 11)") + prop4.extend([[2, 3, 4], [5, 6, 7]]) + self.assertEqual(len(prop4), 5) + self.assertRaises(ValueError, prop4.extend, [[10, 11]]) def test_get_set_value(self): values = [1, 2, 3, 4, 5]