d0c-s4vage / lookatme

An interactive, terminal-based markdown presenter
https://lookatme.readthedocs.io/en/latest/
MIT License
2.1k stars 62 forks source link

AttributeError: can't set attribute #224

Open pcoccoli opened 7 months ago

pcoccoli commented 7 months ago

Describe the bug Unable to use any markdown file with fenced code blocks, like the terminal_ext example

To Reproduce

Steps to reproduce the behavior:

lookatme ~/Downloads/example.md

Expected behavior Render the slides

Screenshots

Traceback (most recent call last):
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/__main__.py", line 169, in main
    pres.run()
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/pres.py", line 159, in run
    self.tui = lookatme.tui.create_tui(self, start_slide=start_slide)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 435, in create_tui
    tui = MarkdownTui(pres, start_slide)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 242, in __init__
    self.prep_pres(self.pres, start_idx)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 255, in prep_pres
    self.update()
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 370, in update
    self.update_body()
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 339, in update_body
    rendered = self.slide_renderer.render_slide(self.curr_slide)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 77, in render_slide
    raise res
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 101, in run
    res = self.do_render(to_render, slide_num)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 153, in do_render
    self._render_tokens(tokens)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/tui.py", line 196, in _render_tokens
    res = render_token(token, stack[-1], stack, self.loop)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/contrib/__init__.py", line 120, in inner
    return fn(*args, **kwargs)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/render/markdown_block.py", line 629, in render_code
    res = pygments_render.render_text(text, lang=lang)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/render/pygments.py", line 72, in render_text
    x[0].background = style_bg
AttributeError: can't set attribute

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pcoccoli/.pyenv/versions/gh392/bin/lookatme", line 8, in <module>
    sys.exit(main())
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/__main__.py", line 171, in main
    number = pres.get_tui().curr_slide.number + 1
  File "/home/pcoccoli/.pyenv/versions/gh392/lib/python3.9/site-packages/lookatme/pres.py", line 164, in get_tui
    raise ValueError(
ValueError: Tui has not been set, has the presentation been run yet?

Environment (please complete the following information):

Additional context Pygments==2.17.2

reinerh commented 6 months ago

Same error when building the Debian package and running tests:

I: pybuild base:305: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_lookatme/build; python3.11 -m pytest tests
============================= test session starts ==============================
platform linux -- Python 3.11.8, pytest-8.1.1, pluggy-1.4.0
rootdir: /<<PKGBUILDDIR>>
plugins: mock-3.12.0
collected 39 items

tests/test_cli.py .....                                                  [ 12%]
tests/test_contrib.py .                                                  [ 15%]
tests/test_file_loader.py FFFF                                           [ 25%]
tests/test_markdown.py .......FFFF                                       [ 53%]
tests/test_parse.py ......                                               [ 69%]
tests/test_schemas.py ......                                             [ 84%]
tests/test_table.py ...                                                  [ 92%]
tests/test_tutorial.py ...                                               [100%]

=================================== FAILURES ===================================
_______________________________ test_file_loader _______________________________

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_file_loader0')
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486fb31e10>

    def test_file_loader(tmpdir, mocker):
        """Test the built-in file loader extension
        """
        tmppath = tmpdir.join("test.py")
        tmppath.write("print('hello')")

>       rendered = render_markdown(f"""
    ```file
    path: {tmppath}
    relative: false
    """)

tests/test_file_loader.py:42:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = b"print('hello')", lang = 'auto', style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError ___ test_file_loader_with_transform ____

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_file_loader_with_transfor0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486e7305d0>

def test_file_loader_with_transform(tmpdir, mocker):
    """Test the built-in file loader extension
    """
    tmppath = tmpdir.join("test.py")
    tmppath.write("""
Hello
Apples2
there
Apples3
there
Apples1
""")
  rendered = render_markdown(f"""
path: {tmppath}
relative: false
transform: "grep -i apples | sort"

""")

tests/test_file_loader.py:72:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = b'Apples1\nApples2\nApples3\n', lang = 'auto', style_name = 'monokai' plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError __ test_file_loader_relative ___

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_file_loader_relative0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486dd34350>

def test_file_loader_relative(tmpdir, mocker):
    """Test the built-in file loader extension
    """
    tmppath = tmpdir.join("test.py")
    tmppath.write("print('hello')")
  rendered = render_markdown("""
path: test.py
relative: true

""")

tests/test_file_loader.py:98:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = b"print('hello')", lang = 'auto', style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError __ test_file_loader_not_found __

mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486dd60d10>

def test_file_loader_not_found(mocker):
    """Test the built-in file loader extension
    """
  rendered = render_markdown("""
path: does_not_exist.py

""")

tests/test_file_loader.py:118:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = 'File not found', lang = 'text', style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError __ test_code ___

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_code0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486f243510>

def test_code(tmpdir, mocker):
    """Test code block rendering
    """
    setup_lookatme(tmpdir, mocker, style={
        "style": "monokai",
    })
  rendered = render_markdown("""

def some_fn(*args, **kargs):
pass```
""")

tests/test_markdown.py:249:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = 'def some_fn(*args, **kargs):\n pass', lang = 'python' style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError _ test_emptycodeblock

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_empty_codeblock0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486dd5d350>

def test_empty_codeblock(tmpdir, mocker):
    """Test that empty code blocks render correctly
    """
    setup_lookatme(tmpdir, mocker, style={
        "style": "monokai",
    })
  render_markdown("""
```""")

tests/test_markdown.py:271:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = '\n', lang = 'python', style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError ____ test_code_yaml ____

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_code_yaml0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486dda4ed0>

def test_code_yaml(tmpdir, mocker):
    """Test code block rendering with yaml language
    """
    setup_lookatme(tmpdir, mocker, style={
        "style": "monokai",
    })
  rendered = render_markdown("""

test: a value
test2: "another value"
array:
- item1
- item2
- item3
```""")

tests/test_markdown.py:284:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, **kwargs) lookatme/render/markdown_block.py:629: in render_code res = pygments_render.render_text(text, lang=lang)


text = 'test: a value\ntest2: "another value"\narray:\n - item1\n - item2\n - item3' lang = 'yaml', style_name = 'monokai', plain = False

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError _ test_inline __

tmpdir = local('/tmp/pytest-of-reiner/pytest-0/test_inline0') mocker = <pytest_mock.plugin.MockerFixture object at 0x7f486dd09750>

def test_inline(tmpdir, mocker):
    """Test inline markdown
    """
    setup_lookatme(tmpdir, mocker, style={
        "style": "monokai",
        "link": {
            "fg": "underline",
            "bg": "default",
        },
    })

    rendered = render_markdown("*emphasis*")
    assert rendered[1][0][0].foreground == "default,italics"
    assert row_text(rendered[1]).strip() == b"emphasis"

    rendered = render_markdown("**emphasis**")
    assert rendered[1][0][0].foreground == "default,underline"
    assert row_text(rendered[1]).strip() == b"emphasis"

    rendered = render_markdown("_emphasis_")
    assert rendered[1][0][0].foreground == "default,italics"
    assert row_text(rendered[1]).strip() == b"emphasis"

    rendered = render_markdown("__emphasis__")
    assert rendered[1][0][0].foreground == "default,underline"
    assert row_text(rendered[1]).strip() == b"emphasis"
  rendered = render_markdown("`inline code`")

tests/test_markdown.py:334:


tests/utils.py:44: in render_markdown contents = renderer.render_slide(slides[0], force=True) lookatme/tui.py:77: in render_slide raise res lookatme/tui.py:101: in run res = self.do_render(to_render, slide_num) lookatme/tui.py:153: in do_render self._render_tokens(tokens) lookatme/tui.py:196: in _render_tokens res = render_token(token, stack[-1], stack, self.loop) lookatme/contrib/init.py:120: in inner return fn(*args, kwargs) lookatme/render/markdown_block.py:493: in render_paragraph res = render_text(token, body, stack, loop) lookatme/contrib/init.py:120: in inner return fn(*args, *kwargs) lookatme/render/markdown_block.py:448: in render_text res = inlinelexer.output(text) /usr/lib/python3/dist-packages/mistune0.py:585: in output ret = manipulate(text) /usr/lib/python3/dist-packages/mistune0.py:579: in manipulate out = getattr(self, 'output%s' % key)(m) /usr/lib/python3/dist-packages/mistune0.py:680: in output_code return self.renderer.codespan(text) lookatme/render/markdown_inline.py:24: in inner return fn(text, styles) lookatme/contrib/init.py:120: in inner return fn(args, kwargs) lookatme/render/markdown_inline.py:238: in codespan res = pygments_render.render_text(" " + text + " ", plain=True)


text = ' inline code ', lang = 'text', style_name = 'monokai', plain = True

def render_text(text, lang="text", style_name=None, plain=False):
    """Render the provided text with the pygments renderer
    """
    if style_name is None:
        style_name = config.get_style()["style"]

    lexer = get_lexer(lang)
    formatter, style_bg = get_formatter(style_name)

    start = time.time()
    code_tokens = lexer.get_tokens(text)
    config.get_log().debug(
        f"Took {time.time()-start}s to render {len(text)} bytes")

    markup = []
    for x in formatter.formatgenerator(code_tokens):
        if style_bg:
          x[0].background = style_bg

E AttributeError: property 'background' of 'AttrSpec' object has no setter

lookatme/render/pygments.py:72: AttributeError =============================== warnings summary =============================== .pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:992: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if ismodule(module) and hasattr(module, 'file'):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:993: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd f = module.file

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:899: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd if getattr(object, 'file', None):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:900: DeprecationWarning: urwid.lcd_display is moved to urwid.display.lcd return object.file

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:992: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if ismodule(module) and hasattr(module, 'file'):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:993: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment f = module.file

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:899: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment if getattr(object, 'file', None):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:900: DeprecationWarning: urwid.html_fragment is moved to urwid.display.html_fragment return object.file

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:992: DeprecationWarning: urwid.web_display is moved to urwid.display.web if ismodule(module) and hasattr(module, 'file'):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:993: DeprecationWarning: urwid.web_display is moved to urwid.display.web f = module.file

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:899: DeprecationWarning: urwid.web_display is moved to urwid.display.web if getattr(object, 'file', None):

.pybuild/cpython3_3.11_lookatme/build/tests/test_file_loader.py::test_file_loader /usr/lib/python3.11/inspect.py:900: DeprecationWarning: urwid.web_display is moved to urwid.display.web return object.file

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_file_loader.py::test_file_loader - AttributeError: property... FAILED tests/test_file_loader.py::test_file_loader_with_transform - Attribute... FAILED tests/test_file_loader.py::test_file_loader_relative - AttributeError:... FAILED tests/test_file_loader.py::test_file_loader_not_found - AttributeError... FAILED tests/test_markdown.py::test_code - AttributeError: property 'backgrou... FAILED tests/test_markdown.py::test_empty_codeblock - AttributeError: propert... FAILED tests/test_markdown.py::test_code_yaml - AttributeError: property 'bac... FAILED tests/test_markdown.py::test_inline - AttributeError: property 'backgr... ================== 8 failed, 31 passed, 12 warnings in 0.41s ===================

carbon-steel commented 6 months ago

I'm also encountering this same problem on my Fedora machine when calling lookatme --tutorial

sarojregmi200 commented 4 months ago

Same Here in my machine (Arch) I found the issue that solves the installation errors caused due to pyyaml but am facing this issue when i use lookatme --tutorial.

I installed it using the virtual environment.

abz89 commented 3 months ago

I'm also encountering the same problem on my MacBook Pro M1 when running lookatme --tutorial

Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/__main__.py", line 169, in main
    pres.run()
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/pres.py", line 159, in run
    self.tui = lookatme.tui.create_tui(self, start_slide=start_slide)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 435, in create_tui
    tui = MarkdownTui(pres, start_slide)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 242, in __init__
    self.prep_pres(self.pres, start_idx)
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 255, in prep_pres
    self.update()
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 370, in update
    self.update_body()
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 339, in update_body
    rendered = self.slide_renderer.render_slide(self.curr_slide)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 77, in render_slide
    raise res
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 101, in run
    res = self.do_render(to_render, slide_num)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 153, in do_render
    self._render_tokens(tokens)
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/tui.py", line 196, in _render_tokens
    res = render_token(token, stack[-1], stack, self.loop)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/contrib/__init__.py", line 120, in inner
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/render/markdown_block.py", line 493, in render_paragraph
    res = render_text(token, body, stack, loop)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/contrib/__init__.py", line 120, in inner
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/render/markdown_block.py", line 448, in render_text
    res = inline_lexer.output(text)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/mistune.py", line 585, in output
    ret = manipulate(text)
          ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/mistune.py", line 579, in manipulate
    out = getattr(self, 'output_%s' % key)(m)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/mistune.py", line 680, in output_code
    return self.renderer.codespan(text)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/render/markdown_inline.py", line 24, in inner
    return fn(text, styles)
           ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/contrib/__init__.py", line 120, in inner
    return fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/render/markdown_inline.py", line 238, in codespan
    res = pygments_render.render_text(" " + text + " ", plain=True)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/render/pygments.py", line 72, in render_text
    x[0].background = style_bg
    ^^^^^^^^^^^^^^^
AttributeError: property 'background' of 'AttrSpec' object has no setter

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/homebrew/bin/lookatme", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/__main__.py", line 171, in main
    number = pres.get_tui().curr_slide.number + 1
             ^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/lookatme/pres.py", line 164, in get_tui
    raise ValueError(
ValueError: Tui has not been set, has the presentation been run yet?  

Tried the simple presentation with a simple code block too with the following command lookatme test.md --debug

Error rendering slide 3: property 'background' of 'AttrSpec' object has no setter
See /var/folders/sk/7ym9q08j4lxc75gtyl0yyqjc0000gn/T/lookatme.log for traceback
Aborted! 

(The full log file is here)

txemaotero commented 2 months ago

In case it helps... I found a similar issue and I ended up uninstalling the packages (pip uninstall lookatme). Then I cloned the repo cd into it and checkout the last release candidate: git checkout v3.0.0-rc5 Finally install that versions: pip install . That worked and I was able to run lookatme --tutorial

avegancafe commented 2 months ago

This might not help anyone, but I found I could "fix" this issue locally by, In /Users/<user>/.local/share/virtualenvs/talks-x72ke6s9/lib/python3.11/site-packages/lookatme/render/pygments.py (or wherever your error is pointing you to pygments.py), whatever line has the following (looks like line 72 here in lookatme==v2.5.5)

x[0].background = style_bg

And change it t:

x[0]._AttrSpec__set_background(style_bg)

I'm not 100% sure this is how you're supposed to modify the background, but at least it gets around the error...?

abz89 commented 2 months ago

I ended up installing newer lookatme by running the command pip install lookatme==3.0.0-rc5. So far, I haven't encountered any problems. I haven't tried @avegancafe 's solution since my lookatme has already upgraded

avegancafe commented 2 months ago

I unfortunately don’t like the styling of the new version as much, I could also probably figure out how to style it the same but it's definitely different ahah

Powerchu commented 1 month ago

hi @avegancafe @pcoccoli

Not sure how late am I to this but I have found a fix to this. I couldn't use @avegancafe solution of changing to _AttrSpec__set_background as my python complains that it is a read-only attribute

My solution:

go to venv\lib\python3.10\site-packages\urwid\display\common.py

line 798 has a property called background but no setter

I added the following:

@background.setter
    def background(self, background: str): 
        self.__set_background(background)

and it worked. Not sure if this can be resolved by getting a latest update to urwid