Первый датасет
Тестовые данные нужны постоянно — наполнить базу для демо, прогнать нагрузочный тест, проверить экспорт в CSV, показать таблицу заказчику. Писать их руками долго, а получаются они однобокими и неслучайными. Готовые fake-генераторы выдают отдельные значения, но собрать из них связный набор — чтобы имя совпадало с полом, а город со страной — это и есть самое трудное.
TDC переворачивает задачу: вы описываете, из чего состоит строка, а движок
собирает сколько угодно правдоподобных и воспроизводимых строк. Один и тот
же seed всегда даёт один и тот же результат — именно это и нужно как для тестов,
так и для примеров в документации. Формат вывода — обычный текст, CSV, JSON, SQL —
задаёте вы сами через шаблон строки.
Эта страница — трёхминутное «Hello, TDC». Вы напишете небольшой конфиг, запустите его и увидите воспроизводимый вывод, а затем сделаете ещё один шаг к главной возможности TDC — зависимым полям.
Шаг 1 — Пишем самый простой конфиг
Создайте файл demo.tdc:
<tdc>
<env count="3" seed="demo">
<sequence name="Name">
<gen type="text" value="Анна,Борис,Клара,Дмитрий,Елена"/>
</sequence>
<sequence name="Age">
<gen type="number" value="18..65"/>
</sequence>
</env>
<block>
<line><data>${{Name}}, возраст ${{Age}}</data></line>
</block>
</tdc>
Что делает каждая часть:
<env>сcount="3"— сгенерировать 3 строки;seedфиксирует случайность, чтобы результат повторялся от запуска к запуску.<sequence>— столбец данных; внутренний<gen>говорит, откуда брать значения (здесь — случайное имя из списка).type="text"— выбрать одно значение из списка через запятую.type="number"сvalue="18..65"— случайное число из диапазона.<block>/<line>/<data>— шаблон одной строки вывода;${{Name}}подставляет значение этого столбца.
Шаг 2 — Запускаем
Самый быстрый способ, из корня репозитория:
./run demo.tdc # прогнать любой свой файл
Под капотом это CLI движка. Полная форма:
node typescript/dist/cli/main.js demo.tdc
После публикации пакета его можно будет запускать откуда угодно:
npm install -D tdcv2
npx tdcv2 demo.tdc
Если движок ещё не собран (нет папки typescript/dist), соберите его один раз.
Всё это описано в разделе Установка.
Шаг 3 — Смотрим результат
Поскольку seed="demo" фиксирует случайность, вывод одинаков при каждом запуске:
Елена, возраст 59 Дмитрий, возраст 18 Клара, возраст 53
Конкретные имена и числа здесь приведены для иллюстрации — от версии ядра к версии они могут меняться. Суть в том, что один и тот же сид всегда воспроизводит один и тот же вывод для заданного ядра.
Переопределение count и seed из командной строки
Количество строк и сид можно поменять, не трогая сам файл. Это удобно, когда конфиг зафиксирован (например, лежит в репозитории), но для разового запуска нужен другой объём или другой случайный набор:
./run demo.tdc --count 5 --seed alt
Анна, возраст 20 Борис, возраст 48 Клара, возраст 65 Елена, возраст 22 Дмитрий, возраст 22
Новый сид даёт другой, но по-прежнему воспроизводимый набор: перезапустите с
--seed alt — и получите ровно те же пять строк снова. Полный список флагов — в
справочнике CLI.
Шаг дальше — зависимые поля
Главная возможность TDC в том, что поля могут зависеть друг от друга. Здесь имя
берётся из мужского или женского списка в зависимости от пола (атрибут parent), а
${{_count}} — это номер строки:
<tdc>
<env count="5" seed="demo" local="ru">
<sequence name="Gender">
<gen type="text" value="Мужчина,Женщина" percent="50,50"/>
</sequence>
<sequence name="MaleName" parent="Gender.Мужчина">
<gen type="template" value="person.male.firstName"/>
</sequence>
<sequence name="FemaleName" parent="Gender.Женщина">
<gen type="template" value="person.female.firstName"/>
</sequence>
<sequence name="Age">
<gen type="number" value="18..80"/>
</sequence>
</env>
<block>
<line><data>${{_count}}. ${{Gender}} — ${{MaleName}}${{FemaleName}}, возраст ${{Age}}</data></line>
</block>
</tdc>
1. Мужчина — Сергей, возраст 72 2. Мужчина — Александр, возраст 18 3. Женщина — Ольга, возраст 64 4. Женщина — Елена, возраст 26 5. Мужчина — Владимир, возраст 32
Здесь два новых момента:
percent="50,50"заставляет генераторtextделить значения примерно поровну междуМужчинаиЖенщина, а не выбирать равновероятно.type="template"сvalue="person.male.firstName"берёт настоящее имя из встроенных данныхperson.*— с учётом активной локали, поэтому подruэто русские имена.
MaleName заполняется только у мужчин, а FemaleName — только у женщин, поэтому
${{MaleName}}${{FemaleName}} всегда даёт ровно одно имя, подходящее полу — два
поля никогда не «разъедутся». Это и есть ключевая идея, подробно разобранная в
разделе Иерархические зависимости.
Использование TDC из вашего кода
Конфиг одинаков во всех языках; отличается только вызов из хост-языка.
- TypeScript
- Python
- Java
- C#
- Rust
import { TDC } from "tdcv2";
const data = new TDC({ configFile: "demo.tdc" });
console.log(data.toString());
from tdcv2 import TDC
data = TDC(config_file="demo.tdc")
print(data.to_string())
var data = new TDC("demo.tdc");
System.out.println(data.toString());
var data = new Tdc("demo.tdc");
Console.WriteLine(data);
let data = tdcv2::Tdc::from_file("demo.tdc")?;
println!("{data}");
Все пять реализаций готовы и выдают одни и те же байты; эталон, по которому сверяются остальные, — TypeScript. У каждой своя страница: TypeScript, Python, Java, C#, Rust.
Что дальше
- Структура конфигурации —
<tdc>,<env>и как устроен конфиг. - Иерархические зависимости — главная возможность.
- Значения-шаблоны —
person.*,date.*,location.*и остальные встроенные данные. - Справочник CLI — полная командная строка, теги, атрибуты и генераторы.