Files
ARCADIA-Studio/harness/analysis-mixed-rename-execution-20260924/envelope_literal_counts.py
T

48 lines
4.2 KiB
Python

"""Independent literal counts only; does not import/run any application parser."""
from pathlib import Path
import json, re, hashlib
root=Path(__file__).resolve().parents[2]
out=Path(__file__).parent
def uid(n): return f'00000000-0000-0000-0000-{n:012}'
def doc(body): return f'arcadia 8;\nproject p "Project" id "{uid(1)}" {{\n{body}\n}}\n'
def rich(sa):
prop,work=('sa_property','sa_function') if sa else ('oa_property','oa_activity')
diagram='layer Sa;' if sa else ''
extra=f'sa_system s "System" id "{uid(6)}" {{}}' if sa else ''
main=doc(f'include "b.arcadia"; include "a.arcadia";\nnode n id "{uid(4)}" {{ diagram @d; element @v; }}\n{prop} v "Value" id "{uid(3)}" {{ subject @w; type Number; base @f(y: 2, x: @g(x: 3, y: 4)) + @f(x: 5, y: 6); }}\n{work} w "Work" id "{uid(2)}" {{}}\ndiagram d "Diagram" id "{uid(5)}" {{ {diagram} }}\n{extra}')
files={'main.arcadia':main}
for file,alias,name,n,op in [('a.arcadia','f','F',10,'+'),('b.arcadia','g','G',11,'-')]:
files[file]=f'calculation {alias} "{name}" id "{uid(n)}" {{\ninput x id "{uid(1)}" : Number;\ninput y id "{uid(12)}" : Number;\nresult Number; body $x {op} $y;\n}}\n'
assert len(main.encode())==(548 if sa else 474)
assert len(files['a.arcadia'].encode())==len(files['b.arcadia'].encode())==213
return files
pattern=re.compile(rb'(?P<space>[ \t\r\n]+)|(?P<comment>//[^\n]*)|(?P<string>"(?:[^"\\]|\\.)*")|(?P<word>[A-Za-z_][A-Za-z_0-9]*)|(?P<number>[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)|(?P<op>[<>!=]=)|(?P<punct>[{}();,\[\]:=@$+*/<>!\-])')
def count(files):
result=[]
for path,text in sorted(files.items()):
raw=text if isinstance(text,bytes) else text.encode()
cursor=0; significant=0; depth=0; peak=0; strings=0; stringmax=0
for m in pattern.finditer(raw):
assert m.start()==cursor,(path,cursor)
cursor=m.end()
if m.lastgroup in ('space','comment'): continue
significant+=1
if m.lastgroup=='string': strings+=1; stringmax=max(stringmax,len(m[0]))
if m[0] in (b'{',b'[',b'('): depth+=1; peak=max(peak,depth)
if m[0] in (b'}',b']',b')'): depth-=1; assert depth>=0
assert cursor==len(raw) and depth==0
result.append({'file':path,'bytes':len(raw),'significant_tokens':significant,'max_delimiter_depth':peak,'string_tokens':strings,'max_quoted_token_bytes':stringmax})
return {'files':result,'total_bytes':sum(x['bytes'] for x in result),'total_tokens':sum(x['significant_tokens'] for x in result),'max_file_tokens':max(x['significant_tokens'] for x in result),'output_path_bytes':len('main.arcadia')+sum(len(p.encode()) for p in files)}
category=(root/'.local/as3batch/crates/oa-core/src/language/analysis_source/mixed/project/ordinary_index/tests/fixtures/categories.arcadia').read_bytes()
assert hashlib.sha256(category).hexdigest()=='3943579866157c7b5d95ce9edcb2d643058826b9af44257557e2864f130d15fc'
route64=category.replace(b'routes [{ edge @link; }];',b'routes [{ edge @link; waypoints ['+b', '.join([b'{ x 0; y 0; }']*64)+b']; }];')
assert len(route64)==3124
shapes={'tiny':{'main.arcadia':doc('')},'rich_oa':rich(False),'rich_sa':rich(True),'category_route64':{'main.arcadia':route64}}
shapes['wide1024']={'main.arcadia':doc(f'calculation wide "Wide" id "{uid(82)}" {{ result List(Number); body ['+', '.join(['1']*1024)+']; }')}
shapes['deep127']={'main.arcadia':doc(f'calculation deep "Deep" id "{uid(81)}" {{ result Number; body '+'abs('*127+'1'+')'*127+'; }')}
shapes['grouped127']={'main.arcadia':doc(f'calculation grouped "Grouped" id "{uid(81)}" {{ result Number; body '+'('*127+'1'+')'*127+'; }')}
shapes['include_paths']={'main.arcadia':doc('include "dir/left.arcadia"; include "dir/right.arcadia";'),'dir/left.arcadia':'include "../shared.arcadia";','dir/right.arcadia':'include "../shared.arcadia";','shared.arcadia':'// shared\n'}
results={k:count(v) for k,v in shapes.items()}
(out/'ENVELOPE-LITERAL-COUNTS.json').write_text(json.dumps({'scope':'Literal lexical counts, not parser admission or allocation measurement.','shapes':results},indent=2)+'\n')
print(json.dumps({k:{x:v[x] for x in ['total_bytes','total_tokens','max_file_tokens','output_path_bytes']} for k,v in results.items()},indent=2))