From cc84ca127be556ce998a18888c3616452c0d64c1 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Tue, 18 Apr 2023 17:48:58 +0200 Subject: [PATCH 1/8] make subclassing work --- generalimport/fake_module.py | 21 +++++++++++++++ generalimport/test/test_generalimport.py | 33 +++++++----------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/generalimport/fake_module.py b/generalimport/fake_module.py index 66ba316..b88e1c4 100644 --- a/generalimport/fake_module.py +++ b/generalimport/fake_module.py @@ -1,4 +1,5 @@ import sys +from functools import partialmethod from generalimport import MissingOptionalDependency @@ -25,6 +26,26 @@ def __getattr__(self, item): self.error_func() return self + # def __mro_entries__(self, *a, **k): + # """ + # This prevents the creation of subclasses from triggering `generalimport`. + + # The classes so generated will trigger generalimport as soon as they're instantiated. + # """ + # return ( + # type( + # # Name of the fake class + # "FakeBaseClass", + # # Parent classes for this class + # (object,), + # # Methods + # { + # "__new__": partialmethod(FakeModule.error_func, "__new__"), + # "__init__": partialmethod(FakeModule.error_func, "__init__"), + # } + # ), + # ) + # Binary __ilshift__ = __invert__ = __irshift__ = __ixor__ = __lshift__ = __rlshift__ = __rrshift__ = __rshift__ = error_func diff --git a/generalimport/test/test_generalimport.py b/generalimport/test/test_generalimport.py index 5f7cf4e..80f8c12 100644 --- a/generalimport/test/test_generalimport.py +++ b/generalimport/test/test_generalimport.py @@ -182,27 +182,12 @@ def test_latest_scope_filename_importlib(self): self.assertIs(True, fake_module_check(hi, error=False)) self.assertIn("test_generalimport.py", catcher.latest_scope_filename) - - - - - - - - - - - - - - - - - - - - - - - - + def test_allow_subclassing(self): + generalimport("test_module") + import test_module + + class SubClass(test_module.BaseClass): + def __init__(self): + raise ValueError("generalimport should fail earlier with MissingOptionalDependency") + + self.assertRaises(MissingOptionalDependency, SubClass()) From 7722a8e4b5d1c6e237710f4594147e693d696c45 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Tue, 18 Apr 2023 18:07:16 +0200 Subject: [PATCH 2/8] move test --- generalimport/fake_module.py | 38 ++++++++++---------- generalimport/test/test_generalimport.py | 10 ------ generalimport/test/test_usage/test_object.py | 20 ++++++++--- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/generalimport/fake_module.py b/generalimport/fake_module.py index b88e1c4..5a5063e 100644 --- a/generalimport/fake_module.py +++ b/generalimport/fake_module.py @@ -26,25 +26,25 @@ def __getattr__(self, item): self.error_func() return self - # def __mro_entries__(self, *a, **k): - # """ - # This prevents the creation of subclasses from triggering `generalimport`. - - # The classes so generated will trigger generalimport as soon as they're instantiated. - # """ - # return ( - # type( - # # Name of the fake class - # "FakeBaseClass", - # # Parent classes for this class - # (object,), - # # Methods - # { - # "__new__": partialmethod(FakeModule.error_func, "__new__"), - # "__init__": partialmethod(FakeModule.error_func, "__init__"), - # } - # ), - # ) + def __mro_entries__(self, *a, **k): + """ + This prevents the creation of subclasses from triggering `generalimport`. + + The classes so generated will trigger generalimport as soon as they're instantiated. + """ + return ( + type( + # Name of the fake class + "FakeBaseClass", + # Parent classes for this class + (object,), + # Methods + { + "__new__": partialmethod(FakeModule.error_func, "__new__"), + "__init__": partialmethod(FakeModule.error_func, "__init__"), + } + ), + ) # Binary __ilshift__ = __invert__ = __irshift__ = __ixor__ = __lshift__ = __rlshift__ = __rrshift__ = __rshift__ = error_func diff --git a/generalimport/test/test_generalimport.py b/generalimport/test/test_generalimport.py index 80f8c12..3190c9e 100644 --- a/generalimport/test/test_generalimport.py +++ b/generalimport/test/test_generalimport.py @@ -181,13 +181,3 @@ def test_latest_scope_filename_importlib(self): hi = importlib.import_module("hi") self.assertIs(True, fake_module_check(hi, error=False)) self.assertIn("test_generalimport.py", catcher.latest_scope_filename) - - def test_allow_subclassing(self): - generalimport("test_module") - import test_module - - class SubClass(test_module.BaseClass): - def __init__(self): - raise ValueError("generalimport should fail earlier with MissingOptionalDependency") - - self.assertRaises(MissingOptionalDependency, SubClass()) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index 253bf37..452728c 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -8,14 +8,26 @@ class Test(ImportTestCase): - def test_init_subclass(self): - """ This one is caught by __call__. """ + + def test_subclass_module(self): generalimport("fakepackage") import fakepackage + class X(fakepackage): + pass + with self.assertRaises(MissingOptionalDependency): - class X(fakepackage): - pass + X() + + def test_subclass_class(self): + generalimport("fakepackage") + import fakepackage + + class SubClass(fakepackage.BaseClass): + def __init__(self): + raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") + + self.assertRaises(MissingOptionalDependency, SubClass()) From be4ee151e3647030524ed8c7daa1af892adbc6fd Mon Sep 17 00:00:00 2001 From: ZanSara Date: Tue, 18 Apr 2023 18:12:31 +0200 Subject: [PATCH 3/8] improve tests --- generalimport/fake_module.py | 4 ++-- generalimport/test/test_usage/test_object.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/generalimport/fake_module.py b/generalimport/fake_module.py index 5a5063e..6aa803f 100644 --- a/generalimport/fake_module.py +++ b/generalimport/fake_module.py @@ -40,8 +40,8 @@ def __mro_entries__(self, *a, **k): (object,), # Methods { - "__new__": partialmethod(FakeModule.error_func, "__new__"), - "__init__": partialmethod(FakeModule.error_func, "__init__"), + "__new__": partialmethod(self.error_func, "__new__"), + "__init__": partialmethod(self.error_func, "__init__"), } ), ) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index 452728c..3598c72 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -29,6 +29,17 @@ def __init__(self): self.assertRaises(MissingOptionalDependency, SubClass()) + def test_subclass_class_direct_new_call(self): + generalimport("fakepackage") + import fakepackage + + class SubClass(fakepackage.BaseClass): + def __init__(self): + raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") + + self.assertRaises(MissingOptionalDependency, SubClass.__new__(SubClass)) + + From 0bb76ac4424c32752626fb871fa42fb04a3e1cb3 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Tue, 18 Apr 2023 18:13:37 +0200 Subject: [PATCH 4/8] whitespace --- generalimport/test/test_usage/test_object.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index 3598c72..65f4cc4 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -38,12 +38,3 @@ def __init__(self): raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") self.assertRaises(MissingOptionalDependency, SubClass.__new__(SubClass)) - - - - - - - - - From 0634b1d666180f22f1d106ada808f6f3bcd7e23f Mon Sep 17 00:00:00 2001 From: Mandera Date: Wed, 19 Apr 2023 07:57:49 +0700 Subject: [PATCH 5/8] Fixed simple `assertRaises` mistake Signed-off-by: Mandera --- generalimport/test/test_usage/test_object.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index 65f4cc4..fbffa50 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -27,7 +27,7 @@ class SubClass(fakepackage.BaseClass): def __init__(self): raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") - self.assertRaises(MissingOptionalDependency, SubClass()) + self.assertRaises(MissingOptionalDependency, SubClass) def test_subclass_class_direct_new_call(self): generalimport("fakepackage") @@ -37,4 +37,5 @@ class SubClass(fakepackage.BaseClass): def __init__(self): raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") - self.assertRaises(MissingOptionalDependency, SubClass.__new__(SubClass)) + with self.assertRaises(MissingOptionalDependency): + SubClass.__new__(SubClass) From a6afb395965580e8888dc0288e953dc756e18eee Mon Sep 17 00:00:00 2001 From: Mandera Date: Wed, 19 Apr 2023 07:59:32 +0700 Subject: [PATCH 6/8] Suggesting test that I'd like to pass Signed-off-by: Mandera --- generalimport/test/test_usage/test_object.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index fbffa50..f9427af 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -9,6 +9,18 @@ class Test(ImportTestCase): + def test_subclass_class_returning_self(self): + generalimport("fakepackage") + import fakepackage + + class SubClass(fakepackage.BaseClass): + pass + + foo = SubClass.bar + + with self.assertRaises(MissingOptionalDependency): + foo *= 2 + def test_subclass_module(self): generalimport("fakepackage") import fakepackage From 659540834d263a66a1c5827c63f6b5463346080b Mon Sep 17 00:00:00 2001 From: ZanSara Date: Wed, 19 Apr 2023 11:54:29 +0200 Subject: [PATCH 7/8] create the FakeBaseClass in a more readable way --- generalimport/fake_module.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/generalimport/fake_module.py b/generalimport/fake_module.py index 6aa803f..0974a0a 100644 --- a/generalimport/fake_module.py +++ b/generalimport/fake_module.py @@ -32,20 +32,16 @@ def __mro_entries__(self, *a, **k): The classes so generated will trigger generalimport as soon as they're instantiated. """ - return ( - type( - # Name of the fake class - "FakeBaseClass", - # Parent classes for this class - (object,), - # Methods - { - "__new__": partialmethod(self.error_func, "__new__"), - "__init__": partialmethod(self.error_func, "__init__"), - } - ), - ) + class FakeBaseClass: + def __new__(fake_cls, *args, **kwargs): + self.error_func("__new__") + + def __init__(fake_self, *args, **kwargs): + self.error_func("__init__") + + return (FakeBaseClass, ) + # Binary __ilshift__ = __invert__ = __irshift__ = __ixor__ = __lshift__ = __rlshift__ = __rrshift__ = __rshift__ = error_func From ac728c8170a4c3e5bfd9b731ae1ba23071396946 Mon Sep 17 00:00:00 2001 From: Mandera Date: Tue, 16 May 2023 09:11:53 +0700 Subject: [PATCH 8/8] Updated to MissingDependencyException Expecting test_subclass_class_returning_self to fail --- generalimport/test/test_usage/test_object.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/generalimport/test/test_usage/test_object.py b/generalimport/test/test_usage/test_object.py index f652594..f8ff715 100644 --- a/generalimport/test/test_usage/test_object.py +++ b/generalimport/test/test_usage/test_object.py @@ -1,14 +1,9 @@ -import sys -from unittest import skip - -import generalimport as gi from generalimport import * from generalimport.test.funcs import ImportTestCase class Test(ImportTestCase): - def test_subclass_class_returning_self(self): generalimport("fakepackage") import fakepackage @@ -16,7 +11,7 @@ def test_subclass_class_returning_self(self): class SubClass(fakepackage.BaseClass): pass - foo = SubClass.bar + foo = SubClass.bar # Won't error if SubClass is a FakeModule with self.assertRaises(MissingDependencyException): foo *= 2 @@ -28,7 +23,7 @@ def test_subclass_module(self): class X(fakepackage): pass - with self.assertRaises(MissingOptionalDependency): + with self.assertRaises(MissingDependencyException): X() def test_subclass_class(self): @@ -37,9 +32,9 @@ def test_subclass_class(self): class SubClass(fakepackage.BaseClass): def __init__(self): - raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") + raise ValueError("'generalimport' should fail earlier with MissingDependencyException") - self.assertRaises(MissingOptionalDependency, SubClass) + self.assertRaises(MissingDependencyException, SubClass) def test_subclass_class_direct_new_call(self): generalimport("fakepackage") @@ -47,7 +42,7 @@ def test_subclass_class_direct_new_call(self): class SubClass(fakepackage.BaseClass): def __init__(self): - raise ValueError("'generalimport' should fail earlier with MissingOptionalDependency") + raise ValueError("'generalimport' should fail earlier with MissingDependencyException") - with self.assertRaises(MissingOptionalDependency): + with self.assertRaises(MissingDependencyException): SubClass.__new__(SubClass)