pycode: Detect @overload decorators

This commit is contained in:
Takeshi KOMIYA
2020-05-24 19:18:21 +09:00
parent a59f83b6bd
commit 640bb2e586
3 changed files with 115 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ import sys
import pytest
from sphinx.pycode.parser import Parser
from sphinx.util.inspect import signature_from_str
def test_comment_picker_basic():
@@ -452,3 +453,80 @@ def test_typing_final_not_imported():
parser = Parser(source)
parser.parse()
assert parser.finals == []
def test_typing_overload():
source = ('import typing\n'
'\n'
'@typing.overload\n'
'def func(x: int, y: int) -> int: pass\n'
'\n'
'@typing.overload\n'
'def func(x: str, y: str) -> str: pass\n'
'\n'
'def func(x, y): pass\n')
parser = Parser(source)
parser.parse()
assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
signature_from_str('(x: str, y: str) -> str')]}
def test_typing_overload_from_import():
source = ('from typing import overload\n'
'\n'
'@overload\n'
'def func(x: int, y: int) -> int: pass\n'
'\n'
'@overload\n'
'def func(x: str, y: str) -> str: pass\n'
'\n'
'def func(x, y): pass\n')
parser = Parser(source)
parser.parse()
assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
signature_from_str('(x: str, y: str) -> str')]}
def test_typing_overload_import_as():
source = ('import typing as foo\n'
'\n'
'@foo.overload\n'
'def func(x: int, y: int) -> int: pass\n'
'\n'
'@foo.overload\n'
'def func(x: str, y: str) -> str: pass\n'
'\n'
'def func(x, y): pass\n')
parser = Parser(source)
parser.parse()
assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
signature_from_str('(x: str, y: str) -> str')]}
def test_typing_overload_from_import_as():
source = ('from typing import overload as bar\n'
'\n'
'@bar\n'
'def func(x: int, y: int) -> int: pass\n'
'\n'
'@bar\n'
'def func(x: str, y: str) -> str: pass\n'
'\n'
'def func(x, y): pass\n')
parser = Parser(source)
parser.parse()
assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
signature_from_str('(x: str, y: str) -> str')]}
def test_typing_overload_not_imported():
source = ('@typing.final\n'
'def func(x: int, y: int) -> int: pass\n'
'\n'
'@typing.final\n'
'def func(x: str, y: str) -> str: pass\n'
'\n'
'def func(x, y): pass\n')
parser = Parser(source)
parser.parse()
assert parser.overloads == {}