diff --git a/bugbug/bugzilla.py b/bugbug/bugzilla.py index dbe678e8a6..66d2434b0d 100644 --- a/bugbug/bugzilla.py +++ b/bugbug/bugzilla.py @@ -9,7 +9,7 @@ import re from datetime import datetime from logging import INFO, basicConfig, getLogger -from typing import Iterable, Iterator, NewType, Optional +from typing import Iterable, Iterator, NewType import tenacity from dateutil.relativedelta import relativedelta @@ -82,7 +82,7 @@ INCLUDE_FIELDS = ["_default", "filed_via"] -def get_bugs(include_invalid: Optional[bool] = False) -> Iterator[BugDict]: +def get_bugs(include_invalid: bool | None = False) -> Iterator[BugDict]: yield from ( bug for bug in db.read(BUGS_DB) diff --git a/bugbug/models/bugtype.py b/bugbug/models/bugtype.py index 320054697e..7971e10a8a 100644 --- a/bugbug/models/bugtype.py +++ b/bugbug/models/bugtype.py @@ -4,7 +4,7 @@ # You can obtain one at http://mozilla.org/MPL/2.0/. import logging -from typing import Iterable, Optional +from typing import Iterable import numpy as np import xgboost @@ -33,7 +33,7 @@ def bug_to_types( - bug: bugzilla.BugDict, bug_map: Optional[dict[int, bugzilla.BugDict]] = None + bug: bugzilla.BugDict, bug_map: dict[int, bugzilla.BugDict] | None = None ) -> list[str]: types = set() diff --git a/bugbug/models/testselect.py b/bugbug/models/testselect.py index ee0217f965..e84abe02ea 100644 --- a/bugbug/models/testselect.py +++ b/bugbug/models/testselect.py @@ -11,7 +11,7 @@ import pickle import statistics from functools import reduce -from typing import Any, Callable, Collection, Iterable, Optional, Sequence, Set +from typing import Any, Callable, Collection, Iterable, Sequence, Set import numpy as np import xgboost @@ -37,7 +37,7 @@ def get_commit_map( - revs: Optional[Set[test_scheduling.Revision]] = None, + revs: Set[test_scheduling.Revision] | None = None, ) -> dict[test_scheduling.Revision, repository.CommitDict]: commit_map = {} @@ -562,7 +562,7 @@ def select_tests( self, commits: Sequence[repository.CommitDict], confidence: float = 0.5, - push_num: Optional[int] = None, + push_num: int | None = None, ) -> dict[str, float]: commit_data = commit_features.merge_commits(commits) @@ -692,9 +692,9 @@ def evaluation(self) -> None: def do_eval( executor: concurrent.futures.ProcessPoolExecutor, confidence_threshold: float, - reduction: Optional[float], - cap: Optional[int], - minimum: Optional[int], + reduction: float | None, + cap: int | None, + minimum: int | None, ) -> None: futures: dict[concurrent.futures.Future, dict[str, Any]] = {} for push in test_pushes.values(): diff --git a/bugbug/phabricator.py b/bugbug/phabricator.py index 90a0fac71b..ffc96a16b9 100644 --- a/bugbug/phabricator.py +++ b/bugbug/phabricator.py @@ -5,7 +5,7 @@ import logging from datetime import datetime, timedelta -from typing import Collection, Iterator, NewType, Optional +from typing import Collection, Iterator, NewType import tenacity from libmozdata.phabricator import PhabricatorAPI @@ -69,7 +69,7 @@ def get_transactions(rev_phid: str) -> Collection[TransactionDict]: def get( - rev_ids: Optional[Collection[int]] = None, modified_start: Optional[datetime] = None + rev_ids: Collection[int] | None = None, modified_start: datetime | None = None ) -> Collection[RevisionDict]: assert PHABRICATOR_API is not None @@ -159,7 +159,7 @@ def download_modified_revisions(): db.append(REVISIONS_DB, modified_revisions) -def get_testing_project(rev: RevisionDict) -> Optional[str]: +def get_testing_project(rev: RevisionDict) -> str | None: testing_projects = [ TESTING_PROJECTS[projectPHID] for projectPHID in rev["attachments"]["projects"]["projectPHIDs"] @@ -177,7 +177,7 @@ def get_testing_project(rev: RevisionDict) -> Optional[str]: def get_review_dates( rev: RevisionDict, -) -> tuple[Optional[datetime], list[datetime], list[datetime], list[datetime]]: +) -> tuple[datetime | None, list[datetime], list[datetime], list[datetime]]: creation_date = None review_dates = [] @@ -208,7 +208,7 @@ def get_review_dates( return creation_date, review_dates, exclusion_start_dates, exclusion_end_dates -def get_first_review_time(rev: RevisionDict) -> Optional[timedelta]: +def get_first_review_time(rev: RevisionDict) -> timedelta | None: ( creation_date, review_dates, @@ -257,7 +257,7 @@ def get_first_review_time(rev: RevisionDict) -> Optional[timedelta]: ) -def get_pending_review_time(rev: RevisionDict) -> Optional[timedelta]: +def get_pending_review_time(rev: RevisionDict) -> timedelta | None: if rev["fields"]["status"]["value"] != "needs-review": return None diff --git a/bugbug/repository.py b/bugbug/repository.py index d12dfc90ae..341115b1c7 100644 --- a/bugbug/repository.py +++ b/bugbug/repository.py @@ -20,7 +20,7 @@ import threading from datetime import datetime from functools import lru_cache -from typing import Collection, Iterable, Iterator, NewType, Optional, Set, Union +from typing import Collection, Iterable, Iterator, NewType, Set, Union import hglib import lmdb @@ -35,7 +35,7 @@ CommitDict = NewType("CommitDict", dict) -code_analysis_server: Optional[rust_code_analysis_server.RustCodeAnalysisServer] = None +code_analysis_server: rust_code_analysis_server.RustCodeAnalysisServer | None = None hg_servers = list() hg_servers_lock = threading.Lock() @@ -173,7 +173,7 @@ def __init__( author: str, desc: str, pushdate: datetime, - bug_id: Optional[int], + bug_id: int | None, backsout: list[str], backedoutby: str, author_email: str, @@ -312,7 +312,7 @@ def get_commits( ) -def get_revision_id(commit: CommitDict) -> Optional[int]: +def get_revision_id(commit: CommitDict) -> int | None: match = PHABRICATOR_REVISION_REGEX.search(commit["desc"]) if not match: return None @@ -871,7 +871,7 @@ def _transform(commit): def hg_log( - hg: hglib.client, revs: list[bytes], branch: Optional[str] = "tip" + hg: hglib.client, revs: list[bytes], branch: str | None = "tip" ) -> tuple[Commit, ...]: if len(revs) == 0: return tuple() @@ -1303,7 +1303,7 @@ def close_component_mapping(): def hg_log_multi( - repo_dir: str, revs: list[bytes], branch: Optional[str] = "tip" + repo_dir: str, revs: list[bytes], branch: str | None = "tip" ) -> tuple[Commit, ...]: if len(revs) == 0: return tuple() @@ -1338,7 +1338,7 @@ def download_commits( repo_dir: str, rev_start: str | None = None, revs: list[bytes] | None = None, - branch: Optional[str] = "tip", + branch: str | None = "tip", save: bool = True, use_single_process: bool = False, include_no_bug: bool = False, diff --git a/bugbug/rust_code_analysis_server.py b/bugbug/rust_code_analysis_server.py index be45c462c4..51f920a54d 100644 --- a/bugbug/rust_code_analysis_server.py +++ b/bugbug/rust_code_analysis_server.py @@ -6,7 +6,6 @@ import logging import subprocess import time -from typing import Optional import requests @@ -20,7 +19,7 @@ class RustCodeAnalysisServer: - def __init__(self, thread_num: Optional[int] = None): + def __init__(self, thread_num: int | None = None): for _ in range(START_RETRIES): self.start_process(thread_num) @@ -41,7 +40,7 @@ def __init__(self, thread_num: Optional[int] = None): def base_url(self): return f"http://127.0.0.1:{self.port}" - def start_process(self, thread_num: Optional[int] = None): + def start_process(self, thread_num: int | None = None): self.port = utils.get_free_tcp_port() try: diff --git a/bugbug/test_scheduling.py b/bugbug/test_scheduling.py index 5127d99259..eb58c07564 100644 --- a/bugbug/test_scheduling.py +++ b/bugbug/test_scheduling.py @@ -21,7 +21,6 @@ Iterable, Iterator, NewType, - Optional, Set, Union, cast, @@ -646,7 +645,7 @@ def set_touched_together(f1: str, f2: str) -> None: ) -def update_touched_together() -> Generator[None, Optional[Revision], None]: +def update_touched_together() -> Generator[None, Revision | None, None]: touched_together = get_touched_together_db(False) last_analyzed = ( touched_together[b"last_analyzed"] diff --git a/bugbug/utils.py b/bugbug/utils.py index 2a737023fc..c0e141933e 100644 --- a/bugbug/utils.py +++ b/bugbug/utils.py @@ -17,7 +17,7 @@ from contextlib import contextmanager from datetime import datetime from functools import lru_cache -from typing import Any, Iterator, Optional +from typing import Any, Iterator import boto3 import dateutil.parser @@ -207,7 +207,7 @@ def download_check_etag(url, path=None): return True -def get_last_modified(url: str) -> Optional[datetime]: +def get_last_modified(url: str) -> datetime | None: session = get_session(urllib.parse.urlparse(url).netloc) r = session.head(url, allow_redirects=True) @@ -524,7 +524,7 @@ def extract_metadata(body: str) -> dict: return dict(match_list) -def extract_private(issue_body: str) -> Optional[tuple]: +def extract_private(issue_body: str) -> tuple | None: """Extract private issue information from public issue body. Parse public issue body and extract private issue number and diff --git a/http_service/bugbug_http/app.py b/http_service/bugbug_http/app.py index e3a8e9bde1..8451f4e151 100644 --- a/http_service/bugbug_http/app.py +++ b/http_service/bugbug_http/app.py @@ -9,7 +9,7 @@ import uuid from dataclasses import dataclass, field from datetime import datetime, timedelta -from typing import Any, Callable, Optional, Sequence +from typing import Any, Callable, Sequence import orjson import zstandard @@ -175,14 +175,14 @@ def get_job_id() -> str: return uuid.uuid4().hex -def init_job(job: JobInfo, job_id: Optional[str] = None) -> str: +def init_job(job: JobInfo, job_id: str | None = None) -> str: job_id = job_id or get_job_id() redis_conn.mset({job.mapping_key: job_id}) return job_id def schedule_job( - job: JobInfo, job_id: Optional[str] = None, timeout: Optional[int] = None + job: JobInfo, job_id: str | None = None, timeout: int | None = None ) -> None: job_id = init_job(job, job_id) @@ -197,7 +197,7 @@ def schedule_job( def prepare_queue_job( - job: JobInfo, job_id: Optional[str] = None, timeout: Optional[int] = None + job: JobInfo, job_id: str | None = None, timeout: int | None = None ) -> Queue: job_id = init_job(job, job_id) return Queue.prepare_data( @@ -379,7 +379,7 @@ def clean_prediction_cache(job): redis_conn.delete(job.change_time_key) -def get_result(job: JobInfo) -> Optional[Any]: +def get_result(job: JobInfo) -> Any | None: LOGGER.debug(f"Checking for existing results at {job.result_key}") result = redis_conn.get(job.result_key) diff --git a/scripts/commit_classifier.py b/scripts/commit_classifier.py index fc8289208d..ed0cccc431 100644 --- a/scripts/commit_classifier.py +++ b/scripts/commit_classifier.py @@ -11,7 +11,7 @@ import subprocess from datetime import datetime from logging import INFO, basicConfig, getLogger -from typing import Optional, cast +from typing import cast import dateutil.parser import hglib @@ -136,8 +136,8 @@ def __init__( method_defect_predictor_dir: str, use_single_process: bool, skip_feature_importance: bool, - phabricator_deployment: Optional[str] = None, - diff_id: Optional[int] = None, + phabricator_deployment: str | None = None, + diff_id: int | None = None, ): self.model_name = model_name self.repo_dir = repo_dir @@ -582,8 +582,8 @@ def feature_sort_key(f): def classify( self, - revision: Optional[str] = None, - runnable_jobs_path: Optional[str] = None, + revision: str | None = None, + runnable_jobs_path: str | None = None, ) -> None: self.update_commit_db() diff --git a/scripts/generate_landings_risk_report.py b/scripts/generate_landings_risk_report.py index 9cbbf147f2..0cabc72c04 100644 --- a/scripts/generate_landings_risk_report.py +++ b/scripts/generate_landings_risk_report.py @@ -18,7 +18,7 @@ import traceback import urllib.parse from datetime import datetime, timedelta, timezone -from typing import Any, Optional, Set, cast +from typing import Any, Set, cast import bs4 import dateutil.parser @@ -1365,7 +1365,7 @@ def regression_to_text(bug): ) ) - def get_top_crashes(team: str, channel: str) -> Optional[str]: + def get_top_crashes(team: str, channel: str) -> str | None: top_crashes = [] if team in super_teams: diff --git a/scripts/revision_retriever.py b/scripts/revision_retriever.py index 00e5150547..38fa8e6a96 100644 --- a/scripts/revision_retriever.py +++ b/scripts/revision_retriever.py @@ -3,7 +3,6 @@ import argparse from datetime import datetime, timezone from logging import getLogger -from typing import Optional import dateutil.parser from dateutil.relativedelta import relativedelta @@ -18,7 +17,7 @@ class Retriever(object): def retrieve_revisions( self, limit_months: int = 2, - limit_count: Optional[int] = None, + limit_count: int | None = None, ) -> None: """Retrieve revisions from Phabricator. diff --git a/scripts/shadow_scheduler_stats.py b/scripts/shadow_scheduler_stats.py index 087dee16e4..68b0599d1a 100644 --- a/scripts/shadow_scheduler_stats.py +++ b/scripts/shadow_scheduler_stats.py @@ -9,7 +9,7 @@ import time import traceback from datetime import datetime -from typing import Any, Optional +from typing import Any import matplotlib.pyplot as plt import mozci.push @@ -254,7 +254,7 @@ def plot_graphs(granularity: str) -> None: def print_uncaught( - granularity: str, scheduler1: str, scheduler2: Optional[str] = None + granularity: str, scheduler1: str, scheduler2: str | None = None ) -> None: push_data_db = ( test_scheduling.PUSH_DATA_GROUP_DB