lawref.evaluator.events
Событие как исполнимое значение — SPEC §79.1, §81.1, §82.1 (DECISION-0156).
Здесь живут три вещи, которые свёртка §161.1 и активация §135.1 читают уже готовыми:
- таблица значений-событий по
id(§79.1): конструктор-запись §53 в константе пакета §54, константе дела §168 и аргументе утверждения §71 собирается в ОДНУ таблицу; два значения одногоidс разным каноническим содержанием §208 — fatalEVENT_ID_CONFLICT, побайтово равные суть одно событие; - цепочки версий §81.1:
supersedesдаёт голову цепочки; цикл, две исправляющие версии, ссылка в неизвестныйidлибо в событие другого типа — fatalEVENT_VERSION_CHAIN_BROKEN; - политика темпорального разрешения §82.1:
Date→[b(D), b(D+1))по ФИКСИРОВАННОМУ смещению политики. Ни одна tz-база не читается (§82.1, детерминизм §211): смещение записано в самой политике, иzoneinfoздесь не импортируется намеренно.
Отказы поднимаются ТОЛЬКО когда разрешение потребовалось (§82.1): дело без
единой даты в time исполняется при любом числе объявленных политик.
Attributes
| Name | Description |
|---|---|
DATE_T | No description. |
EVENT_ROOTS | No description. |
INSTANT_T | No description. |
Classes
| Name | Description |
|---|---|
EventWorld | Мир событий документа: таблица по id, головы цепочек §81.1, время. |
EventWorldRefusal | Fatal §79.1/§81.1: мир событий не однозначен, свёртка не выполнялась. |
PolicySelector | Ленивый выбор политики §82.1 осью §168.2. |
TemporalPolicy | Фиксированное смещение и граница гражданских суток (§82.1). |
TemporalResolutionRefusal | Отказ §82.1 до вывода: политики нет либо она неоднозначна. |
TypeLattice | Иерархия type_decl для проверки «носитель есть подтип on E» (§160.1). |
Functions
| Name | Description |
|---|---|
build_world | Собрать мир событий из программы и дела (§79.1, §81.1). |
parse_instant | ISO-мгновение → aware datetime. Смещение читается из САМОЙ строки — |
DATE_Tattributemodule attribute#
DATE_T = 'urn:law:std#Date'EVENT_ROOTSattributemodule attribute#
EVENT_ROOTS = ('urn:law:std#Event', 'urn:law:std#Action')INSTANT_Tattributemodule attribute#
INSTANT_T = 'urn:law:std#Instant'EventWorldclass#
class EventWorld(lattice: TypeLattice, policy: PolicySelector)Мир событий документа: таблица по id, головы цепочек §81.1, время.
Область сбора — ровно та, которую называют §79.1 и §81.1: константы
пакета §54, константы дела §168 и аргументы утверждений §71. Первые две
приходят узлами symbol_decl вида constant (константы дела становятся
эфемерными декларациями в prepared._build), третьи — атомами store.
latticeattributeinstance attribute#
lattice = latticepolicyattributeinstance attribute#
policy = policyrecordsattributeinstance attribute#
records: dict[str, dict] = {}canonical_timemethod#
def canonical_time(event_id: str) -> tuple[datetime, datetime, bool, bool]time → канонический Interval<Instant> §79.1 (три формы записи).
collectmethod#
def collect(value: Any) -> Nonefinalizemethod#
def finalize() -> NoneСвести формы к записи на id и назвать ВСЕ конфликты §79.1.
Равенство содержания проверяется по СЕМАНТИЧЕСКОМУ канону, а не по
байтам записи: 09:00+05:00 и 04:00Z суть один момент (E-0048), и
§79.1 говорит о содержании, а не о форме его записи. Поле time
приводится к каноническому интервалу §79.1 ДО сравнения, прочие поля
сравниваются каноном §208.
Конфликты собираются ВСЕ: relatedNodes называет каждый спорный id,
отсортированный по id. Отказ на первом встреченном ставил бы состав
ответа в зависимость от порядка обхода дела — ровно то, что развилка
F16 и снимает.
headmethod#
def head(event_id: str) -> strГолова цепочки версий §81.1 — версия, которую никто не исправляет.
resolve_versionsmethod#
def resolve_versions() -> Nonestart_ofmethod#
def start_of(event_id: str) -> datetimeНачало канонического интервала — ключ порядка истории §161.1.
supersededmethod#
def superseded(event_id: str) -> str | Noneid исправленной версии, если носитель есть голова непустой цепочки.
EventWorldRefusalclass#
class EventWorldRefusal(issue: dict)Bases: Exception
PolicySelectorclass#
class PolicySelector(nodes: list[dict], options: dict)Ленивый выбор политики §82.1 осью §168.2.
Ленивость нормативна, а не является оптимизацией: §82.1 говорит, что отказы поднимаются ТОЛЬКО когда разрешение потребовалось. Дело, в котором ни одна дата не сравнивалась с мгновением, исполняется при любом числе объявленных политик — выбирать было нечего, и гасить ответ незачем.
getmethod#
def get() -> TemporalPolicyTemporalPolicyclass#
class TemporalPolicy(node: dict)Фиксированное смещение и граница гражданских суток (§82.1).
day_boundaryattributeinstance attribute#
day_boundary = str(node.get('dayBoundary', '00:00:00'))idattributeinstance attribute#
id = str(node.get('id', ''))timezoneattributeinstance attribute#
timezone = node.get('timezone')utc_offsetattributeinstance attribute#
utc_offset = str(node.get('utcOffset', '+00:00'))TemporalResolutionRefusalclass#
class TemporalResolutionRefusal(issue: dict)Bases: Exception
Отказ §82.1 до вывода: политики нет либо она неоднозначна.
TypeLatticeclass#
class TypeLattice(nodes: list[dict])Иерархия type_decl для проверки «носитель есть подтип on E» (§160.1).
declsattributeinstance attribute#
decls = {
str(n['id']): n for n in nodes if n.get('kind') == 'type_decl' and isinstance(n.get('id'), str)
}basesmethod#
def bases(type_id: str) -> list[str]Цепочка баз от самого типа вверх; цикл в объявлениях обрывается.
Ребро Action <: Event ВСТРОЕНО (§80: «действие есть событие с
выделенным агентом»), и объявлять его пакету нечем: оба корня стоят в
urn:law:std, их type_decl в программе нет. Без этого ребра
on Event не принимал бы носителя-действия — то есть §160.1 («E
либо его подтип») читалось бы как «ровно E» ровно для той пары
типов, ради которой §80 и написан.
is_event_typemethod#
def is_event_type(type_id: str) -> boolis_subtypemethod#
def is_subtype(type_id: str, of_id: str) -> boolbuild_worldfunction#
def build_world(nodes: list[dict], atoms: Any, options: dict) -> EventWorldparse_instantfunction#
def parse_instant(text: str) -> datetimeDocumentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.