YAML


Начало работы

Введение

YAML - это язык сериализации данных, предназначенный для непосредственной записи и чтения человеком.

  • YAML не допускает использования табуляций
  • Между частями элемента должен быть пробел
  • YAML чувствителен к CASE
  • Завершайте YAML-файл расширением .yaml или .yml.
  • YAML является надмножеством JSON
  • Плейбуки Ansible представляют собой YAML-файлы {.marker-round}

Скалярные типы

``yaml n1: 1 # целое число n2: 1.234 # float

s1: ‘abc’ # строка s2: “abc” # строка s3: abc # строка

b: false # тип boolean

d: 2015-04-05 # тип даты

#### ↓ Эквивалентный JSON
``json
{
  "n1": 1,
  "n2": 1.234,
  "s1": "abc",
  "s2": "abc",
  "s3": "abc",
  "b": false,
  "d": "2015-04-05"
}

Используйте пробелы для отступа. Между частями элемента должен быть пробел.

Переменные

``yaml some_thing: &VAR_NAME foobar other_thing: *VAR_NAME

#### ↓ Эквивалентный JSON
``json
{
  "some_thing": "foobar",
  "other_thing": "foobar"
}

Комментарии

``yaml

Пример однострочного комментария

пример комментария на уровне блока

комментарий строки 1

комментарий строки 2

комментарий строки 3




### Многострочные строки
```yaml
описание: |
  hello
  мир

↓ Эквивалентный JSON

``json {“description”: “hello\nworld\n”}




### Наследование {.row-span-2}
``yaml
родитель: &defaults
  a: 2
  b: 3

дочерний:
  <<: *дефолты
  b: 4

↓ Эквивалентный JSON

``json { “parent”: { “a”: 2, “b”: 3 }, “child”: { “a”: 2, “b”: 4 } }




### Ссылка {.row-span-2}
``yaml
значения: &ref
  - Будет
  - повторно использоваться ниже
  
other_values:
  i_am_ref: *ref

↓ Эквивалентный JSON

``json { “values”: [ “Будет”, “повторно использован ниже” ], “other_values”: { “i_am_ref”: [ “Будет”, [ “Повторное использование ниже” ] } }



### Свернутые строки
``yaml
описание: >
  привет
  мир

↓ Эквивалентный JSON

``json {“description”: “hello world\n”}




### Два документа
```yaml
---
документ: это документ 1
---
документ: это документ 2

В YAML используется --- для отделения директив от содержимого документа.

Коллекции YAML

Последовательность

``yaml

  • Марк Макгвайр
  • Сэмми Соса
  • Кен Гриффи
#### ↓ Эквивалентный JSON
``json
[
  "Марк Макгвайр",
  "Сэмми Соса",
  "Кен Гриффи"
]

Сопоставление

``yaml hr: 65 # Хоумраны avg: 0.278 # Batting average rbi: 147 # Runs Batted In

#### ↓ Эквивалентный JSON
``json
{
  "hr": 65,
  "avg": 0.278,
  "rbi": 147
}

Отображение на последовательности

``yaml атрибуты:

  • a1
  • a2 методы: [getter, setter]
#### ↓ Эквивалентный JSON
``json
{
  "attributes": ["a1", "a2"],
  "methods": ["getter", "setter"]
}

Последовательность отображений

``yaml дети:

  • имя: Джимми Смит возраст: 15
  • имя: Джимми Смит возраст: 15
  • имя: Сэмми Соса возраст: 12
#### ↓ Эквивалентный JSON
``json
{
  "children": [
    { "name": "Джимми Смит", "возраст": 15},
    { "name": "Jimmy Smith", "age": 15},
    {"name": "Сэмми Соса", "возраст": 12}
  ]
}

Последовательность последовательностей

my_sequences:
  - [1, 2, 3]
  - [4, 5, 6]
  -
    - 7
    - 8
    - 9
    - 0

↓ Эквивалентный JSON

``json { “my_sequences”: [ [1, 2, 3], [4, 5, 6], [7, 8, 9, 0] ] }



### Отображение отображений
``yaml
Марк Макгвайр: {hr: 65, avg: 0.278}
Сэмми Соса: {
    hr: 63,
    avg: 0.288
  }

↓ Эквивалентный JSON

``json { “Mark McGwire”: { “hr”: 65, “avg”: 0.278 }, “Сэмми Соса”: { “hr”: 63, “avg”: 0.288 } }




### Вложенные коллекции
``yaml
Джек:
  id: 1
  имя: Franc
  зарплата: 25000
  хобби:
    - a
    - b
  местоположение: {country: "A", город: "A-A"}

↓ Эквивалентный JSON

``json { “Jack”: { “id”: 1, “name”: “Franc”, “salary”: 25000, “hobby”: [“a”, “b”], “location”: { “страна”: “A”, “city”: “A-A” } } }



### Неупорядоченные множества
``yaml
set1: !!! set
  ? one
  ? два
set2: !!!set {"один", "два"}

↓ Эквивалентный JSON

``json { “set1”: {“1”: null, “2”: null}, “set2”: { “1”: null, “2”: null} }

Наборы представляются в виде отображения, в котором каждый ключ связан с нулевым значением


### Упорядоченные отображения
``yaml
упорядоченное: !!!omap
- Марк Макгвайр: 65
- Сэмми Соса: 63
- Кен Гриффи: 58

↓ Эквивалентный JSON

``json { “ordered”: [ { “Марк Макгвайр”: 65}, { “Сэмми Соса”: 63}, {“Кен Гриффи”: 58} ] }







Справочник по YAML
--------------

### Термины

- Последовательности, они же массивы или списки
- Скаляры, они же строки или числа
- Отображения, они же хэши или словари
{.marker-round}

Основано на YAML.org [refcard](https://yaml.org/refcard.html).


### Индикаторы документа

| | |
|-------|---------------------|
| `%` | Индикатор директивы |
| `---` | Заголовок документа |
| `...` | Терминатор документа |



### Индикаторы коллекции {.row-span-2}

| | |
|------|---------------------------------|
| `?` | Ключевой индикатор |
| `:` | Индикатор значения |
| | `-` | Индикатор вложенных записей серии |
| | `,` | Разделять входы линейной ветви |
| `[]` | Окружать ветвь серии |
| `{}` | Окружать ветвь с ключом |


### Индикаторы псевдонимов

| | |
|-----|-----------------|
| `&` | Свойство якоря |
| `*` | Псевдонимный индикатор |


### Специальные ключи

| | |
|------|---------------------------------|
| | `=` | Ключ отображения "значение" по умолчанию |
| `<<` | Объединить ключи из другого отображения |


### Скалярные индикаторы

| | |
|-------|----------------------------------------------------------------------------------------------|
| ```` | Обвести скаляр в строке без раскрытия |
| ```` | Обвести в строке экранированный скаляр |
| | `|` | Индикатор блочного скаляра |
| `>` | Индикатор свернутого скаляра |
| | `-` | Убрать модификатор chomp (`|-` или `>-`)|
| `+` | Оставить модификатор chomp (`|+` или `>+`)|
| `1-9` | Модификатор явного отступа (`|1` или `>2`). <br/> Модификаторы могут комбинироваться (`|2-`, `>+1`)|


### Свойство тега (обычно не указывается) {.col-span-2}
| | |
|----------|-------------------------------------------------------------|
| `none` | Неопределенный тег (автоматически разрешается приложением)|
| `!` | Неспецифический тег (по умолчанию `!!map`/`!!seq`/`!!str`) |
| | `!foo` | Первичный (по условию, означает локальный тег `!foo`)| |
| | `!!foo` | Вторичный (по условию, означает `tag:yaml.org,2002:foo`)|
| | `!h!foo` | Требуется `%TAG !h! <prefix>` (и тогда означает `<prefix>foo`)|
| `!<foo>` | Дословный тег (всегда означает `foo`) |

### Misc-индикаторы

| | |
|-----|-----------------------------|
| `#` | Индикатор отбрасываемого комментария |
| <code>\`@</code> | Оба варианта зарезервированы для будущего использования |


### Основные типы (автоматические теги по умолчанию) {.row-span-2}

| | |
|---------|------------------------------------------|
| `!!map` | `{Хеш-таблица, словарь, отображение}` |
| `!!seq` | `{Список, массив, кортеж, вектор, последовательность}` |
| `!!str` | Строка Юникода |



### Escape Codes {.row-span-3}

#### Числовые

- `\x12` (8-бит)
- `\u1234` (16-бит)
- `\U00102030` (32-бит)
  {.cols-2 .marker-none}

#### Protective

- `\\` (\\)
- `\"` (")
- `\ ` ( )
- `\<TAB>` (TAB)
  {.cols-3 .marker-none}

#### C
- `\0` (NUL)
- `\a` (BEL)
- `\b` (BS)
- `\f` (FF)
- `\n` (LF)
- `\r` (CR)
- `\t` (TAB)
- `\v` (VTAB)
  {.cols-3 .marker-none}

#### Дополнительно

- `\e` (ESC)
- `\_` (NBSP)
- `\N` (NEL)
- `\L` (LS)
- `\P` (PS)
  {.cols-3 .marker-none}
  
### Другие типы

| | |
|----------|-----------------------------|
| `!!set` | `{вишни, сливы, яблоки}` |
| `!!omap` | `[one: 1, two: 2]` |



### Языковые независимые скалярные типы {.col-span-2}

| | |
|---------------------------|--------------------------------------------|
| `{~, null}` | Null (нет значения).                           |
| | `[1234, 0x4D2, 02333]` | [Decimal int, Hexadecimal int, Octal int] |
| | `[1_230.15, 12.3015e+02]` | [Fixed float, Exponential float] |
| `[.inf, -.Inf, .NAN]` | [Бесконечность (float), Отрицательное число, Не число] |
| `{Y, true, Yes, ON}` | Булево true |
| `{n, FALSE, No, Off}` | Булево ложно |



Также см.
--------
- [YAML Reference Card](https://yaml.org/refcard.html) _(yaml.org)_
- [Learn X in Y minutes](https://learnxinyminutes.com/docs/yaml/) _(learnxinyminutes.com)_
- [YAML lint online](http://www.yamllint.com/) _(yamllint.com)_