Assistant: codex Assistant-Model: gpt-5.6-luna Assistant-Session: 01a087b0-7b1e-7531-8ef3-6525ebaf7ee7
21 lines
2.1 KiB
Python
Executable file
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()
|