diff --git a/tools/github_ci_tool.py b/tools/github_ci_tool.py index 29edd43..b4a1422 100644 --- a/tools/github_ci_tool.py +++ b/tools/github_ci_tool.py @@ -15,40 +15,49 @@ class GitHubCIHelper(BaseTool): # Inherits from BaseTool A helper class to interact with GitHub Actions CI, specifically for fetching and analyzing test logs. """ - def __init__(self, repo_owner: str, repo_name: str, github_token: str = None, session=None, logger_instance=None): # Added session and logger_instance - """ - Initializes the GitHubCIHelper. - - Args: - repo_owner (str): The owner of the GitHub repository (e.g., '''bucolucas'''). - repo_name (str): The name of the GitHub repository (e.g., '''cyclop'''). - github_token (str, optional): A GitHub Personal Access Token (PAT) - for API authentication. Recommended for - private repos or higher rate limits. - Can also be set via GITHUB_TOKEN env var. - session (requests.Session, optional): An external requests session to use. - logger_instance (logging.Logger, optional): An external logger instance. - """ - self.repo_owner = repo_owner - self.repo_name = repo_name + def __init__(self, repo_owner: str = None, repo_name: str = None, github_token: str = None, session=None, logger_instance=None): + # Call BaseTool's init. BaseTool's __init__ expects 'logger' as the arg name. + super().__init__(logger=logger_instance) + + # Logger setup: Prefer logger_instance, then BaseTool's logger, then a default. + if logger_instance: + self.logger = logger_instance + elif not hasattr(self, 'logger') or self.logger is None: # If BaseTool didn't set it or set to None + self.logger = logging.getLogger(__name__ + '.' + self.__class__.__name__) + # Ensure logger has handlers to prevent "No handlers could be found" + if not self.logger.handlers: + self.logger.addHandler(logging.NullHandler()) + + # Repo owner and name handling + if repo_owner and repo_name: + self.repo_owner = repo_owner + self.repo_name = repo_name + else: + github_repository = os.environ.get("GITHUB_REPOSITORY") + if not github_repository or '/' not in github_repository: + self.logger.error("GITHUB_REPOSITORY environment variable not set or in incorrect format (expected 'owner/repo') and repo_owner/repo_name not provided during __init__.") + raise ValueError("GITHUB_REPOSITORY environment variable not set or in incorrect format (expected 'owner/repo') and repo_owner/repo_name not provided.") + self.repo_owner, self.repo_name = github_repository.split('/', 1) + self.logger.info(f"Initialized repo_owner/repo_name from GITHUB_REPOSITORY: {self.repo_owner}/{self.repo_name}") + self.base_url = f"https://api.github.com/repos/{self.repo_owner}/{self.repo_name}" - self._token = github_token or os.environ.get("GITHUB_TOKEN") # Renamed to _token for consistency + self._token = github_token or os.environ.get("GITHUB_TOKEN") + + if not self._token: + self.logger.warning("GitHub token not provided directly or via GITHUB_TOKEN. API requests may be rate-limited or fail for private resources.") self.headers = { "Accept": "application/vnd.github.v3+json" } - if self._token: # Use self._token + if self._token: self.headers["Authorization"] = f"token {self._token}" - + if session: self.session = session else: self.session = requests.Session() - # Headers are applied per-request in _make_request or directly where self.session is used if needed globally for session - - self.logger = logger_instance if logger_instance else logging.getLogger(__name__) - if not self.logger.handlers: - self.logger.addHandler(logging.NullHandler()) + + self.logger.info(f"GitHubCIHelper initialized for {self.repo_owner}/{self.repo_name}.") def get_functions(self): return [ @@ -400,4 +409,3 @@ if __name__ == "__main__": else: example_logger.info(f"No failed 'Python CI' workflow run found for PR #{pr_number} or the PR doesn't exist/no runs yet.") -