@@ -266,6 +266,7 @@ def _record(self) -> logging.LogRecord:
266266
267267class PullRequestCheck :
268268 _package_files = ['package.yml' ]
269+ _pspec_files = ['pspec_x86_64.xml' ]
269270 _two_letter_dirs = ['py' ]
270271 _config : Optional [Config ] = None
271272
@@ -290,6 +291,10 @@ def config(self) -> Config:
290291 def package_files (self ) -> List [str ]:
291292 return self .filter_files (* self ._package_files )
292293
294+ @property
295+ def pspec_files (self ) -> List [str ]:
296+ return self .filter_files (* self ._pspec_files )
297+
293298 def filter_files (self , * allowed : str ) -> List [str ]:
294299 return [f for f in self .files
295300 if os .path .basename (f ) in allowed ]
@@ -458,6 +463,26 @@ def _has_monitoring_yml(self, file: str) -> bool:
458463 return self ._exists (os .path .join (os .path .dirname (file ), 'monitoring.yaml' ))
459464
460465
466+ class License (PullRequestCheck ):
467+ _error = 'Package is missing license files'
468+ _level = Level .WARNING
469+ _globs = [
470+ '**/licenses/**' ,
471+ '/usr/lib/python*/site-packages/*.dist-info/LICENSE' ,
472+ ]
473+
474+ def run (self ) -> List [Result ]:
475+ return [Result (message = self ._error , file = f , level = self ._level )
476+ for f in self .pspec_files
477+ if not self ._has_license (f )]
478+
479+ def _has_license (self , file : str ) -> bool :
480+ return any (self ._match_globs (f ) for f in PspecXML (self ._read (file )).files )
481+
482+ def _match_globs (self , path : str ) -> bool :
483+ return any (fnmatch .fnmatch (path , pattern ) for pattern in self ._globs )
484+
485+
461486class PackageBumped (PullRequestCheck ):
462487 _msg = 'Package release is not incremented by 1'
463488 _msg_new = 'Package release is not 1'
@@ -847,6 +872,7 @@ class Checker:
847872 FrozenPackage ,
848873 Homepage ,
849874 Monitoring ,
875+ License ,
850876 PackageBumped ,
851877 PackageDependenciesOrder ,
852878 PackageDirectory ,
0 commit comments