Перейти к основному содержимому

Установка

TDC задуман для пяти экосистем — npm (Node.js / TypeScript), pip (Python), Maven (Java), NuGet (.NET) и Cargo (Rust), — и все они дают байт-в-байт одинаковый вывод из одного и того же конфига, сида, версии и режима вывода (см. Детерминизм и пропорции).

Все пять реализаций готовы. У них одна грамматика, один набор кодов диагностики и общий набор фикстур, который держит их на одинаковых байтах: гигабайт вывода из одного конфига получается в каждой одинаковым. В каждой есть и одна и та же командная строка, так что ни одному конфигу не нужен инструментарий чужого языка.

Выберите свою экосистему ниже. Если хочется просто попробовать TDC, не выбирая язык, откройте вкладку npm — там есть однокомандная обёртка, которой не нужна ни строчки кода.

Требования: Node.js 20.0.0 или новее.

npm install -D tdcv2
npx tdcv2 demo.tdc

Это вся установка. Пакеты данных common, en и США идут вместе с пакетом, поэтому пример ниже работает без единой загрузки.

Если же вы хотите работать над самим движком, запускайте его из копии репозитория. Соберите его один раз:

npm --workspace typescript run build

Дальше любой конфиг запускается указанием Node на собранный CLI:

node typescript/dist/cli/main.js demo.tdc

В корне репозитория есть и однокомандная обёртка, чтобы не запоминать этот путь:

./run demo.tdc # прогнать любой файл, который вы укажете

./run — самый быстрый способ увидеть вывод: укажите файл и читайте результат прямо в терминале. Под капотом вызывается тот же CLI. Полный список опций — --seed, --count, --output, --locale и остальные — в справочнике CLI.

Проверяем, что всё работает

Когда npm-версия настроена, создайте файл demo.tdc. В нём две колонки — имя, выбранное из списка через type="text", и возраст из диапазона через type="number", — и однострочный шаблон вывода:

<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>

Запустите той командой, которую дала ваша установка. Три экосистемы кладут tdcv2 в PATH из того же пакета, что несёт библиотеку; у Maven и NuGet нет аналога npm-овского bin, поэтому там командная строка — отдельный артефакт:

ЯзыкКоманда
Node.jsnpx tdcv2 demo.tdc
Pythontdcv2 demo.tdc
Rusttdcv2 demo.tdc, после cargo install tdcv2
C#tdcv2 demo.tdc, после dotnet tool install --global Tdcv2.Cli
Javajava -jar tdcv2-0.1.7-cli.jar demo.tdc — классификатор cli у координат самой библиотеки

Из корня репозитория короче всех — ./run demo.tdc.

tdcv2 demo.tdc
Елена, возраст 59
Дмитрий, возраст 18
Клара, возраст 53
информация

Конкретные имена и числа приведены для примера — от версии ядра они могут отличаться. Важно другое: seed="demo" делает прогон воспроизводимым — тот же конфиг с тем же сидом каждый раз даёт тот же вывод.

Если вы получили три строки вида Имя, N лет, установка работает. Проверьте воспроизводимость, запустив команду второй раз, — три строки будут теми же. Затем переопределите число строк и сид прямо из командной строки, не трогая файл:

tdcv2 demo.tdc --count 20 --seed alt

Или совсем без конфига

Конфиг — это способ описать целый набор данных. Но та же установка отвечает и на одно значение, как это делает faker: без файла, без <env>, одним вызовом:

import { tdc } from 'tdcv2';

tdc.person.lastName(); // Jones
tdc.person.male.firstName(); // Robert
tdc.common.finance.iban(); // DE62299399441396459682
tdc.country.usa.docs.ssn(); // 699209702 — с настоящими контрольными цифрами
tdc.lang.ru.person.lastName(); // после `tdcv2 pack add ru`

Оба пути читают одни и те же пакеты данных, так что фамилия из однострочного вызова и фамилия из конфига на миллион строк приходят из одного списка. Что выбрать — зависит от того, должны ли значения согласовываться между собой: конфиг связывает город со страной и держит долю ровно в 30%, а одиночный вызов не связывает ничего ни с чем.

Вся поверхность — .many(n), seed(), locale() и способ дотянуться до конкретного пакета в каждом языке — на странице API одного значения.

Значения здесь взяты из сида

Сама по себе каждая из пяти реализаций случайна на каждый запуск процесса — как faker. В комментариях стоит то, что разыгрывает сид demo, так что tdc.seed('demo') — в Java и Rust Quick.seeded("demo") — повторит их в точности.

Установка пакетов данных (необязательно)

Имена, города, регионы, компании и прочие списки значений поставляются как пакеты данных — отдельно от движка, чтобы обновление библиотеки никогда не затирало ваши данные. Разумный набор по умолчанию (например, топ-1000 имён) идёт из коробки, поэтому пример из проверки выше работает без каких-либо докачек. Полные и дополнительные наборы скачиваются по требованию.

Настраивается это двумя командами — по одному разу каждая:

tdcv2 init # выбрать, где лежат пакеты, и локаль по умолчанию
tdcv2 pack list # посмотреть, что предлагает реестр
tdcv2 pack add en usa # скачать и подключить нужные пакеты

tdcv2 pack list печатает каталог, отмечая уже установленное:

tdcv2 pack list
Available data packs:

common ✓ installed Common (locale-agnostic) (0.0 MB)
Generators bound to neither a language nor a country: uuid,
hashes, ISBN/ISSN, GTIN/UPC/EAN, card PANs, MRZ, IPv4/IPv6/MAC,
semver, and more.

…

usa ✓ installed Usa (country) (0.0 MB)
Data specific to the USA regardless of the language it is
written in: SSN/ITIN/EIN, ZIP codes, states, street names, ABA
routing numbers, phone format, license plates.

Пакеты компонуются по независимым осям — язык, страна и локаль-независимый common, — так что данные для США по-английски = common + en + usa. Полный порядок работы (файл конфигурации, затенение пакетов, удаление) описан в разделе Установка пакетов данных.

Что дальше