bugbot/rules/webcompat_sightline.py (53 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. from typing import Any, Optional from bugbot import gcp from bugbot.bzcleaner import BzCleaner class WebcompatSightline(BzCleaner): WHITEBOARD_ENTRY = "[webcompat:sightline]" def __init__(self): super().__init__() self.sightline_ids = set() def description(self) -> str: return "Bugs with the [webcompat:sightline] whiteboard tag updated" def filter_no_nag_keyword(self) -> bool: return False def has_default_products(self) -> bool: return False def handle_bug( self, bug: dict[str, Any], data: dict[str, Any] ) -> Optional[dict[str, Any]]: bug_id = str(bug["id"]) whiteboard = bug["whiteboard"] if bug["id"] in self.sightline_ids: if self.WHITEBOARD_ENTRY not in whiteboard: self.autofix_changes[bug_id] = { "whiteboard": whiteboard + self.WHITEBOARD_ENTRY } return bug else: if self.WHITEBOARD_ENTRY in whiteboard: self.autofix_changes[bug_id] = { "whiteboard": whiteboard.replace(self.WHITEBOARD_ENTRY, "") } return bug return None def get_bz_params(self, date) -> dict[str, Any]: fields = ["id", "summary", "whiteboard"] self.sightline_ids = self.get_sightline_bug_ids() # Get all bugs that either have, or should have, the [webcompat:sightline] # whiteboard entry return { "include_fields": fields, "j_top": "OR", "f1": "bug_id", "o1": "anyexact", "v1": ",".join(str(item) for item in self.sightline_ids), "f2": "status_whiteboard", "o2": "substring", "v2": self.WHITEBOARD_ENTRY, } def get_sightline_bug_ids(self) -> set[int]: project = "moz-fx-dev-dschubert-wckb" dataset = "webcompat_knowledge_base" client = gcp.get_bigquery_client(project, ["cloud-platform", "drive"]) query = f""" SELECT number FROM `{project}.{dataset}.webcompat_topline_metric_site_reports` as bugs """ return {row["number"] for row in client.query(query).result()} if __name__ == "__main__": WebcompatSightline().run()