"""
find pgi coverage of all gi.repositorys.
you need to have access to both 'gi' and 'pgi' in the current python
environment.

In a virtualenv this works:

$ pip install pgi
$ pip install vext.gi

$ python pgi_coverage.py
"""

TYPELIB_DIR="/usr/lib/girepository-1.0"

from os.path import basename
from glob import glob
from textwrap import dedent

def test_pgi_coverage(gi_module, pgi_module):
    name_width = len(max(dir(gi_module), key=len))
    print('%s %s' % (gi_module.__name__.rjust(name_width), pgi_module.__name__))
    for name in dir(gi_module):
        if name.startswith('_'):
            continue
        status = 'OK'
        try:
            getattr(pgi_module, name)
        except NotImplementedError as e:
            #status = "FAIL: '%s'" % str(e.__class__.__name__)
            status = "FAIL"
            for line in str(e).splitlines():
                if line.startswith('NotImplementedError:'):
                    status =  status + "    " + line
        print("%s\t%s" % (name.rjust(name_width), status))
    print("")

def test_coverage(typelib):
    code = dedent("""
    from pgi.repository import {0} as PGI_{0}
    from gi.repository import {0} as GI_{0}

    test_pgi_coverage(GI_{0}, PGI_{0})
    """.format(typelib))

    try:
        print("PGI coverage of %s" % typelib)
        exec(code)
    except Exception as e:
        print("Skipped because of %s during test" % str(e))

def get_typelibs():
    typelibs = []

    for typelib in glob(TYPELIB_DIR + "/*.typelib"):
        fn = basename(typelib).partition("-")[0]
        typelibs.append(fn)
    return typelibs

if __name__=='__main__':
    typelibs = get_typelibs()
    for typelib in typelibs:
        test_coverage(typelib)

Check coverage of pgi, vs gi
Check coverage of pgi, vs gi

This loops through all the typelibs it can find and the methods, then tries to call them, to build a report to see coverage.

It's a fairly brute force approach but works..  not sure if this is the place to put this in the repo

Could probably extend this in various ways, maybe html output would be useful for some sort of web page ?