From 268f90176c0fbab21fb137ee2f5577a126608ebc Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Sat, 7 Feb 2026 23:32:22 +0900 Subject: [PATCH 1/4] refactor: break up StatusNotifier.notify into focused methods Extract StatusNotifier.notify() (98 lines) into focused methods under 50 lines each. - _check_notify_preconditions(): validates branches/builds requirements - _build_payload_with_behavior(): builds payload applying flag coverage rules - _set_payload_url(): sets URL based on PR or commit context Co-authored-by: Cursor --- .../notification/notifiers/status/base.py | 143 +++++++++++------- 1 file changed, 85 insertions(+), 58 deletions(-) diff --git a/apps/worker/services/notification/notifiers/status/base.py b/apps/worker/services/notification/notifiers/status/base.py index b28143c17a..488954b039 100644 --- a/apps/worker/services/notification/notifiers/status/base.py +++ b/apps/worker/services/notification/notifiers/status/base.py @@ -148,66 +148,16 @@ def notify( comparison: ComparisonProxy, status_or_checks_helper_text: dict[str, str] | None = None, ) -> NotificationResult: + precondition_result = self._check_notify_preconditions(comparison) + if precondition_result is not None: + return precondition_result payload = None - if not self.can_we_set_this_status(comparison): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="not_fit_criteria", - data_sent=None, - ) - if not self.required_builds(comparison): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="need_more_builds", - data_sent=None, - ) - # Filter the coverage report based on fields in this notification's YAML settings - # e.g. if "paths" is specified, exclude the coverage not on those paths try: - # If flag coverage wasn't uploaded, apply the appropriate behavior - flag_coverage_not_uploaded_behavior = ( - self.determine_status_check_behavior_to_apply( - comparison, "flag_coverage_not_uploaded_behavior" - ) - ) - if not comparison.has_head_report(): - payload = self.build_payload(comparison) - elif ( - flag_coverage_not_uploaded_behavior == "exclude" - and not self.flag_coverage_was_uploaded(comparison) - ): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="exclude_flag_coverage_not_uploaded_checks", - data_sent=None, - data_received=None, - ) - elif ( - flag_coverage_not_uploaded_behavior == "pass" - and not self.flag_coverage_was_uploaded(comparison) - ): - filtered_comparison = comparison.get_filtered_comparison( - **self.get_notifier_filters() - ) - payload = self.build_payload(filtered_comparison) - payload["state"] = "success" - payload["message"] = ( - payload["message"] - + " [Auto passed due to carriedforward or missing coverage]" - ) - else: - filtered_comparison = comparison.get_filtered_comparison( - **self.get_notifier_filters() - ) - payload = self.build_payload(filtered_comparison) - if comparison.pull: - payload["url"] = get_pull_url(comparison.pull) - else: - payload["url"] = get_commit_url(comparison.head.commit) - + result_or_payload = self._build_payload_with_behavior(comparison) + if isinstance(result_or_payload, NotificationResult): + return result_or_payload + payload = result_or_payload + self._set_payload_url(comparison, payload) return self.maybe_send_notification(comparison, payload) except TorngitClientError: log.warning( @@ -242,6 +192,83 @@ def notify( data_sent=payload, ) + def _check_notify_preconditions( + self, comparison: ComparisonProxy + ) -> NotificationResult | None: + """Check if we should proceed with the notification. + + Returns a NotificationResult to return early, or None to continue. + """ + if not self.can_we_set_this_status(comparison): + return NotificationResult( + notification_attempted=False, + notification_successful=None, + explanation="not_fit_criteria", + data_sent=None, + ) + if not self.required_builds(comparison): + return NotificationResult( + notification_attempted=False, + notification_successful=None, + explanation="need_more_builds", + data_sent=None, + ) + return None + + def _build_payload_with_behavior( + self, comparison: ComparisonProxy + ) -> NotificationResult | dict: + """Build the notification payload, applying flag coverage behavior rules. + + Filters the coverage report based on fields in this notification's YAML + settings (e.g. if "paths" is specified, exclude coverage not on those paths). + + Returns a NotificationResult for early exit, or a payload dict to send. + """ + flag_coverage_not_uploaded_behavior = ( + self.determine_status_check_behavior_to_apply( + comparison, "flag_coverage_not_uploaded_behavior" + ) + ) + if not comparison.has_head_report(): + return self.build_payload(comparison) + if ( + flag_coverage_not_uploaded_behavior == "exclude" + and not self.flag_coverage_was_uploaded(comparison) + ): + return NotificationResult( + notification_attempted=False, + notification_successful=None, + explanation="exclude_flag_coverage_not_uploaded_checks", + data_sent=None, + data_received=None, + ) + if ( + flag_coverage_not_uploaded_behavior == "pass" + and not self.flag_coverage_was_uploaded(comparison) + ): + filtered_comparison = comparison.get_filtered_comparison( + **self.get_notifier_filters() + ) + payload = self.build_payload(filtered_comparison) + payload["state"] = "success" + payload["message"] = ( + payload["message"] + + " [Auto passed due to carriedforward or missing coverage]" + ) + return payload + filtered_comparison = comparison.get_filtered_comparison( + **self.get_notifier_filters() + ) + return self.build_payload(filtered_comparison) + + def _set_payload_url(self, comparison: ComparisonProxy, payload: dict) -> None: + """Set the URL on the notification payload based on PR or commit context.""" + if comparison.pull: + payload["url"] = get_pull_url(comparison.pull) + else: + payload["url"] = get_commit_url(comparison.head.commit) + def status_already_exists( self, comparison: ComparisonProxy, title, state, description ) -> bool: From 35c9ff1f65f4501e249a6b62297c17604e3490c6 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Sat, 7 Feb 2026 23:32:37 +0900 Subject: [PATCH 2/4] refactor: break up ChecksNotifier.notify into focused methods Extract ChecksNotifier.notify() (176 lines) into focused methods under 50 lines each. - _validate_pull_request(): validates PR exists, is in provider, is open - _check_preexisting_status(): checks if commit status already exists - _build_payload_with_behavior(): overrides parent with checks-specific logic - Removed unused nullcontext and get_commit_url imports Co-authored-by: Cursor --- .../notification/notifiers/checks/base.py | 199 +++++++++--------- 1 file changed, 105 insertions(+), 94 deletions(-) diff --git a/apps/worker/services/notification/notifiers/checks/base.py b/apps/worker/services/notification/notifiers/checks/base.py index 9ef1c65843..2b908ac939 100644 --- a/apps/worker/services/notification/notifiers/checks/base.py +++ b/apps/worker/services/notification/notifiers/checks/base.py @@ -1,5 +1,4 @@ import logging -from contextlib import nullcontext from typing import Any, TypedDict import sentry_sdk @@ -11,7 +10,6 @@ from services.notification.notifiers.status.base import StatusNotifier from services.urls import ( append_tracking_params_to_urls, - get_commit_url, get_members_url, get_pull_url, ) @@ -95,6 +93,65 @@ def notify( comparison: ComparisonProxy, status_or_checks_helper_text: dict[str, str] | None = None, ) -> NotificationResult: + pr_result = self._validate_pull_request(comparison) + if pr_result is not None: + return pr_result + precondition_result = self._check_notify_preconditions(comparison) + if precondition_result is not None: + return precondition_result + status_result = self._check_preexisting_status(comparison) + if status_result is not None: + return status_result + payload = None + try: + result_or_payload = self._build_payload_with_behavior(comparison) + if isinstance(result_or_payload, NotificationResult): + return result_or_payload + payload = result_or_payload + self._set_payload_url(comparison, payload) + return self.maybe_send_notification(comparison, payload) + except TorngitClientError as e: + if e.code == 403: + raise e + log.warning( + "Unable to send checks notification to user due to a client-side error", + exc_info=True, + extra={ + "repoid": comparison.head.commit.repoid, + "commit": comparison.head.commit.commitid, + "notifier_name": self.name, + }, + ) + return NotificationResult( + notification_attempted=True, + notification_successful=False, + explanation="client_side_error_provider", + data_sent=payload, + ) + except TorngitError: + log.warning( + "Unable to send checks notification to user due to an unexpected error", + exc_info=True, + extra={ + "repoid": comparison.head.commit.repoid, + "commit": comparison.head.commit.commitid, + "notifier_name": self.name, + }, + ) + return NotificationResult( + notification_attempted=True, + notification_successful=False, + explanation="server_side_error_provider", + data_sent=payload, + ) + + def _validate_pull_request( + self, comparison: ComparisonProxy + ) -> NotificationResult | None: + """Validate that the comparison has a valid, open pull request. + + Returns a NotificationResult if validation fails, or None to continue. + """ if comparison.pull is None or (): log.debug( "Falling back to commit_status: Not a pull request", @@ -149,24 +206,12 @@ def notify( data_sent=None, data_received=None, ) - # Check branches config for this status before sending the check - if not self.can_we_set_this_status(comparison): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="not_fit_criteria", - data_sent=None, - ) - if not self.required_builds(comparison): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="need_more_builds", - data_sent=None, - data_received=None, - ) - # Check for existing statuses for this commit. If so, retain - # statuses and don't do a check as well + return None + + def _check_preexisting_status( + self, comparison: ComparisonProxy + ) -> NotificationResult | None: + """Check if a commit status already exists. Returns a result to return early, or None.""" statuses = comparison.get_existing_statuses() status_title = self.get_status_external_name() if statuses and statuses.get(status_title): @@ -187,85 +232,51 @@ def notify( data_sent=None, data_received=None, ) - payload = None - try: - with nullcontext(): - # If flag coverage wasn't uploaded, apply the appropriate behavior - flag_coverage_not_uploaded_behavior = ( - self.determine_status_check_behavior_to_apply( - comparison, "flag_coverage_not_uploaded_behavior" - ) - ) - if not comparison.has_head_report(): - payload = self.build_payload(comparison) - elif ( - flag_coverage_not_uploaded_behavior == "exclude" - and not self.flag_coverage_was_uploaded(comparison) - ): - return NotificationResult( - notification_attempted=False, - notification_successful=None, - explanation="exclude_flag_coverage_not_uploaded_checks", - data_sent=None, - data_received=None, - ) - elif ( - flag_coverage_not_uploaded_behavior == "pass" - and not self.flag_coverage_was_uploaded(comparison) - ): - filtered_comparison = comparison.get_filtered_comparison( - **self.get_notifier_filters() - ) - payload = self.build_payload(filtered_comparison) - payload["state"] = "success" - payload["output"]["summary"] = ( - payload.get("output", {}).get("summary", "") - + " [Auto passed due to carriedforward or missing coverage]" - ) - else: - filtered_comparison = comparison.get_filtered_comparison( - **self.get_notifier_filters() - ) - payload = self.build_payload(filtered_comparison) - if comparison.pull: - payload["url"] = get_pull_url(comparison.pull) - else: - payload["url"] = get_commit_url(comparison.head.commit) - return self.maybe_send_notification(comparison, payload) - except TorngitClientError as e: - if e.code == 403: - raise e - log.warning( - "Unable to send checks notification to user due to a client-side error", - exc_info=True, - extra={ - "repoid": comparison.head.commit.repoid, - "commit": comparison.head.commit.commitid, - "notifier_name": self.name, - }, + return None + + def _build_payload_with_behavior( + self, comparison: ComparisonProxy + ) -> NotificationResult | dict: + """Build the checks notification payload, applying flag coverage behavior rules. + + Returns a NotificationResult for early exit, or a payload dict to send. + """ + flag_coverage_not_uploaded_behavior = ( + self.determine_status_check_behavior_to_apply( + comparison, "flag_coverage_not_uploaded_behavior" ) + ) + if not comparison.has_head_report(): + return self.build_payload(comparison) + if ( + flag_coverage_not_uploaded_behavior == "exclude" + and not self.flag_coverage_was_uploaded(comparison) + ): return NotificationResult( - notification_attempted=True, - notification_successful=False, - explanation="client_side_error_provider", - data_sent=payload, + notification_attempted=False, + notification_successful=None, + explanation="exclude_flag_coverage_not_uploaded_checks", + data_sent=None, + data_received=None, ) - except TorngitError: - log.warning( - "Unable to send checks notification to user due to an unexpected error", - exc_info=True, - extra={ - "repoid": comparison.head.commit.repoid, - "commit": comparison.head.commit.commitid, - "notifier_name": self.name, - }, + if ( + flag_coverage_not_uploaded_behavior == "pass" + and not self.flag_coverage_was_uploaded(comparison) + ): + filtered_comparison = comparison.get_filtered_comparison( + **self.get_notifier_filters() ) - return NotificationResult( - notification_attempted=True, - notification_successful=False, - explanation="server_side_error_provider", - data_sent=payload, + payload = self.build_payload(filtered_comparison) + payload["state"] = "success" + payload["output"]["summary"] = ( + payload.get("output", {}).get("summary", "") + + " [Auto passed due to carriedforward or missing coverage]" ) + return payload + filtered_comparison = comparison.get_filtered_comparison( + **self.get_notifier_filters() + ) + return self.build_payload(filtered_comparison) def get_line_diff(self, file_diff): """ From 9f669c943234726a03cab6dcfb3f789bd16229a2 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Sat, 7 Feb 2026 23:49:07 +0900 Subject: [PATCH 3/4] cleanup: fix no-op 'or ()' condition and docstring typo in ChecksNotifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix 'comparison.pull is None or ()' to 'comparison.pull is None' in _validate_pull_request — the 'or ()' was a no-op since () is falsy, so the expression was equivalent to just 'is None' - Fix typo "where chnaged" -> "were changed" in get_line_diff docstring Co-authored-by: Cursor --- apps/worker/services/notification/notifiers/checks/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/worker/services/notification/notifiers/checks/base.py b/apps/worker/services/notification/notifiers/checks/base.py index 2b908ac939..09a23457f1 100644 --- a/apps/worker/services/notification/notifiers/checks/base.py +++ b/apps/worker/services/notification/notifiers/checks/base.py @@ -152,7 +152,7 @@ def _validate_pull_request( Returns a NotificationResult if validation fails, or None to continue. """ - if comparison.pull is None or (): + if comparison.pull is None: log.debug( "Falling back to commit_status: Not a pull request", extra={ @@ -280,7 +280,7 @@ def _build_payload_with_behavior( def get_line_diff(self, file_diff): """ - This method traverses a git file diff and returns the lines (as line numbers) that where chnaged + This method traverses a git file diff and returns the lines (as line numbers) that were changed Note: For now it only looks for line additions on diff, we can quickly add functionality to handle line deletions if needed From 443fc35c0345274bd5abf6257dc51ea02c52e569 Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Sun, 8 Feb 2026 00:20:48 +0900 Subject: [PATCH 4/4] refactor: move database.enums to shared.django_apps.enums Move all plain Python enums from apps/worker/database/enums.py to libs/shared/shared/django_apps/enums.py, decoupling them from the SQLAlchemy database package. Update all ~60 consumer files in the worker to import from the new shared location. The old database/enums.py is kept as a re-export shim for backward compatibility. Part of the SQLAlchemy removal migration (Phase 0). Co-authored-by: Cursor --- apps/worker/database/enums.py | 94 +++---------------- apps/worker/database/models/core.py | 7 +- apps/worker/database/tests/factories/core.py | 3 +- .../helpers/tests/unit/test_commit_error.py | 2 +- .../services/bundle_analysis/comparison.py | 2 +- .../bundle_analysis/notify/conftest.py | 2 +- .../notify/contexts/__init__.py | 2 +- .../worker/services/bundle_analysis/report.py | 2 +- .../tests/test_bundle_analysis.py | 2 +- apps/worker/services/comparison/__init__.py | 2 +- .../unit/test_get_or_create_comparison.py | 2 +- apps/worker/services/decoration.py | 2 +- apps/worker/services/lock_manager.py | 2 +- apps/worker/services/notification/__init__.py | 2 +- .../notification/commit_notifications.py | 2 +- .../notification/notifiers/checks/changes.py | 2 +- .../notification/notifiers/checks/patch.py | 2 +- .../notification/notifiers/checks/project.py | 2 +- .../notifiers/codecov_slack_app.py | 2 +- .../notifiers/comment/__init__.py | 2 +- .../services/notification/notifiers/gitter.py | 2 +- .../notification/notifiers/hipchat.py | 2 +- .../services/notification/notifiers/irc.py | 2 +- .../services/notification/notifiers/slack.py | 2 +- .../notification/notifiers/status/changes.py | 2 +- .../notification/notifiers/status/patch.py | 2 +- .../notification/notifiers/status/project.py | 2 +- .../tests/unit/test_codecov_slack_app.py | 2 +- .../tests/unit/test_comment_conditions.py | 2 +- .../notifiers/tests/unit/test_status.py | 2 +- .../notification/notifiers/webhook.py | 2 +- .../tests/unit/test_commit_notifications.py | 2 +- .../tests/unit/test_notification_service.py | 2 +- apps/worker/services/repository.py | 2 +- .../tests/test_ta_finish_upload.py | 2 +- apps/worker/services/test_results.py | 2 +- apps/worker/services/tests/test_decoration.py | 2 +- .../services/tests/test_lock_manager.py | 2 +- apps/worker/services/yaml/__init__.py | 2 +- apps/worker/tasks/base.py | 2 +- .../worker/tasks/bundle_analysis_processor.py | 2 +- apps/worker/tasks/compute_comparison.py | 2 +- apps/worker/tasks/manual_trigger.py | 2 +- apps/worker/tasks/new_user_activated.py | 2 +- apps/worker/tasks/notify.py | 7 +- apps/worker/tasks/notify_error.py | 2 +- apps/worker/tasks/preprocess_upload.py | 2 +- apps/worker/tasks/test_analytics_notifier.py | 2 +- apps/worker/tasks/test_results_finisher.py | 2 +- apps/worker/tasks/tests/unit/test_base.py | 2 +- .../test_bundle_analysis_processor_task.py | 2 +- .../tests/unit/test_compute_comparison.py | 2 +- .../tests/unit/test_new_user_activated.py | 2 +- .../tasks/tests/unit/test_notify_task.py | 2 +- .../tasks/tests/unit/test_trial_expiration.py | 2 +- .../tests/unit/test_trial_expiration_cron.py | 2 +- .../tests/unit/test_upload_finisher_task.py | 2 +- .../tasks/tests/unit/test_upload_task.py | 2 +- apps/worker/tasks/trial_expiration_cron.py | 2 +- apps/worker/tasks/upload.py | 2 +- apps/worker/tasks/upload_finisher.py | 2 +- libs/shared/shared/django_apps/enums.py | 80 ++++++++++++++++ 62 files changed, 165 insertions(+), 140 deletions(-) create mode 100644 libs/shared/shared/django_apps/enums.py diff --git a/apps/worker/database/enums.py b/apps/worker/database/enums.py index 42b0b92601..60db83e719 100644 --- a/apps/worker/database/enums.py +++ b/apps/worker/database/enums.py @@ -1,80 +1,14 @@ -from enum import Enum - - -class Decoration(Enum): - standard = "standard" - upgrade = "upgrade" - upload_limit = "upload_limit" - passing_empty_upload = "passing_empty_upload" - failing_empty_upload = "failing_empty_upload" - processing_upload = "processing_upload" - - -class Notification(Enum): - comment = "comment" - status_changes = "status_changes" - status_patch = "status_patch" - status_project = "status_project" - checks_changes = "checks_changes" - checks_patch = "checks_patch" - checks_project = "checks_project" - slack = "slack" - webhook = "webhook" - gitter = "gitter" - irc = "irc" - hipchat = "hipchat" - codecov_slack_app = "codecov_slack_app" - - -notification_type_status_or_checks = { - Notification.status_changes, - Notification.status_patch, - Notification.status_project, - Notification.checks_changes, - Notification.checks_patch, - Notification.checks_project, -} - - -class NotificationState(Enum): - pending = "pending" - success = "success" - error = "error" - - -class CompareCommitState(Enum): - pending = "pending" - processed = "processed" - error = "error" - - -class CompareCommitError(Enum): - missing_base_report = "missing_base_report" - missing_head_report = "missing_head_report" - provider_client_error = "provider_client_error" - - -class CommitErrorTypes(Enum): - INVALID_YAML = "invalid_yaml" - YAML_CLIENT_ERROR = "yaml_client_error" - YAML_UNKNOWN_ERROR = "yaml_unknown_error" - REPO_BOT_INVALID = "repo_bot_invalid" - - -class TrialStatus(Enum): - NOT_STARTED = "not_started" - ONGOING = "ongoing" - EXPIRED = "expired" - CANNOT_TRIAL = "cannot_trial" - - -class ReportType(Enum): - COVERAGE = "coverage" - TEST_RESULTS = "test_results" - BUNDLE_ANALYSIS = "bundle_analysis" - - -class FlakeSymptomType(Enum): - FAILED_IN_DEFAULT_BRANCH = "failed_in_default_branch" - CONSECUTIVE_DIFF_OUTCOMES = "consecutive_diff_outcomes" - UNRELATED_MATCHING_FAILURES = "unrelated_matching_failures" +# Re-export all enums from the shared location for backward compatibility. +# New code should import directly from shared.django_apps.enums. +from shared.django_apps.enums import ( # noqa: F401 + CommitErrorTypes, + CompareCommitError, + CompareCommitState, + Decoration, + FlakeSymptomType, + Notification, + NotificationState, + ReportType, + TrialStatus, + notification_type_status_or_checks, +) diff --git a/apps/worker/database/models/core.py b/apps/worker/database/models/core.py index 8151575e10..ab3b9b97c4 100644 --- a/apps/worker/database/models/core.py +++ b/apps/worker/database/models/core.py @@ -13,8 +13,13 @@ import database.models from database.base import CodecovBaseModel, MixinBaseClass, MixinBaseClassNoExternalID -from database.enums import Decoration, Notification, NotificationState, ReportType from database.utils import ArchiveField +from shared.django_apps.enums import ( + Decoration, + Notification, + NotificationState, + ReportType, +) from shared.django_apps.utils.config import should_write_data_to_storage_config_check from shared.helpers.github_apps import is_configured from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName diff --git a/apps/worker/database/tests/factories/core.py b/apps/worker/database/tests/factories/core.py index dbcb30a676..6e969ab5ab 100644 --- a/apps/worker/database/tests/factories/core.py +++ b/apps/worker/database/tests/factories/core.py @@ -5,8 +5,9 @@ import factory from factory import Factory -from database import enums, models +from database import models from services.encryption import encryptor +from shared.django_apps import enums from shared.django_apps.codecov_auth.models import Plan, Tier from shared.plan.constants import DEFAULT_FREE_PLAN, TierName diff --git a/apps/worker/helpers/tests/unit/test_commit_error.py b/apps/worker/helpers/tests/unit/test_commit_error.py index 284bea21cd..b36873293b 100644 --- a/apps/worker/helpers/tests/unit/test_commit_error.py +++ b/apps/worker/helpers/tests/unit/test_commit_error.py @@ -1,6 +1,6 @@ -from database.enums import CommitErrorTypes from database.tests.factories import CommitFactory from helpers.save_commit_error import save_commit_error +from shared.django_apps.enums import CommitErrorTypes class TestSaveCommitError: diff --git a/apps/worker/services/bundle_analysis/comparison.py b/apps/worker/services/bundle_analysis/comparison.py index e2ac9bc477..905be9cb9e 100644 --- a/apps/worker/services/bundle_analysis/comparison.py +++ b/apps/worker/services/bundle_analysis/comparison.py @@ -1,6 +1,5 @@ from functools import cached_property -from database.enums import ReportType from database.models.core import Commit, Repository from database.models.reports import CommitReport from services.bundle_analysis.exceptions import ( @@ -14,6 +13,7 @@ BundleAnalysisComparison, BundleAnalysisReportLoader, ) +from shared.django_apps.enums import ReportType class ComparisonLoader: diff --git a/apps/worker/services/bundle_analysis/notify/conftest.py b/apps/worker/services/bundle_analysis/notify/conftest.py index 682edf4091..230419462a 100644 --- a/apps/worker/services/bundle_analysis/notify/conftest.py +++ b/apps/worker/services/bundle_analysis/notify/conftest.py @@ -1,12 +1,12 @@ from pathlib import Path -from database.enums import ReportType from database.models.core import Commit, Repository from database.models.reports import CommitReport from database.tests.factories.core import CommitFactory, PullFactory from services.repository import EnrichedPull from shared.api_archive.archive import ArchiveService from shared.bundle_analysis.storage import get_bucket_name +from shared.django_apps.enums import ReportType SAMPLE_FOLDER_PATH = Path(__file__).resolve().parent / "tests" / "samples" diff --git a/apps/worker/services/bundle_analysis/notify/contexts/__init__.py b/apps/worker/services/bundle_analysis/notify/contexts/__init__.py index b9c987a177..b6e3c61685 100644 --- a/apps/worker/services/bundle_analysis/notify/contexts/__init__.py +++ b/apps/worker/services/bundle_analysis/notify/contexts/__init__.py @@ -4,7 +4,6 @@ import sentry_sdk -from database.enums import ReportType from database.models.core import Commit, Repository from database.models.reports import CommitReport from services.bundle_analysis.notify.helpers import to_BundleThreshold @@ -14,6 +13,7 @@ ) from services.repository import get_repo_provider_service from shared.bundle_analysis import BundleAnalysisReport, BundleAnalysisReportLoader +from shared.django_apps.enums import ReportType from shared.torngit.base import TorngitBaseAdapter from shared.typings.torngit import AdditionalData, UploadType from shared.validation.types import BundleThreshold diff --git a/apps/worker/services/bundle_analysis/report.py b/apps/worker/services/bundle_analysis/report.py index 05283dad77..49e8811235 100644 --- a/apps/worker/services/bundle_analysis/report.py +++ b/apps/worker/services/bundle_analysis/report.py @@ -8,7 +8,6 @@ from sqlalchemy.dialects import postgresql from sqlalchemy.orm import Session -from database.enums import ReportType from database.models.core import Commit from database.models.reports import CommitReport, Upload, UploadError from database.models.timeseries import Measurement, MeasurementName @@ -21,6 +20,7 @@ from shared.django_apps.bundle_analysis.service.bundle_analysis import ( BundleAnalysisCacheConfigService, ) +from shared.django_apps.enums import ReportType from shared.metrics import Counter from shared.reports.enums import UploadState, UploadType from shared.storage.exceptions import FileNotInStorageError, PutRequestRateLimitError diff --git a/apps/worker/services/bundle_analysis/tests/test_bundle_analysis.py b/apps/worker/services/bundle_analysis/tests/test_bundle_analysis.py index 4abae36853..2feb5f8883 100644 --- a/apps/worker/services/bundle_analysis/tests/test_bundle_analysis.py +++ b/apps/worker/services/bundle_analysis/tests/test_bundle_analysis.py @@ -3,7 +3,6 @@ import pytest -from database.enums import ReportType from database.models import CommitReport, MeasurementName from database.tests.factories import CommitFactory, PullFactory, UploadFactory from database.tests.factories.timeseries import DatasetFactory, Measurement @@ -28,6 +27,7 @@ from shared.bundle_analysis.models import AssetType from shared.bundle_analysis.storage import get_bucket_name from shared.config import PATCH_CENTRIC_DEFAULT_CONFIG +from shared.django_apps.enums import ReportType from shared.yaml import UserYaml from tests.helpers import mock_all_plans_and_tiers diff --git a/apps/worker/services/comparison/__init__.py b/apps/worker/services/comparison/__init__.py index 0368a0ec96..0fb326e5eb 100644 --- a/apps/worker/services/comparison/__init__.py +++ b/apps/worker/services/comparison/__init__.py @@ -5,11 +5,11 @@ import sentry_sdk from asgiref.sync import async_to_sync -from database.enums import CompareCommitState from database.models import CompareCommit from services.comparison.changes import get_changes from services.comparison.types import Comparison, FullCommit, ReportUploadedCount from services.repository import get_repo_provider_service +from shared.django_apps.enums import CompareCommitState from shared.reports.changes import run_comparison_using_rust from shared.reports.types import Change, ReportTotals from shared.torngit.base import TorngitBaseAdapter diff --git a/apps/worker/services/comparison/tests/unit/test_get_or_create_comparison.py b/apps/worker/services/comparison/tests/unit/test_get_or_create_comparison.py index f3efead1cb..26c19ef3c1 100644 --- a/apps/worker/services/comparison/tests/unit/test_get_or_create_comparison.py +++ b/apps/worker/services/comparison/tests/unit/test_get_or_create_comparison.py @@ -1,6 +1,6 @@ -from database.enums import CompareCommitState from database.tests.factories.core import CommitFactory, CompareCommitFactory from services.comparison import get_or_create_comparison +from shared.django_apps.enums import CompareCommitState class TestGetOrCreateComparison: diff --git a/apps/worker/services/decoration.py b/apps/worker/services/decoration.py index 11de8a0ced..9191604095 100644 --- a/apps/worker/services/decoration.py +++ b/apps/worker/services/decoration.py @@ -1,11 +1,11 @@ import logging from dataclasses import dataclass -from database.enums import Decoration from database.models import Owner from services.license import requires_license from services.repository import EnrichedPull from shared.config import get_config +from shared.django_apps.enums import Decoration from shared.plan.service import PlanService from shared.upload.utils import query_monthly_coverage_measurements diff --git a/apps/worker/services/lock_manager.py b/apps/worker/services/lock_manager.py index 887aca43bb..e49d1fecc2 100644 --- a/apps/worker/services/lock_manager.py +++ b/apps/worker/services/lock_manager.py @@ -8,12 +8,12 @@ from redis import Redis # type: ignore from redis.exceptions import LockError # type: ignore -from database.enums import ReportType from shared.celery_config import ( DEFAULT_BLOCKING_TIMEOUT_SECONDS, DEFAULT_LOCK_TIMEOUT_SECONDS, ) from shared.config import get_config +from shared.django_apps.enums import ReportType from shared.helpers.redis import get_redis_connection # type: ignore log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/__init__.py b/apps/worker/services/notification/__init__.py index d9a3f19479..a40092ebda 100644 --- a/apps/worker/services/notification/__init__.py +++ b/apps/worker/services/notification/__init__.py @@ -11,7 +11,6 @@ from celery.exceptions import CeleryError, SoftTimeLimitExceeded -from database.enums import notification_type_status_or_checks from database.models.core import GITHUB_APP_INSTALLATION_DEFAULT_NAME, Owner, Repository from services.comparison import ComparisonProxy from services.decoration import Decoration @@ -38,6 +37,7 @@ from services.yaml.reader import get_components_from_yaml from shared.config import get_config from shared.django_apps.codecov_auth.models import Plan +from shared.django_apps.enums import notification_type_status_or_checks from shared.helpers.yaml import default_if_true from shared.plan.constants import TierName from shared.torngit.base import TorngitBaseAdapter diff --git a/apps/worker/services/notification/commit_notifications.py b/apps/worker/services/notification/commit_notifications.py index b90b4c3617..a6e5a66961 100644 --- a/apps/worker/services/notification/commit_notifications.py +++ b/apps/worker/services/notification/commit_notifications.py @@ -2,13 +2,13 @@ from sqlalchemy.orm.session import Session -from database.enums import NotificationState from database.models import CommitNotification, Pull from services.comparison import ComparisonProxy from services.notification.notifiers.base import ( AbstractBaseNotifier, NotificationResult, ) +from shared.django_apps.enums import NotificationState log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/notifiers/checks/changes.py b/apps/worker/services/notification/notifiers/checks/changes.py index 0c5ebde45a..b493ff5d15 100644 --- a/apps/worker/services/notification/notifiers/checks/changes.py +++ b/apps/worker/services/notification/notifiers/checks/changes.py @@ -1,4 +1,3 @@ -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.checks.base import ( CheckOutput, @@ -6,6 +5,7 @@ ChecksNotifier, ) from services.notification.notifiers.mixins.status import StatusChangesMixin +from shared.django_apps.enums import Notification class ChangesChecksNotifier(StatusChangesMixin, ChecksNotifier): diff --git a/apps/worker/services/notification/notifiers/checks/patch.py b/apps/worker/services/notification/notifiers/checks/patch.py index d2e069aed2..75b5413f61 100644 --- a/apps/worker/services/notification/notifiers/checks/patch.py +++ b/apps/worker/services/notification/notifiers/checks/patch.py @@ -1,4 +1,3 @@ -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.checks.base import ( CheckOutput, @@ -7,6 +6,7 @@ ) from services.notification.notifiers.mixins.status import StatusPatchMixin from services.yaml import read_yaml_field +from shared.django_apps.enums import Notification class PatchChecksNotifier(StatusPatchMixin, ChecksNotifier): diff --git a/apps/worker/services/notification/notifiers/checks/project.py b/apps/worker/services/notification/notifiers/checks/project.py index 293bc1a341..8f8e2c17d6 100644 --- a/apps/worker/services/notification/notifiers/checks/project.py +++ b/apps/worker/services/notification/notifiers/checks/project.py @@ -1,4 +1,3 @@ -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.checks.base import ( CheckOutput, @@ -8,6 +7,7 @@ from services.notification.notifiers.mixins.message import MessageMixin from services.notification.notifiers.mixins.status import StatusProjectMixin from services.yaml.reader import read_yaml_field +from shared.django_apps.enums import Notification class ProjectChecksNotifier(MessageMixin, StatusProjectMixin, ChecksNotifier): diff --git a/apps/worker/services/notification/notifiers/codecov_slack_app.py b/apps/worker/services/notification/notifiers/codecov_slack_app.py index 102f01a301..9f5a591f12 100644 --- a/apps/worker/services/notification/notifiers/codecov_slack_app.py +++ b/apps/worker/services/notification/notifiers/codecov_slack_app.py @@ -4,7 +4,6 @@ import requests -from database.enums import Notification from database.models import Commit from services.comparison import ComparisonProxy from services.notification.notifiers.base import ( @@ -14,6 +13,7 @@ from services.notification.notifiers.generics import EnhancedJSONEncoder from services.urls import get_commit_url, get_pull_url from services.yaml.reader import round_number +from shared.django_apps.enums import Notification CODECOV_INTERNAL_TOKEN = os.environ.get("CODECOV_INTERNAL_TOKEN") CODECOV_SLACK_APP_URL = os.environ.get("CODECOV_SLACK_APP_URL") diff --git a/apps/worker/services/notification/notifiers/comment/__init__.py b/apps/worker/services/notification/notifiers/comment/__init__.py index aaeb13524a..138d5bc710 100644 --- a/apps/worker/services/notification/notifiers/comment/__init__.py +++ b/apps/worker/services/notification/notifiers/comment/__init__.py @@ -6,7 +6,6 @@ import sentry_sdk from asgiref.sync import async_to_sync -from database.enums import Notification from services.comparison import ComparisonProxy from services.comparison.types import Comparison from services.license import requires_license @@ -25,6 +24,7 @@ ) from services.notification.notifiers.mixins.message import MessageMixin from services.urls import append_tracking_params_to_urls, get_members_url, get_plan_url +from shared.django_apps.enums import Notification from shared.metrics import Counter, inc_counter from shared.plan.constants import PlanName from shared.torngit.exceptions import ( diff --git a/apps/worker/services/notification/notifiers/gitter.py b/apps/worker/services/notification/notifiers/gitter.py index cecb022b8e..719b2c1e40 100644 --- a/apps/worker/services/notification/notifiers/gitter.py +++ b/apps/worker/services/notification/notifiers/gitter.py @@ -1,9 +1,9 @@ -from database.enums import Notification from services.notification.notifiers.generics import ( Comparison, RequestsYamlBasedNotifier, ) from services.urls import get_commit_url +from shared.django_apps.enums import Notification from shared.torngit.enums import Endpoints diff --git a/apps/worker/services/notification/notifiers/hipchat.py b/apps/worker/services/notification/notifiers/hipchat.py index 1575389d3c..2de8ccbb8c 100644 --- a/apps/worker/services/notification/notifiers/hipchat.py +++ b/apps/worker/services/notification/notifiers/hipchat.py @@ -1,12 +1,12 @@ from decimal import Decimal -from database.enums import Notification from services.notification.notifiers.generics import ( Comparison, RequestsYamlBasedNotifier, ) from services.urls import get_commit_url, get_graph_url from services.yaml.reader import round_number +from shared.django_apps.enums import Notification class HipchatNotifier(RequestsYamlBasedNotifier): diff --git a/apps/worker/services/notification/notifiers/irc.py b/apps/worker/services/notification/notifiers/irc.py index f597d6af65..0240caa6b2 100644 --- a/apps/worker/services/notification/notifiers/irc.py +++ b/apps/worker/services/notification/notifiers/irc.py @@ -4,8 +4,8 @@ from io import BytesIO from typing import Any -from database.enums import Notification from services.notification.notifiers.generics import Comparison, StandardNotifier +from shared.django_apps.enums import Notification log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/notifiers/slack.py b/apps/worker/services/notification/notifiers/slack.py index fbf2c3c7c2..8873792c24 100644 --- a/apps/worker/services/notification/notifiers/slack.py +++ b/apps/worker/services/notification/notifiers/slack.py @@ -1,9 +1,9 @@ -from database.enums import Notification from services.notification.notifiers.generics import ( Comparison, RequestsYamlBasedNotifier, ) from services.urls import get_commit_url, get_graph_url +from shared.django_apps.enums import Notification class SlackNotifier(RequestsYamlBasedNotifier): diff --git a/apps/worker/services/notification/notifiers/status/changes.py b/apps/worker/services/notification/notifiers/status/changes.py index 08eac62a82..1004b66cc7 100644 --- a/apps/worker/services/notification/notifiers/status/changes.py +++ b/apps/worker/services/notification/notifiers/status/changes.py @@ -1,12 +1,12 @@ import logging -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.mixins.status import ( StatusChangesMixin, StatusResult, ) from services.notification.notifiers.status.base import StatusNotifier +from shared.django_apps.enums import Notification log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/notifiers/status/patch.py b/apps/worker/services/notification/notifiers/status/patch.py index 10c52ba4e2..d8ec5aff01 100644 --- a/apps/worker/services/notification/notifiers/status/patch.py +++ b/apps/worker/services/notification/notifiers/status/patch.py @@ -1,7 +1,7 @@ -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.mixins.status import StatusPatchMixin, StatusResult from services.notification.notifiers.status.base import StatusNotifier +from shared.django_apps.enums import Notification class PatchStatusNotifier(StatusPatchMixin, StatusNotifier): diff --git a/apps/worker/services/notification/notifiers/status/project.py b/apps/worker/services/notification/notifiers/status/project.py index 702ed4bfab..acb7c3af21 100644 --- a/apps/worker/services/notification/notifiers/status/project.py +++ b/apps/worker/services/notification/notifiers/status/project.py @@ -1,12 +1,12 @@ import logging -from database.enums import Notification from services.comparison import ComparisonProxy, FilteredComparison from services.notification.notifiers.mixins.status import ( StatusProjectMixin, StatusResult, ) from services.notification.notifiers.status.base import StatusNotifier +from shared.django_apps.enums import Notification log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/notifiers/tests/unit/test_codecov_slack_app.py b/apps/worker/services/notification/notifiers/tests/unit/test_codecov_slack_app.py index 9af5a1d253..3e51373ed3 100644 --- a/apps/worker/services/notification/notifiers/tests/unit/test_codecov_slack_app.py +++ b/apps/worker/services/notification/notifiers/tests/unit/test_codecov_slack_app.py @@ -1,7 +1,7 @@ from unittest.mock import patch -from database.enums import Notification from services.notification.notifiers.codecov_slack_app import CodecovSlackAppNotifier +from shared.django_apps.enums import Notification class TestCodecovSlackAppNotifier: diff --git a/apps/worker/services/notification/notifiers/tests/unit/test_comment_conditions.py b/apps/worker/services/notification/notifiers/tests/unit/test_comment_conditions.py index 905b08bb10..d6405a8896 100644 --- a/apps/worker/services/notification/notifiers/tests/unit/test_comment_conditions.py +++ b/apps/worker/services/notification/notifiers/tests/unit/test_comment_conditions.py @@ -2,7 +2,6 @@ import pytest -from database.enums import Decoration from database.models.core import Repository from services.comparison import ComparisonProxy from services.notification.notifiers.base import AbstractBaseNotifier @@ -17,6 +16,7 @@ PullRequestInProvider, PullRequestOpen, ) +from shared.django_apps.enums import Decoration from shared.validation.types import ( CoverageCommentRequiredChanges, CoverageCommentRequiredChangesANDGroup, diff --git a/apps/worker/services/notification/notifiers/tests/unit/test_status.py b/apps/worker/services/notification/notifiers/tests/unit/test_status.py index 0c74b1dd08..0e878b1cac 100644 --- a/apps/worker/services/notification/notifiers/tests/unit/test_status.py +++ b/apps/worker/services/notification/notifiers/tests/unit/test_status.py @@ -2,7 +2,6 @@ import pytest -from database.enums import Notification from database.tests.factories.core import CommitFactory from services.comparison import ComparisonProxy from services.comparison.types import FullCommit @@ -20,6 +19,7 @@ ) from services.notification.notifiers.status.base import StatusNotifier from services.urls import get_pull_url +from shared.django_apps.enums import Notification from shared.reports.readonly import ReadOnlyReport from shared.reports.reportfile import ReportFile from shared.reports.resources import Report diff --git a/apps/worker/services/notification/notifiers/webhook.py b/apps/worker/services/notification/notifiers/webhook.py index 7d8c0c030a..21620d005b 100644 --- a/apps/worker/services/notification/notifiers/webhook.py +++ b/apps/worker/services/notification/notifiers/webhook.py @@ -1,9 +1,9 @@ import logging -from database.enums import Notification from services.comparison.types import Comparison, FullCommit from services.notification.notifiers.generics import RequestsYamlBasedNotifier from services.urls import get_commit_url, get_repository_url +from shared.django_apps.enums import Notification from shared.torngit.enums import Endpoints log = logging.getLogger(__name__) diff --git a/apps/worker/services/notification/tests/unit/test_commit_notifications.py b/apps/worker/services/notification/tests/unit/test_commit_notifications.py index eeb07ee384..314f034958 100644 --- a/apps/worker/services/notification/tests/unit/test_commit_notifications.py +++ b/apps/worker/services/notification/tests/unit/test_commit_notifications.py @@ -1,6 +1,5 @@ import pytest -from database.enums import Decoration, Notification, NotificationState from database.tests.factories import ( CommitFactory, CommitNotificationFactory, @@ -15,6 +14,7 @@ from services.notification.notifiers.base import NotificationResult from services.notification.notifiers.comment import CommentNotifier from services.repository import EnrichedPull +from shared.django_apps.enums import Decoration, Notification, NotificationState @pytest.fixture diff --git a/apps/worker/services/notification/tests/unit/test_notification_service.py b/apps/worker/services/notification/tests/unit/test_notification_service.py index 50158f862f..76853110e3 100644 --- a/apps/worker/services/notification/tests/unit/test_notification_service.py +++ b/apps/worker/services/notification/tests/unit/test_notification_service.py @@ -6,7 +6,6 @@ import pytest from celery.exceptions import SoftTimeLimitExceeded -from database.enums import Decoration, Notification, NotificationState from database.models.core import ( GITHUB_APP_INSTALLATION_DEFAULT_NAME, ) @@ -33,6 +32,7 @@ HelperTextKey, HelperTextTemplate, ) +from shared.django_apps.enums import Decoration, Notification, NotificationState from shared.plan.constants import PlanName from shared.reports.reportfile import ReportFile from shared.reports.resources import Report diff --git a/apps/worker/services/repository.py b/apps/worker/services/repository.py index acfd412315..f60547ca8e 100644 --- a/apps/worker/services/repository.py +++ b/apps/worker/services/repository.py @@ -11,7 +11,6 @@ from sqlalchemy.orm import Query, Session, lazyload import shared.torngit as torngit -from database.enums import CommitErrorTypes from database.models import Commit, Owner, Pull from database.models import Repository as SQLAlchemyRepository from database.models.core import GITHUB_APP_INSTALLATION_DEFAULT_NAME @@ -23,6 +22,7 @@ from shared.bots import get_adapter_auth_information from shared.config import get_config, get_verify_ssl from shared.django_apps.core.models import Repository +from shared.django_apps.enums import CommitErrorTypes from shared.torngit.base import TorngitBaseAdapter from shared.torngit.exceptions import ( TorngitClientError, diff --git a/apps/worker/services/test_analytics/tests/test_ta_finish_upload.py b/apps/worker/services/test_analytics/tests/test_ta_finish_upload.py index dc360bf7b8..c6e439b306 100644 --- a/apps/worker/services/test_analytics/tests/test_ta_finish_upload.py +++ b/apps/worker/services/test_analytics/tests/test_ta_finish_upload.py @@ -5,7 +5,6 @@ import pytest from django.db import transaction as django_transaction -from database.enums import ReportType from database.tests.factories import ( PullFactory, UploadFactory, @@ -15,6 +14,7 @@ from services.yaml import UserYaml from shared.django_apps.core.models import Commit as DjangoCommit from shared.django_apps.core.models import Repository as DjangoRepo +from shared.django_apps.enums import ReportType from shared.django_apps.reports.tests.factories import ( UploadErrorFactory as DjangoUploadErrorFactory, ) diff --git a/apps/worker/services/test_results.py b/apps/worker/services/test_results.py index 37c506cf99..e467d00279 100644 --- a/apps/worker/services/test_results.py +++ b/apps/worker/services/test_results.py @@ -8,7 +8,6 @@ import sentry_sdk -from database.enums import ReportType from database.models import ( Commit, CommitReport, @@ -24,6 +23,7 @@ from services.urls import get_members_url, get_test_analytics_url from services.yaml import read_yaml_field from shared.django_apps.codecov_auth.models import Plan +from shared.django_apps.enums import ReportType from shared.plan.constants import TierName from shared.yaml import UserYaml diff --git a/apps/worker/services/tests/test_decoration.py b/apps/worker/services/tests/test_decoration.py index be080713ce..0c4a50a2ca 100644 --- a/apps/worker/services/tests/test_decoration.py +++ b/apps/worker/services/tests/test_decoration.py @@ -2,7 +2,6 @@ import pytest -from database.enums import TrialStatus from database.tests.factories import ( CommitFactory, OwnerFactory, @@ -26,6 +25,7 @@ from shared.django_apps.core.tests.factories import ( RepositoryFactory as DjangoRepositoryFactory, ) +from shared.django_apps.enums import TrialStatus from shared.django_apps.reports.models import ReportSession, ReportType from shared.django_apps.reports.tests.factories import CommitReportFactory from shared.django_apps.reports.tests.factories import ( diff --git a/apps/worker/services/tests/test_lock_manager.py b/apps/worker/services/tests/test_lock_manager.py index e3273b3ac4..8f98a88564 100644 --- a/apps/worker/services/tests/test_lock_manager.py +++ b/apps/worker/services/tests/test_lock_manager.py @@ -6,8 +6,8 @@ import pytest from redis.exceptions import LockError -from database.enums import ReportType from services.lock_manager import LockManager, LockRetry, LockType +from shared.django_apps.enums import ReportType from tasks.base import BaseCodecovTask diff --git a/apps/worker/services/yaml/__init__.py b/apps/worker/services/yaml/__init__.py index 47535cb1e7..1224bd6037 100644 --- a/apps/worker/services/yaml/__init__.py +++ b/apps/worker/services/yaml/__init__.py @@ -2,12 +2,12 @@ from collections.abc import Mapping from typing import Any -from database.enums import CommitErrorTypes from database.models import Commit from database.models.core import Repository from helpers.save_commit_error import save_commit_error from services.yaml.fetcher import fetch_commit_yaml_from_provider from services.yaml.reader import read_yaml_field +from shared.django_apps.enums import CommitErrorTypes from shared.django_apps.utils.model_utils import get_ownerid_if_member from shared.torngit.exceptions import TorngitClientError, TorngitError from shared.validation.exceptions import InvalidYamlException diff --git a/apps/worker/tasks/base.py b/apps/worker/tasks/base.py index 7534585877..16af10b48e 100644 --- a/apps/worker/tasks/base.py +++ b/apps/worker/tasks/base.py @@ -18,7 +18,6 @@ from app import celery_app from celery_task_router import _get_ownerid_from_task, _get_user_plan_from_task from database.engine import get_db_session -from database.enums import CommitErrorTypes from database.models.core import ( GITHUB_APP_INSTALLATION_DEFAULT_NAME, Commit, @@ -36,6 +35,7 @@ upload_breadcrumb_task_name, ) from shared.celery_router import route_tasks_based_on_user_plan +from shared.django_apps.enums import CommitErrorTypes from shared.django_apps.upload_breadcrumbs.models import ( BreadcrumbData, Errors, diff --git a/apps/worker/tasks/bundle_analysis_processor.py b/apps/worker/tasks/bundle_analysis_processor.py index be7f242d9d..2d9c469503 100644 --- a/apps/worker/tasks/bundle_analysis_processor.py +++ b/apps/worker/tasks/bundle_analysis_processor.py @@ -4,7 +4,6 @@ from celery.exceptions import CeleryError, SoftTimeLimitExceeded from app import celery_app -from database.enums import ReportType from database.models import Commit, CommitReport, Upload from services.bundle_analysis.report import ( BundleAnalysisReportService, @@ -20,6 +19,7 @@ BUNDLE_ANALYSIS_PROCESSOR_MAX_RETRIES, bundle_analysis_processor_task_name, ) +from shared.django_apps.enums import ReportType from shared.reports.enums import UploadState from shared.yaml import UserYaml from tasks.base import BaseCodecovTask diff --git a/apps/worker/tasks/compute_comparison.py b/apps/worker/tasks/compute_comparison.py index 8265073d89..026e61f0b6 100644 --- a/apps/worker/tasks/compute_comparison.py +++ b/apps/worker/tasks/compute_comparison.py @@ -7,7 +7,6 @@ from celery import group from app import celery_app -from database.enums import CompareCommitError, CompareCommitState from database.models import CompareCommit, CompareComponent, CompareFlag from database.models.reports import RepositoryFlag from helpers.comparison import minimal_totals @@ -20,6 +19,7 @@ from shared.api_archive.archive import ArchiveService from shared.celery_config import compute_comparison_task_name from shared.components import Component +from shared.django_apps.enums import CompareCommitError, CompareCommitState from shared.helpers.flag import Flag from shared.torngit.exceptions import TorngitRateLimitError from shared.yaml import UserYaml diff --git a/apps/worker/tasks/manual_trigger.py b/apps/worker/tasks/manual_trigger.py index 0b3c95d2c6..65c0352a1a 100644 --- a/apps/worker/tasks/manual_trigger.py +++ b/apps/worker/tasks/manual_trigger.py @@ -3,7 +3,6 @@ from celery.exceptions import MaxRetriesExceededError from app import celery_app -from database.enums import ReportType from database.models import Commit, Pull from database.models.reports import CommitReport, Upload from services.comparison import get_or_create_comparison @@ -16,6 +15,7 @@ notify_task_name, pulls_task_name, ) +from shared.django_apps.enums import ReportType from shared.reports.enums import UploadState from tasks.base import BaseCodecovTask diff --git a/apps/worker/tasks/new_user_activated.py b/apps/worker/tasks/new_user_activated.py index d93ff6e010..b290fe4378 100644 --- a/apps/worker/tasks/new_user_activated.py +++ b/apps/worker/tasks/new_user_activated.py @@ -3,10 +3,10 @@ from datetime import datetime, timedelta from app import celery_app -from database.enums import Decoration from database.models import Owner, Pull, Repository from helpers.metrics import metrics from shared.celery_config import new_user_activated_task_name, notify_task_name +from shared.django_apps.enums import Decoration from shared.plan.service import PlanService from tasks.base import BaseCodecovTask diff --git a/apps/worker/tasks/notify.py b/apps/worker/tasks/notify.py index 660d5caf55..d07b85790c 100644 --- a/apps/worker/tasks/notify.py +++ b/apps/worker/tasks/notify.py @@ -7,7 +7,6 @@ from sqlalchemy.orm.session import Session from app import celery_app -from database.enums import CommitErrorTypes, Decoration, NotificationState, ReportType from database.models import ( Commit, Pull, @@ -52,6 +51,12 @@ ) from shared.config import get_config from shared.django_apps.codecov_auth.models import Service +from shared.django_apps.enums import ( + CommitErrorTypes, + Decoration, + NotificationState, + ReportType, +) from shared.django_apps.upload_breadcrumbs.models import Errors, Milestones from shared.helpers.redis import Redis, get_redis_connection from shared.reports.readonly import ReadOnlyReport diff --git a/apps/worker/tasks/notify_error.py b/apps/worker/tasks/notify_error.py index aae889b376..c1e76d77dd 100644 --- a/apps/worker/tasks/notify_error.py +++ b/apps/worker/tasks/notify_error.py @@ -4,11 +4,11 @@ from sqlalchemy.orm import Session from celery_config import notify_error_task_name -from database.enums import ReportType from database.models import Commit, CommitReport, Upload from helpers.checkpoint_logger.flows import UploadFlow from helpers.notifier import BaseNotifier, NotifierResult from services.yaml import UserYaml +from shared.django_apps.enums import ReportType from tasks.base import BaseCodecovTask, celery_app log = logging.getLogger(__name__) diff --git a/apps/worker/tasks/preprocess_upload.py b/apps/worker/tasks/preprocess_upload.py index 05795fb5b7..0065c9da7f 100644 --- a/apps/worker/tasks/preprocess_upload.py +++ b/apps/worker/tasks/preprocess_upload.py @@ -1,7 +1,6 @@ import logging from app import celery_app -from database.enums import CommitErrorTypes from database.models import Commit from helpers.exceptions import RepositoryWithoutValidBotError from helpers.github_installation import get_installation_name_for_owner_for_task @@ -18,6 +17,7 @@ PREPROCESS_UPLOAD_MAX_RETRIES, pre_process_upload_task_name, ) +from shared.django_apps.enums import CommitErrorTypes from shared.django_apps.upload_breadcrumbs.models import Errors, Milestones from shared.helpers.redis import get_redis_connection from shared.torngit.base import TorngitBaseAdapter diff --git a/apps/worker/tasks/test_analytics_notifier.py b/apps/worker/tasks/test_analytics_notifier.py index b58b51f740..f69957e44c 100644 --- a/apps/worker/tasks/test_analytics_notifier.py +++ b/apps/worker/tasks/test_analytics_notifier.py @@ -9,7 +9,6 @@ from sqlalchemy.orm import Session from app import celery_app -from database.enums import ReportType from helpers.notifier import NotifierResult from helpers.string import shorten_file_paths from services.lock_manager import LockManager, LockRetry, LockType @@ -37,6 +36,7 @@ ) from shared.celery_config import test_analytics_notifier_task_name from shared.django_apps.core.models import Repository +from shared.django_apps.enums import ReportType from shared.helpers.redis import get_redis_connection from shared.reports.types import UploadType from shared.typings.torngit import AdditionalData diff --git a/apps/worker/tasks/test_results_finisher.py b/apps/worker/tasks/test_results_finisher.py index 40cb808eaf..839fcc5061 100644 --- a/apps/worker/tasks/test_results_finisher.py +++ b/apps/worker/tasks/test_results_finisher.py @@ -4,12 +4,12 @@ from sqlalchemy.orm import Session from app import celery_app -from database.enums import ReportType from database.models import Commit from helpers.checkpoint_logger.flows import TestResultsFlow from services.lock_manager import LockManager, LockRetry, LockType from services.test_analytics.ta_finish_upload import ta_finish_upload from shared.celery_config import test_results_finisher_task_name +from shared.django_apps.enums import ReportType from shared.yaml import UserYaml from tasks.base import BaseCodecovTask from tasks.notify import notify_task_name diff --git a/apps/worker/tasks/tests/unit/test_base.py b/apps/worker/tasks/tests/unit/test_base.py index 237ba9b51a..9f151fcb59 100644 --- a/apps/worker/tasks/tests/unit/test_base.py +++ b/apps/worker/tasks/tests/unit/test_base.py @@ -17,7 +17,6 @@ StatementError, ) -from database.enums import CommitErrorTypes from database.models.core import GITHUB_APP_INSTALLATION_DEFAULT_NAME from database.tests.factories.core import OwnerFactory, RepositoryFactory from helpers.exceptions import NoConfiguredAppsAvailable, RepositoryWithoutValidBotError @@ -26,6 +25,7 @@ upload_breadcrumb_task_name, upload_task_name, ) +from shared.django_apps.enums import CommitErrorTypes from shared.django_apps.upload_breadcrumbs.models import BreadcrumbData, Errors from shared.plan.constants import PlanName from shared.torngit.exceptions import TorngitClientError diff --git a/apps/worker/tasks/tests/unit/test_bundle_analysis_processor_task.py b/apps/worker/tasks/tests/unit/test_bundle_analysis_processor_task.py index d77d9f636d..ac91e63a63 100644 --- a/apps/worker/tasks/tests/unit/test_bundle_analysis_processor_task.py +++ b/apps/worker/tasks/tests/unit/test_bundle_analysis_processor_task.py @@ -2,7 +2,6 @@ from celery.exceptions import Retry from redis.exceptions import LockError -from database.enums import ReportType from database.models import CommitReport, Upload from database.tests.factories import CommitFactory, RepositoryFactory, UploadFactory from services.bundle_analysis.report import ProcessingError, ProcessingResult @@ -11,6 +10,7 @@ from shared.bundle_analysis.storage import get_bucket_name from shared.celery_config import BUNDLE_ANALYSIS_PROCESSOR_MAX_RETRIES from shared.django_apps.bundle_analysis.models import CacheConfig +from shared.django_apps.enums import ReportType from shared.storage.exceptions import PutRequestRateLimitError from tasks.bundle_analysis_processor import BundleAnalysisProcessorTask from tasks.bundle_analysis_save_measurements import ( diff --git a/apps/worker/tasks/tests/unit/test_compute_comparison.py b/apps/worker/tasks/tests/unit/test_compute_comparison.py index 0a811c9739..faa86bad6e 100644 --- a/apps/worker/tasks/tests/unit/test_compute_comparison.py +++ b/apps/worker/tasks/tests/unit/test_compute_comparison.py @@ -2,11 +2,11 @@ from celery import group -from database.enums import CompareCommitError, CompareCommitState from database.models import CompareComponent, CompareFlag, RepositoryFlag from database.tests.factories import CompareCommitFactory from rollouts import PARALLEL_COMPONENT_COMPARISON from services.report import ReportService +from shared.django_apps.enums import CompareCommitError, CompareCommitState from shared.reports.readonly import ReadOnlyReport from shared.reports.resources import Report from shared.reports.types import ReportTotals diff --git a/apps/worker/tasks/tests/unit/test_new_user_activated.py b/apps/worker/tasks/tests/unit/test_new_user_activated.py index d59f867906..429c942d4d 100644 --- a/apps/worker/tasks/tests/unit/test_new_user_activated.py +++ b/apps/worker/tasks/tests/unit/test_new_user_activated.py @@ -2,7 +2,6 @@ import pytest -from database.enums import Decoration, Notification, NotificationState from database.tests.factories import ( CommitFactory, CommitNotificationFactory, @@ -10,6 +9,7 @@ PullFactory, RepositoryFactory, ) +from shared.django_apps.enums import Decoration, Notification, NotificationState from tasks.new_user_activated import NewUserActivatedTask from tests.helpers import mock_all_plans_and_tiers diff --git a/apps/worker/tasks/tests/unit/test_notify_task.py b/apps/worker/tasks/tests/unit/test_notify_task.py index 38aff49364..9eea6c8315 100644 --- a/apps/worker/tasks/tests/unit/test_notify_task.py +++ b/apps/worker/tasks/tests/unit/test_notify_task.py @@ -8,7 +8,6 @@ from celery.exceptions import MaxRetriesExceededError, Retry from freezegun import freeze_time -from database.enums import Decoration, Notification, NotificationState from database.models.core import CommitNotification from database.tests.factories import ( CommitFactory, @@ -38,6 +37,7 @@ new_user_activated_task_name, upload_breadcrumb_task_name, ) +from shared.django_apps.enums import Decoration, Notification, NotificationState from shared.django_apps.upload_breadcrumbs.models import ( BreadcrumbData, Errors, diff --git a/apps/worker/tasks/tests/unit/test_trial_expiration.py b/apps/worker/tasks/tests/unit/test_trial_expiration.py index 2fc3421d6a..f8e27d6413 100644 --- a/apps/worker/tasks/tests/unit/test_trial_expiration.py +++ b/apps/worker/tasks/tests/unit/test_trial_expiration.py @@ -1,11 +1,11 @@ import pytest -from database.enums import TrialStatus from shared.django_apps.codecov_auth.tests.factories import ( OwnerFactory, PlanFactory, TierFactory, ) +from shared.django_apps.enums import TrialStatus from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName, TierName from tasks.trial_expiration import TrialExpirationTask diff --git a/apps/worker/tasks/tests/unit/test_trial_expiration_cron.py b/apps/worker/tasks/tests/unit/test_trial_expiration_cron.py index d2fc9f204f..5d87f6a037 100644 --- a/apps/worker/tasks/tests/unit/test_trial_expiration_cron.py +++ b/apps/worker/tasks/tests/unit/test_trial_expiration_cron.py @@ -2,8 +2,8 @@ from unittest.mock import patch from celery_config import trial_expiration_task_name -from database.enums import TrialStatus from database.tests.factories.core import OwnerFactory +from shared.django_apps.enums import TrialStatus from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName from tasks.trial_expiration_cron import TrialExpirationCronTask diff --git a/apps/worker/tasks/tests/unit/test_upload_finisher_task.py b/apps/worker/tasks/tests/unit/test_upload_finisher_task.py index 6a0492b246..c01fe9d2f1 100644 --- a/apps/worker/tasks/tests/unit/test_upload_finisher_task.py +++ b/apps/worker/tasks/tests/unit/test_upload_finisher_task.py @@ -6,7 +6,6 @@ from celery.exceptions import Retry, SoftTimeLimitExceeded from celery_config import notify_error_task_name -from database.enums import ReportType from database.models.reports import CommitReport, Upload from database.tests.factories import CommitFactory, PullFactory, RepositoryFactory from database.tests.factories.core import UploadFactory @@ -27,6 +26,7 @@ timeseries_save_commit_measurements_task_name, upload_breadcrumb_task_name, ) +from shared.django_apps.enums import ReportType from shared.django_apps.upload_breadcrumbs.models import ( BreadcrumbData, Errors, diff --git a/apps/worker/tasks/tests/unit/test_upload_task.py b/apps/worker/tasks/tests/unit/test_upload_task.py index 6be8e6f5a4..cc0821f8f2 100644 --- a/apps/worker/tasks/tests/unit/test_upload_task.py +++ b/apps/worker/tasks/tests/unit/test_upload_task.py @@ -8,7 +8,6 @@ import pytest from celery.exceptions import Retry, SoftTimeLimitExceeded -from database.enums import ReportType from database.models import Upload from database.models.reports import CommitReport from database.tests.factories import CommitFactory, OwnerFactory, RepositoryFactory @@ -20,6 +19,7 @@ from services.lock_manager import LockRetry from services.report import NotReadyToBuildReportYetError, ReportService from shared.celery_config import upload_breadcrumb_task_name +from shared.django_apps.enums import ReportType from shared.django_apps.upload_breadcrumbs.models import ( BreadcrumbData, Errors, diff --git a/apps/worker/tasks/trial_expiration_cron.py b/apps/worker/tasks/trial_expiration_cron.py index 7ba9a1c88a..712ed44cd1 100644 --- a/apps/worker/tasks/trial_expiration_cron.py +++ b/apps/worker/tasks/trial_expiration_cron.py @@ -2,9 +2,9 @@ from app import celery_app from celery_config import trial_expiration_cron_task_name, trial_expiration_task_name -from database.enums import TrialStatus from database.models.core import Owner from helpers.clock import get_utc_now +from shared.django_apps.enums import TrialStatus from shared.plan.constants import PlanName from tasks.crontasks import CodecovCronTask diff --git a/apps/worker/tasks/upload.py b/apps/worker/tasks/upload.py index 92a70b8693..841ef8975a 100644 --- a/apps/worker/tasks/upload.py +++ b/apps/worker/tasks/upload.py @@ -16,7 +16,6 @@ from sqlalchemy.orm import Session from app import celery_app -from database.enums import ReportType from database.models import Commit, CommitReport, Repository, RepositoryFlag, Upload from database.models.core import GITHUB_APP_INSTALLATION_DEFAULT_NAME from helpers.checkpoint_logger.flows import TestResultsFlow, UploadFlow @@ -39,6 +38,7 @@ from services.test_results import TestResultsReportService from shared.celery_config import DEFAULT_LOCK_TIMEOUT_SECONDS, upload_task_name from shared.config import get_config +from shared.django_apps.enums import ReportType from shared.django_apps.upload_breadcrumbs.models import Errors, Milestones from shared.django_apps.user_measurements.models import UserMeasurement from shared.helpers.redis import get_redis_connection diff --git a/apps/worker/tasks/upload_finisher.py b/apps/worker/tasks/upload_finisher.py index 4cf742dbf6..b39a797a81 100644 --- a/apps/worker/tasks/upload_finisher.py +++ b/apps/worker/tasks/upload_finisher.py @@ -9,7 +9,6 @@ from app import celery_app from celery_config import notify_error_task_name -from database.enums import CommitErrorTypes, ReportType from database.models import Commit, Pull from database.models.core import GITHUB_APP_INSTALLATION_DEFAULT_NAME from database.models.reports import Upload @@ -40,6 +39,7 @@ timeseries_save_commit_measurements_task_name, upload_finisher_task_name, ) +from shared.django_apps.enums import CommitErrorTypes, ReportType from shared.django_apps.upload_breadcrumbs.models import Errors, Milestones from shared.helpers.cache import cache from shared.helpers.redis import get_redis_connection diff --git a/libs/shared/shared/django_apps/enums.py b/libs/shared/shared/django_apps/enums.py new file mode 100644 index 0000000000..42b0b92601 --- /dev/null +++ b/libs/shared/shared/django_apps/enums.py @@ -0,0 +1,80 @@ +from enum import Enum + + +class Decoration(Enum): + standard = "standard" + upgrade = "upgrade" + upload_limit = "upload_limit" + passing_empty_upload = "passing_empty_upload" + failing_empty_upload = "failing_empty_upload" + processing_upload = "processing_upload" + + +class Notification(Enum): + comment = "comment" + status_changes = "status_changes" + status_patch = "status_patch" + status_project = "status_project" + checks_changes = "checks_changes" + checks_patch = "checks_patch" + checks_project = "checks_project" + slack = "slack" + webhook = "webhook" + gitter = "gitter" + irc = "irc" + hipchat = "hipchat" + codecov_slack_app = "codecov_slack_app" + + +notification_type_status_or_checks = { + Notification.status_changes, + Notification.status_patch, + Notification.status_project, + Notification.checks_changes, + Notification.checks_patch, + Notification.checks_project, +} + + +class NotificationState(Enum): + pending = "pending" + success = "success" + error = "error" + + +class CompareCommitState(Enum): + pending = "pending" + processed = "processed" + error = "error" + + +class CompareCommitError(Enum): + missing_base_report = "missing_base_report" + missing_head_report = "missing_head_report" + provider_client_error = "provider_client_error" + + +class CommitErrorTypes(Enum): + INVALID_YAML = "invalid_yaml" + YAML_CLIENT_ERROR = "yaml_client_error" + YAML_UNKNOWN_ERROR = "yaml_unknown_error" + REPO_BOT_INVALID = "repo_bot_invalid" + + +class TrialStatus(Enum): + NOT_STARTED = "not_started" + ONGOING = "ongoing" + EXPIRED = "expired" + CANNOT_TRIAL = "cannot_trial" + + +class ReportType(Enum): + COVERAGE = "coverage" + TEST_RESULTS = "test_results" + BUNDLE_ANALYSIS = "bundle_analysis" + + +class FlakeSymptomType(Enum): + FAILED_IN_DEFAULT_BRANCH = "failed_in_default_branch" + CONSECUTIVE_DIFF_OUTCOMES = "consecutive_diff_outcomes" + UNRELATED_MATCHING_FAILURES = "unrelated_matching_failures"