diff --git a/tests/test_3141596.py b/tests/test_3141596.py index 06fd3772..e88803c0 100644 --- a/tests/test_3141596.py +++ b/tests/test_3141596.py @@ -6,8 +6,8 @@ from functools import wraps from unittest import skipIf from unittesting import AWAIT_WORKER +from unittesting import DeferrableMethod from unittesting import DeferrableTestCase -from unittesting.utils import isiterable BASEDIR = os.path.dirname(os.path.abspath(__file__)) @@ -83,7 +83,7 @@ def condition(): txt = f.read() deferred = func(self, txt) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield diff --git a/unittesting/__init__.py b/unittesting/__init__.py index f4cea726..e111fd1a 100644 --- a/unittesting/__init__.py +++ b/unittesting/__init__.py @@ -1,4 +1,5 @@ from .core import AWAIT_WORKER +from .core import DeferrableMethod from .core import DeferrableTestCase from .core import expectedFailure from .helpers import DeferrableViewTestCase @@ -10,6 +11,7 @@ __all__ = [ "AWAIT_WORKER", + "DeferrableMethod", "DeferrableTestCase", "expectedFailure", "run_scheduler", diff --git a/unittesting/core/__init__.py b/unittesting/core/__init__.py index a214b962..b065ca40 100644 --- a/unittesting/core/__init__.py +++ b/unittesting/core/__init__.py @@ -1,12 +1,14 @@ import sys if sys.version_info >= (3, 8): + from .py38.case import DeferrableMethod from .py38.case import DeferrableTestCase from .py38.case import expectedFailure from .py38.runner import AWAIT_WORKER from .py38.runner import DeferringTextTestRunner from .py38.suite import DeferrableTestSuite else: + from .py33.case import DeferrableMethod from .py33.case import DeferrableTestCase from .py33.case import expectedFailure from .py33.runner import AWAIT_WORKER @@ -17,6 +19,7 @@ __all__ = [ "AWAIT_WORKER", + "DeferrableMethod", "DeferrableTestCase", "DeferrableTestSuite", "DeferringTextTestRunner", diff --git a/unittesting/core/py33/case.py b/unittesting/core/py33/case.py index 40941e47..dfa947b4 100644 --- a/unittesting/core/py33/case.py +++ b/unittesting/core/py33/case.py @@ -1,6 +1,7 @@ import sys import warnings +from collections.abc import Iterable as DeferrableMethod from functools import wraps from unittest import TestCase from unittest.case import _ExpectedFailure @@ -8,7 +9,7 @@ from unittest.case import _UnexpectedSuccess from unittest.case import SkipTest -from ...utils import isiterable + from .runner import defer __all__ = [ @@ -22,7 +23,7 @@ def expectedFailure(func): def wrapper(*args, **kwargs): try: deferred = func(*args, **kwargs) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception: raise _ExpectedFailure(sys.exc_info()) @@ -35,7 +36,7 @@ class DeferrableTestCase(TestCase): def _executeTestPart(self, function, outcome, isTest=False): try: deferred = function() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except KeyboardInterrupt: raise diff --git a/unittesting/core/py33/suite.py b/unittesting/core/py33/suite.py index bea1b72d..32d64361 100644 --- a/unittesting/core/py33/suite.py +++ b/unittesting/core/py33/suite.py @@ -4,7 +4,7 @@ from unittest.suite import _isnotsuite from unittest.suite import TestSuite -from ...utils import isiterable +from .case import DeferrableMethod class DeferrableTestSuite(TestSuite): @@ -20,13 +20,13 @@ def run(self, result, debug=False): if _isnotsuite(test): deferred = self._tearDownPreviousClass(test, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield self._handleModuleFixture(test, result) yield deferred = self._handleClassSetUp(test, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield result._previousTestClass = test.__class__ @@ -40,14 +40,14 @@ def run(self, result, debug=False): else: deferred = test.debug() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield if topLevel: deferred = self._tearDownPreviousClass(None, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield yield @@ -77,7 +77,7 @@ def _handleClassSetUp(self, test, result): _call_if_exists(result, '_setupStdout') try: deferred = setUpClass() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception as e: if isinstance(result, _DebugResult): @@ -106,7 +106,7 @@ def _tearDownPreviousClass(self, test, result): _call_if_exists(result, '_setupStdout') try: deferred = tearDownClass() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception as e: if isinstance(result, _DebugResult): diff --git a/unittesting/core/py38/case.py b/unittesting/core/py38/case.py index bd8db100..2527d15e 100644 --- a/unittesting/core/py38/case.py +++ b/unittesting/core/py38/case.py @@ -1,10 +1,10 @@ import sys +from collections.abc import Generator as DeferrableMethod from unittest import TestCase from unittest.case import _Outcome from unittest.case import expectedFailure -from ...utils import isiterable from .runner import defer __all__ = [ @@ -17,22 +17,22 @@ class DeferrableTestCase(TestCase): def _callSetUp(self): deferred = self.setUp() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred def _callTestMethod(self, method): deferred = method() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred def _callTearDown(self): deferred = self.tearDown() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred def _callCleanup(self, function, *args, **kwargs): deferred = function(*args, **kwargs) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred @staticmethod @@ -71,22 +71,22 @@ def run(self, result=None): with outcome.testPartExecutor(self): deferred = self._callSetUp() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred if outcome.success: outcome.expecting_failure = expecting_failure with outcome.testPartExecutor(self, isTest=True): deferred = self._callTestMethod(testMethod) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred outcome.expecting_failure = False with outcome.testPartExecutor(self): deferred = self._callTearDown() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred deferred = self.doCleanups() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred for test, reason in outcome.skipped: self._addSkip(result, test, reason) @@ -123,7 +123,7 @@ def doCleanups(self): function, args, kwargs = self._cleanups.pop() with outcome.testPartExecutor(self): deferred = self._callCleanup(function, *args, **kwargs) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred # return this for backwards compatibility @@ -138,14 +138,14 @@ def doClassCleanups(cls): function, args, kwargs = cls._class_cleanups.pop() try: deferred = function(*args, **kwargs) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception: cls.tearDown_exceptions.append(sys.exc_info()) def __call__(self, *args, **kwds): deferred = self.run(*args, **kwds) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred else: return deferred diff --git a/unittesting/core/py38/suite.py b/unittesting/core/py38/suite.py index 4de4bc0a..84a1c602 100644 --- a/unittesting/core/py38/suite.py +++ b/unittesting/core/py38/suite.py @@ -4,7 +4,7 @@ from unittest.suite import _isnotsuite from unittest.suite import TestSuite -from ...utils import isiterable +from .case import DeferrableMethod class DeferrableTestSuite(TestSuite): @@ -20,13 +20,13 @@ def run(self, result, debug=False): if _isnotsuite(test): deferred = self._tearDownPreviousClass(test, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield self._handleModuleFixture(test, result) yield deferred = self._handleClassSetUp(test, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield result._previousTestClass = test.__class__ @@ -43,14 +43,14 @@ def run(self, result, debug=False): if self._cleanup: self._removeTestAtIndex(index) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield if topLevel: deferred = self._tearDownPreviousClass(None, result) - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred yield yield @@ -80,7 +80,7 @@ def _handleClassSetUp(self, test, result): _call_if_exists(result, '_setupStdout') try: deferred = setUpClass() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception as e: if isinstance(result, _DebugResult): @@ -94,7 +94,7 @@ def _handleClassSetUp(self, test, result): _call_if_exists(result, '_restoreStdout') if currentClass._classSetupFailed is True: deferred = currentClass.doClassCleanups() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred if len(currentClass.tearDown_exceptions) > 0: for exc in currentClass.tearDown_exceptions: @@ -119,7 +119,7 @@ def _tearDownPreviousClass(self, test, result): _call_if_exists(result, '_setupStdout') try: deferred = tearDownClass() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred except Exception as e: if isinstance(result, _DebugResult): @@ -131,7 +131,7 @@ def _tearDownPreviousClass(self, test, result): finally: _call_if_exists(result, '_restoreStdout') deferred = previousClass.doClassCleanups() - if isiterable(deferred): + if isinstance(deferred, DeferrableMethod): yield from deferred if len(previousClass.tearDown_exceptions) > 0: for exc in previousClass.tearDown_exceptions: diff --git a/unittesting/helpers/override_preferences_test_cast.py b/unittesting/helpers/override_preferences_test_cast.py index d459f46c..7c048a33 100644 --- a/unittesting/helpers/override_preferences_test_cast.py +++ b/unittesting/helpers/override_preferences_test_cast.py @@ -3,6 +3,7 @@ import shutil import sublime +from ..core import DeferrableMethod from ..core import DeferrableTestCase @@ -32,9 +33,9 @@ def setUpClass(cls): yield 500 s.clear_on_change(on_change_key) - x = super().setUpClass() - if hasattr(x, '__iter__'): - yield from x + deferred = super().setUpClass() + if isinstance(deferred, DeferrableMethod): + yield from deferred @classmethod def tearDownClass(cls): @@ -49,6 +50,6 @@ def tearDownClass(cls): except Exception: pass - x = super().tearDownClass() - if hasattr(x, '__iter__'): - yield from x + deferred = super().tearDownClass() + if isinstance(deferred, DeferrableMethod): + yield from deferred diff --git a/unittesting/helpers/temp_directory_test_case.py b/unittesting/helpers/temp_directory_test_case.py index ed76132a..f55d19f8 100644 --- a/unittesting/helpers/temp_directory_test_case.py +++ b/unittesting/helpers/temp_directory_test_case.py @@ -3,6 +3,7 @@ import sublime import tempfile +from ..core import DeferrableMethod from ..core import DeferrableTestCase @@ -33,15 +34,15 @@ def condition(): @classmethod def setUpClass(cls): - """ - Create a temp directory for testing. - Note that it is a generator, if you need to extend this method, you will - need to call + """Create a temp directory for testing. + + Note that it is a DeferrableMethod, if you need to extend this method, + you will need to call - yield from super().setUpClass() + yield from super().setUpClass() - from the subclass. Note that if the subclass has multiple parents, - `super().setUpClass` may not be a generator at all depends on the order. + from the subclass. Note that if the subclass has multiple parents, + `super().setUpClass` may not be a DeferrableMethod at all depends on the order. """ cls._temp_dir = tempfile.mkdtemp() nwindows = len(sublime.windows()) @@ -56,9 +57,9 @@ def setUpClass(cls): yield from cls.setWindowFolder() - x = super().setUpClass() - if hasattr(x, '__iter__'): - yield from x + deferred = super().setUpClass() + if isinstance(deferred, DeferrableMethod): + yield from deferred @classmethod def tearDownClass(cls): @@ -74,6 +75,6 @@ def remove_temp_dir(): sublime.set_timeout(remove_temp_dir, 1000) - x = super().tearDownClass() - if hasattr(x, '__iter__'): - yield from x + deferred = super().tearDownClass() + if isinstance(deferred, DeferrableMethod): + yield from deferred diff --git a/unittesting/utils/__init__.py b/unittesting/utils/__init__.py index 2ca69075..b0449a43 100644 --- a/unittesting/utils/__init__.py +++ b/unittesting/utils/__init__.py @@ -2,7 +2,6 @@ from .output_panel import OutputPanel from .progress_bar import ProgressBar from .stdio_splitter import StdioSplitter -from .isiterable import isiterable from .reloader import reload_package __all__ = [ @@ -10,6 +9,5 @@ "OutputPanel", "StdioSplitter", "ProgressBar", - "isiterable", "reload_package" ] diff --git a/unittesting/utils/isiterable.py b/unittesting/utils/isiterable.py deleted file mode 100644 index 786efcdb..00000000 --- a/unittesting/utils/isiterable.py +++ /dev/null @@ -1,2 +0,0 @@ -def isiterable(obj): - return hasattr(obj, '__iter__')