Coverage for project/utils/decisions_logger.py : 87%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import json
2import logging
3from copy import deepcopy
5from mahjong.meld import Meld
6from mahjong.tile import TilesConverter
7from utils.settings_handler import settings
10class DecisionsLogger:
11 logger = logging.getLogger()
13 def debug(self, message_id, message="", context=None):
14 if not settings.PRINT_LOGS:
15 return None
17 self.logger.debug(f"id={message_id}")
19 if message:
20 self.logger.debug(f"msg={message}")
22 if context:
23 if isinstance(context, list):
24 for x in context:
25 self.log_message(x)
26 else:
27 self.log_message(context)
29 def log_message(self, message):
30 if hasattr(message, "serialize"):
31 message = message.serialize()
33 if isinstance(message, dict):
34 message = deepcopy(message)
35 self.serialize_dict_objects(message)
36 self.logger.debug(json.dumps(message))
37 else:
38 self.logger.debug(message)
40 def serialize_dict_objects(self, d):
41 for k, v in d.items():
42 if isinstance(v, dict):
43 self.serialize_dict_objects(v)
44 elif isinstance(v, list):
45 for i in range(len(v)):
46 if isinstance(v, dict):
47 self.serialize_dict_objects(v)
48 elif hasattr(v[i], "serialize"):
49 v[i] = v[i].serialize()
50 elif hasattr(v, "serialize"):
51 d[k] = v.serialize()
54class MeldPrint(Meld):
55 """
56 Wrapper to be able use mahjong package MeldPrint object in our loggers.
57 """
59 def __str__(self):
60 meld_type_str = self.type
61 if meld_type_str == self.KAN:
62 meld_type_str += f" open={self.opened}"
63 return f"Type: {meld_type_str}, Tiles: {TilesConverter.to_one_line_string(self.tiles)} {self.tiles}"
65 def serialize(self):
66 return {
67 "type": self.type,
68 "tiles_string": TilesConverter.to_one_line_string(self.tiles),
69 "tiles": self.tiles,
70 }