You've already forked onec_codetemplate_parser
mirror of
https://github.com/240596448/onec_codetemplate_parser.git
synced 2025-11-23 21:34:39 +02:00
pretty print
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
from .api import parse_to_src, render_from_src
|
||||
from .api import parse_to_src, render_from_src, pretty_print
|
||||
|
||||
__all__ = ["parse_to_src", "render_from_src"]
|
||||
__all__ = ["parse_to_src", "render_from_src", "pretty_print"]
|
||||
|
||||
@@ -15,3 +15,9 @@ def render_from_src(src: str, path: str):
|
||||
root = Root.from_src(src)
|
||||
text = root.compile()
|
||||
Path(path).write_text(text, encoding='utf-8-sig')
|
||||
|
||||
def pretty_print(path: str):
|
||||
"""Выводит в консоль дерево шаблона"""
|
||||
text = Path(path).read_text(encoding='utf-8-sig')
|
||||
root = parse(text)
|
||||
root.pretty_print()
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
"""Консольное приложение для вызова API библиотеки """
|
||||
|
||||
import typer
|
||||
from pathlib import Path
|
||||
from .api import parse_to_src, render_from_src
|
||||
import typer
|
||||
from .api import parse_to_src, render_from_src, pretty_print
|
||||
|
||||
app = typer.Typer(
|
||||
help="Парсер шаблонов кода 1С.\n\n"
|
||||
"Позволяет разбирать шаблоны *.st в исходники src и обратно.")
|
||||
|
||||
def validate_file_enable(value: str):
|
||||
"""Проверка существования и размера файла"""
|
||||
path = Path(value)
|
||||
if not path.is_file():
|
||||
raise typer.BadParameter(f"Файл отсутствует '{value}'")
|
||||
@@ -17,6 +18,7 @@ def validate_file_enable(value: str):
|
||||
return path
|
||||
|
||||
def validate_empty_dir(value: str):
|
||||
"""Проверка существования и пустоты папки"""
|
||||
path = Path(value)
|
||||
if not path.is_dir() or not any(path.iterdir()):
|
||||
raise typer.BadParameter(f"Папка '{value}' не существует или пуста.")
|
||||
@@ -24,7 +26,7 @@ def validate_empty_dir(value: str):
|
||||
|
||||
@app.command(help="Разобрать шаблон из 1С-файла *.st в исходники src")
|
||||
def parse(
|
||||
path: str = typer.Argument(...,
|
||||
path: str = typer.Argument(...,
|
||||
callback=validate_file_enable,
|
||||
help="Путь к исходному 1С-файлу шаблона *.st", ),
|
||||
src: str = typer.Argument('./src', help="Папка, в которую будут сохранены исходники src")
|
||||
@@ -54,5 +56,20 @@ def render(
|
||||
typer.echo(f"Шаблон собран из папки {src} в файл {path}")
|
||||
|
||||
|
||||
@app.command(help="Показать структуру файла *.st")
|
||||
def pretty(
|
||||
path: str = typer.Argument(...,
|
||||
callback=validate_file_enable,
|
||||
help="Путь к исходному 1С-файлу шаблона *.st", )
|
||||
):
|
||||
"""
|
||||
Визуализация структуры 1С-шаблон (*.st) в виде дерева.
|
||||
|
||||
Пример:
|
||||
onec_codetemplate_parser pretty my_template.st
|
||||
"""
|
||||
pretty_print(path)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app()
|
||||
|
||||
@@ -45,3 +45,12 @@ class Test_CLI:
|
||||
result = runner.invoke(app, ["render", str(temp_output_st), str(temp_src)], catch_exceptions=False)
|
||||
assert result.exit_code == 0, result.stdout + result.stderr
|
||||
assert test_file_path.read_text(encoding='utf-8-sig') == temp_output_st.read_text(encoding='utf-8-sig'), 'Собранный файл не совпадает с исходным'
|
||||
|
||||
def test_pretty_print_command(self, test_file_path):
|
||||
"""Тест выполнения команды парсинга"""
|
||||
result = runner.invoke(app, ["pretty", str(test_file_path)])
|
||||
assert result.exit_code == 0, result.stdout + result.stderr
|
||||
if test_file_path.name == '00-empty.st_':
|
||||
assert len(result.stdout.splitlines()) == 1, result.stdout + result.stderr
|
||||
else:
|
||||
assert len(result.stdout.splitlines()) > 1, result.stdout + result.stderr
|
||||
|
||||
Reference in New Issue
Block a user