Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 75 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Полнофункциональная библиотека для работы с YAML в экосистеме OneScript/1C. Реализует парсинг и сериализацию YAML с поддержкой основных возможностей стандарта YAML 1.2 включая вложенные структуры, якоря, многострочные литералы и Flow Style синтаксис.

[![GitHub release](https://img.shields.io/github/v/release/Segate-ekb/oscript-yaml)](https://github.com/Segate-ekb/oscript-yaml/releases)
[![Tests](https://img.shields.io/badge/tests-354%20passed-green)](https://github.com/Segate-ekb/oscript-yaml)
[![Tests](https://img.shields.io/badge/tests-418%20passed-green)](https://github.com/Segate-ekb/oscript-yaml)
[![OneScript](https://img.shields.io/badge/OneScript-2.0.0--rc.7+-blue)](https://oscript.io/)

## 📋 Оглавление
Expand All @@ -14,6 +14,7 @@
- [Поддерживаемые возможности](#поддерживаемые-возможности)
- [Статус реализации](#статус-реализации)
- [Тестирование](#тестирование)
- [Нагрузочные тесты](#нагрузочные-тесты)

## 🚀 Установка

Expand Down Expand Up @@ -73,6 +74,22 @@ git clone https://github.com/Segate-ekb/oscript-yaml.git
Результат = Парсер.ПрочитатьYaml("key: value");
```

#### ПрочитатьИзФайла(ПутьКФайлу)

Читает YAML-файл в кодировке UTF-8 и возвращает соответствующую структуру данных.

**Параметры:**
- `ПутьКФайлу` (Строка) - путь к YAML-файлу

**Возвращаемое значение:**
- Произвольный - распарсенная структура данных или массив документов

**Пример:**
```bsl
Парсер = Новый ПарсерYaml();
Результат = Парсер.ПрочитатьИзФайла("config.yaml");
```

#### ЗаписатьYaml(Значение)

Сериализует данные в YAML-формат.
Expand All @@ -91,6 +108,21 @@ git clone https://github.com/Segate-ekb/oscript-yaml.git
// Результат: "---\nключ: значение"
```

#### ЗаписатьВФайл(ПутьКФайлу, Значение)

Сериализует данные в YAML-формат и записывает результат в файл в кодировке UTF-8.

**Параметры:**
- `ПутьКФайлу` (Строка) - путь к YAML-файлу
- `Значение` (Произвольный) - данные для сериализации

**Пример:**
```bsl
Парсер = Новый ПарсерYaml();
Данные = Новый Структура("ключ", "значение");
Парсер.ЗаписатьВФайл("config.yaml", Данные);
```

## ✅ Поддерживаемые возможности

### Базовые типы данных
Expand Down Expand Up @@ -152,70 +184,44 @@ git clone https://github.com/Segate-ekb/oscript-yaml.git
1. **Базовый парсинг YAML** - ключ-значение пары, скалярные типы
2. **Массивы Block Style** - списки с дефисами
3. **Вложенные структуры** - многоуровневые объекты любой глубины
4. **Многострочные литералы** - `|` и `>` стили с базовыми модификаторами (28/39 тестов)
5. **Flow Style** - инлайн массивы `[1, 2, 3]` и объекты `{key: value}` (74/79 тестов)
4. **Многострочные литералы** - `|` и `>` стили, chomping и indentation indicators
5. **Flow Style** - инлайн массивы `[1, 2, 3]` и объекты `{key: value}`
6. **Пустые коллекции** - `[]`, `{}`, неявные пустые значения
7. **Комментарии** - строки с `#`
8. **Якоря и ссылки** - `&anchor`, `*anchor`, `<<: *anchor` (22/25 тестов)
8. **Якоря и ссылки** - `&anchor`, `*anchor`, `<<: *anchor`
9. **Смешанные типы** - комбинации различных структур
10. **Сложные структуры** - глубокая вложенность и композиции
11. **YAML сериализация** - полная поддержка записи в YAML формат
12. **Базовое экранирование строк** - `\n`, `\t`, `\r`, `\"`, `\\`, `\/`, `\b`, `\f` (42/45 тестов)
12. **Базовое экранирование строк** - `\n`, `\t`, `\r`, `\"`, `\\`, `\/`, `\b`, `\f`
13. **Unicode поддержка** - `\uXXXX` и `\xXX` последовательности
14. **Обработка ошибок** - валидация синтаксиса и информативные сообщения (58/74 тестов)

### 🔧 Частично реализовано

1. **Обработка пробелов и табуляции** - базовая поддержка (75/92 тестов)
- ✅ Основные случаи отступов
- 🚧 Сложные случаи с табуляцией в различных контекстах
- 🚧 Trailing spaces в некоторых сценариях

2. **Свернутые блоки (folded style)** - частичная поддержка (20/29 тестов)
- ✅ Базовое складывание строк с `>`
- 🚧 Сложные случаи с модификаторами и отступами
- ✅ Корректная обработка финальных переносов строк

3. **YAML директивы** - базовая поддержка (19/25 тестов)
- ✅ Обработка `%YAML 1.2`
- 🚧 Валидация версий и дублированных директив
- 🚧 Обработка ошибок в директивах
14. **Обработка ошибок** - валидация синтаксиса и информативные сообщения
15. **Пробелы, табуляция и explicit keys** - сценарии из YAML Test Suite
16. **YAML директивы** - `%YAML`, tag handles и связанные проверки
17. **Файловые операции** - чтение YAML из файла и запись YAML в файл

### 🔄 В разработке / Планируется

1. **Чтение из файлов** - метод `ПрочитатьИзФайла(ПутьКФайлу)`
```bsl
Парсер = Новый ПарсерYaml();
Результат = Парсер.ПрочитатьИзФайла("config.yaml");
```

2. **Улучшение обработки пробелов и табуляции**
- Корректная обработка табуляции в отступах
- Валидация смешения пробелов и табов
- Trailing spaces в потоках

3. **Завершение якорей и алиасов**
- Edge cases с алиасами в последовательностях
- Сложные сценарии merge
1. **Расширение удобства API**
- Настройки форматирования сериализатора
- Дополнительные вспомогательные методы для документов YAML

### 📋 Планы развития

- **Файловые операции** - `ПрочитатьИзФайла()`, `ЗаписатьВФайл()`
- **Улучшение парсинга пробелов** - завершение поддержки табуляции и trailing spaces
- **Сложные ключи** - поддержка explicit keys
- **Улучшение парсинга очень больших файлов** - контроль памяти и времени на больших YAML
- **Сложные ключи** - расширение пользовательских сценариев поверх explicit keys

#### Долгосрочные планы
- **Производительность** - оптимизация для больших файлов
- **Производительность** - точечная оптимизация при появлении измеримого узкого места
- **Потоковый парсинг** - обработка файлов по частям
- **Плагины типов** - кастомные обработчики данных

## 🧪 Тестирование

Проект включает обширный набор тестов на основе официального YAML Test Suite:

- **Всего тестов:** 402 обнаружено
- **Пройдено:** 355 теста (88.1%)
- **Пропущено:** 47 тестов (для функций в разработке)
- **Всего тестов:** 418 обнаружено
- **Пройдено:** 418 тестов (100%)
- **Пропущено:** 0 тестов
- **Покрытие:** основные возможности YAML 1.2

### Запуск тестов
Expand All @@ -225,12 +231,33 @@ git clone https://github.com/Segate-ekb/oscript-yaml.git
oneunit e

# Конкретная категория
oneunit e --tagsInclude flow # Flow Style тесты (74/79 пройдено)
oneunit e --tagsInclude anchor # Якоря и ссылки (22/25 пройдено)
oneunit e --tagsInclude literal # Многострочные литералы (28/39 пройдено)
oneunit e --tagsInclude error # Обработка ошибок (58/74 пройдено)
oneunit e --tagsInclude flow # Flow Style тесты
oneunit e --tagsInclude anchor # Якоря и ссылки
oneunit e --tagsInclude literal # Многострочные литералы
oneunit e --tagsInclude error # Обработка ошибок
```

## Нагрузочные тесты

Для проверки работы на больших YAML в `utils` есть отдельные сценарии. Они генерируют документ из 5000 элементов с вложенными массивами и соответствиями, затем проверяют десериализацию или сериализацию.

```bash
# Десериализация большого YAML (~665 КБ)
oscript -measure utils/load-deserialize.os

# Сериализация большого объекта в YAML (~665 КБ)
oscript -measure utils/load-serialize.os
```

Контрольный прогон на текущем окружении:

```text
utils/load-deserialize.os: 5000 элементов, 664976 байт, 00:00:17.4475616
utils/load-serialize.os: 5000 элементов, 664976 байт, 00:00:03.1080556
```

Оба сценария завершаются успешно. По результатам проверки срочная оптимизация не требуется: сериализация работает быстро для текущего объема, десериализация ожидаемо дороже и остается кандидатом только для будущей точечной оптимизации при росте требований к большим файлам.

## 📄 Лицензия

MIT License - см. файл LICENSE для подробностей.
Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
.Автор("Egor Ivanov")
.АдресАвтора("e.ivanov@1cdevelopers.ru")
.Описание("Реализация Yaml")
.ВерсияСреды("2.0.0-rc.7")
.ВерсияСреды("2.0.0")
.ВключитьФайл("src")
.ВключитьФайл("tests")
.ОпределяетКласс("ПарсерYaml", "src/Классы/ПарсерYaml.os")
Expand Down
Loading
Loading