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)
|
root = Root.from_src(src)
|
||||||
text = root.compile()
|
text = root.compile()
|
||||||
Path(path).write_text(text, encoding='utf-8-sig')
|
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 библиотеки """
|
"""Консольное приложение для вызова API библиотеки """
|
||||||
|
|
||||||
import typer
|
|
||||||
from pathlib import Path
|
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(
|
app = typer.Typer(
|
||||||
help="Парсер шаблонов кода 1С.\n\n"
|
help="Парсер шаблонов кода 1С.\n\n"
|
||||||
"Позволяет разбирать шаблоны *.st в исходники src и обратно.")
|
"Позволяет разбирать шаблоны *.st в исходники src и обратно.")
|
||||||
|
|
||||||
def validate_file_enable(value: str):
|
def validate_file_enable(value: str):
|
||||||
|
"""Проверка существования и размера файла"""
|
||||||
path = Path(value)
|
path = Path(value)
|
||||||
if not path.is_file():
|
if not path.is_file():
|
||||||
raise typer.BadParameter(f"Файл отсутствует '{value}'")
|
raise typer.BadParameter(f"Файл отсутствует '{value}'")
|
||||||
@@ -17,6 +18,7 @@ def validate_file_enable(value: str):
|
|||||||
return path
|
return path
|
||||||
|
|
||||||
def validate_empty_dir(value: str):
|
def validate_empty_dir(value: str):
|
||||||
|
"""Проверка существования и пустоты папки"""
|
||||||
path = Path(value)
|
path = Path(value)
|
||||||
if not path.is_dir() or not any(path.iterdir()):
|
if not path.is_dir() or not any(path.iterdir()):
|
||||||
raise typer.BadParameter(f"Папка '{value}' не существует или пуста.")
|
raise typer.BadParameter(f"Папка '{value}' не существует или пуста.")
|
||||||
@@ -24,7 +26,7 @@ def validate_empty_dir(value: str):
|
|||||||
|
|
||||||
@app.command(help="Разобрать шаблон из 1С-файла *.st в исходники src")
|
@app.command(help="Разобрать шаблон из 1С-файла *.st в исходники src")
|
||||||
def parse(
|
def parse(
|
||||||
path: str = typer.Argument(...,
|
path: str = typer.Argument(...,
|
||||||
callback=validate_file_enable,
|
callback=validate_file_enable,
|
||||||
help="Путь к исходному 1С-файлу шаблона *.st", ),
|
help="Путь к исходному 1С-файлу шаблона *.st", ),
|
||||||
src: str = typer.Argument('./src', help="Папка, в которую будут сохранены исходники src")
|
src: str = typer.Argument('./src', help="Папка, в которую будут сохранены исходники src")
|
||||||
@@ -54,5 +56,20 @@ def render(
|
|||||||
typer.echo(f"Шаблон собран из папки {src} в файл {path}")
|
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__":
|
if __name__ == "__main__":
|
||||||
app()
|
app()
|
||||||
|
|||||||
@@ -45,3 +45,12 @@ class Test_CLI:
|
|||||||
result = runner.invoke(app, ["render", str(temp_output_st), str(temp_src)], catch_exceptions=False)
|
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 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'), 'Собранный файл не совпадает с исходным'
|
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