lawref.profiles
Профили канона §170.1 (DECISION-0170) — эталон.
Профиль — именованный, датированный и хэшированный состав библиотеки норм:
не пакет и не дело, а перечень с версиями и хэшами, сам закреплённый
contentHash. Здесь: чтение артефакта law.profile/0.1, развёртка B
(объединение packages[] и вложенных профилей, транзитивно, с конфликтами
вместо слияния), замкнутость по imports CLIR, записи LockedPackage
из элементов B, граница [dependencies] (§10, LDC-E1366), сверка лока с
библиотекой (§11, LDC-E1367) и строка jurisdictionProfile (§168.3).
Множества B/L/C/W §168.4: профиль — граница библиотеки, НЕ состав мира. Лок закрепляет всю развёртку B; исполняется замыкание фактических импортов корня C; закреплённый, но не импортированный пакет в мир не входит.
Attributes
| Name | Description |
|---|---|
BOUNDARY_CODE | No description. |
CLIR_HEAD_CACHE_DIR | No description. |
DEPS_SUBDIR | No description. |
KEYS | No description. |
PROFILE_CODE | No description. |
QUAD | No description. |
SCHEMA_VERSION | No description. |
STRING_RE | No description. |
Classes
| Name | Description |
|---|---|
Library | Развёртка B(P): множества по ключам; конфликт — LDC-E1367. |
ProfileError | No description. |
Functions
| Name | Description |
|---|---|
artifact_path | No description. |
boundary_problems | [dependencies] при профиле: каждая строка — пакет B той же версии, |
clir_head | Шапка CLIR по байтам файла: {"package": {"name": …}, "imports": …}. |
closure_problems | Замкнутость §170.1: imports CLIR каждого пакета B лежат в B по всей четвёрке. |
content_hash | sha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно). |
default_clir_dir | corpus/clir ближайшего корня вверх от пакета (зеркало |
deps_label | Имя артефакта в сообщениях: путь ОТ КОРНЯ пакета, а не абсолютный путь |
deps_loader | Вложенные профили — из deps/profiles/<id>/<version>/profile.json. |
dir_label | То же для каталога-реестра профилей (--profiles <dir>): путь от него. |
dir_loader | Профили из каталога-реестра <dir>/<id>/<version>/profile.json. |
expand | B(P) — транзитивно по profiles[]; loader(id, version, contentHash) |
import_problems | §23 под профилем: версия import точная и равна пину B (LDC-E1110). |
load_for_root | Артефакт, блок {id, version, contentHash, registryId?} и развёртка B |
lock_problems | §11: L = B по четвёрке; блок profile лока = профиль; линия языка и |
locked_packages | Записи LockedPackage исчерпывающего состава из элементов B (§11). |
parse_string | No description. |
profile_string | "<id>/<version>#sha256:…" — строка поля §170 из блока профиля лока. |
quadruple | No description. |
read_profile | Артефакт по схеме, с сошедшимся contentHash и множествами в каноническом порядке. |
registry_loader | CLIR пакета B: из deps/ (материализованное C), иначе из реестра |
root_imports | import-декларации заголовков .law корня (без прелюдии law.std.*): |
BOUNDARY_CODEattributemodule attribute#
BOUNDARY_CODE = 'LDC-E1366'CLIR_HEAD_CACHE_DIRattributemodule attribute#
CLIR_HEAD_CACHE_DIR = schemas.cache_dir() / 'clir-heads'DEPS_SUBDIRattributemodule attribute#
DEPS_SUBDIR = ('deps', 'profiles')KEYSattributemodule attribute#
KEYS = {'packages': 'name', 'profiles': 'id', 'calendars': 'node', 'expansions': 'name'}PROFILE_CODEattributemodule attribute#
PROFILE_CODE = 'LDC-E1367'QUADattributemodule attribute#
QUAD = ('name', 'version', 'namespace', 'contentHash')SCHEMA_VERSIONattributemodule attribute#
SCHEMA_VERSION = 'law.profile/0.1'STRING_REattributemodule attribute#
STRING_RE = re.compile(
'^(?P<id>[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)*)/(?P<version>[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?)#(?P<hash>sha256:[0-9a-f]{64})$'
)Libraryclass#
class Library()Развёртка B(P): множества по ключам; конфликт — LDC-E1367.
calendarsattributeinstance attribute#
calendars: dict[str, dict] = {}expansionsattributeinstance attribute#
expansions: dict[str, dict] = {}languageattributeinstance attribute#
language: str | None = Nonepackagesattributeinstance attribute#
packages: dict[str, dict] = {}profilesattributeinstance attribute#
profiles: dict[str, dict] = {}semantics_revisionattributeinstance attribute#
semantics_revision: str | None = Nonenamesmethod#
def names() -> set[str]ProfileErrorclass#
class ProfileError(code: str, message: str)Bases: ValueError
artifact_pathfunction#
def artifact_path(root: Path, profile_id: str, version: str) -> Pathboundary_problemsfunction#
def boundary_problems(manifest: dict, library: Library) -> list[str][dependencies] при профиле: каждая строка — пакет B той же версии,
издатель и возможности согласны; optional границы не расширяет;
прелюдия law.std исключена (§10, LDC-E1366).
clir_headfunction#
def clir_head(path: Path) -> dictШапка CLIR по байтам файла: {"package": {"name": …}, "imports": …}.
Файл вне JSON — ValueError, как у json.loads всего документа
(вызывающий решает: индекс пропускает файл, загрузка B отказывает).
closure_problemsfunction#
def closure_problems(library: Library, clir_for: Callable[[str], dict | None]) -> list[str]Замкнутость §170.1: imports CLIR каждого пакета B лежат в B по всей четвёрке.
content_hashfunction#
def content_hash(artifact: dict) -> strsha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).
default_clir_dirfunction#
def default_clir_dir(start: Path) -> Path | Nonecorpus/clir ближайшего корня вверх от пакета (зеркало
imports_context::default_clir_dir): реестр CLIR авторского дерева, из
которого читается B \ C — закреплённое, но не материализованное (П14).
deps_labelfunction#
def deps_label(profile_id: str, version: str) -> strdeps_loaderfunction#
def deps_loader(root: Path) -> Callable[[str, str, str], dict]Вложенные профили — из deps/profiles/<id>/<version>/profile.json.
dir_labelfunction#
def dir_label(profile_id: str, version: str) -> strТо же для каталога-реестра профилей (--profiles <dir>): путь от него.
dir_loaderfunction#
def dir_loader(profiles_dir: Path) -> Callable[[str, str, str], dict]Профили из каталога-реестра <dir>/<id>/<version>/profile.json.
expandfunction#
def expand(artifact: dict, loader: Callable[[str, str, str], dict]) -> LibraryB(P) — транзитивно по profiles[]; loader(id, version, contentHash)
возвращает вложенный артефакт (уже прочитанный read_profile).
import_problemsfunction#
def import_problems(root_imports_: list[tuple[str, str]], library: Library) -> list[str]§23 под профилем: версия import точная и равна пину B (LDC-E1110).
load_for_rootfunction#
def load_for_root(root: Path, manifest: dict, lock: dict | None) -> tuple[dict, dict, Library]Артефакт, блок {id, version, contentHash, registryId?} и развёртка B
для корня с [profile]; лок, если предъявлен, сверяется блоком.
lock_problemsfunction#
def lock_problems(lock: dict, library: Library, block: dict) -> list[str]§11: L = B по четвёрке; блок profile лока = профиль; линия языка и
ревизия семантики — те же, что у лока; календари и развёртки лока — из
перечней профиля.
locked_packagesfunction#
def locked_packages(library: Library) -> list[dict]Записи LockedPackage исчерпывающего состава из элементов B (§11).
parse_stringfunction#
def parse_string(text) -> dict | Noneprofile_stringfunction#
def profile_string(block: dict) -> str"<id>/<version>#sha256:…" — строка поля §170 из блока профиля лока.
quadruplefunction#
def quadruple(item: dict) -> tupleread_profilefunction#
def read_profile(path: Path, label: str | None = None) -> dictАртефакт по схеме, с сошедшимся contentHash и множествами в каноническом порядке.
label — имя артефакта в сообщениях (см. deps_label); без него берётся
предъявленный путь, каким его назвал вызывающий.
registry_loaderfunction#
def registry_loader(root: Path, present: dict[str, dict]) -> Callable[[str], dict | None]CLIR пакета B: из deps/ (материализованное C), иначе из реестра
corpus/clir авторского дерева по имени пакета; нет нигде — None.
Из файла читается только шапка (clir_head): замкнутость §170.1 судит
по imports, и дерево узлов ей не нужно.
root_importsfunction#
def root_imports(root: Path) -> list[tuple[str, str]]import-декларации заголовков .law корня (без прелюдии law.std.*):
старт обхода C и корневые рёбра лока, доступные до понижения (§168.4).
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.