commit c3b831d519c4ebcb59ce4926aac1235524a835e7 Author: Artur Mukhamadiev Date: Fri Jul 10 16:09:06 2026 +0300 [init][minimal] Base init commit for tree-sitter seminar :Release Notes: - Minimal example with dumping of dot graph on provided file - cpp/python files parsing :Detailed Notes: - :Testing Performed: - direct launch, no unit-tests :QA Notes: - it's okay :Issues Addressed: - diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9593653 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.venv/ +*/*/__pycache__/ +*/__pycache__/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..6323b33 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Tree sitter Seminar + +## Prerequisites + +```bash +$ python3 -m venv .venv +$ source .venv/bin/activate +$ pip install -r requirements.txt +``` + +## Launch + +```bash +$ source .venv/bin/activate +$ python3 src/ts-example +``` diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ca74039 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "ts-example" +version = "0.0.1" +description = "Tree Sitter Usage Example" +requires-python = ">=3.11" +dependencies = [ + "tree-sitter>=0.26.0", + "tree-sitter-cpp==0.23.4", + "tree-sitter-python==0.25.0", +] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..703674a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +tree-sitter==0.26.0 +tree-sitter-cpp==0.23.4 +tree-sitter-python==0.25.0 diff --git a/src/ts-example/__init__.py b/src/ts-example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ts-example/__main__.py b/src/ts-example/__main__.py new file mode 100644 index 0000000..57842f3 --- /dev/null +++ b/src/ts-example/__main__.py @@ -0,0 +1,43 @@ +import logging + +import ts_minimal as tsmin +from arg_conf import parser, setup_parser +from log_conf import logger, logger_setup + + +def parse_severity(severity: str): + if severity == "DEBUG": + return logging.DEBUG + elif severity == "INFO": + return logging.INFO + elif severity == "ERROR": + return logging.ERROR + else: + raise Exception(f"Unknown Severity level {severity}") + + +def main_arguments(): + setup_parser("Tree Sitter Usage Python Examples startup arguments") + global parser + parser.add_argument( + "-l", "--log-file", help="File in which log messages will go", default="ts.log" + ) + parser.add_argument("-s", "--severity", help="Log severity level", default="DEBUG") + tsmin.arguments() + + args = parser.parse_args() + return args + + +def main(): + global logger + args = main_arguments() + logger_setup("Seminar-Test", parse_severity(args.severity)) + logger.info("Hi!") + + tsmin.simple_file() + pass + + +if __name__ == "__main__": + main() diff --git a/src/ts-example/arg_conf.py b/src/ts-example/arg_conf.py new file mode 100644 index 0000000..841b492 --- /dev/null +++ b/src/ts-example/arg_conf.py @@ -0,0 +1,7 @@ +import argparse + +parser = argparse.ArgumentParser() + + +def setup_parser(desc: str): + parser.description = desc diff --git a/src/ts-example/log_conf.py b/src/ts-example/log_conf.py new file mode 100644 index 0000000..009bc6e --- /dev/null +++ b/src/ts-example/log_conf.py @@ -0,0 +1,24 @@ +import logging + +logger = logging.getLogger("Seminar-Test") + + +def logger_setup(app_name: str, logging_level) -> logging.Logger: + logger.name = app_name + logger.handlers.clear() + logger.setLevel(logging_level) + # # create file handler which logs even debug messages + # fh = logging.FileHandler("spam.log") + # fh.setLevel(logging_level) + # create console handler with a higher log level + ch = logging.StreamHandler() + ch.setLevel(logging_level) + # create formatter and add it to the handlers + formatter = logging.Formatter("[%(asctime)s] [%(name)s:%(levelname)s] %(message)s") + # fh.setFormatter(formatter) + ch.setFormatter(formatter) + # add the handlers to the logger + # logger.addHandler(fh) + logger.addHandler(ch) + + return logger diff --git a/src/ts-example/ts_minimal.py b/src/ts-example/ts_minimal.py new file mode 100644 index 0000000..f0a6bf8 --- /dev/null +++ b/src/ts-example/ts_minimal.py @@ -0,0 +1,35 @@ +import logging +from sys import stdout +from arg_conf import parser as arg_parser +from log_conf import logger +import tree_sitter_python as tspython +import tree_sitter_cpp as tscpp +from tree_sitter import Language, Parser + +PY_LANGUAGE = Language(tspython.language()) +CPP_LANGUAGE = Language(tscpp.language()) + +def arguments(): + global arg_parser + arg_parser.add_argument("--language", help="Setup parsing language", default="Python") + arg_parser.add_argument("--file", "-f", help="File to parse", required=True) + logger.debug("Added Tree Sitter Minimal Example Arguments to the list") + +def simple_file(): + global arg_parser + args = arg_parser.parse_args() + parser: Parser + if args.language == 'Python': + parser = Parser(PY_LANGUAGE) + elif args.language == 'C++': + parser = Parser(CPP_LANGUAGE) + else: + parser = Parser(PY_LANGUAGE) + args.language = 'Python' + + logger.info(f"Parser is installed to {args.language}") + + with open(args.file, 'rb') as file: + source_code = file.read() + tree = parser.parse(source_code) + tree.print_dot_graph(stdout)