• A little source file analyzer

    From DFS@21:1/5 to All on Wed Oct 26 16:47:21 2022
    Nothing special, but kind of fun to use

    $python progname.py sourcefile.py

    ---------------------------------------------------------
    #count blank lines, comments, source code

    import sys

    #counters
    imports, blanks,comments, source = 0,0,0,0
    functions, dbexec, total = 0,0,0

    #python builtins
    builtins = 0
    bins = ['abs','aiter','all','any','anext','ascii','bin','bool','breakpoint','bytearray','bytes','callable','chr','classmethod','compile','complex','delattr','dict','dir','divmod','enumerate','eval','exec','filter','float','format','frozenset','getattr','globals'
    ,'hasattr','hash','help','hex','id','input','int','isinstance','issubclass','iter','len','list','locals','map','max','memoryview','min','next','object','oct','open','ord','pow','property','range','repr','reversed','round','set','setattr','slice','sorted',
    'staticmethod','str','sum','super','tuple','type','vars','zip']
    bins2,bins3 = [],[]
    for bi in bins: bins2.append(' ' + bi + '(') #look for leading space
    then builtin then open paren

    #todo use for source files other than .py
    ccomments = 0
    py_comment = ['#','~','@']
    c_comment = ['/*','//']

    #read file
    f = open(sys.argv[1], encoding='utf-8')
    lines = f.read().splitlines()
    f.close()

    #print builtin usage count
    #def binusage():

    #iterate file
    linenbr = 0
    for line in lines:
    line = line.strip()
    linenbr += 1

    if line == '' : blanks += 1
    if line != '':
    if line[0:1] == '#' : comments += 1
    if line[0:3] == '"""' : comments += 1
    if line[-3:1] == '"""' : comments += 1

    if line[0:1] not in ['#','"']:
    source += 1
    if line[0:3] == 'def' and line[-2:] == '):' : functions += 1
    if '.execute' in line : dbexec += 1
    if 'commit()' in line : dbexec += 1
    if 'import' in line : imports += 1
    if 'print(' in line : bins3.append('print')
    for bi in bins2: #usage of a python builtin function
    if bi in line:
    bins3.append(bi[1:-1])
    total += 1

    #output
    print('imports : ' + str(imports))
    print('source : ' + str(source))
    print('-functions: ' + str(functions))
    print('-db exec : ' + str(dbexec) + 'x')
    ctxt = ''
    x = [(i,bins3.count(i)) for i in sorted(set(bins3))]
    for bi,cnt in x: ctxt += bi + '('+ str(cnt) + '), '
    print('-builtins : ' + str(len(bins3)) + 'x [' + ctxt[:-2] + ']') print('comments : ' + str(comments))
    print('blanks : ' + str(blanks))
    print('Total : ' + str(total)) ---------------------------------------------------------

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)