"""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[ \t\r\n]+)|(?P//[^\n]*)|(?P"(?:[^"\\]|\\.)*")|(?P[A-Za-z_][A-Za-z_0-9]*)|(?P[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)|(?P[<>!=]=)|(?P[{}();,\[\]:=@$+*/<>!\-])') 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))