Skip to content

Commit

Permalink
Add a rule to sync [webcompat:sightline] whiteboard entry
Browse files Browse the repository at this point in the history
This should be set on all bugs that are part of the webcompat metrics
set, and by no bugs that aren't.

This initial approach just gets all the bugs that are either in that
set or have the whiteboard entry, and implements the logic to update
them in the client. Given that we expect initially to have ~700 bugs
in that set, this means we need to set the maximum number of bugs to
update to something rather high.
  • Loading branch information
jgraham committed Nov 4, 2024
1 parent af573db commit 96524e0
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 15 deletions.
36 changes: 36 additions & 0 deletions bugbot/gcp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from typing import Iterable, Optional

from google.cloud import bigquery
from google.oauth2 import service_account

from bugbot import utils

SCOPES = {
"cloud-platform": "https://www.googleapis.com/auth/cloud-platform",
"drive": "https://www.googleapis.com/auth/drive",
}


def get_bq_client(
project: str, scopes: Optional[Iterable[str]] = None
) -> bigquery.Client:
"""Get a bigquery.Client for a given project
:param project: Name of the project.
:param scopes: Optional iterable containing the scopes the client should have.
By default this will be the cloud-platform scopes required to
run queries.
:returns: bigquery.Client
"""
scope_urls = []
if scopes is None:
scope_urls.append(SCOPES["cloud-platform"])
else:
for item in scopes:
scope_urls.append(SCOPES[item] if item in SCOPES else item)

credentials = service_account.Credentials.from_service_account_info(
utils.get_gcp_service_account_info()
).with_scopes(scope_urls)

return bigquery.Client(project=project, credentials=credentials)
17 changes: 2 additions & 15 deletions bugbot/rules/webcompat_platform_without_keyword.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@
# 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 google.cloud import bigquery
from google.oauth2 import service_account

from bugbot import utils
from bugbot import gcp
from bugbot.bzcleaner import BzCleaner


Expand Down Expand Up @@ -34,17 +31,7 @@ def get_core_bug_ids(self):
project = "moz-fx-dev-dschubert-wckb"
dataset = "webcompat_knowledge_base"

credentials = service_account.Credentials.from_service_account_info(
utils.get_gcp_service_account_info()
).with_scopes(
[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/drive",
]
)

client = bigquery.Client(project=project, credentials=credentials)

client = gcp.get_bq_client(project, ["cloud-platform", "drive"])
query = f"""
SELECT core_bug
FROM `{project}.{dataset}.prioritized_kb_entries` as kb_entries
Expand Down
79 changes: 79 additions & 0 deletions bugbot/rules/webcompat_sightline.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# 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):
normal_changes_max = 1000
whiteboard_entry = "[webcompat:sightline]"

def __init__(self):
super().__init__()
self.autofix_changes = {}
self.sightline_ids = []

def description(self) -> str:
return "Web Compat site report in the sightline metric set"

def filter_no_nag_keyword(self) -> bool:
return False

def has_default_products(self) -> bool:
return False

def get_autofix_change(self) -> dict[str, Any]:
return self.autofix_changes

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
}
elif self.whiteboard_entry in whiteboard:
self.autofix_changes[bug_id] = {
"whiteboard": whiteboard.replace(self.whiteboard_entry, "")
}

return None

def get_bz_params(self, date) -> dict[str, Any]:
fields = ["id", "summary", "whiteboard"]
self.sightline_ids = self.get_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_bug_ids(self) -> list[int]:
project = "moz-fx-dev-dschubert-wckb"
dataset = "webcompat_knowledge_base"

client = gcp.get_bq_client(project, ["cloud-platform", "drive"])
query = f"""
SELECT number FROM `{project}.{dataset}.webcompat_topline_metric_site_reports` as bugs
"""

return list(row["number"] for row in client.query(query).result())


if __name__ == "__main__":
WebcompatSightline().run()
3 changes: 3 additions & 0 deletions scripts/cron_run_hourly.sh
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,7 @@ python -m bugbot.rules.duplicate_copy_metadata --production
# Add `webcompat:platform-bug` keyword to bugs without a platform keyword
python -m bugbot.rules.webcompat_platform_without_keyword --production

# Add `[webcompat:sightline]` whiteboard entry to bugs in sightline metric set
python -m bugbot.rules.webcompat_sightline --production

source ./scripts/cron_common_end.sh

0 comments on commit 96524e0

Please sign in to comment.