Полнофункциональная библиотека для работы с YAML в экосистеме OneScript/1C. Реализует парсинг и сериализацию YAML с поддержкой основных возможностей стандарта YAML 1.2 включая вложенные структуры, якоря, многострочные литералы и Flow Style синтаксис.
- Установка
- Быстрый старт
- API
- Поддерживаемые возможности
- Статус реализации
- Тестирование
- Нагрузочные тесты
opm install oscript-yamlИли клонируйте репозиторий:
git clone https://github.com/Segate-ekb/oscript-yaml.git#Использовать oscript-yaml
Парсер = Новый ПарсерYaml();
// Простой пример парсинга
СтрокаYAML = "
| name: John Doe
| age: 30
| active: true
|";
Результат = Парсер.ПрочитатьYaml(СтрокаYAML);
Сообщить(Результат.Получить("name")); // John Doe
// Сериализация в YAML
Данные = Новый Структура;
Данные.Вставить("имя", "Иван Иванов");
Данные.Вставить("возраст", 25);
Данные.Вставить("активен", Истина);
СтрокаYAML = Парсер.ЗаписатьYaml(Данные);
Сообщить(СтрокаYAML);Парсит YAML-строку и возвращает соответствующую структуру данных.
Параметры:
СтрокаYaml(Строка) - YAML-строка для парсинга
Возвращаемое значение:
- Массив - массив документов yaml
Пример:
Парсер = Новый ПарсерYaml();
Результат = Парсер.ПрочитатьYaml("key: value");Читает YAML-файл в кодировке UTF-8 и возвращает соответствующую структуру данных.
Параметры:
ПутьКФайлу(Строка) - путь к YAML-файлу
Возвращаемое значение:
- Произвольный - распарсенная структура данных или массив документов
Пример:
Парсер = Новый ПарсерYaml();
Результат = Парсер.ПрочитатьИзФайла("config.yaml");Сериализует данные в YAML-формат.
Параметры:
Значение(Произвольный) - данные для сериализации
Возвращаемое значение:
- Строка - YAML-представление данных
Пример:
Парсер = Новый ПарсерYaml();
Данные = Новый Структура("ключ", "значение");
СтрокаYAML = Парсер.ЗаписатьYaml(Данные);
// Результат: "---\nключ: значение"Сериализует данные в YAML-формат и записывает результат в файл в кодировке UTF-8.
Параметры:
ПутьКФайлу(Строка) - путь к YAML-файлуЗначение(Произвольный) - данные для сериализации
Пример:
Парсер = Новый ПарсерYaml();
Данные = Новый Структура("ключ", "значение");
Парсер.ЗаписатьВФайл("config.yaml", Данные);- ✅ Строки (с кавычками и без)
- ✅ Числа (целые и вещественные)
- ✅ Булевы значения (
true,false) - ✅ Null значения (
null,~) - ✅ Комментарии (
#) - ✅ Множественные документы (
---и...)
- ✅ Соответствия (объекты)
- ✅ Массивы (списки)
- ✅ Вложенные структуры любой глубины
- ✅ Смешанные типы в массивах
- ✅ Массивы в квадратных скобках
[1, 2, 3] - ✅ Объекты в фигурных скобках
{key: value} - ✅ Вложенные Flow структуры
- ✅ Пустые коллекции
[],{} - ✅ Смешанный Flow и Block стили
- ✅ Literal style (
|) - сохраняет переводы строк - ✅ Folded style (
>) - объединяет строки - ✅ strip_literal: (
|-) - убирает последний перенос строки - ✅ keep_literal: (
|+) - сохраняет финальные переводы строк
- ✅ Пустые массивы в Flow style
[] - ✅ Пустые объекты в Flow style
{} - ✅ Неявные пустые значения (Block style)
- ✅ Null значения (
null,~)
- ✅ Определение якорей
&anchor - ✅ Ссылки на якоря
*anchor - ✅ Слияние объектов
<<: *anchor - ✅ Простые ссылки на скалярные значения
- ✅ Проверка синтаксиса Flow Style
- ✅ Валидация парных скобок и кавычек
- ✅ Информативные сообщения об ошибках
- Базовый парсинг YAML - ключ-значение пары, скалярные типы
- Массивы Block Style - списки с дефисами
- Вложенные структуры - многоуровневые объекты любой глубины
- Многострочные литералы -
|и>стили, chomping и indentation indicators - Flow Style - инлайн массивы
[1, 2, 3]и объекты{key: value} - Пустые коллекции -
[],{}, неявные пустые значения - Комментарии - строки с
# - Якоря и ссылки -
&anchor,*anchor,<<: *anchor - Смешанные типы - комбинации различных структур
- Сложные структуры - глубокая вложенность и композиции
- YAML сериализация - полная поддержка записи в YAML формат
- Базовое экранирование строк -
\n,\t,\r,\",\\,\/,\b,\f - Unicode поддержка -
\uXXXXи\xXXпоследовательности - Обработка ошибок - валидация синтаксиса и информативные сообщения
- Пробелы, табуляция и explicit keys - сценарии из YAML Test Suite
- YAML директивы -
%YAML, tag handles и связанные проверки - Файловые операции - чтение YAML из файла и запись YAML в файл
- Расширение удобства API
- Настройки форматирования сериализатора
- Дополнительные вспомогательные методы для документов YAML
- Улучшение парсинга очень больших файлов - контроль памяти и времени на больших YAML
- Сложные ключи - расширение пользовательских сценариев поверх explicit keys
- Производительность - точечная оптимизация при появлении измеримого узкого места
- Потоковый парсинг - обработка файлов по частям
- Плагины типов - кастомные обработчики данных
Проект включает обширный набор тестов на основе официального YAML Test Suite:
- Всего тестов: 418 обнаружено
- Пройдено: 418 тестов (100%)
- Пропущено: 0 тестов
- Покрытие: основные возможности YAML 1.2
# Все тесты
oneunit e
# Конкретная категория
oneunit e --tagsInclude flow # Flow Style тесты
oneunit e --tagsInclude anchor # Якоря и ссылки
oneunit e --tagsInclude literal # Многострочные литералы
oneunit e --tagsInclude error # Обработка ошибокДля проверки работы на больших YAML в utils есть отдельные сценарии. Они генерируют документ из 5000 элементов с вложенными массивами и соответствиями, затем проверяют десериализацию или сериализацию.
# Десериализация большого YAML (~665 КБ)
oscript -measure utils/load-deserialize.os
# Сериализация большого объекта в YAML (~665 КБ)
oscript -measure utils/load-serialize.osКонтрольный прогон на текущем окружении:
utils/load-deserialize.os: 5000 элементов, 664976 байт, 00:00:17.4475616
utils/load-serialize.os: 5000 элементов, 664976 байт, 00:00:03.1080556
Оба сценария завершаются успешно. По результатам проверки срочная оптимизация не требуется: сериализация работает быстро для текущего объема, десериализация ожидаемо дороже и остается кандидатом только для будущей точечной оптимизации при росте требований к большим файлам.
MIT License - см. файл LICENSE для подробностей.
Egor Ivanov - e.ivanov@1cdevelopers.ru