rcarriga/vim-ultest

ImportError when looking for Literal or Protocol in Python 3.7 typing

spigot opened this issue · 1 comments

error caught in notification handler 'b'/home/michael/.local/share/nvim/site/plugged/vim-ultest/rplugin/python3/ultest:function:_ultest_update_positions' [[b'nvim/.config/nvim/init_plug.vim']]'
Traceback (most recent call last):
  File "/home/michael/.local/lib/python3.7/site-packages/pynvim/plugin/host.py", line 145, in _on_notification
    handler(*args)
  File "/home/michael/.local/lib/python3.7/site-packages/pynvim/plugin/host.py", line 89, in _wrap_delayed_function
    self._discover_functions(plugin, module_handlers, path, False)
  File "/home/michael/.local/lib/python3.7/site-packages/pynvim/plugin/host.py", line 220, in _discover_functions
    for _, fn in inspect.getmembers(obj, predicate):
  File "/usr/lib/python3.7/inspect.py", line 341, in getmembers
    value = getattr(object, key)
  File "/home/michael/.local/share/nvim/site/plugged/vim-ultest/rplugin/python3/ultest/__init__.py", line 76, in handler
    from .handler import HandlerFactory
  File "/home/michael/.local/share/nvim/site/plugged/vim-ultest/rplugin/python3/ultest/handler/__init__.py", line 8, in <module>
    from ..models import File, Namespace, Position, Result, Test, Tree
  File "/home/michael/.local/share/nvim/site/plugged/vim-ultest/rplugin/python3/ultest/models/__init__.py", line 3, in <module>
    from .file import File
  File "/home/michael/.local/share/nvim/site/plugged/vim-ultest/rplugin/python3/ultest/models/file.py", line 2, in <module>
    from typing import List, Literal
ImportError: cannot import name 'Literal' from 'typing' (/usr/lib/python3.7/typing.py)

Describe the bug
Literal and Protocol weren't added to typing until 3.8

To Reproduce
install vim-ultest on a system with Python 3.7

Additional context
vim-ultest/rplugin/python3/ultest/models/file.py
vim-ultest/rplugin/python3/ultest/models/namespace.py
vim-ultest/rplugin/python3/ultest/models/tree.py
vim-ultest/rplugin/python3/ultest/models/tree.py
all attempt to import either Literal or Protocol from typing. both were added in 3.8. you can find them in typing_extensions, though. so this code replacing the import (for Literal or Protocol where appropriate) in those files seems to work after typing_extensions is installed via pip

try:
    from typing import Literal
except ImportError:
    from typing_extensions import Literal

Thanks for the report! These types are only needed for development so users shouldn't need to install a third party dependency for them. I've added fallback classes as a fix instead.