LINUX.ORG.RU

«Тупой» python шаблонизатор

 ,


1

1

Доброго времени суток.

Сразу к делу. Есть пара десятков конфигурационных файлов в xml формате. Есть пара «properties» файлов (java-style). Как в темплейтах конфигов, так и в properties-файлах, плейсхолдеры и ключи встречются с разедлителями в виде точек.

Пример конфига:

<?xml version="1.0" encoding="UTF=8" standalone="yes"?>
<common-conf>
    <primary_db>${db.url.primary}</primary_db>
    <some_soap_stuff>
        <swifts>${url.ws.swiftinfo}</swifts>
        <customer_info>${url.ws.customerinfo}</customer_info>
    </some_soap_stuff>
    <!-- and so on -->
</common-conf>

Есть, назовем его, common.properties файл:

db.url.primary=jdbc:oracle:thin@blah:1521/BLAH
url.ws.swiftinfo=http://endless.soap.sheet
url.ws.customerinfo=http://endless.soap.shit

Любой шаблонизатор считает себя достаточно умным, поэтому, когда он видит в placeholder'е точку, он ждет от меня dict или объект.

Ткинте пальцем в тупой шаблонизатор, который будет впиливать значения по ключам as is, или у которого этот режим опционален.

P.S.: Эту простыню ссылок на шаблонизаторы я видел, а данный тред - выбора пост.

P.P.S.: текущая имплементация шаблонов пилилась ещё в бородатые времена и, судя по всему, по той же причине, сначала темплейты преобразуются в ровно такие же, но точки заменяются на underscores, затем шаблоны обрабтываются. Никто также не догадался пропустить шаг и сразу склепать ключи и шаблоны без точек, но с underscore'ами. А у меня тут так, просто любопытство. Наверняка же есть где-то моя хотелка, воплощенная в код.

Заранее благодарен.

str.format() с некоторыми костылями.

import yaml
from collections import namedtuple

def to_struct(name, data):
    if isinstance(data, dict):
        T = namedtuple(name, data.keys())
        return T(*[to_struct(k.title(), v) for k, v in data.items()])
    elif isinstance(data, list):
        return [to_struct('YAMLList', x) for x in data]
    return data

...

with open(filename, "r") as f:
    data = yaml.load(f)
try:
    data = to_struct('CVTemplate', data)
    with open(dest_filename, "w") as f:
        f.write(template.format(**(data.__dict__)))
except KeyError as e:
    print("{0}: missing {1} group".format(filename, e))
    return 1
except AttributeError as e:
    print("{0}: {1}".format(filename, e))
    return 1
E ★★★
()
Последнее исправление: E (всего исправлений: 2)
Ответ на: комментарий от E

Наверное, нужно немного пояснений, всё-таки.

str.format() имеет встроенный язык шаблонов, простенький, но питоньи структуры db.url.primary и даже списки распознаёт.

Коды выше загружает структуру в словарь из YAML-файла (мне так удобнее, может работать и с JSON, формат с точками тоже легко преобразовать в пару строк.

Дальше словарь преобразуется в питоний объект (ключи становятся атрибутами, чтобы format() распознал). Это делает to_struct().

Само применение шаблона - разыменование полученной структуры и подстановка как есть в format().

E ★★★
()

Ты хочешь вот это написать?

lambda s, k, v: s.replace("${%s}"%k, v)

Распарсить файл common.properties, думаю, не составит труда.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.