Source code for projectreport.analyzer.parsers.python.init

import ast
from pathlib import Path
from typing import List, Optional

from cached_property import cached_property
from typing_extensions import TypeGuard

from projectreport.analyzer.parsers.python.base import PythonParser
from projectreport.version import Version


[docs]class PythonInitParser(PythonParser): @cached_property def docstring(self) -> Optional[str]: if self.parsed is None: return None return ast.get_docstring(self.parsed) @cached_property def version(self) -> Optional[Version]: if self.parsed is None: return None # Walk ast to look for __version__ variable. If it is defined, extract the version from it for node in ast.walk(self.parsed): if _is_version_node(node): # Extract version from __version__ = "1.2.3" if isinstance(node.value, ast.Str): return Version.from_str(node.value.s) # Extract version from __version__ = 1.2 elif isinstance(node.value, ast.Num): return Version.from_str(str(node.value.n)) return None @cached_property def topics(self) -> Optional[List[str]]: # Topics are not specified in __init__.py return None
[docs] @classmethod def matches_path(cls, path: str) -> bool: return Path(path).name == "__init__.py"
def _is_version_node(node: ast.AST) -> TypeGuard[ast.Assign]: return ( isinstance(node, ast.Assign) and node.targets and hasattr(node.targets[0], "id") and node.targets[0].id == "__version__" # type: ignore )