On Aug 17, 5:31 pm, Sebastian Wiesner <lunary...@googlemail.com> wrote: > 2010/8/17 Matt Williams <li...@milliams.com>: > > > While parts of this can obviously be done with plain Python, I was > > wondering how it should be done within the framework of Sphinx. This > > is particularly needed in order to re-evaluate the roles when the file > > has changed. > > Just attach your cache to the environment object "app.env": > > def init_doxylink(app): > tag_file_mtime = os.path.getmtime(tagfile) > if not hasattr(app.env, 'doxylink_cache'): > # no cache present, initialize it > app.env.doxylink_cache = DoxyLinkCache(tag_file_mtime) > elif tag_file_mtime > app.env.doxylink_cache.tag_file_mtime: > # tag file has been modified since cache creation > app.env.doxylink_cache = DoxyLinkCache(tag_file_mtime) > > def setup(app): > app.connect('builder-inited', init_doxylink) > > Sphinx pickles the whole environment object, so you get caching for > free for any object attached to the environment. You just need to > create the cache, in case sphinx has a fresh environment (e.g. built > after configuration changes, "make clean" or so), and to verify, if > the cache is up to date. This is done in "init_doxylink()", which is > run, when the builder is initialized. This is what > sphinx.ext.interspinx does. > > Of course, all access to the tag files must be done through the cache. > How the cache could be implemented, depends on the way your extension > works. collections.defaultdict generally makes a nice base class for > caches. You could for instance use signatures as keys, normalize them > internally, and re-implement __missing__ to look the signature up in > the cache file: > > class DoxyLinkCache(collections.defaultdict): > def __getitem__(self, signature): > return collections.defaultdict.__getitem__(self, normalize(signature)) > > def __missing__(self, signature): > # look up normalized signature in the tag file
Thankyou, this is very useful. I'll have a go at implementing this. I'm sure I'll have a few questions though :) Regards, Matt -- You received this message because you are subscribed to the Google Groups "sphinx-dev" group. To post to this group, send email to sphinx-...@googlegroups.com. To unsubscribe from this group, send email to sphinx-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sphinx-dev?hl=en.