diff options
author | Nejc Habjan <hab.nejc@gmail.com> | 2021-12-01 01:04:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-01 01:04:53 +0100 |
commit | 8d76826fa64460e504acc5924f859f8dbc246b42 (patch) | |
tree | 083fefada982c795e2415092794db429abb0c184 /tests/unit/objects/test_mro.py | |
parent | 5a1678f43184bd459132102cc13cf8426fe0449d (diff) | |
parent | 86ab04e54ea4175f10053decfad5086cda7aa024 (diff) | |
download | gitlab-master.tar.gz |
Merge pull request #1723 from python-gitlab/jlvillal/dead_mastermaster
Close-out `master` branch
Diffstat (limited to 'tests/unit/objects/test_mro.py')
-rw-r--r-- | tests/unit/objects/test_mro.py | 122 |
1 files changed, 0 insertions, 122 deletions
diff --git a/tests/unit/objects/test_mro.py b/tests/unit/objects/test_mro.py deleted file mode 100644 index 8f67b77..0000000 --- a/tests/unit/objects/test_mro.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -Ensure objects defined in gitlab.v4.objects have REST* as last item in class -definition - -Original notes by John L. Villalovos - -An example of an incorrect definition: - class ProjectPipeline(RESTObject, RefreshMixin, ObjectDeleteMixin): - ^^^^^^^^^^ This should be at the end. - -Correct way would be: - class ProjectPipeline(RefreshMixin, ObjectDeleteMixin, RESTObject): - Correctly at the end ^^^^^^^^^^ - - -Why this is an issue: - - When we do type-checking for gitlab/mixins.py we make RESTObject or - RESTManager the base class for the mixins - - Here is how our classes look when type-checking: - - class RESTObject(object): - def __init__(self, manager: "RESTManager", attrs: Dict[str, Any]) -> None: - ... - - class Mixin(RESTObject): - ... - - # Wrong ordering here - class Wrongv4Object(RESTObject, RefreshMixin): - ... - - If we actually ran this in Python we would get the following error: - class Wrongv4Object(RESTObject, Mixin): - TypeError: Cannot create a consistent method resolution - order (MRO) for bases RESTObject, Mixin - - When we are type-checking it fails to understand the class Wrongv4Object - and thus we can't type check it correctly. - -Almost all classes in gitlab/v4/objects/*py were already correct before this -check was added. -""" -import inspect - -import pytest - -import gitlab.v4.objects - - -def test_show_issue(): - """Test case to demonstrate the TypeError that occurs""" - - class RESTObject(object): - def __init__(self, manager: str, attrs: int) -> None: - ... - - class Mixin(RESTObject): - ... - - with pytest.raises(TypeError) as exc_info: - # Wrong ordering here - class Wrongv4Object(RESTObject, Mixin): - ... - - # The error message in the exception should be: - # TypeError: Cannot create a consistent method resolution - # order (MRO) for bases RESTObject, Mixin - - # Make sure the exception string contains "MRO" - assert "MRO" in exc_info.exconly() - - # Correctly ordered class, no exception - class Correctv4Object(Mixin, RESTObject): - ... - - -def test_mros(): - """Ensure objects defined in gitlab.v4.objects have REST* as last item in - class definition. - - We do this as we need to ensure the MRO (Method Resolution Order) is - correct. - """ - - failed_messages = [] - for module_name, module_value in inspect.getmembers(gitlab.v4.objects): - if not inspect.ismodule(module_value): - # We only care about the modules - continue - # Iterate through all the classes in our module - for class_name, class_value in inspect.getmembers(module_value): - if not inspect.isclass(class_value): - continue - - # Ignore imported classes from gitlab.base - if class_value.__module__ == "gitlab.base": - continue - - mro = class_value.mro() - - # We only check classes which have a 'gitlab.base' class in their MRO - has_base = False - for count, obj in enumerate(mro, start=1): - if obj.__module__ == "gitlab.base": - has_base = True - base_classname = obj.__name__ - if has_base: - filename = inspect.getfile(class_value) - # NOTE(jlvillal): The very last item 'mro[-1]' is always going - # to be 'object'. That is why we are checking 'mro[-2]'. - if mro[-2].__module__ != "gitlab.base": - failed_messages.append( - ( - f"class definition for {class_name!r} in file {filename!r} " - f"must have {base_classname!r} as the last class in the " - f"class definition" - ) - ) - failed_msg = "\n".join(failed_messages) - assert not failed_messages, failed_msg |