From 7e11578609e9f895284a42856205ebfc3c481133 Mon Sep 17 00:00:00 2001 From: Nicola Soranzo Date: Thu, 24 Nov 2022 16:24:55 +0000 Subject: [PATCH] Workaround misleading metaclass conflict mypy errors Fix hundreds of errors reported by mypy since 0.990, e.g.: ``` lib/galaxy/model/__init__.py:9626: error: Metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases [misc] class CleanupEventLibraryAssociation(Base): ^ ``` It should be possible to revert this workaround once https://github.com/python/mypy/issues/14182 is fixed. --- lib/galaxy/model/__init__.py | 9 ++++++++- lib/galaxy/model/tool_shed_install/__init__.py | 8 +++++++- lib/tool_shed/webapp/model/__init__.py | 8 +++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 9c4df77eab14..9ef6e4e85652 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -97,7 +97,6 @@ relationship, ) from sqlalchemy.orm.collections import attribute_mapped_collection -from sqlalchemy.orm.decl_api import DeclarativeMeta from sqlalchemy.sql import exists from typing_extensions import Protocol @@ -176,6 +175,12 @@ if TYPE_CHECKING: + # Workaround for https://github.com/python/mypy/issues/14182 + from sqlalchemy.orm.decl_api import DeclarativeMeta as _DeclarativeMeta + + class DeclarativeMeta(_DeclarativeMeta, type): + pass + from galaxy.datatypes.data import Data from galaxy.tools import DefaultToolState from galaxy.workflow.modules import WorkflowModule @@ -185,6 +190,8 @@ class _HasTable: __table__: Table else: + from sqlalchemy.orm.decl_api import DeclarativeMeta + _HasTable = object diff --git a/lib/galaxy/model/tool_shed_install/__init__.py b/lib/galaxy/model/tool_shed_install/__init__.py index 581b7ceb7df8..5b7e3ceacbd9 100644 --- a/lib/galaxy/model/tool_shed_install/__init__.py +++ b/lib/galaxy/model/tool_shed_install/__init__.py @@ -23,7 +23,6 @@ registry, relationship, ) -from sqlalchemy.orm.decl_api import DeclarativeMeta from galaxy.model.custom_types import ( MutableJSONType, @@ -40,11 +39,18 @@ mapper_registry = registry() if TYPE_CHECKING: + # Workaround for https://github.com/python/mypy/issues/14182 + from sqlalchemy.orm.decl_api import DeclarativeMeta as _DeclarativeMeta + + class DeclarativeMeta(_DeclarativeMeta, type): + pass class _HasTable: table: Table else: + from sqlalchemy.orm.decl_api import DeclarativeMeta + _HasTable = object diff --git a/lib/tool_shed/webapp/model/__init__.py b/lib/tool_shed/webapp/model/__init__.py index b98a36ebe568..ab9c55621665 100644 --- a/lib/tool_shed/webapp/model/__init__.py +++ b/lib/tool_shed/webapp/model/__init__.py @@ -33,7 +33,6 @@ registry, relationship, ) -from sqlalchemy.orm.decl_api import DeclarativeMeta import tool_shed.repository_types.util as rt_util from galaxy import util @@ -60,11 +59,18 @@ WEAK_HG_REPO_CACHE: Mapping["Repository", Any] = weakref.WeakKeyDictionary() if TYPE_CHECKING: + # Workaround for https://github.com/python/mypy/issues/14182 + from sqlalchemy.orm.decl_api import DeclarativeMeta as _DeclarativeMeta + + class DeclarativeMeta(_DeclarativeMeta, type): + pass class _HasTable: table: Table else: + from sqlalchemy.orm.decl_api import DeclarativeMeta + _HasTable = object