Skip to content

Commit 21cd94d

Browse files
authored
#498: Relax numeric conversion to float when reading JSON (#500)
* #498: loosen type requirements in lbsObject * #498: allow ints for rank size * #498: add missing import * #498: handle bool case * #498: add unit test for rank size
1 parent bb11351 commit 21cd94d

File tree

4 files changed

+24
-19
lines changed

4 files changed

+24
-19
lines changed

src/lbaf/Model/lbsObject.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ def __init__(
2424
self.__index = i
2525

2626
# Nonnegative load required to perform the work of this object
27-
if not isinstance(load, float) or load < 0.0:
27+
if not isinstance(load, (int, float)) or isinstance(load, bool) or load < 0.0:
2828
raise TypeError(
2929
f"load: incorrect type {type(load)} or value: {load}")
30-
self.__load = load
30+
self.__load = float(load)
3131

3232
# Nonnegative size required to for memory footprint of this object
33-
if not isinstance(size, float) or size < 0.0:
33+
if not isinstance(size, (int, float)) or isinstance(size, bool) or size < 0.0:
3434
raise TypeError(
3535
f"size: incorrect type {type(size)} or value: {size}")
36-
self.__size = size
36+
self.__size = float(size)
3737

3838
# Rank to which object is currently assigned if defined
3939
if not(r_id is None or isinstance(r_id, int)) or isinstance(r_id, bool):
@@ -62,19 +62,19 @@ def __init__(
6262
if user_defined:
6363
# Object size is by definition its memory footprint
6464
if not isinstance((
65-
size := user_defined.get("task_footprint_bytes")), float) or size < 0.0:
65+
size := user_defined.get("task_footprint_bytes")), (int, float)) or isinstance(size, bool) or size < 0.0:
6666
raise TypeError(
6767
f"size: incorrect type {type(size)} or value: {size}")
6868
else:
69-
self.__size = size
69+
self.__size = float(size)
7070

7171
# Object overhead is by definition its additional working memory
7272
if not isinstance((
73-
overhead := user_defined.get("task_working_bytes")), float) or overhead < 0.0:
73+
overhead := user_defined.get("task_working_bytes")), (int, float)) or isinstance(overhead, bool) or overhead < 0.0:
7474
raise TypeError(
7575
f"overhead: incorrect type {type(overhead)} or value: {overhead}")
7676
else:
77-
self.__overhead = overhead
77+
self.__overhead = float(overhead)
7878

7979
# Sub-phases
8080
if isinstance(subphases, list) or subphases is None:

src/lbaf/Model/lbsRank.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ def get_size(self) -> float:
6464
"""Return object size."""
6565
return self.__size
6666

67-
def set_size(self, size: float):
67+
def set_size(self, size):
6868
"""Set rank working memory, called size."""
6969
# Nonnegative size required for memory footprint of this rank
70-
if not isinstance(size, float) or size < 0.0:
70+
if not isinstance(size, (int, float)) or isinstance(size, bool) or size < 0.0:
7171
raise TypeError(
7272
f"size: incorrect type {type(size)} or value: {size}")
73-
self.__size = size
73+
self.__size = float(size)
7474

7575
def get_metadata(self) -> dict:
7676
"""Return original metadata."""

tests/unit/Model/test_lbs_object.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def setUp(self):
1919
self.simple_obj_001 = Object(i=1, load=2.5, subphases=self.subphases)
2020
self.simple_obj_002 = Object(i=2, load=4.5, r_id=0)
2121
self.oc = ObjectCommunicator(i=3, logger=self.logger)
22-
self.simple_obj_003 = Object(i=3, load=3.5, r_id=2, comm=self.oc)
22+
self.simple_obj_003 = Object(i=3, load=3, r_id=2, comm=self.oc)
2323
self.sent_objects = {Object(i=0, load=1.0): 2.0, Object(i=1, load=0.5): 1.0, Object(i=4, load=0.5): 2.0,
2424
Object(i=3, load=0.5): 1.5}
2525
self.received_objects = {Object(i=5, load=2.0): 2.0, Object(i=6, load=0.5): 1.0, Object(i=2, load=0.5): 1.0,
@@ -39,14 +39,14 @@ def test_object_initialization_002(self):
3939

4040
def test_object_initialization_003(self):
4141
self.assertEqual(self.simple_obj_003._Object__index, 3)
42-
self.assertEqual(self.simple_obj_003._Object__load, 3.5)
42+
self.assertEqual(self.simple_obj_003._Object__load, 3.0)
4343
self.assertEqual(self.simple_obj_003._Object__rank_id, 2)
4444
self.assertEqual(self.simple_obj_003._Object__communicator, self.oc)
4545

4646
def test_object_repr(self):
4747
self.assertEqual(str(self.simple_obj_001), "Object id: 1, load: 2.5")
4848
self.assertEqual(str(self.simple_obj_002), "Object id: 2, load: 4.5")
49-
self.assertEqual(str(self.simple_obj_003), "Object id: 3, load: 3.5")
49+
self.assertEqual(str(self.simple_obj_003), "Object id: 3, load: 3.0")
5050

5151
def test_object_get_id(self):
5252
self.assertEqual(self.simple_obj_001.get_id(), 1)
@@ -56,7 +56,7 @@ def test_object_get_id(self):
5656
def test_object_get_load(self):
5757
self.assertEqual(self.simple_obj_001.get_load(), 2.5)
5858
self.assertEqual(self.simple_obj_002.get_load(), 4.5)
59-
self.assertEqual(self.simple_obj_003.get_load(), 3.5)
59+
self.assertEqual(self.simple_obj_003.get_load(), 3.0)
6060

6161
def test_object_set_rank_id(self):
6262
self.simple_obj_001.set_rank_id(15)
@@ -97,10 +97,6 @@ def test_object_load_error(self):
9797
Object(i=1, load="2.5")
9898
self.assertEqual(err.exception.args[0], "load: incorrect type <class 'str'> or value: 2.5")
9999

100-
with self.assertRaises(TypeError) as err:
101-
Object(i=2, load=3)
102-
self.assertEqual(err.exception.args[0], "load: incorrect type <class 'int'> or value: 3")
103-
104100
with self.assertRaises(TypeError) as err:
105101
Object(i=3, load=True)
106102
self.assertEqual(err.exception.args[0], "load: incorrect type <class 'bool'> or value: True")

tests/unit/Model/test_lbs_rank.py

+9
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ def test_lbs_rank_get_migratable_load(self):
6060
def test_lbs_rank_get_sentinel_load(self):
6161
self.assertEqual(self.rank.get_sentinel_load(), 7.0)
6262

63+
def test_lbs_rank_set_size(self):
64+
self.rank.set_size(3.0)
65+
self.assertEqual(self.rank.get_size(), 3.0)
66+
self.rank.set_size(3)
67+
self.assertEqual(self.rank.get_size(), 3.0)
68+
with self.assertRaises(TypeError) as err:
69+
self.rank.set_size(True)
70+
self.assertEqual(err.exception.args[0], "size: incorrect type <class 'bool'> or value: True")
71+
6372
def test_lbs_rank_get_received_volume_001(self):
6473
sent_objects = {Object(i=123, load=1.0): 2.0, Object(i=1, load=0.5): 1.0, Object(i=4, load=0.5): 2.0,
6574
Object(i=3, load=0.5): 1.5}

0 commit comments

Comments
 (0)