Skip to content

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

NameDescription
BOUNDARY_CODENo description.
CLIR_HEAD_CACHE_DIRNo description.
DEPS_SUBDIRNo description.
KEYSNo description.
PROFILE_CODENo description.
QUADNo description.
SCHEMA_VERSIONNo description.
STRING_RENo description.

Classes

NameDescription
LibraryРазвёртка B(P): множества по ключам; конфликт — LDC-E1367.
ProfileErrorNo description.

Functions

NameDescription
artifact_pathNo description.
boundary_problems[dependencies] при профиле: каждая строка — пакет B той же версии,
clir_headШапка CLIR по байтам файла: {"package": {"name": …}, "imports": …}.
closure_problemsЗамкнутость §170.1: imports CLIR каждого пакета B лежат в B по всей четвёрке.
content_hashsha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).
default_clir_dircorpus/clir ближайшего корня вверх от пакета (зеркало
deps_labelИмя артефакта в сообщениях: путь ОТ КОРНЯ пакета, а не абсолютный путь
deps_loaderВложенные профили — из deps/profiles/<id>/<version>/profile.json.
dir_labelТо же для каталога-реестра профилей (--profiles <dir>): путь от него.
dir_loaderПрофили из каталога-реестра <dir>/<id>/<version>/profile.json.
expandB(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_stringNo description.
profile_string"<id>/<version>#sha256:…" — строка поля §170 из блока профиля лока.
quadrupleNo description.
read_profileАртефакт по схеме, с сошедшимся contentHash и множествами в каноническом порядке.
registry_loaderCLIR пакета B: из deps/ (материализованное C), иначе из реестра
root_importsimport-декларации заголовков .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 = None

packagesattributeinstance attribute#

packages: dict[str, dict] = {}

profilesattributeinstance attribute#

profiles: dict[str, dict] = {}

semantics_revisionattributeinstance attribute#

semantics_revision: str | None = None

namesmethod#

def names() -> set[str]

ProfileErrorclass#

class ProfileError(code: str, message: str)

Bases: ValueError

codeattributeinstance attribute#

code = code

messageattributeinstance attribute#

message = message

artifact_pathfunction#

def artifact_path(root: Path, profile_id: str, version: str) -> Path

boundary_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) -> str

sha256 канонических байтов артефакта БЕЗ поля contentHash (нерекурсивно).

default_clir_dirfunction#

def default_clir_dir(start: Path) -> Path | None

corpus/clir ближайшего корня вверх от пакета (зеркало imports_context::default_clir_dir): реестр CLIR авторского дерева, из которого читается B \ C — закреплённое, но не материализованное (П14).

deps_labelfunction#

def deps_label(profile_id: str, version: str) -> str

Имя артефакта в сообщениях: путь ОТ КОРНЯ пакета, а не абсолютный путь хоста, — как у снимков §168.5 (compose.read_export). Конверт отказа входит в голдены векторов и не вправе зависеть от каталога checkout (§211: путь — не вход).

deps_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]) -> Library

B(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 | None

profile_stringfunction#

def profile_string(block: dict) -> str

"<id>/<version>#sha256:…" — строка поля §170 из блока профиля лока.

quadruplefunction#

def quadruple(item: dict) -> tuple

read_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.