lawref.expansion
Независимая эталонная развёртка профиля law.expansion/0.1 (SPEC §279.1,
DECISION-0126).
Как и term_sugar, это намеренно маленький рукописный разбор поверхности
expansion/expand: модуль не импортирует и не вызывает lawc, чтобы
байтовый differential (verify/ci/gates/differential/check_expansions.py)
сравнивал две по-настоящему разные реализации одного prose-контракта.
Принимается ровно закрытый профиль §279.1; всё вне него отвергается громко —
либо диагностикой профиля (LDC-E1335…LDC-E1342, §279.1.10), либо
ExpansionSyntaxError там, где сама поверхность вне узкого среза оракула
(qualified-ссылки, формулы scope сложнее конъюнкции атомов).
Вход — тексты файлов пакета (обычные модули с отношениями и экземплярами) и
предъявленный контекст пина §279.1.8; выход — порождённые узлы CLIR с
contentHash, диагностики и карта §279.1.9.
Attributes
| Name | Description |
|---|---|
BUDGET_CASES | No description. |
BUDGET_LIST | No description. |
BUDGET_NODES | No description. |
BUDGET_PREMISES | No description. |
MAP_FORMAT | No description. |
MAP_FORMAT_02 | No description. |
PROFILE | No description. |
PROFILES | No description. |
PROFILE_02 | No description. |
Classes
| Name | Description |
|---|---|
Argument | No description. |
Case | No description. |
DateTerm | Датовый терм границы окна §279.2.2: связыватель Date, литерал даты либо |
Definition | No description. |
DeonticHead | Деонтическая голова emit §279.2.3. |
Diagnostic | No description. |
EmitPriority | No description. |
EmitRule | No description. |
ExpansionSyntaxError | Поверхность вне узкого среза эталонной реализации. |
ExternalRoleRef | prefer A.role over B в обычном priority — §279.1.6. |
Instance | No description. |
Label | No description. |
MetaLiteral | No description. |
Module | No description. |
ParamType | No description. |
Premise | No description. |
Result | No description. |
Functions
| Name | Description |
|---|---|
expand_package | Развернуть все экземпляры пакета; files — имя файла → текст (порядок сборки). |
expansion_map | Карта §279.1.9 с привязкой к digest полных канонических байтов CLIR. |
pack_content_hash | No description. |
BUDGET_CASESattributemodule attribute#
BUDGET_CASES = 32BUDGET_LISTattributemodule attribute#
BUDGET_LIST = 32BUDGET_NODESattributemodule attribute#
BUDGET_NODES = 128BUDGET_PREMISESattributemodule attribute#
BUDGET_PREMISES = 64MAP_FORMATattributemodule attribute#
MAP_FORMAT = 'law.expansion-map/0.1'MAP_FORMAT_02attributemodule attribute#
MAP_FORMAT_02 = 'law.expansion-map/0.2'PROFILEattributemodule attribute#
PROFILE = 'law.expansion/0.1'PROFILESattributemodule attribute#
PROFILES = frozenset({PROFILE, PROFILE_02})PROFILE_02attributemodule attribute#
PROFILE_02 = 'law.expansion/0.2'Argumentclassdataclass#
class Argument(name: str, kind: str, values: tuple[str, ...] = (), spans: tuple[tuple[int, int], ...] = (), quantity: tuple[str, str] | None = None, quantity_span: tuple[int, int] = (0, 0))kindattributeinstance attribute#
kind: strnameattributeinstance attribute#
name: strquantityattributeclass attributeinstance attribute#
quantity: tuple[str, str] | None = Nonequantity_spanattributeclass attributeinstance attribute#
quantity_span: tuple[int, int] = (0, 0)spansattributeclass attributeinstance attribute#
spans: tuple[tuple[int, int], ...] = ()valuesattributeclass attributeinstance attribute#
values: tuple[str, ...] = ()Caseclassdataclass#
class Case(param: str, name: str, name_span: tuple[int, int], labels: list[Label], anchors: list[str], arguments: dict[str, Argument])anchorsattributeinstance attribute#
anchors: list[str]argumentsattributeinstance attribute#
arguments: dict[str, Argument]labelsattributeinstance attribute#
labels: list[Label]nameattributeinstance attribute#
name: strname_spanattributeinstance attribute#
name_span: tuple[int, int]paramattributeinstance attribute#
param: strDateTermclassdataclass#
class DateTerm(kind: str, value: str, quantity: str = '', span: tuple[int, int] = (0, 0))Датовый терм границы окна §279.2.2: связыватель Date, литерал даты либо
календарный шаг add_calendar_period(<binder>, <quantity>).
Definitionclassdataclass#
class Definition(name: str, params: dict[str, ParamType], exports: dict[str, tuple[str, ...]], emits: list[EmitRule | EmitPriority], file: str, alias: str = '', local: bool = True, pin: dict | None = None, profile: str = PROFILE_02)aliasattributeclass attributeinstance attribute#
alias: str = ''emitsattributeinstance attribute#
emits: list[EmitRule | EmitPriority]exportsattributeinstance attribute#
exports: dict[str, tuple[str, ...]]fileattributeinstance attribute#
file: strlocalattributeclass attributeinstance attribute#
local: bool = Truenameattributeinstance attribute#
name: strparamsattributeinstance attribute#
params: dict[str, ParamType]pinattributeclass attributeinstance attribute#
pin: dict | None = Noneprofileattributeclass attributeinstance attribute#
profile: str = PROFILE_02DeonticHeadclassdataclass#
class DeonticHead(modality: str, path: tuple[str, ...], bearer: str, beneficiary: str | None, goal_kind: str, goal: MetaLiteral, start: DateTerm, end: DateTerm, end_inclusive: bool, spans: dict[str, tuple[int, int]])Деонтическая голова emit §279.2.3.
bearerattributeinstance attribute#
bearer: strbeneficiaryattributeinstance attribute#
beneficiary: str | Noneendattributeinstance attribute#
end: DateTermend_inclusiveattributeinstance attribute#
end_inclusive: boolgoalattributeinstance attribute#
goal: MetaLiteralgoal_kindattributeinstance attribute#
goal_kind: strmodalityattributeinstance attribute#
modality: strpathattributeinstance attribute#
path: tuple[str, ...]spansattributeinstance attribute#
spans: dict[str, tuple[int, int]]startattributeinstance attribute#
start: DateTermDiagnosticclassdataclass#
class Diagnostic(code: str, message: str, span: tuple[int, int] = (0, 0), file: str = '')EmitPriorityclassdataclass#
class EmitPriority(path: tuple[str, ...], path_span: tuple[int, int], prefer: tuple[str, ...], over: tuple[str, ...], reason: str, labels_from: tuple[str, ...] | None, labels_prefix: str, source_from: tuple[str, ...] | None, source_fallback: bool, case_var: str | None, cases_param: str | None = None)case_varattributeinstance attribute#
case_var: str | Nonecases_paramattributeclass attributeinstance attribute#
cases_param: str | None = Nonelabels_fromattributeinstance attribute#
labels_from: tuple[str, ...] | Nonelabels_prefixattributeinstance attribute#
labels_prefix: stroverattributeinstance attribute#
over: tuple[str, ...]pathattributeinstance attribute#
path: tuple[str, ...]path_spanattributeinstance attribute#
path_span: tuple[int, int]preferattributeinstance attribute#
prefer: tuple[str, ...]reasonattributeinstance attribute#
reason: strsource_fallbackattributeinstance attribute#
source_fallback: boolsource_fromattributeinstance attribute#
source_from: tuple[str, ...] | NoneEmitRuleclassdataclass#
class EmitRule(path: tuple[str, ...], path_span: tuple[int, int], strength: str, binders: list[str], premises: list[Premise], head: MetaLiteral | None, head_kind: str, scope_from_self: bool, effective_from_self: bool, labels_from: tuple[str, ...] | None, labels_prefix: str, source_from: tuple[str, ...] | None, source_fallback: bool, case_var: str | None, cases_param: str | None = None, deontic: DeonticHead | None = None)bindersattributeinstance attribute#
binders: list[str]case_varattributeinstance attribute#
case_var: str | Nonecases_paramattributeclass attributeinstance attribute#
cases_param: str | None = Nonedeonticattributeclass attributeinstance attribute#
deontic: DeonticHead | None = Noneeffective_from_selfattributeinstance attribute#
effective_from_self: boolheadattributeinstance attribute#
head: MetaLiteral | Nonehead_kindattributeinstance attribute#
head_kind: strlabels_fromattributeinstance attribute#
labels_from: tuple[str, ...] | Nonelabels_prefixattributeinstance attribute#
labels_prefix: strpathattributeinstance attribute#
path: tuple[str, ...]path_spanattributeinstance attribute#
path_span: tuple[int, int]premisesattributeinstance attribute#
premises: list[Premise]scope_from_selfattributeinstance attribute#
scope_from_self: boolsource_fallbackattributeinstance attribute#
source_fallback: boolsource_fromattributeinstance attribute#
source_from: tuple[str, ...] | Nonestrengthattributeinstance attribute#
strength: strExpansionSyntaxErrorclass#
class ExpansionSyntaxError(TermSyntaxError)Bases: TermSyntaxError
Поверхность вне узкого среза эталонной реализации.
ExternalRoleRefclassdataclass#
class ExternalRoleRef(instance: str, role: str, span: tuple[int, int], file: str)prefer A.role over B в обычном priority — §279.1.6.
Instanceclassdataclass#
class Instance(reference: str, name: str, name_span: tuple[int, int], labels: list[Label], anchors: list[str], explicit_id: str | None, binds: dict[str, tuple[str, str, tuple[int, int]]], arguments: dict[str, Argument], cases: list[Case], scope: tuple[tuple[str, tuple[str, ...]], ...] | None, effective: dict | None, file: str, scope_span: tuple[int, int] = (0, 0), effective_span: tuple[int, int] = (0, 0))anchorsattributeinstance attribute#
anchors: list[str]argumentsattributeinstance attribute#
arguments: dict[str, Argument]bindsattributeinstance attribute#
binds: dict[str, tuple[str, str, tuple[int, int]]]casesattributeinstance attribute#
cases: list[Case]effectiveattributeinstance attribute#
effective: dict | Noneeffective_spanattributeclass attributeinstance attribute#
effective_span: tuple[int, int] = (0, 0)explicit_idattributeinstance attribute#
explicit_id: str | Nonefileattributeinstance attribute#
file: strlabelsattributeinstance attribute#
labels: list[Label]nameattributeinstance attribute#
name: strname_spanattributeinstance attribute#
name_span: tuple[int, int]referenceattributeinstance attribute#
reference: strscopeattributeinstance attribute#
scope: tuple[tuple[str, tuple[str, ...]], ...] | Nonescope_spanattributeclass attributeinstance attribute#
scope_span: tuple[int, int] = (0, 0)Labelclassdataclass#
class Label(language: str, status: str, text: str, forms: tuple[tuple[str, str], ...] = ())MetaLiteralclassdataclass#
class MetaLiteral(relation: tuple[str, ...], args: tuple[str, ...], negated: bool = False)Moduleclassdataclass#
class Module(file: str, text: str, namespace: str, relations: dict[str, list[tuple[str, str]]], types: set[str], declared_ids: dict[str, tuple[int, int]], definitions: list[Definition], instances: list[Instance], role_refs: list[ExternalRoleRef], constants: dict[str, tuple[str, str]], parents: dict[str, str], aliases: dict[str, str], entities: set[str], imports: set[str])aliasesattributeinstance attribute#
aliases: dict[str, str]constantsattributeinstance attribute#
constants: dict[str, tuple[str, str]]declared_idsattributeinstance attribute#
declared_ids: dict[str, tuple[int, int]]definitionsattributeinstance attribute#
definitions: list[Definition]entitiesattributeinstance attribute#
entities: set[str]fileattributeinstance attribute#
file: strimportsattributeinstance attribute#
imports: set[str]instancesattributeinstance attribute#
instances: list[Instance]namespaceattributeinstance attribute#
namespace: strparentsattributeinstance attribute#
parents: dict[str, str]relationsattributeinstance attribute#
relations: dict[str, list[tuple[str, str]]]role_refsattributeinstance attribute#
role_refs: list[ExternalRoleRef]textattributeinstance attribute#
text: strtypesattributeinstance attribute#
types: set[str]ParamTypeclassdataclass#
class ParamType(kind: str, binders: tuple[str, ...] = (), min_len: int = 0, fields: dict[str, 'ParamType'] = dict(), value_type: str | None = None)bindersattributeclass attributeinstance attribute#
binders: tuple[str, ...] = ()fieldsattributeclass attributeinstance attribute#
fields: dict[str, 'ParamType'] = field(default_factory=dict)kindattributeinstance attribute#
kind: strmin_lenattributeclass attributeinstance attribute#
min_len: int = 0value_typeattributeclass attributeinstance attribute#
value_type: str | None = NonePremiseclassdataclass#
class Premise(kind: str, literal: MetaLiteral | None = None, var: str = '', source: tuple[str, ...] = (), event: str = '', day: str = '', events: MetaLiteral | None = None, window: str = '', threshold: str = '')dayattributeclass attributeinstance attribute#
day: str = ''eventattributeclass attributeinstance attribute#
event: str = ''eventsattributeclass attributeinstance attribute#
events: MetaLiteral | None = Nonekindattributeinstance attribute#
kind: strliteralattributeclass attributeinstance attribute#
literal: MetaLiteral | None = Nonesourceattributeclass attributeinstance attribute#
source: tuple[str, ...] = ()thresholdattributeclass attributeinstance attribute#
threshold: str = ''varattributeclass attributeinstance attribute#
var: str = ''windowattributeclass attributeinstance attribute#
window: str = ''Resultclassdataclass#
class Result(nodes: list[dict], diagnostics: list[Diagnostic], entries: list[dict], definitions: list[dict], role_ids: dict[str, str])definitionsattributeinstance attribute#
definitions: list[dict]diagnosticsattributeinstance attribute#
diagnostics: list[Diagnostic]entriesattributeinstance attribute#
entries: list[dict]nodesattributeinstance attribute#
nodes: list[dict]role_idsattributeinstance attribute#
role_ids: dict[str, str]okproperty#
ok: boolexpand_packagefunction#
def expand_package(files: dict[str, str], context: list[dict] | None = None, base_dir: Path | None = None, declared_aliases: list[str] | None = None, imports: dict[str, str] | None = None, import_descriptors: list[dict] | None = None) -> ResultРазвернуть все экземпляры пакета; files — имя файла → текст (порядок сборки).
context — записи --expansions (§279.1.8), пути root — от base_dir;
declared_aliases — алиасы [expansions] манифеста: объявленный и не
предъявленный контекстом — LDC-E1340, не LDC-E1336; imports — имя
пакета → namespace предъявленных зависимостей §23 (qualified-ссылки
pkg::rel в аргументах разрешаются в <namespace>#rel).
expansion_mapfunction#
def expansion_map(result: Result, namespace: str, artifact_bytes: bytes) -> dictКарта §279.1.9 с привязкой к digest полных канонических байтов CLIR.
pack_content_hashfunction#
def pack_content_hash(root: Path, entry: str) -> strDocumentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.