facetted-interfaces/history/FIAM_v0.2_Draft6/tools/add_property_assertion.py
tegwick 1353267569 Establish FIAM repository governance baseline
Assistant: codex
Assistant-Model: gpt-5.6-luna
Assistant-Session: 01a087b0-7b1e-7531-8ef3-6525ebaf7ee7
2026-09-09 21:53:43 +02:00

38 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
"""Add one evidence-backed property assertion to a FIAM model.
Useful for governed declarations/expectations that live outside interface-description
formats, e.g. an operational architecture profile declaring an expected protocol.
"""
from __future__ import annotations
import argparse, copy
from pathlib import Path
import yaml
def parse_value(s):
try:return yaml.safe_load(s)
except Exception:return s
def main():
ap=argparse.ArgumentParser(description=__doc__)
ap.add_argument('input',type=Path); ap.add_argument('-o','--output',type=Path,required=True)
ap.add_argument('--subject',required=True); ap.add_argument('--predicate',required=True); ap.add_argument('--value',required=True)
ap.add_argument('--source',type=Path,required=True); ap.add_argument('--source-type',default='architecture-declaration')
ap.add_argument('--locator',default='declaration'); ap.add_argument('--confidence',type=float,default=1.0)
args=ap.parse_args()
d=yaml.safe_load(args.input.read_text()); src=yaml.safe_load(args.source.read_text()) or {}
aid='artifact.declaration.'+args.source.stem.replace('_','-')
artifacts=d.setdefault('artifacts',[])
if not any(x.get('id')==aid for x in artifacts):
artifacts.append({'id':aid,'kind':'artifact','name':args.source.name,'artifact_type':'fiam.artifact.architecture-declaration','locator':str(args.source),
'facets':{'source_note':src.get('source_note') or src.get('statement') or 'Governed architecture declaration.'}})
n=1; existing={x.get('id') for x in d.get('assertions',[]) or []}
while f'assertion.declaration.{n:04d}' in existing:n+=1
a={'id':f'assertion.declaration.{n:04d}','assertion_kind':'property','subject':args.subject,'predicate':args.predicate,'polarity':'asserted','value':parse_value(args.value),
'evidence':{'mode':'fiam.evidence.declared','source':{'type':args.source_type,'ref':aid,'locator':args.locator,'metadata':{'source_file':args.source.name}},
'observer':'governed-declaration/v0.2-draft.2','confidence':args.confidence,'stance':'supports'}}
d.setdefault('assertions',[]).append(a)
d['instance']=dict(d.get('instance',{})); d['instance']['id']=d['instance'].get('id','model')+'.expectation'; d['instance']['title']=d['instance'].get('title','FIAM model')+' + declared expectation'
args.output.parent.mkdir(parents=True,exist_ok=True); args.output.write_text(yaml.safe_dump(d,sort_keys=False,allow_unicode=True,width=120))
print(f'wrote {args.output}: {a["id"]}')
if __name__=='__main__':main()