From 666657926b41c934da4fdd57221120f0ca1a8b85 Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Sun, 16 Mar 2025 03:52:07 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=83=D1=8E=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8E=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проект в целом получил свой MVP --- src/interactive.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/markov.py | 25 +++++++++++++++++++++---- src/rulebook.py | 7 +++---- 3 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/interactive.py diff --git a/src/interactive.py b/src/interactive.py new file mode 100644 index 0000000..a8b2143 --- /dev/null +++ b/src/interactive.py @@ -0,0 +1,45 @@ +from rulebook import Rulebook +from rule import Rule + +def format_rule(rule: Rule) -> str: + """ + Just like CLI defined conversion from Rule to str + """ + arrow = "->|" if rule.is_blocking else "->" + return f"{rule.operand} {arrow} {rule.target}" + +def interactve_mode(rulebook: Rulebook): + """ + Handles interactive mode of the program + """ + print("To get help type \"h:\" in prompt") + _print_rules(rulebook.rules) + while True: + user_input = input("#> ") + if user_input.startswith("h:"): + print_help() + elif user_input.startswith("r:"): + _print_rules(rulebook.rules) + elif user_input.startswith("v:"): + user_input = user_input[2:].strip(" \t") + _, log = rulebook.logged_transform(user_input) + print(log) + elif user_input.startswith("e:"): + return + elif user_input.startswith(":"): + print(rulebook.transform(user_input[1:])) + else: + print(rulebook.transform(user_input)) + +def print_help(): + print("you can type expressions right after prompt. However there is some " + 'reserved chars: "h:" to print help, "v:" to run next expression in ' + 'verbose mode, "r:" to view rules, "e:" to exit, and ":" to imidiately ' + 'start prompt.Can be omited if your prompt doesn\'t start from' + 'reserved sequence. Note that your input after "h:", "e:" and "r:" will ' + 'be ignored') + +def _print_rules(rules: list[Rule]) -> None: + for num, rule in enumerate(rules, start=1): + print(" " * 4 + str(num) + " : " + format_rule(rule)) + diff --git a/src/markov.py b/src/markov.py index c8c2405..b04d647 100644 --- a/src/markov.py +++ b/src/markov.py @@ -1,5 +1,6 @@ -import rulesparser -import rulebook +from rulesparser import RulesParser +from rulebook import Rulebook +from interactive import interactve_mode import argparse def main(): @@ -8,7 +9,7 @@ def main(): description = "Simple tool to apply Markov's normal algorithms" ) parser.add_argument("rulebook", type=str, help="File with the rules for algorithm") - parser.add_argument("-c", "--command-line-input", type=str, nargs='?', + parser.add_argument("-c", "--command-line-input", help="Takes input from user via command line " "arguments. There should be only one string. " "Please, use quotation marks") @@ -16,7 +17,23 @@ def main(): help="If set, verbose output will be produced. " "It'll contain all intermediate transformations, " "reason of stop etc.") - parser.parse_args() + args = parser.parse_args() + + rules = RulesParser().parse(args.rulebook) + rulebook = Rulebook(rules) + print(args.command_line_input) + if not args.command_line_input: + interactve_mode(rulebook) + return + + transformer = (rulebook.logged_transform if args.verbose + else rulebook.transform) + if args.verbose: + _, log = transformer(args.command_line_input) + print(log) + else: + print(transformer(args.command_line_input)) + if __name__ == "__main__": main() diff --git a/src/rulebook.py b/src/rulebook.py index aa07d26..80eaccf 100644 --- a/src/rulebook.py +++ b/src/rulebook.py @@ -61,10 +61,9 @@ class Rulebook: 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") + + log += "OVERFLOW".center(CENTER_WIDTH, "_") + '\n' + return None, log def _log_rule(self, rule) -> str: arrow = "->|" if rule.is_blocking else "->"