Skip to content

Як долучитися ​

Оновлення даних ​

Суди, в'язниці, justitiehuizen / maisons de justice і межі кантонів будуються з офіційних джерел щотижня (як): не редагуйте їх вручну. Виправте парсер у scripts/parse або, якщо помилка в самому джерелі, повідомте про неї суд. Щотижневий pull request переглядається, як і будь-який інший: перед злиттям порівняйте diff із джерелами.

Для наборів даних, які ведуться вручну (апеляційні округи, судові округи, процентні ставки):

  1. Відредагуйте JSON у data/. Зберігайте наявні id: проєкти їх зберігають.
  2. Оновіть lastReviewed для набору даних у datapackage.json, якщо ви звірили його з джерелами.
  3. pnpm check: перегенерувати типи id і схеми, перевірити типи, lint і форматування, зібрати, запустити тести з покриттям і lint пакета. Команда падає, якщо згенеровані файли не закомічено.
  4. Додайте рядок до CHANGELOG.md у розділ Unreleased і закомітьте (включно зі schema/, src/ids.generated.ts і ids.lock.json). Результат збірки (dist/) не комітиться: його збирають для кожного релізу і публікують у npm.

Опублікований id залишається: ids.lock.json перелічує їх усі, і тести падають, коли якогось немає в даних. Якщо джерело перейменувало запис, зіставте нову назву з наявним id у парсері; якщо запис припинився, залиште його з validTo. Див. Ідентифікатори.

Кантони й громади ​

data/cantons.json і data/municipalities.json генеруються; не редагуйте їх вручну. Запустіть pnpm build:cantons (потрібні доступ до мережі та unzip). Команда читає:

  • додаток до Gerechtelijk Wetboek / Code judiciaire (Судового кодексу), «Gebiedsomschrijving en zetel van hoven en rechtbanken» (ELI, numac 1967101058), нідерландською і французькою;
  • файл Statbel із населенням за громадами — для чинних громад і кодів REFNIS.

Вона розбирає нідерландський і французький тексти окремо і відмовляється щось записувати, якщо вони не збігаються або якщо не кожна громада охоплена рівно один раз (чи поділена між кількома кантонами). Екзоніми, які використовує додаток, але не Statbel (Gembloers, Saint-Nicolas, …), друкарські помилки в додатку і згадки меж, які вона не може розрізнити, перелічено на початку скрипта.

Запускайте її знову після того, як закон змінює додаток або громади об'єднуються. Id кантонів ідуть за місцевою мовою (нідерландська у Фландрії та Брюсселі, французька у Валлонії, німецька в районі Eupen); vredegerecht / justice de paix кантону x має id justice-of-the-peace-x і пов'язаний із ним через своє поле canton.

Набори даних, зібрані з вебсторінок ​

bash
pnpm fetch:sources            # кожне джерело в .sources/ (близько 20 хвилин, чемно)
pnpm fetch:sources courts     # або одне джерело
pnpm build:data               # перебудувати суди, в'язниці, justitiehuizen, поштові індекси, регіони і провінції з .sources/

Межі кантонів беруться з GeoPackage від NGI (джерело ngi), який читається власним SQLite Node; коли NGI перейменовує кантон, зіставте його код з id у CANTON_ALIASES у scripts/parse/boundaries.ts.

Або замість завантаження перейдіть на останні знімки: git worktree add .sources origin/sources.

Джерело — це обхід у scripts/sources/catalog.ts; парсер читає його знімки в scripts/parse. Коли сайт змінює розмітку, тести парсерів у test/parse (на скорочених копіях справжніх сторінок у test/fixtures/sources) показують, що зламалося.

Нові процентні ставки ​

  • Комерційна: FOD Financiën публікує ставку за кожне півріччя. Додайте період із from, to, rate і датою Staatsblad у note.
  • Законна: публікується за кожен календарний рік. Додайте період за рік.

Додавання набору даних ​

Кожен набір даних отримує однакове поводження, щоб користувачі могли на нього покладатися:

  1. Дані: data/<name>.json, масив записів. Кожне значення — з офіційного джерела.
  2. Id: дотримуйтеся правил для ідентифікаторів: офіційний код, якщо він існує, інакше kebab-case у нижньому регістрі з назви місцевою мовою (scripts/id.ts).
  3. Зв'язки, а не копії: посилайтеся на судові округи, кантони й громади за id і використовуйте спільні типи (Translated, Address, Contact, SourceRef).
  4. Джерела: sources: [{ url, retrieved }] у кожному записі і запис у datapackage.json з джерелами набору даних, ліцензією, lastReviewed і reviewEveryMonths.
  5. Типи й допоміжні функції: src/<name>.ts, експортований із src/index.ts, плюс entry point у tsup.config.ts і в exports у package.json.
  6. Схема: додайте тип файлу до scripts/schema-types.ts і scripts/build-schemas.ts.
  7. Джерело і парсер: обхід у scripts/sources/catalog.ts, що завантажує офіційні сторінки, і парсер у scripts/parse, що будує файл зі знімків, із fixtures і тестами. Він читає лише те, що може прочитати напевно, і повідомляє про решту.
  8. Тести: унікальні id, посилання, що розв'язуються, і кількість, яку дає офіційне джерело.
  9. Документація: сторінка в docs/data/ про те, чим набір корисний, джерело й оновлення, а також таблиця полів.

Перевірки ​

КомандаЩо робить
pnpm checkУсе, що запускає CI: generate, typecheck, lint, build, test:coverage, test:package, lint:package і перевірку, що згенеровані файли закомічено
pnpm testМодульні тести, тести цілісності, схем і типів на вихідному коді (збірка не потрібна)
pnpm test:packageSmoke-тести зібраного пакета через import і require(): спершу запустіть pnpm build
pnpm test:coverageТе саме, але падає, якщо покриття src/ нижче 100 %
pnpm lint / pnpm formatESLint і Prettier: перевірити / виправити
pnpm generateПерегенерувати src/ids.generated.ts (типи id) і schema/ з даних і типів та додати нові id до ids.lock.json
pnpm lint:packagepublint і arethetypeswrong на запакованому пакеті
pnpm test:freshnessПеревірки, що залежать від дати: відсутні ставки, прострочені перегляди. Не входить до check; FRESHNESS_ONLINE=1 перевіряє також URL джерел
pnpm fetch:sourcesЗавантажити офіційні джерела в .sources/
pnpm build:dataПеребудувати суди, в'язниці, justitiehuizen / maisons de justice, поштові індекси, регіони, провінції і межі кантонів з .sources/
pnpm build:csvЗаписати дані як CSV-таблиці в csv/

Випуск релізу ​

  1. Перенесіть записи з Unreleased у CHANGELOG.md під нову версію.
  2. Збільште version у package.json і закомітьте.
  3. Поставте тег і запуште: git tag v0.3.0 && git push && git push --tags.

Release workflow запускає pnpm check, публікує тег у npm із provenance і створює реліз на GitHub із доданими даними, схемами і CSV-таблицями. Тег має збігатися з version.

Цей вебсайт ​

Сайт міститься в docs/ і збирається за допомогою VitePress. Інтерактивні таблиці імпортують власні src/ і data/ пакета, тож завжди показують дані з репозиторію.

bash
pnpm docs:dev      # локальний сервер з hot reload
pnpm docs:build    # статичний сайт у docs/.vitepress/dist
pnpm docs:preview  # віддати зібраний сайт

Кожен push у main розгортає його на GitHub Pages. CI збирає його в кожному pull request, тож зламану сторінку виявляють ще до злиття.

Переклади ​

Англійські сторінки в docs/ — джерело істини. Кожна інша мова має те саме дерево у власній теці: нідерландська (docs/nl/) і французька (docs/fr/), а також німецька, іспанська, італійська, португальська, польська, турецька, арабська, українська, китайська і японська (docs/de/, docs/es/ і так далі). Це переклади англійської сторінки, і їх оновлюють після її змін. Коли ви змінюєте англійську сторінку, змініть ту саму сторінку і в docs/nl/ та docs/fr/, або вкажіть у pull request, що переклади відстають; інші мови можуть відставати на реліз. Слова теми та інтерактивних компонентів цими іншими мовами містяться в docs/.vitepress/locales/.

Код, id, назви полів і офіційні назви залишаються незмінними в кожній мові, а кожен заголовок зберігає англійський якір (## Heading {#english-anchor}), щоб перехресні посилання і перемикач мов і далі працювали. Бельгійська установа чи правовий термін зберігає свою офіційну нідерландську або французьку назву (або німецьку, де Бельгія її публікує) замість вигаданого перекладу: китайська сторінка пише vredegerecht / justice de paix, а не вигадане для нього слово. Changelog ведеться лише англійською.

Код за ліцензією MIT, дані за CC BY 4.0. Це довідкові дані, а не юридична консультація: перевіряйте офіційні джерела.