VirusTotal / yara-python

The Python interface for YARA
http://virustotal.github.io/yara/
Apache License 2.0
650 stars 179 forks source link

Missing python interface file #218

Open JasperJuergensen opened 1 year ago

JasperJuergensen commented 1 year ago

The compiled yara-python is missing a python interface file (.pyi).

Without such an interface definition, support in IDEs is quite limited (no type hinting, no code completion).

I've created a small interface file based on the documentation, which is definitely not 100% correct, but enough to enable code completion and type hinting in VSCode:

from typing import IO, Callable, Dict, List, Tuple, Union

class Match:

    rule: str
    namespace: str
    tags: List[str]
    meta: Dict[str, str]
    strings: List[Tuple[int, str, str]]

class Rules:
    def match(
        self,
        filepath: str = "",
        pid: int = 0,
        data: Union[str, bytes] = "",
        externals: dict = {},
        callback: Callable = lambda x: x,
        fast: bool = False,
        timeout: int = -1,
        modules_data: dict = {},
        modules_callback: Callable = lambda x: x,
        warnings_callback: Callable = lambda x: x,
        which_callbacks: int = 0,
        console_callback: Callable = lambda x: x,
    ) -> List[Match]:
        pass
    def save(self, filepath: str = "", file: IO = None) -> None:
        pass

def compile(
    filepath: str = "",
    source: str = "",
    file: IO = None,
    filepaths: dict = {},
    sources: dict = {},
    externals: dict = {},
    includes: bool = True,
    error_on_warning: bool = False,
) -> Rules:
    pass

def load(filepath: str = "", file: IO = None) -> Rules:
    pass

def set_config(
    stack_size: int = -1, max_strings_per_rule: int = -1, max_match_data: int = -1
) -> None:
    pass

Adding a correct .pyi file to this repo, which can also be autogenerated using mypys stubgen (https://mypy.readthedocs.io/en/stable/stubgen.html), would obviously be the preferred solution. I already tried autogeneration with stubgen, which did not work that good (function parameters and type hints were missing).