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)