import collections
import dataclasses
from typing import List, Optional
@dataclasses.dataclass
class DirMetadata:
'''A synthetic representation of a DIR_METADATA file.'''
component: Optional[str] = None
team: Optional[str] = None
os: Optional[str] = None
def copy(self):
return dataclasses.replace(self)
@dataclasses.dataclass
class Owners:
'''A synthetic representation of an OWNERS file.'''
owners_file: str
file_inherited: Optional[str] = None
owners: List[str] = dataclasses.field(default_factory=list)
@dataclasses.dataclass
class GitData:
'''Git data for a given hash/repo/folder.'''
cls: int = 0
reverted_cls: int = 0
relanded_cls: int = 0
lines_of_code: int = 0
number_of_files: int = 0
authors: collections.Counter = dataclasses.field(
default_factory=collections.Counter)
reviewers: collections.Counter = dataclasses.field(
default_factory=collections.Counter)
latest_cl_date: Optional[int] = None
git_head: Optional[str] = None
git_head_time: Optional[str] = None
def get_top_authors(self, n):
return self.authors.most_common(n)
def get_top_reviewers(self, n):
return self.reviewers.most_common(n)
@dataclasses.dataclass(frozen=True)
class RequestedPath:
'''Path to be searched for.'''
path: str
feature: str
@dataclasses.dataclass(frozen=True)
class PathData:
'''Path to be searched for.'''
owner: Owners
git_data: GitData
dir_metadata: DirMetadata