Skip to content

Error when importing pyodide for sphinx documentation build #288

@timonmerk

Description

@timonmerk

I am following this tutorial (https://panel.holoviz.org/how_to/wasm/sphinx.html), but unfortunately did not manage to build the documentation which show's the panel in sphix due to an import error based on pyodide in nbsite.
I included in a rst file the following pyodide block:

.. pyodide::
   import panel
   settings = {"key1" : 5, "key2" : 45}
   settings_panel = panel.pane.JSON(settings, name="JSON")
   settings_panel

and also included the nbsite_pyodide_conf configuration in the sphinx conf.py:

from panel.io.convert import BOKEH_VERSION, MINIMUM_VERSIONS, PY_VERSION
from panel.io.convert import BOKEH_VERSION, MINIMUM_VERSIONS, PY_VERSION
from panel.io.resources import CDN_DIST

def base_version(version: str) -> str:
    """Extract the final release and if available pre-release (alpha, beta,
    release candidate) segments of a PEP440 version, defined with three
    components (major.minor.micro).

    Useful to avoid nbsite/sphinx to display the documentation HTML title
    with a not so informative and rather ugly long version (e.g.
    ``0.13.0a19.post4+g0695e214``). Use it in ``conf.py``::

        version = release = base_version(package.__version__)

    Return the version passed as input if no match is found with the pattern.
    """
    # look at the start for e.g. 0.13.0, 0.13.0rc1, 0.13.0a19, 0.13.0b10
    pattern = r"([\d]+\.[\d]+\.[\d]+(?:a|rc|b)?[\d]*)"
    match = re.match(pattern, version)
    if match:
        return match.group()
    else:
        return version

version = release = base_version(panel.__version__)

if panel.__version__ != version and (PANEL_ROOT / 'dist' / 'wheels').is_dir():
    py_version = panel.__version__.replace("-dirty", "")
    panel_req = f'./wheels/panel-{py_version}-py3-none-any.whl'
    bokeh_req = f'./wheels/bokeh-{BOKEH_VERSION}-py3-none-any.whl'
else:
    panel_req = f'{CDN_DIST}wheels/panel-{PY_VERSION}-py3-none-any.whl'
    bokeh_req = f'{CDN_DIST}wheels/bokeh-{BOKEH_VERSION}-py3-none-any.whl'

def get_requirements():
    with open('pyodide_dependencies.json') as deps:
        dependencies = json.load(deps)
    requirements = {}
    for src, deps in dependencies.items():
        if deps is None:
            continue
        src = src.replace('.ipynb', '').replace('.md', '')
        for name, min_version in MINIMUM_VERSIONS.items():
            if any(name in req for req in deps):
                deps = [f'{name}>={min_version}' if name in req else req for req in deps]
        requirements[src] = deps
    return requirements


nbsite_pyodide_conf = {
    'PYODIDE_URL': 'https://cdn.jsdelivr.net/pyodide/v0.23.1/full/pyodide.js',
    'requirements': [bokeh_req, panel_req, 'pyodide-http'],
    'requires': get_requirements()
}

When trying to run the documentation with make html I get however this error:

Exception occurred:
File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\nbsite\pyodide_init_.py", line 257, in run
current_source = self.state_machine.get_source()
TypeError: StateMachine.get_source() missing 1 required positional argument: 'line_offset'

I checked the official site of pyodide but could not see that the same line is being called.

For compleness here the full traceback from sphinx:

# Sphinx version: 5.3.0
# Python version: 3.10.12 (CPython)
# Docutils version: 0.18.1 release
# Jinja2 version: 3.1.2
# Last messages:
#   reading sources... [ 66%] nm_projection
#   reading sources... [ 70%] nm_rereference
#   reading sources... [ 73%] nm_resample
#   reading sources... [ 76%] nm_run_analysis
#   reading sources... [ 80%] nm_settings
#   reading sources... [ 83%] nm_sharpwaves
#   reading sources... [ 86%] outline_analysis
#   reading sources... [ 90%] outline_featureestimation
#   reading sources... [ 93%] outline_parametrization
#   reading sources... [ 96%] param
# Loaded extensions:
#   sphinx.ext.mathjax (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\mathjax.py
#   sphinxcontrib.applehelp (1.0.4) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinxcontrib\applehelp\__init__.py
#   sphinxcontrib.devhelp (1.0.2) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinxcontrib\devhelp\__init__.py
#   sphinxcontrib.htmlhelp (2.0.1) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinxcontrib\htmlhelp\__init__.py
#   sphinxcontrib.serializinghtml (1.1.5) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinxcontrib\serializinghtml\__init__.py
#   sphinxcontrib.qthelp (1.0.3) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinxcontrib\qthelp\__init__.py
#   alabaster (0.7.13) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\alabaster\__init__.py
#   sphinx.ext.autodoc.preserve_defaults (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autodoc\preserve_defaults.py
#   sphinx.ext.autodoc.type_comment (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autodoc\type_comment.py
#   sphinx.ext.autodoc.typehints (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autodoc\typehints.py
#   sphinx.ext.autodoc (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autodoc\__init__.py
#   sphinx.ext.autosummary (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autosummary\__init__.py
#   sphinx.ext.doctest (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\doctest.py
#   sphinx.ext.intersphinx (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\intersphinx.py
#   sphinx.ext.viewcode (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\viewcode.py
#   numpydoc (1.5.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\numpydoc\__init__.py
#   sphinx.ext.napoleon (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\napoleon\__init__.py
#   sphinx.ext.autosectionlabel (5.3.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\ext\autosectionlabel.py
#   sphinx_gallery.gen_gallery (0.13.0) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx_gallery\gen_gallery.py
#   nbsphinx (0.9.2) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\nbsphinx\__init__.py
#   recommonmark (0.7.1) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\recommonmark\__init__.py
#   nbsite.pyodide (0.5) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\nbsite\pyodide\__init__.py
#   pydata_sphinx_theme (unknown version) from C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\pydata_sphinx_theme\__init__.py
Traceback (most recent call last):
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\cmd\build.py", line 281, in build_main
    app.build(args.force_all, args.filenames)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\application.py", line 347, in build
    self.builder.build_update()
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\builders\__init__.py", line 310, in build_update
    self.build(to_build,
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\builders\__init__.py", line 326, in build
    updated_docnames = set(self.read())
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\builders\__init__.py", line 433, in read
    self._read_serial(docnames)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\builders\__init__.py", line 454, in _read_serial
    self.read_doc(docname)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\builders\__init__.py", line 510, in read_doc
    publisher.publish()
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\core.py", line 217, in publish
    self.document = self.reader.read(self.source, self.parser,
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\io.py", line 104, in read
    self.parse()
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\readers\__init__.py", line 78, in parse
    self.parser.parse(self.input, document)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\sphinx\parsers.py", line 78, in parse
    self.statemachine.run(inputlines, document, inliner=self.inliner)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 170, in run
    results = StateMachineWS.run(self, input_lines, input_offset,
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 2779, in underline
    self.section(title, source, style, lineno - 1, messages)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 327, in section
    self.new_subsection(title, lineno, messages)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 393, in new_subsection
    newabsoffset = self.nested_parse(
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 281, in nested_parse
    state_machine.run(block, input_offset, memo=self.memo,
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 196, in run
    results = StateMachineWS.run(self, input_lines, input_offset)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\statemachine.py", line 240, in run
    context, next_state, result = self.check_line(
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\statemachine.py", line 452, in check_line
    return method(match, context, next_state)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 2352, in explicit_markup
    nodelist, blank_finish = self.explicit_construct(match)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 2364, in explicit_construct
    return method(self, expmatch)
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 2101, in directive
    return self.run_directive(
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\docutils\parsers\rst\states.py", line 2151, in run_directive
    result = directive_instance.run()
  File "C:\Users\ICN_admin\Anaconda3\envs\pynm-test\lib\site-packages\nbsite\pyodide\__init__.py", line 257, in run
    current_source = self.state_machine.get_source()
TypeError: StateMachine.get_source() missing 1 required positional argument: 'line_offset'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions