From 4513bcc6222f60b5ecc58e56f686a71a6ef72675 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 11 Sep 2025 10:05:50 -0500 Subject: [PATCH] chore - MyPy check Enterprise with OpenHands (#10858) Co-authored-by: Tim O'Farrell --- .../dev_config/python/.pre-commit-config.yaml | 3 ++- enterprise/dev_config/python/mypy.ini | 8 ++------ enterprise/experiments/experiment_manager.py | 2 +- enterprise/integrations/gitlab/gitlab_manager.py | 16 ++++++++++++++-- enterprise/integrations/gitlab/gitlab_view.py | 8 ++++---- enterprise/server/routes/event_webhook.py | 2 +- enterprise/sync/install_gitlab_webhooks.py | 6 +++--- .../integrations/github/service/resolver.py | 4 ++-- 8 files changed, 29 insertions(+), 20 deletions(-) diff --git a/enterprise/dev_config/python/.pre-commit-config.yaml b/enterprise/dev_config/python/.pre-commit-config.yaml index 82649b2121..e2a2564455 100644 --- a/enterprise/dev_config/python/.pre-commit-config.yaml +++ b/enterprise/dev_config/python/.pre-commit-config.yaml @@ -46,7 +46,8 @@ repos: - types-toml - types-redis - lxml - # TODO: Add OpenHands in parent + # OpenHands package in repo root + - ./ - stripe==11.5.0 - pygithub==2.6.1 # To see gaps add `--html-report mypy-report/` diff --git a/enterprise/dev_config/python/mypy.ini b/enterprise/dev_config/python/mypy.ini index c0c01c29c0..c6c1dfc365 100644 --- a/enterprise/dev_config/python/mypy.ini +++ b/enterprise/dev_config/python/mypy.ini @@ -7,15 +7,11 @@ warn_unreachable = True warn_redundant_casts = True no_implicit_optional = True strict_optional = True -exclude = (^enterprise/migrations/.*|^openhands/.*) +disable_error_code = type-abstract +exclude = (^enterprise/migrations/.*) [mypy-enterprise.tests.unit.test_auth_routes.*] disable_error_code = union-attr [mypy-enterprise.sync.install_gitlab_webhooks.*] disable_error_code = redundant-cast - -# Let the other config check base openhands packages -[mypy-openhands.*] -follow_imports = skip -ignore_missing_imports = True diff --git a/enterprise/experiments/experiment_manager.py b/enterprise/experiments/experiment_manager.py index 69f08b3957..fd400b12d0 100644 --- a/enterprise/experiments/experiment_manager.py +++ b/enterprise/experiments/experiment_manager.py @@ -55,7 +55,7 @@ class SaaSExperimentManager(ExperimentManager): @staticmethod def run_config_variant_test( - user_id: str, conversation_id: str, config: OpenHandsConfig + user_id: str | None, conversation_id: str, config: OpenHandsConfig ) -> OpenHandsConfig: """ Run agent config variant test and potentially modify the OpenHands config diff --git a/enterprise/integrations/gitlab/gitlab_manager.py b/enterprise/integrations/gitlab/gitlab_manager.py index efb9bbab39..b7296f13e1 100644 --- a/enterprise/integrations/gitlab/gitlab_manager.py +++ b/enterprise/integrations/gitlab/gitlab_manager.py @@ -62,7 +62,13 @@ class GitlabManager(Manager): logger.warning(f'Got invalid keyloak user id for GitLab User {user_id}') return False - gitlab_service = GitLabServiceImpl(external_auth_id=keycloak_user_id) + # Importing here prevents circular import + from integrations.gitlab.gitlab_service import SaaSGitLabService + + gitlab_service: SaaSGitLabService = GitLabServiceImpl( + external_auth_id=keycloak_user_id + ) + return await gitlab_service.user_has_write_access(project_id) async def receive_message(self, message: Message): @@ -119,7 +125,13 @@ class GitlabManager(Manager): gitlab_view: The GitLab view object containing issue/PR/comment info """ keycloak_user_id = gitlab_view.user_info.keycloak_user_id - gitlab_service = GitLabServiceImpl(external_auth_id=keycloak_user_id) + + # Importing here prevents circular import + from integrations.gitlab.gitlab_service import SaaSGitLabService + + gitlab_service: SaaSGitLabService = GitLabServiceImpl( + external_auth_id=keycloak_user_id + ) outgoing_message = message.message diff --git a/enterprise/integrations/gitlab/gitlab_view.py b/enterprise/integrations/gitlab/gitlab_view.py index 592299d474..9dd34b2821 100644 --- a/enterprise/integrations/gitlab/gitlab_view.py +++ b/enterprise/integrations/gitlab/gitlab_view.py @@ -47,14 +47,14 @@ class GitlabIssue(ResolverViewInterface): ) self.previous_comments = await gitlab_service.get_issue_or_mr_comments( - self.project_id, self.issue_number, is_mr=self.is_mr + str(self.project_id), self.issue_number, is_mr=self.is_mr ) ( self.title, self.description, ) = await gitlab_service.get_issue_or_mr_title_and_body( - self.project_id, self.issue_number, is_mr=self.is_mr + str(self.project_id), self.issue_number, is_mr=self.is_mr ) async def _get_instructions(self, jinja_env: Environment) -> tuple[str, str]: @@ -199,11 +199,11 @@ class GitlabInlineMRComment(GitlabMRComment): self.title, self.description, ) = await gitlab_service.get_issue_or_mr_title_and_body( - self.project_id, self.issue_number, is_mr=self.is_mr + str(self.project_id), self.issue_number, is_mr=self.is_mr ) self.previous_comments = await gitlab_service.get_review_thread_comments( - self.project_id, self.issue_number, self.discussion_id + str(self.project_id), self.issue_number, self.discussion_id ) async def _get_instructions(self, jinja_env: Environment) -> tuple[str, str]: diff --git a/enterprise/server/routes/event_webhook.py b/enterprise/server/routes/event_webhook.py index 012c29d930..b4f8b71f68 100644 --- a/enterprise/server/routes/event_webhook.py +++ b/enterprise/server/routes/event_webhook.py @@ -234,7 +234,7 @@ def _get_user_id(conversation_id: str) -> str: return conversation_metadata.user_id -async def _get_session_api_key(user_id: str, conversation_id: str) -> str: +async def _get_session_api_key(user_id: str, conversation_id: str) -> str | None: agent_loop_info = await conversation_manager.get_agent_loop_info( user_id, filter_to_sids={conversation_id} ) diff --git a/enterprise/sync/install_gitlab_webhooks.py b/enterprise/sync/install_gitlab_webhooks.py index e8e3ead613..883fff9cc9 100644 --- a/enterprise/sync/install_gitlab_webhooks.py +++ b/enterprise/sync/install_gitlab_webhooks.py @@ -276,12 +276,12 @@ class VerifyWebhookStatus: webhook ) - gitlab_service = GitLabServiceImpl(external_auth_id=user_id) + gitlab_service_impl = GitLabServiceImpl(external_auth_id=user_id) - if not isinstance(gitlab_service, SaaSGitLabService): + if not isinstance(gitlab_service_impl, SaaSGitLabService): raise Exception('Only SaaSGitLabService is supported') # Cast needed when mypy can see OpenHands - gitlab_service = cast(type[SaaSGitLabService], gitlab_service) + gitlab_service = cast(type[SaaSGitLabService], gitlab_service_impl) await self.verify_conditions_are_met( gitlab_service=gitlab_service, diff --git a/openhands/integrations/github/service/resolver.py b/openhands/integrations/github/service/resolver.py index f8013d2dec..bda668053e 100644 --- a/openhands/integrations/github/service/resolver.py +++ b/openhands/integrations/github/service/resolver.py @@ -120,7 +120,7 @@ class GitHubResolverMixin(GitHubMixinBase): 'first': 50, } if after_cursor: - threads_variables['after'] = after_cursor + threads_variables['after'] = after_cursor # type: ignore[unreachable] threads_data = await self.execute_graphql_query( get_review_threads_graphql_query, threads_variables @@ -167,7 +167,7 @@ class GitHubResolverMixin(GitHubMixinBase): comments_variables['threadId'] = thread_id comments_variables['page'] = 50 if after_cursor: - comments_variables['after'] = after_cursor + comments_variables['after'] = after_cursor # type: ignore[unreachable] thread_comments_data = await self.execute_graphql_query( get_thread_comments_graphql_query, comments_variables