facetted-interfaces/history/FIAM_v0.2_Draft6/tools/architecture_changes_lens.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

21 lines
2.1 KiB
Python
Executable file

#!/usr/bin/env python3
from __future__ import annotations
import argparse, sqlite3
from pathlib import Path
import yaml
from declaration_matching import match_edge
def edge(row,dm):
return {'edge_key':row['edge_key'],'domain':row['domain'],'kind':row['kind'],'from':row['from_ref'],'target':row['target_ref'],'target_kind':row['target_kind'],'channel':row['channel_ref'],'first_seen':row['first_seen'],'last_seen':row['last_seen'],'valid_from':row['valid_from'],'closed_at':row['closed_at'],'observation_count':int(row['observation_count'] or 0),'declared':dm['declared'],'declaration_matches':dm['matches'],'declaration_reason':dm['reason'],'close_reason':row['close_reason']}
def main():
ap=argparse.ArgumentParser();ap.add_argument('db',type=Path);ap.add_argument('--population');ap.add_argument('--scope',dest='scope');ap.add_argument('--since',required=True);ap.add_argument('--until',required=True);ap.add_argument('-o','--output',type=Path,required=True);a=ap.parse_args();pop=a.population or a.scope
if not pop:ap.error('--population is required')
c=sqlite3.connect(a.db);c.row_factory=sqlite3.Row;appeared=[];undeclared=[];disappeared=[]
for r in c.execute('SELECT * FROM logical_topology_intervals WHERE population_id=? AND valid_from>=? AND valid_from<=? ORDER BY valid_from,edge_key',(pop,a.since,a.until)).fetchall():
dm=match_edge(c,r,pop,r['valid_from']);x=edge(r,dm);appeared.append(x)
if not dm['declared']:undeclared.append(dict(x))
for r in c.execute('SELECT * FROM logical_topology_intervals WHERE population_id=? AND closed_at IS NOT NULL AND closed_at>=? AND closed_at<=? ORDER BY closed_at,edge_key',(pop,a.since,a.until)).fetchall():
dm=match_edge(c,r,pop,r['closed_at']);disappeared.append(edge(r,dm))
out={'lens_id':'fiam.lens.architecture-changes','window':{'since':a.since,'until':a.until,'population_id':pop},'summary':{'appeared':len(appeared),'disappeared':len(disappeared),'newly_undeclared':len(undeclared)},'appeared':appeared,'disappeared':disappeared,'newly_undeclared':undeclared};a.output.write_text(yaml.safe_dump(out,sort_keys=False))
if __name__=='__main__':main()