48 lines
4.2 KiB
Python
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))
|