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
27 changes: 0 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,30 +124,3 @@ jobs:
- name: Build and test
run: .\gradlew.bat build --no-daemon


tree-guard:
name: Публичное дерево
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Checkout
uses: actions/checkout@v4

# Публичный репозиторий не должен содержать внутренние материалы
# (AGENTS.md, docs/internal, docs/reference, tools, seed.sql) и ссылки на них.
- name: Запрещённые пути и ссылки
run: |
bad=$(git ls-files | grep -E '^(AGENTS\.md|test\.ps1|seed\.sql|docs/internal/|docs/reference/|tools/|data/|\.idea/)' || true)
if [ -n "$bad" ]; then
echo "::error::В публичном дереве появились внутренние файлы:"
echo "$bad"
exit 1
fi
refs=$(git grep -nE 'docs/internal|docs/reference|open-reports\.ps1|AGENTS\.md' -- '*.md' '*.java' '*.kts' || true)
if [ -n "$refs" ]; then
echo "::error::Ссылки на внутренние файлы:"
echo "$refs"
exit 1
fi
echo "Публичное дерево чистое: внутренних файлов и ссылок нет."
54 changes: 29 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
name: Release

# Запуск: git tag v0.1.0 && git push origin v0.1.0
# Запуск: git tag v0.2.0 && git push origin v0.2.0
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: "Тег релиза (например, v0.1.0)"
description: "Тег релиза (например, v0.2.0)"
required: true

permissions:
contents: write # создание GitHub Release
packages: write # публикация в GitHub Packages

concurrency:
group: release-${{ github.ref }}
Expand All @@ -25,6 +24,14 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 25

# Секреты Central Portal видны шагам через env. Пустая строка = секрет не задан,
# и шаг публикации в Maven Central пропускается (релиз всё равно соберётся).
env:
CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }}
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}

steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -44,24 +51,6 @@ jobs:
- name: Make gradlew executable
run: chmod +x gradlew

# Секреты для Maven Central: если они не заданы, подпись просто не выполняется.
- name: Build и тесты
run: ./gradlew build --no-daemon

# Перевыпуск тега на той же версии: пакет уже лежит в GitHub Packages,
# повторная публикация отвечает 409 — это не повод валить релиз.
- name: Публикация в GitHub Packages
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
run: |
if ./gradlew publish --no-daemon --no-configuration-cache; then
echo "Опубликовано в GitHub Packages."
else
echo "::warning::Публикация не удалась — вероятно, версия уже опубликована. Релиз продолжается."
fi

- name: Определить версию
id: version
run: |
Expand All @@ -72,6 +61,25 @@ jobs:
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Ревизия: $TAG (версия $VERSION)"

- name: Сборка и тесты
env:
VERSION: ${{ steps.version.outputs.version }}
run: ./gradlew build -Pversion="$VERSION" --no-daemon

# Публикация в Maven Central: только когда заданы токен и PGP-ключ.
# artifactId: validum-core и validum-allure (см. корневой build.gradle.kts).
- name: Публикация в Maven Central
if: env.CENTRAL_USERNAME != '' && env.SIGNING_KEY != ''
env:
VERSION: ${{ steps.version.outputs.version }}
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_PASSWORD }}
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.CENTRAL_USERNAME }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.CENTRAL_TOKEN }}
run: |
./gradlew publishToMavenCentral -Pversion="$VERSION" \
--no-daemon --no-configuration-cache

- name: Подготовить артефакты релиза
env:
VERSION: ${{ steps.version.outputs.version }}
Expand All @@ -95,10 +103,6 @@ jobs:
run: |
NOTES="$(awk '/^## \[$VERSION\]/{flag=1; next} /^## \[/{flag=0} flag' CHANGELOG.md)"
if [ -z "$NOTES" ]; then NOTES="Validum $VERSION — см. CHANGELOG.md"; fi
# Идемпотентно: перевыпуск тега не должен падать на существующем релизе
if gh release view "$TAG" >/dev/null 2>&1; then
gh release delete "$TAG" --yes
fi
gh release create "$TAG" \
"dist/validum-${VERSION}.jar" \
"dist/validum-${VERSION}.jar.sha256" \
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ Thumbs.db
*.swp
*~

# Python (скрипты инструментов)
__pycache__/
*.pyc

# Логи и env
*.log
logs/
Expand Down
48 changes: 47 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,38 @@

Формат — [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), версии — [SemVer](https://semver.org/lang/ru/).

## [Unreleased] — 0.3.0

## [0.2.0] — 2026-11-03

Пакет «Набор»: данные воспроизводимы, уникальны и читаемы человеком без шаманства.

### Added

- **Версия и seed в выводе.** CLI пишет в stderr строку `# validum <версия> · seed=N · asOf=YYYY-MM-DD`
и подсказку с готовой командой `--seed`, если seed сгенерирован автоматически. REST отдаёт заголовки
`X-Validum-Version` и `X-Validum-Seed`; SQL-скрипт начинается с `-- validum <версия>, seed=N`.
Версия берётся из одного места — `ru.validum.core.Version` (системное свойство `validum.version`
из Gradle → манифест jar → `dev`), а не хардкод. Заголовки отдают все генеративные эндпоинты,
включая батчи и CSV.
- **Уникальность с проверкой ёмкости** (`--unique` в `generate individual|ip|organization`).
Дубликаты ИНН (ФЛ), ОГРНИП (ИП) и ОГРН (ЮЛ) не выпускаются: при совпадении профиль
перегенерируется с новым seed. В режиме `--unique` seed обязателен — иначе набор невоспроизводим.
При исчерпании вариантов — ошибка «не удалось получить уникальный ИНН за 1000 попыток
из M вариантов», без бесконечного цикла.
- **`csv-semicolon` — CSV для русского Excel**: UTF-8 с BOM, разделитель «;» и русские заголовки
(«ФИО;ИНН;СНИЛС…»). CLI `--format csv-semicolon`, REST `?format=csv-semicolon`. Машинный `csv`
не изменился: «,» и английские заголовки.
- **Спецификация набора `.validum.json` (C1)**: `validum generate --spec set.validum.json` —
`type` (или русский синоним `фл`/`ип`/`юл`), `count`, `seed`, `asOf`, `format`, `output`, `unique`,
`options{region, age, gender, bik, okved, documentTypes…}`. Исполняется тем же кодом, что и флаги;
неизвестный ключ отклоняется с кодом 2, при `unique` без `seed` — отказ.
- **Регрессионная сетка (N1)**: `PropertyInvariantsTest` сверяет валидаторы с независимой
реализацией алгоритмов (ИНН, СНИЛС, ОГРН/ОГРНИП, контрольный ключ счёта по письму № 515) на
случайных данных и проверяет свойства сгенерированных профилей; `GoldenFixturesTest` фиксирует
SHA-256 набора для пары `seed + asOf` — дрейф справочников или порядка колонок ловится сразу.
Обновление эталона — `./gradlew :validum-core:test -Dvalidum.golden.update=true`.

## [0.1.0] — 2026-10-30

Первая публичная версия: генерация валидных данных для российского финтеха, self-hosted, без LLM.
Expand Down Expand Up @@ -51,6 +83,16 @@
- `Dockerfile` (multi-stage, JRE 21) и `docker-compose.yml` с монтированием справочника ЦБ.
- GitHub Actions: сборка, тесты, публикация артефактов и сводки по модулям.
- 721 тест (567 core + 80 api + 55 cli + 19 allure), 0 падений.
- **Отчёт о покрытии набора** — `coverage --file <csv|json>`. Показывает, во что превратился файл:
сколько строк заполнено, сколько значений различных и проходят ли контрольные суммы ИНН, СНИЛС,
ОГРН/ОГРНИП, КПП, ОКПО и ключ счёта (БИК берётся из той же строки набора). Понимает «дружелюбный»
CSV (BOM + `;`), машинный CSV, JSON и JSON-массив — формат можно задать `--format`. Ядро отчёта —
`ru.validum.core.report.Coverage`, оболочка — `ru.validum.cli.CoverageCommand`.
- **Публикация в Maven Central.** Релиз больше не уходит в GitHub Packages: `validum-core` и
`validum-allure` публикуются через Central Portal (`com.vanniktech.maven.publish`, авторелиз).
Шаг в `release.yml` включается только при заданных секретах — без них релиз собирается и
выкладывается как обычно, но пакет в Central не отправляется. Координаты для потребителей:
`io.github.validum-tech:validum-core:0.2.0` без подключения репозитория.

### Changed

Expand Down Expand Up @@ -80,8 +122,12 @@
| Что | Где |
|---|---|
| `validum-0.1.0.jar` + `.sha256` | GitHub Releases |
| `io.github.validum-tech:validum-core:0.1.0` и `io.github.validum-tech:validum-allure:0.1.0` | GitHub Packages; Maven Central — после настройки секретов |
| `io.github.validum-tech:validum-core:0.2.0` (и `validum-allure`) | Maven Central |
| Исходники | `git clone` → `./gradlew build` |

Требования: JDK 21. Справочник `data/ED807.xml` обязателен — `validum fetch-bik -o data/ED807.xml`.
Порядок выпуска версии — `docs/RELEASING.md`.

[Unreleased]: https://github.com/Validum-Tech/validum/compare/v0.2.0...HEAD
[0.2.0]: https://github.com/Validum-Tech/validum/releases/tag/v0.2.0
[0.1.0]: https://github.com/Validum-Tech/validum/releases/tag/v0.1.0
Loading
Loading