feat: добавлена поддержка логирования при трансформации
This commit is contained in:
@ -33,6 +33,49 @@ class Rulebook:
|
|||||||
"amount by setting class variable MAX_DEPTH,"
|
"amount by setting class variable MAX_DEPTH,"
|
||||||
" but may be something wrong with your input")
|
" but may be something wrong with your input")
|
||||||
|
|
||||||
|
def logged_transform(self, string: str) -> tuple[str | None, str]:
|
||||||
|
"""
|
||||||
|
Does exactly the same thing as transform, but logging the whole
|
||||||
|
process, so it can be used to create reports
|
||||||
|
|
||||||
|
NOTE: It's literally COPY + PASTE in it's worst, but I don't like
|
||||||
|
the idea of splitting anything apart, because of the specificity
|
||||||
|
of the task
|
||||||
|
|
||||||
|
Returns the result of transformations and full report
|
||||||
|
in str respectively
|
||||||
|
"""
|
||||||
|
CENTER_WIDTH: int = 30
|
||||||
|
log = "НАЧАЛО ЛИСТИНГА".center(CENTER_WIDTH, "=") + '\n'
|
||||||
|
log += self._log_rules()
|
||||||
|
log += f"Ввод: \"{string}\"\n"
|
||||||
|
for _ in range(self.MAX_DEPTH):
|
||||||
|
log += string + "\n"
|
||||||
|
rule = self.find_appropriate_rule(string)
|
||||||
|
if rule is None:
|
||||||
|
log += "NO_MORE_RULES".center(CENTER_WIDTH, "_") + '\n'
|
||||||
|
return string, log
|
||||||
|
log += " " * string.find(rule.operand) + self._log_rule(rule) + '\n'
|
||||||
|
string = self._apply_rule(rule, string)
|
||||||
|
if rule.is_blocking:
|
||||||
|
log += string + '\n'
|
||||||
|
log += "FINAL_RULE".center(CENTER_WIDTH, "_") + '\n'
|
||||||
|
return string, log
|
||||||
|
# raise ValueError("The amount of transformations exceeded "
|
||||||
|
# f"{self.MAX_DEPTH}. You can change maximum "
|
||||||
|
# "amount by setting class variable MAX_DEPTH,"
|
||||||
|
# " but may be something wrong with your input")
|
||||||
|
|
||||||
|
def _log_rule(self, rule) -> str:
|
||||||
|
arrow = "->|" if rule.is_blocking else "->"
|
||||||
|
return f"{rule.operand} {arrow} {rule.target}"
|
||||||
|
|
||||||
|
def _log_rules(self) -> str:
|
||||||
|
log = ""
|
||||||
|
for num, rule in enumerate(self.rules, start=1):
|
||||||
|
#log += f"\t{num} : {rule.operand} {arrow} {rule.target}\n"
|
||||||
|
log += " " * 4 + f"{num} : " + self._log_rule(rule) + "\n"
|
||||||
|
return log
|
||||||
|
|
||||||
def find_appropriate_rule(self, string) -> Rule | None:
|
def find_appropriate_rule(self, string) -> Rule | None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user