from contextlib import contextmanager
+import re
import textwrap
from typing import Any
from typing import Callable
-from typing import ForwardRef # noqa
from typing import Iterator
from typing import List # noqa
from typing import Optional
formatvalue=lambda x: "=" + x,
)
+ args = re.sub(
+ r'[_]?ForwardRef\(([\'"].+?[\'"])\)',
+ lambda m: m.group(1),
+ args,
+ )
+
func_text = textwrap.dedent(
"""\
def %(name)s%(args)s:
import io
import os
+import sys
from sqlalchemy.util import inspect_getfullargspec # noqa
from sqlalchemy.util.compat import inspect_formatargspec # noqa
is_posix = os.name == "posix"
+py39 = sys.version_info >= (3, 9)
+
string_types = (str,)
binary_type = bytes
from alembic.testing import exclusions
from alembic.testing.requirements import SuiteRequirements
+from alembic.util import compat
from alembic.util import sqla_compat
return exclusions.only_if(
lambda config: not getattr(config.db, "_is_future", False)
)
+
+ @property
+ def stubs_test(self):
+ def requirements():
+ try:
+ import black # noqa
+ import zimports # noqa
+
+ return False
+ except Exception:
+ return True
+
+ imports = exclusions.skip_if(
+ requirements, "black and zimports are required for this test"
+ )
+ version = exclusions.only_if(
+ lambda _: compat.py39, "python 3.9 is required"
+ )
+ return imports + version
import alembic
from alembic.testing import eq_
-from alembic.testing import skip_if
from alembic.testing import TestBase
_home = Path(__file__).parent.parent
-def requirements():
- try:
- import black # noqa
- import zimports # noqa
-
- return False
- except Exception:
- return True
-
-
def run_command(file):
res = subprocess.run(
[
class TestStubFiles(TestBase):
- @skip_if(requirements, "black and zimports are required for this test")
+ __requires__ = ("stubs_test",)
+
def test_op_pyi(self):
res = run_command("op")
generated = res.stdout
expected = Path(alembic.__file__).parent / "op.pyi"
eq_(generated, expected.read_text())
- @skip_if(requirements, "black and zimports are required for this test")
def test_context_pyi(self):
res = run_command("context")
generated = res.stdout
printer = PythonPrinter(buf)
printer.writeline(
- f"# ### this file stubs are generated by {progname} - do not edit ###"
+ f"# ### this file stubs are generated by {progname} "
+ "- do not edit ###"
)
for line in imports:
buf.write(line + "\n")