Skip to content

Commit c6b8790

Browse files
authored
Update refactoring proposal to iot_ext_item_data_builder.py
1 parent 00f7e02 commit c6b8790

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

src/builders/iot_ext_item_data_builder.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ def __str__(self, items_separator=",") -> str:
6767
return self.__prepare_msg(items_separator=items_separator)
6868

6969
def to_json(self) -> str:
70+
Item(
71+
kind=ItemTypes.METRIC_ITEM,
72+
name=item["m"],
73+
metric=MetricDataItem(
74+
data_type=data_type,
75+
value=val,
76+
),
77+
)
78+
)
7079
self.__str__()
7180
return IoTextItemDataBuilder.to_json_from_iotext_struct(self.output)
7281

@@ -194,3 +203,90 @@ def from_json(json_iotext_msg) -> List[Item]:
194203
)
195204
)
196205
return items
206+
207+
"""
208+
@staticmethod
209+
def parse_integer(value):
210+
return MetricDataTypes.INTEGER, int(value)
211+
212+
@staticmethod
213+
def parse_bool(value):
214+
return MetricDataTypes.BOOL, value == "1"
215+
216+
@staticmethod
217+
def parse_decimal(value):
218+
return MetricDataTypes.DECIMAL, Decimal(str(value))
219+
220+
@staticmethod
221+
def parse_text(value):
222+
return MetricDataTypes.TEXT, str(value)
223+
224+
@staticmethod
225+
def parse_decimals_list(value):
226+
return MetricDataTypes.DECIMALS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.DECIMALS_LIST, value)
227+
228+
@staticmethod
229+
def parse_bools_list(value):
230+
return MetricDataTypes.BOOLS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.BOOLS_LIST, value)
231+
232+
@staticmethod
233+
def parse_integers_list(value):
234+
return MetricDataTypes.INTEGERS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.INTEGERS_LIST, value)
235+
236+
@staticmethod
237+
def parse_texts_list(value):
238+
return MetricDataTypes.TEXTS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.TEXTS_LIST, value)
239+
240+
@staticmethod
241+
def handle_multi_key_item(item):
242+
parsers = {
243+
"i": IoTextItemDataBuilder.parse_integer,
244+
"b": IoTextItemDataBuilder.parse_bool,
245+
"d": IoTextItemDataBuilder.parse_decimal,
246+
"t": IoTextItemDataBuilder.parse_text,
247+
"D": IoTextItemDataBuilder.parse_decimals_list,
248+
"B": IoTextItemDataBuilder.parse_bools_list,
249+
"I": IoTextItemDataBuilder.parse_integers_list,
250+
"T": IoTextItemDataBuilder.parse_texts_list
251+
}
252+
253+
data_type, val = parsers\
254+
.get(item["t"], lambda _: (_ for _ in ())\
255+
.throw(ValueError(f"Not recognized metric type: '{item['t']}'")))(item["v"])
256+
257+
return data_type, val
258+
259+
@staticmethod
260+
def handle_single_key_item(item, items) -> List[Item]:
261+
key = next(iter(item))
262+
val = list(item.values())[0]
263+
if key == "t":
264+
return items.append(Item(kind=ItemTypes.TIMESTAMP_MILIS, name=val, metric=None))
265+
elif key == "d":
266+
return items.append(Item(kind=ItemTypes.DEVICE_ID, name=val, metric=None))
267+
elif key == "c":
268+
return items.append(Item(kind=ItemTypes.CRC, name=val, metric=None))
269+
else:
270+
raise ValueError(f"Not recognized type item in keys: '{key}'")
271+
272+
@staticmethod
273+
def from_json(json_iotext_msg) -> List[Item]:
274+
data_row_from_json = json.loads(json_iotext_msg)
275+
items = []
276+
for item in data_row_from_json:
277+
if len(item.keys()) == 1:
278+
items = IoTextItemDataBuilder.handle_single_key_item(item, items)
279+
else:
280+
data_type, val = IoTextItemDataBuilder.handle_multi_key_item(item)
281+
items.append(
282+
Item(
283+
kind=ItemTypes.METRIC_ITEM,
284+
name=item["m"],
285+
metric=MetricDataItem(
286+
data_type=data_type,
287+
value=val,
288+
),
289+
)
290+
)
291+
return items
292+
"""

0 commit comments

Comments
 (0)