Hi Bryan,

Sphinx sets `env.docname` during reading docs (env.read_doc()). So I
feel a bit strange your situation.
Could you share stacktrace of the error?

Thanks,
Takeshi KOMIYA

2017-06-24 6:27 GMT+09:00 Bryan Van de ven <[email protected]>:
> Hi All,
>
> I've developed a "bokeh-gallery" extension to help with automating our
> project documentation. It is used to generate the gallery below:
>
>     http://bokeh.pydata.org/en/latest/docs/gallery.html
>
> After trying to update from Sphinx 1.5.x to 1.6.x, I get the following
> exception:
>
> Exception occurred:
>   File
> "/Users/bryan/anaconda/lib/python3.6/site-packages/Sphinx-1.6.2-py3.6.egg/sphinx/environment/__init__.py",
> line 785, in docname
>     return self.temp_data['docname']
> KeyError: 'docname'
>
>
> The full code for the extension is here:
>
>
> https://github.com/bokeh/bokeh/blob/master/bokeh/sphinxext/bokeh_gallery.py
>
> But i've included the just the "run: code, which seems the be the problem
> below. (It's been updated with a workaround I describe below) The extension
> works by reading a JSON config that lists gallery files, then reading doc
> for all these in a loop. Then it generates some RST txt with ".. image"
> links to the docs generated in the links, which it passes to self._parse.
> It's this step that fails. Evidently now the value of env.docname is erased
> during the loop that reads docs. When self._parse is called with the
> generated RST txt, the image collector tries to access env.docname,
> resulting in the exception above.
>
> I can "fix" this by saving the docname before the loop, then setting
> env.temp_data['docname'] = current_docname as seen below. But this seems
> like a pretty bad workaround. What is the right way to do what I am doing,
> which is basically:
>
> * read in a bunch of files and generate docs for them
> * generate a string of RST text for the current doc
> * parse that dynamically generated RST text
>
> Thanks for any guidance,
>
> Bryan
>
> class BokehGalleryDirective(BokehDirective):
>
>
>     has_content = False
>     required_arguments = 1
>
>
>     def run(self):
>         env = self.state.document.settings.env
>         app = env.app
>
>
>         current_docname = env.docname
>         docdir = dirname(env.doc2path(current_docname))
>
>
>         dest_dir = join(docdir, "gallery")
>         ensuredir(dest_dir)
>
>
>         specpath = join(docdir, self.arguments[0])
>         env.note_dependency(specpath)
>         spec = json.load(open(specpath))
>         details = spec['details']
>
>
>         details_iter = status_iterator(details,
>                                        'copying gallery files... ',
>                                        "brown",
>                                        len(details),
>                                        app.verbosity,
>                                        lambda x: x['name'] + ".py")
>
>
>         env.gallery_updated = []
>         for detail in details_iter:
>             src_path = abspath(join("..", detail['path']))
>             dest_path = join(dest_dir, detail['name'] + ".py")
>
>
>             # sphinx pickled env works only with forward slash
>             docname = join(env.app.config.bokeh_gallery_dir,
> detail['name']).replace("\\","/")
>
>
>             try:
>                 copyfile(src_path, dest_path)
>             except OSError as e:
>                 raise SphinxError('cannot copy gallery file %r, reason: %s'
> % (src_path, e))
>
>
>             try:
>                 env.clear_doc(docname)
>                 env.read_doc(docname, app=app)
>                 env.gallery_updated.append(docname)
>             except Exception as e:
>                 raise SphinxError('failed to read gallery doc %r, reason:
> %s' % (docname, e))
>
>
>         names = [detail['name']for detail in details]
>         rst_text = GALLERY_PAGE.render(names=names)
>
>
>         # current docname has been cleared, not sure a better way to restore
>         env.temp_data['docname'] = current_docname
>         return self._parse(rst_text, "<bokeh-gallery>")
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sphinx-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sphinx-users.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sphinx-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sphinx-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to