45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
|
|
from typing import Dict, Any
|
||
|
|
|
||
|
|
from .lineage_model import CodexEntry, SegmentLineage, EpochInfo, ContributorInfo
|
||
|
|
from .epoch_mapper import parse_epoch
|
||
|
|
from .contributor_index import register_contributor
|
||
|
|
|
||
|
|
|
||
|
|
def resolve_lineage(manifest: Dict[str, Any]) -> CodexEntry:
|
||
|
|
source_file = manifest.get("source_file", "unknown")
|
||
|
|
source_type = manifest.get("source_type", ".py")
|
||
|
|
version = manifest.get("version", "1.0.0")
|
||
|
|
origin = manifest.get("origin", "unknown")
|
||
|
|
timestamp = manifest.get("timestamp")
|
||
|
|
|
||
|
|
epoch_str = manifest.get("epoch", "v1")
|
||
|
|
epoch = parse_epoch(str(epoch_str))
|
||
|
|
|
||
|
|
contributor_name = manifest.get("contributor", "unknown")
|
||
|
|
contributor = register_contributor(contributor_name)
|
||
|
|
|
||
|
|
segments = []
|
||
|
|
codex_lineage = manifest.get("codex_lineage", {})
|
||
|
|
segment_list = codex_lineage.get("segments", [])
|
||
|
|
|
||
|
|
for seg in segment_list:
|
||
|
|
segment = SegmentLineage(
|
||
|
|
segment_id=seg.get("id", "unknown"),
|
||
|
|
start_line=seg.get("start", 0),
|
||
|
|
end_line=seg.get("end", 0),
|
||
|
|
start_byte=seg.get("start_byte", 0),
|
||
|
|
end_byte=seg.get("end_byte", 0)
|
||
|
|
)
|
||
|
|
segments.append(segment)
|
||
|
|
|
||
|
|
return CodexEntry(
|
||
|
|
source_file=source_file,
|
||
|
|
source_type=source_type,
|
||
|
|
version=version,
|
||
|
|
origin=origin,
|
||
|
|
epoch=epoch,
|
||
|
|
contributor=contributor,
|
||
|
|
segments=segments,
|
||
|
|
timestamp=timestamp
|
||
|
|
)
|