File: //proc/thread-self/root/usr/local/lib/python3.8/dist-packages/trio/tests/tools/test_gen_exports.py
import ast
import astor
import pytest
import os
import sys
from shutil import copyfile
from trio._tools.gen_exports import (
get_public_methods,
create_passthrough_args,
process,
)
SOURCE = '''from _run import _public
class Test:
@_public
def public_func(self):
"""With doc string"""
@ignore_this
@_public
@another_decorator
async def public_async_func(self):
pass # no doc string
def not_public(self):
pass
async def not_public_async(self):
pass
'''
def test_get_public_methods():
methods = list(get_public_methods(ast.parse(SOURCE)))
assert {m.name for m in methods} == {"public_func", "public_async_func"}
def test_create_pass_through_args():
testcases = [
("def f()", "()"),
("def f(one)", "(one)"),
("def f(one, two)", "(one, two)"),
("def f(one, *args)", "(one, *args)"),
(
"def f(one, *args, kw1, kw2=None, **kwargs)",
"(one, *args, kw1=kw1, kw2=kw2, **kwargs)",
),
]
for (funcdef, expected) in testcases:
func_node = ast.parse(funcdef + ":\n pass").body[0]
assert isinstance(func_node, ast.FunctionDef)
assert create_passthrough_args(func_node) == expected
def test_process(tmp_path):
modpath = tmp_path / "_module.py"
genpath = tmp_path / "_generated_module.py"
modpath.write_text(SOURCE, encoding="utf-8")
assert not genpath.exists()
with pytest.raises(SystemExit) as excinfo:
process([(str(modpath), "runner")], do_test=True)
assert excinfo.value.code == 1
process([(str(modpath), "runner")], do_test=False)
assert genpath.exists()
process([(str(modpath), "runner")], do_test=True)
# But if we change the lookup path it notices
with pytest.raises(SystemExit) as excinfo:
process([(str(modpath), "runner.io_manager")], do_test=True)
assert excinfo.value.code == 1