Фреймворк для работы с MOON в Python. MOON - это гибрид YAML и TOON. Отличительная особенность - это мультимодельность данных и неограниченная расширяемость.
Вы сами можете определять теги и типы и реализовывать для них требуемую логику.
Тег - это директива обозначающая начало определённой структуры данных,
например @object или @array. С помощью системы хуков можно
самостоятельно определять кастомные теги.
Основная идея использования - конфигурации приложений.
Установка:
pip install magicmoonИспользование:
import moon
obj = moon.load("./example.moon")
print(obj["context"])Публичный интерфейс реализован в _api.py. Импортируется не напрямую, а из moon (__init__.py).
load(file_path) - парсинг файла в object. Оба потока поддерживаются, как строка (буфер), так и файл.
dump(magicked_data, file_path) - сохранение объекта в файл.
Ядро фреймворка lib определяет внутренние механизмы. Принцип работы: Из MOON в Python object:
- Токенизация, tokenizer.py проходится по всему файлу и разбивает
его на токены. Это лексические части файла, например
word,colon,tab. - Парсинг, parser.py парсит токены в поток событий.
События это декларативное описание:
tag_start- начата структура определённого тега. - Композиция, composer.py из потока событий формирует AST (Abstract Syntax Tree).
- Сборка, constructor.py из AST собирает готовый python
dict[str, Any]. На этом же этапе все типы помеченные какScalarNodeв AST проходят определение типов. Расширить поддерживаемые типы можно черезTypeHook.
Из Python object в MOON:
- Представление в AST, representer.py преобразует python
dict[str, Any]в AST, используя обратные методы представленияTypeHook. - Сериализация, serializer.py преобразует AST в поток событий.
- Генерация, emitter.py генерирует финальный MOON текст из потока событий.
Модуль schemas хранит все определения типов:
- Набор исключений errors.py
- Модель и типы токенов, лексем на которые разбивается исходный MOON tokens.py
- Модель и типы событий, декларативных описаний происходящего в MOON events.py
- Базовые узлы AST, в том числе
TagNode- это базовая нода для каждого тега nodes.py
Основной принцип работы пайплайнов построен на:
StatefulStreamer- это абстрактный класс реализующий интерфейс для работы stream to stream (iterable to iterable)TagHook- это хук тега, в пайплайне нет никаких точных реализаций парсинга структур тего. Для каждого тега на каждом этапе вызывается соответсвующий метод хука, определённого для этого тега.
Оригинальны фреймворк поставляется с тегами:
@object- это именованные объекты, поддерживающие вложенность, синтаксис как в YAML. После тега@objectидёт название, далееkey: value
// Can be commented
@object Config
user: Alex
password: something-secret
context:
revision: 177
friends_list: danil,vladimirВ Python представлении:
magicked_data = {
"Config": {
"user": "Alex",
"password": "something-secret",
"context": {
"revision": 177
},
"friends_list": ["danil", "vladimir"]
}
}Проект инициирован, разработан и поддерживается Aleksandr @magicaleks. Распространяется на основании лицензии Apache-2.0.