Beispiel #1
0
def describe_class(classname, filename, verbose=False):
    """Returns a description dictionary for a class (called classname) 
    living in a file (called filename).  

    Parameters
    ----------
    classname : str
        Class to describe.
    filename : str
        File where the class is implemented.  Will remove leading ``'bright_'`` from
        filename for the puprose of generating other files.
    verbose : bool, optional
        Flag for printing extra information during description process.

    Returns
    -------
    desc : dict
        Description dictionary of the class.

    """
    # C++ description
    cppfilename = filename + '.cpp'
    if cache.isvalid(classname, cppfilename):
        cppdesc = cache[classname, cppfilename]
    else:
        cppdesc = describe(cppfilename, classname=classname, verbose=verbose)
        cache[classname, cppfilename] = cppdesc

    # python description
    if os.path.isfile(filename + '.py'):
        glbs = globals()
        locs = {}
        execfile(filename + '.py', glbs, locs)
        if 'desc' not in locs:
            pydesc = {}
        elif callable(locs['desc']):
            pydesc = eval('desc()', glbs, locs)
        else:
            pydesc = locs['desc']
    else:
        pydesc = {}

    desc = merge_descriptions([cppdesc, pydesc])
    basefilename = os.path.split(filename)[-1]
    dimfilename = basefilename[7:] if basefilename.startswith('bright_') else basefilename
    desc['cpp_filename'] = '{0}.cpp'.format(basefilename)
    desc['header_filename'] = '{0}.h'.format(basefilename)
    desc['metadata_filename'] = '{0}.py'.format(basefilename)
    desc['pxd_filename'] = '{0}.pxd'.format(dimfilename)
    desc['pyx_filename'] = '{0}.pyx'.format(dimfilename)
    desc['cpppxd_filename'] = 'cpp_{0}.pxd'.format(dimfilename)
    return desc
def test_merge_descriptions():
    obs = ad.merge_descriptions([exp_toaster_desc, meta_toaster_desc])
    exp = full_toaster_desc
    assert_equal(obs, exp)