The following issues were found

coq/lang.py
7 issues
Unable to import 'std2.pickle'
Error

Line: 5 Column: 1

              from string import Template
from typing import Mapping, MutableMapping, Optional, Union

from std2.pickle import new_decoder
from yaml import safe_load

from .consts import DEFAULT_LANG, LANG_ROOT



            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 8 Column: 1

              from std2.pickle import new_decoder
from yaml import safe_load

from .consts import DEFAULT_LANG, LANG_ROOT


def _get_lang(code: Optional[str], fallback: str) -> str:
    if code:
        return code.casefold()

            

Reported by Pylint.

Access to a protected member _specs of a client class
Error

Line: 46 Column: 5

                  specs: Mapping[str, str] = new_decoder(Mapping[str, str])(
        safe_load(yml_path.read_text("UTF-8"))
    )
    LANG._specs.update(specs)


init(None)

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from locale import getdefaultlocale
from string import Template
from typing import Mapping, MutableMapping, Optional, Union

from std2.pickle import new_decoder
from yaml import safe_load

from .consts import DEFAULT_LANG, LANG_ROOT


            

Reported by Pylint.

Unnecessary "else" after "return"
Error

Line: 12 Column: 5

              

def _get_lang(code: Optional[str], fallback: str) -> str:
    if code:
        return code.casefold()
    else:
        tag, _ = getdefaultlocale()
        tag = (tag or fallback).casefold()
        primary, _, _ = tag.partition("-")

            

Reported by Pylint.

Too few public methods (1/2)
Error

Line: 22 Column: 1

                      return lang


class _Lang:
    def __init__(self, specs: MutableMapping[str, str]) -> None:
        self._specs = specs

    def __call__(self, key: str, **kwds: Union[int, float, str]) -> str:
        spec = self._specs[key]

            

Reported by Pylint.

Missing function or method docstring
Error

Line: 34 Column: 1

              LANG = _Lang({})


def init(code: Optional[str]) -> None:
    lang = _get_lang(code, fallback=DEFAULT_LANG)
    lang_path = (LANG_ROOT / lang).with_suffix(".yml")
    yml_path = (
        lang_path
        if lang_path.exists()

            

Reported by Pylint.

coq/shared/lru.py
7 issues
__init__ method from base class 'UserDict' is not called
Error

Line: 9 Column: 5

              

class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:
        assert size > 0
        self._size = size
        self.data = OrderedDict()

    def __setitem__(self, key: K, item: V) -> None:

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from collections import OrderedDict, UserDict
from typing import Generic, TypeVar, cast

K = TypeVar("K")
V = TypeVar("V")


class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:

            

Reported by Pylint.

Class name "K" doesn't conform to PascalCase naming style
Error

Line: 4 Column: 1

              from collections import OrderedDict, UserDict
from typing import Generic, TypeVar, cast

K = TypeVar("K")
V = TypeVar("V")


class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:

            

Reported by Pylint.

Class name "V" doesn't conform to PascalCase naming style
Error

Line: 5 Column: 1

              from typing import Generic, TypeVar, cast

K = TypeVar("K")
V = TypeVar("V")


class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:
        assert size > 0

            

Reported by Pylint.

Too many ancestors (9/7)
Error

Line: 8 Column: 1

              V = TypeVar("V")


class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:
        assert size > 0
        self._size = size
        self.data = OrderedDict()


            

Reported by Pylint.

Missing class docstring
Error

Line: 8 Column: 1

              V = TypeVar("V")


class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:
        assert size > 0
        self._size = size
        self.data = OrderedDict()


            

Reported by Pylint.

Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
Security

Line: 10
Suggestion: https://bandit.readthedocs.io/en/latest/plugins/b101_assert_used.html

              
class LRU(UserDict, Generic[K, V]):
    def __init__(self, size: int) -> None:
        assert size > 0
        self._size = size
        self.data = OrderedDict()

    def __setitem__(self, key: K, item: V) -> None:
        if len(self) >= self._size:

            

Reported by Bandit.

coq/ci/main.py
7 issues
Unable to import 'std2.tree'
Error

Line: 5 Column: 1

              from json import dumps
from typing import Any

from std2.tree import recur_sort

from ..consts import LSP_ARTIFACTS, VARS
from .load import load_parsable
from .lsp import lsp


            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 7 Column: 1

              
from std2.tree import recur_sort

from ..consts import LSP_ARTIFACTS, VARS
from .load import load_parsable
from .lsp import lsp

_SNIPPET_ARTIFACTS = VARS / "snippets" / "coq+snippets.json"


            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 8 Column: 1

              from std2.tree import recur_sort

from ..consts import LSP_ARTIFACTS, VARS
from .load import load_parsable
from .lsp import lsp

_SNIPPET_ARTIFACTS = VARS / "snippets" / "coq+snippets.json"



            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 9 Column: 1

              
from ..consts import LSP_ARTIFACTS, VARS
from .load import load_parsable
from .lsp import lsp

_SNIPPET_ARTIFACTS = VARS / "snippets" / "coq+snippets.json"


def _json(o: Any) -> str:

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from asyncio.tasks import gather
from json import dumps
from typing import Any

from std2.tree import recur_sort

from ..consts import LSP_ARTIFACTS, VARS
from .load import load_parsable
from .lsp import lsp

            

Reported by Pylint.

Argument name "o" doesn't conform to snake_case naming style
Error

Line: 14 Column: 1

              _SNIPPET_ARTIFACTS = VARS / "snippets" / "coq+snippets.json"


def _json(o: Any) -> str:
    json = dumps(recur_sort(o), check_circular=False, ensure_ascii=False, indent=2)
    return json


async def main() -> None:

            

Reported by Pylint.

Missing function or method docstring
Error

Line: 19 Column: 1

                  return json


async def main() -> None:
    lsprotocol, snippets = await gather(lsp(), load_parsable())

    j_lsp = _json(lsprotocol)
    LSP_ARTIFACTS.write_text(j_lsp)


            

Reported by Pylint.

coq/lsp/protocol.py
7 issues
Unable to import 'std2.pickle'
Error

Line: 5 Column: 1

              from json import loads
from typing import Mapping, Optional

from std2.pickle import new_decoder

from ..consts import LSP_ARTIFACTS


@dataclass(frozen=True)

            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 7 Column: 1

              
from std2.pickle import new_decoder

from ..consts import LSP_ARTIFACTS


@dataclass(frozen=True)
class LSProtocol:
    CompletionItemKind: Mapping[Optional[int], str]

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from dataclasses import dataclass
from json import loads
from typing import Mapping, Optional

from std2.pickle import new_decoder

from ..consts import LSP_ARTIFACTS



            

Reported by Pylint.

Missing class docstring
Error

Line: 11 Column: 1

              

@dataclass(frozen=True)
class LSProtocol:
    CompletionItemKind: Mapping[Optional[int], str]
    InsertTextFormat: Mapping[Optional[int], str]


def _load() -> LSProtocol:

            

Reported by Pylint.

Attribute name "CompletionItemKind" doesn't conform to snake_case naming style
Error

Line: 12 Column: 5

              
@dataclass(frozen=True)
class LSProtocol:
    CompletionItemKind: Mapping[Optional[int], str]
    InsertTextFormat: Mapping[Optional[int], str]


def _load() -> LSProtocol:
    raw = LSP_ARTIFACTS.read_text("UTF-8")

            

Reported by Pylint.

Attribute name "InsertTextFormat" doesn't conform to snake_case naming style
Error

Line: 13 Column: 5

              @dataclass(frozen=True)
class LSProtocol:
    CompletionItemKind: Mapping[Optional[int], str]
    InsertTextFormat: Mapping[Optional[int], str]


def _load() -> LSProtocol:
    raw = LSP_ARTIFACTS.read_text("UTF-8")
    json: Mapping[str, Mapping[str, int]] = loads(raw)

            

Reported by Pylint.

Variable name "p" doesn't conform to snake_case naming style
Error

Line: 20 Column: 5

                  raw = LSP_ARTIFACTS.read_text("UTF-8")
    json: Mapping[str, Mapping[str, int]] = loads(raw)
    trans = {key: {v: k for k, v in val.items()} for key, val in json.items()}
    p: LSProtocol = new_decoder(LSProtocol, strict=False)(trans)
    return p


PROTOCOL = _load()

            

Reported by Pylint.

coq/clients/t9/types.py
6 issues
Missing module docstring
Error

Line: 1 Column: 1

              from dataclasses import dataclass
from typing import Optional, Sequence


@dataclass(frozen=True)
class ReqL2:
    before: str
    after: str
    filename: str

            

Reported by Pylint.

Missing class docstring
Error

Line: 6 Column: 1

              

@dataclass(frozen=True)
class ReqL2:
    before: str
    after: str
    filename: str
    region_includes_beginning: bool
    region_includes_end: bool

            

Reported by Pylint.

Missing class docstring
Error

Line: 16 Column: 1

              

@dataclass(frozen=True)
class ReqL1:
    Autocomplete: ReqL2


@dataclass(frozen=True)
class Request:

            

Reported by Pylint.

Attribute name "Autocomplete" doesn't conform to snake_case naming style
Error

Line: 17 Column: 5

              
@dataclass(frozen=True)
class ReqL1:
    Autocomplete: ReqL2


@dataclass(frozen=True)
class Request:
    request: ReqL1

            

Reported by Pylint.

Missing class docstring
Error

Line: 21 Column: 1

              

@dataclass(frozen=True)
class Request:
    request: ReqL1
    version: str


@dataclass(frozen=True)

            

Reported by Pylint.

Missing class docstring
Error

Line: 34 Column: 1

              

@dataclass(frozen=True)
class Response:
    old_prefix: str
    results: Sequence[_RespL1]

            

Reported by Pylint.

coq/lsp/types.py
6 issues
Attempted relative import beyond top-level package
Error

Line: 4 Column: 1

              from dataclasses import dataclass
from typing import Iterator, Literal, Optional, Sequence, TypedDict, Union

from ..shared.types import Completion

# https://microsoft.github.io/language-server-protocol/specification


class _Position(TypedDict):

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from dataclasses import dataclass
from typing import Iterator, Literal, Optional, Sequence, TypedDict, Union

from ..shared.types import Completion

# https://microsoft.github.io/language-server-protocol/specification


class _Position(TypedDict):

            

Reported by Pylint.

Missing class docstring
Error

Line: 19 Column: 1

                  end: _Position


class TextEdit(TypedDict):
    newText: str
    range: _Range


class InsertReplaceEdit(TypedDict):

            

Reported by Pylint.

Missing class docstring
Error

Line: 24 Column: 1

                  range: _Range


class InsertReplaceEdit(TypedDict):
    newText: str
    insert: _Range
    replace: _Range



            

Reported by Pylint.

Missing class docstring
Error

Line: 41 Column: 1

              _InsertTextFormat = int


class CompletionItem(TypedDict):
    label: str
    additionalTextEdits: Optional[Sequence[TextEdit]]
    detail: Optional[str]
    documentation: Union[str, _MarkupContent, None]
    filterText: Optional[str]

            

Reported by Pylint.

Missing class docstring
Error

Line: 64 Column: 1

              

@dataclass(frozen=True)
class LSPcomp:
    local_cache: bool
    items: Iterator[Completion]

            

Reported by Pylint.

coq/snippets/loaders/lsp.py
6 issues
Unable to import 'std2.pickle'
Error

Line: 7 Column: 1

              from pathlib import Path
from typing import AbstractSet, Iterator, Mapping, Sequence, Tuple, Union

from std2.pickle import new_decoder

from ..types import ParsedSnippet


@dataclass

            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 9 Column: 1

              
from std2.pickle import new_decoder

from ..types import ParsedSnippet


@dataclass
class _Unit:
    prefix: Union[str, Sequence[str]]

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from dataclasses import dataclass
from json import loads
from os import linesep
from pathlib import Path
from typing import AbstractSet, Iterator, Mapping, Sequence, Tuple, Union

from std2.pickle import new_decoder

from ..types import ParsedSnippet

            

Reported by Pylint.

Unnecessary "elif" after "return"
Error

Line: 24 Column: 5

              

def _prefix(prefix: Union[str, Sequence[str]]) -> AbstractSet[str]:
    if isinstance(prefix, str):
        return {prefix}
    elif isinstance(prefix, Sequence):
        return {*prefix}
    else:
        raise ValueError(prefix)

            

Reported by Pylint.

Unnecessary "elif" after "return"
Error

Line: 33 Column: 5

              

def _body(body: Union[str, Sequence[str]]) -> str:
    if isinstance(body, str):
        return body
    elif isinstance(body, Sequence):
        return linesep.join(body)
    else:
        raise ValueError(body)

            

Reported by Pylint.

Missing function or method docstring
Error

Line: 41 Column: 1

                      raise ValueError(body)


def parse(path: Path) -> Tuple[AbstractSet[str], Sequence[ParsedSnippet]]:
    text = path.read_text("UTF-8") if path.exists() else ""
    json = loads(text)
    fmt: _FMT = _DECODER(json)

    def cont() -> Iterator[ParsedSnippet]:

            

Reported by Pylint.

tests/tags/parser.py
5 issues
Attempted relative import beyond top-level package
Error

Line: 6 Column: 1

              from shutil import get_terminal_size
from unittest import IsolatedAsyncioTestCase

from ...coq.consts import TMP_DIR
from ...coq.tags.parse import parse, run


class Parser(IsolatedAsyncioTestCase):
    async def test_1(self) -> None:

            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 7 Column: 1

              from unittest import IsolatedAsyncioTestCase

from ...coq.consts import TMP_DIR
from ...coq.tags.parse import parse, run


class Parser(IsolatedAsyncioTestCase):
    async def test_1(self) -> None:
        tag = TMP_DIR / "TAG"

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from itertools import islice
from os import linesep
from shutil import get_terminal_size
from unittest import IsolatedAsyncioTestCase

from ...coq.consts import TMP_DIR
from ...coq.tags.parse import parse, run



            

Reported by Pylint.

Missing class docstring
Error

Line: 10 Column: 1

              from ...coq.tags.parse import parse, run


class Parser(IsolatedAsyncioTestCase):
    async def test_1(self) -> None:
        tag = TMP_DIR / "TAG"
        TMP_DIR.mkdir(parents=True, exist_ok=True)
        if not tag.exists():
            text = await run("--recurse")

            

Reported by Pylint.

Missing function or method docstring
Error

Line: 11 Column: 5

              

class Parser(IsolatedAsyncioTestCase):
    async def test_1(self) -> None:
        tag = TMP_DIR / "TAG"
        TMP_DIR.mkdir(parents=True, exist_ok=True)
        if not tag.exists():
            text = await run("--recurse")
            tag.write_text(text)

            

Reported by Pylint.

coq/registry.py
5 issues
Unable to import 'pynvim_pp.atomic'
Error

Line: 3 Column: 1

              from typing import Any, Callable

from pynvim_pp.atomic import Atomic
from pynvim_pp.autocmd import AutoCMD
from pynvim_pp.rpc import RPC


def _name_gen(fn: Callable[[Callable[..., Any]], str]) -> str:
    return f"COQ{fn.__qualname__.lstrip('_')}"

            

Reported by Pylint.

Unable to import 'pynvim_pp.autocmd'
Error

Line: 4 Column: 1

              from typing import Any, Callable

from pynvim_pp.atomic import Atomic
from pynvim_pp.autocmd import AutoCMD
from pynvim_pp.rpc import RPC


def _name_gen(fn: Callable[[Callable[..., Any]], str]) -> str:
    return f"COQ{fn.__qualname__.lstrip('_')}"

            

Reported by Pylint.

Unable to import 'pynvim_pp.rpc'
Error

Line: 5 Column: 1

              
from pynvim_pp.atomic import Atomic
from pynvim_pp.autocmd import AutoCMD
from pynvim_pp.rpc import RPC


def _name_gen(fn: Callable[[Callable[..., Any]], str]) -> str:
    return f"COQ{fn.__qualname__.lstrip('_')}"


            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from typing import Any, Callable

from pynvim_pp.atomic import Atomic
from pynvim_pp.autocmd import AutoCMD
from pynvim_pp.rpc import RPC


def _name_gen(fn: Callable[[Callable[..., Any]], str]) -> str:
    return f"COQ{fn.__qualname__.lstrip('_')}"

            

Reported by Pylint.

Argument name "fn" doesn't conform to snake_case naming style
Error

Line: 8 Column: 1

              from pynvim_pp.rpc import RPC


def _name_gen(fn: Callable[[Callable[..., Any]], str]) -> str:
    return f"COQ{fn.__qualname__.lstrip('_')}"


autocmd = AutoCMD()
atomic = Atomic()

            

Reported by Pylint.

coq/snippets/main.py
5 issues
Attempted relative import beyond top-level package
Error

Line: 4 Column: 1

              from argparse import ArgumentParser, Namespace
from sys import stdin

from ..shared.context import EMPTY_CONTEXT
from ..shared.types import SnippetEdit
from .parse import parse


def _parse_args() -> Namespace:

            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 5 Column: 1

              from sys import stdin

from ..shared.context import EMPTY_CONTEXT
from ..shared.types import SnippetEdit
from .parse import parse


def _parse_args() -> Namespace:
    parser = ArgumentParser()

            

Reported by Pylint.

Attempted relative import beyond top-level package
Error

Line: 6 Column: 1

              
from ..shared.context import EMPTY_CONTEXT
from ..shared.types import SnippetEdit
from .parse import parse


def _parse_args() -> Namespace:
    parser = ArgumentParser()
    parser.add_argument("grammar", choices=("lsp", "snu"))

            

Reported by Pylint.

Missing module docstring
Error

Line: 1 Column: 1

              from argparse import ArgumentParser, Namespace
from sys import stdin

from ..shared.context import EMPTY_CONTEXT
from ..shared.types import SnippetEdit
from .parse import parse


def _parse_args() -> Namespace:

            

Reported by Pylint.

Missing function or method docstring
Error

Line: 15 Column: 1

                  return parser.parse_args()


def main() -> None:
    args = _parse_args()
    edit = SnippetEdit(grammar=args.grammar, new_text=stdin.read())
    parsed = parse(set(), context=EMPTY_CONTEXT, snippet=edit, sort_by="", visual="")
    print(parsed)

            

Reported by Pylint.